Task — engineering-spec@1

task-lint, a deterministic machine floor under the task-audit rubric

doneTASK-IMP-084
module improvement · class product · priority p1 · created 2026-07-16 · shipped 2026-07-16
depends on none · blocks none

TASK-IMP-084: task-lint, a deterministic machine floor under the task-audit rubric

Summary

audit_rubric@2.0 calls itself machine-checkable, but nothing executes it - every FM enum, required section, and traceability citation is re-derived by a model on each audit. Ship task-lint.mjs in docs-tools: a zero-dependency node CLI that checks the mechanical rule families deterministically, emits rule_id-tagged findings, and exits non-zero on error severity. The task-audit skill runs it first and judges only what needs judgment (QA semantics, SAFE content, TRACE meaning). Consumer repos inherit the tool through the payload's docs-tools copy.

Problem

On the 2026-07-16 sachviet run, six spec audits were performed entirely by the model. The findings that mattered were judgment calls, but the majority of rubric surface walked each time was mechanical: frontmatter enums, title length, snake_case keys, required H2s, conditional sections, clause-to-AC citation presence, test-path resolution. A model re-checking those is spending its diligence budget where a 300-line script is strictly better - byte-stable, instant, and immune to fatigue. The rubric's own header makes the promise:

<untrusted_content source="modules/skill/task-audit/RUBRIC.md:1">

audit_rubric@2.0 - machine-checkable Task rubric

</untrusted_content>

Proposed Solution

node .cyberos/docs-tools/task-lint.mjs <spec.md ... | dir> (in the platform repo: tools/install/docs-tools/task-lint.mjs). Node stdlib only. It parses frontmatter with a strict minimal YAML reader (scalars, lists, quoted strings - the subset the template uses; anything beyond that is itself an FM-001 finding), walks the body headings, and checks the mechanical families. Output: one line per finding, SEVERITY rule_id file:line message, sorted; --json for machines; exit 0 only when zero error-severity findings. The task-audit skill's loop gains one normative step: run the lint first when present, seed the report's mechanical findings from it, then perform the judgment families. The lint never replaces the audit; it floors it.

Alternatives Considered

Success Metrics

Scope

In scope: the lint CLI, its fixture-driven test suite, one normative wiring line in task-audit SKILL.md, payload presence gating.

Out of scope / Non-Goals

Dependencies

AI Authorship Disclosure

1. Description (normative)

2. Acceptance criteria

3. Edge cases

4. Out of scope / non-goals

Duplicated intentionally with ## Scope for template conformance: judgment families, auto-fix, other template profiles, and gate wiring are excluded.

5. Protected invariants this task must not weaken

End of TASK-IMP-084.

Audit

TASK-IMP-084-task-lint-machine-floor spec audit - audit_rubric@2.0

Families walked: FM (all pass - task@1, title <=72, closed enums, ISO created_at, no UNREVIEWED markers, corpus extras additive), SEC (seven H2s present and non-empty, one H1), COND (COND-004 three labeled bullets present; others not triggered), QA (metrics carry baseline/target/deadline grounded in run evidence; >=3 distinct alternatives; Out-of-scope subsection; no unsourced numeric targets; no cross-team claims), SAFE (one sourced block, closed, unnested, clean scan), TRACE (every numbered clause cited by >=1 AC; every AC names a test or a justified ops verification; every test path is in new_files or exists on disk; draft status exempts TRACE-004; no deferred slices).

ISSUE ISS-001 (QA-007, wontfix-info): the strict YAML-subset parser is a design decision marked in Proposed Solution (loud FM-001 on exotic YAML beats silent acceptance); reviewer approves at the review gate. ISSUE ISS-002 (SAFE-004, wontfix-info): the spec explicitly notes SAFE-003 content scanning stays with the model so nobody assumes lint coverage - recorded as a scope guard.

SUMMARY verdict: pass issues_open: 0 issues_human: 0 iterations: 2 next_action: ship

§gate-log

Populated during implementation (ship-tasks testing phase).