Task — engineering-spec@1

mechanical means deterministic, not docs-tools/

doneTASK-IMP-125
module improvement · class product · priority p3 · created 2026-07-18 · shipped null
depends on TASK-IMP-115 · blocks none

TASK-IMP-125: mechanical means deterministic, not docs-tools/

Summary

TASK-IMP-115 gave every ship-tasks skill_chain step a judgment: high | medium | mechanical advisory field. Its own spec defines mechanical two incompatible ways: §1.2 keys it on BEHAVIOUR ("a deterministic helper … no model judgment in the result"), while AC 2 and the Success Metric key it on a PATH ("a docs-tools helper", "precisely"). The two readings diverge on exactly two steps — 28 (awh-gate) and 29 (caf-gate) — which are deterministic but whose executors live in tools/awh/ and scripts/caf_gate.sh, not docs-tools/. This task picks the behaviour reading, makes §1.2, AC 2, and the Success Metric agree on it, re-tags steps 28-29 mechanical, and generalises the suite arm so a mechanical executor may live anywhere on disk.

Problem

The field's stated purpose is to tell a host which steps a model is NOT deciding, so the host can decline to spend judgment-grade reasoning on them (IMP-115 §1.2 "no model judgment in the result"; ship-tasks §11e:437 "no model is deciding anything"). That is a fact about behaviour — is a model in the loop? — not about a directory.

But IMP-115 shipped the narrow reading. Steps 28 and 29 both carry judgment: medium (ship-tasks.md:65-66), and §11e:465-467 records why: both gates are deterministic, "but their executors (tools/awh, scripts/caf_gate.sh) are not docs-tools helpers, and TASK-IMP-115's AC 2 scopes mechanical to docs-tools backing. They read medium: under-informative rather than wrong." The implementer violated no clause — §1.2 is a one-way definition (it says what mechanical IS, not what it is NOT), so labelling a deterministic-executor step medium breaks nothing, and the AC-2 test (test_mechanical_steps_are_helper_backed) only checks that mechanical steps ARE docs-tools-backed, never the reverse.

The cost is precise and small: a host reading the advisory field is told to spend judgment-grade reasoning on two gates that provably need none. Both are deterministic — caf-gate's SKILL.md says "The deterministic floor:" (SKILL.md:66) and awh scores on subprocess exit codes (runner.py:250,254, _run(task.cmd) / _run(task.check) == 0, no model call). A definition that mislabels its own two most mechanical steps is a definition not yet doing its job.

Note on provenance: §11e:466 claims "caf-gate's skill says 'no LLM'". It does not — grep -c -i llm modules/skill/caf-gate/SKILL.md returns 0. The "no LLM" phrase is in the workflow's own step-29 description (ship-tasks.md:66), and the SKILL.md says "deterministic" instead. The behaviour is real; the attribution is mislocated. This correction cites the true sources and does not repeat the mislocated one.

Proposed Solution

Decide the definition on behaviour and make the three IMP-115 sentences agree:

Is "which directory the executor lives in" load-bearing? No — it is an accident of where things got put, and the payload itself proves it. build.sh:137-141 vendors a deterministic executor from OUTSIDE docs-tools/ (scripts/caf_gate.sh + tools/caf -> cuo/gates/caf/), and dist/cyberos/cuo/gates/caf/caf_gate.sh exists on disk. So docs-tools/ is not the only deterministic executor family the payload ships, and build.sh gives it no guarantee the other paths lack — it cps docs-tools files exactly as it cps caf. A definition keyed on the directory would call caf non-mechanical purely for its address while the payload ships it as a first-class deterministic gate: the definition rotting on contact with the payload it describes. Keying on behaviour cannot rot when a file moves.

Alternatives Considered

Success Metrics

Scope

In scope: IMP-115 §1.2 / AC 2 / Success Metric wording; steps 28-29's judgment value; §11e's mechanical-definition line, helper table, and rough-edge paragraph; the test_mechanical_steps_are_helper_backed arm and two supporting arms.

Out of scope / Non-Goals

Dependencies

depends_on TASK-IMP-115: this task corrects three artefacts IMP-115 produced (its spec, its ship-tasks annotation, its suite arm). IMP-115 must be landed for there to be a definition to reconcile, so 125 comes after 115, never before. service: modules/cuo serialises 125 behind the in-flight modules/cuo cone per the ship-tasks parent-serialisation rule; it must not race it.

AI Authorship Disclosure

1. Description (normative)

2. Acceptance criteria

3. Edge cases