Surfaced by the correctness seat auditing Task 1.1 of plan 5 (#1130), phase-1 tip c663340. Disposition: follow-up (auditor-stated: not absorbable — needs a decision, not a mechanical edit).
Problem
cmdLint's directory branch is fs.readdirSync(t).filter(f => f.endsWith('.md')) — one level, no recursion (skills/_shared/war-memory.mjs, cmdLint). git ls-tree HEAD docs/learnings/archive/ lists ~104 committed lesson files that neither CI nor the newly-landed gate wrapper ever lints — while memory-audit.yml's trigger is docs/learnings/**, so an archive-only PR fires the workflow and reports green vacuously.
The task's new prose ("PRE-MERGE enforcement of this same lint") is literally accurate — the wrapper's invocation is byte-identical to CI's — so this is not a false claim. But the anti-vacuity intent the existence guard serves is only partly met: the guard catches a moved target, not an unlinted subtree.
Grounded, non-blocking: git log -S/Users/ -- docs/learnings and -Sghp_ are both empty across all history, so no live violation hides there today.
Why it wasn't absorbed
Closing it requires either a cmdLint walk change (war-memory.mjs — outside spec §4.1's "no logic beyond path resolution") or a second target arg in the wrapper. Either diverges the gate from CI unless memory-audit.yml's run: step changes in lock-step, which plan 5's End state 8 freezes byte-identical apart from comments.
Suggested fix
Decide whether docs/learnings/archive/ should be linted. If yes, fix at the source — make cmdLint's walk recursive — so CI and the wrapper stay one invocation, rather than adding a second target only to the wrapper.
Close when the archive-lint question is decided and (if linted) the recursive walk lands with CI and wrapper still sharing one invocation.
Surfaced by the correctness seat auditing Task 1.1 of plan 5 (#1130), phase-1 tip
c663340. Disposition: follow-up (auditor-stated: not absorbable — needs a decision, not a mechanical edit).Problem
cmdLint's directory branch isfs.readdirSync(t).filter(f => f.endsWith('.md'))— one level, no recursion (skills/_shared/war-memory.mjs,cmdLint).git ls-tree HEAD docs/learnings/archive/lists ~104 committed lesson files that neither CI nor the newly-landed gate wrapper ever lints — whilememory-audit.yml's trigger isdocs/learnings/**, so an archive-only PR fires the workflow and reports green vacuously.The task's new prose ("PRE-MERGE enforcement of this same lint") is literally accurate — the wrapper's invocation is byte-identical to CI's — so this is not a false claim. But the anti-vacuity intent the existence guard serves is only partly met: the guard catches a moved target, not an unlinted subtree.
Grounded, non-blocking:
git log -S/Users/ -- docs/learningsand-Sghp_are both empty across all history, so no live violation hides there today.Why it wasn't absorbed
Closing it requires either a
cmdLintwalk change (war-memory.mjs— outside spec §4.1's "no logic beyond path resolution") or a second target arg in the wrapper. Either diverges the gate from CI unlessmemory-audit.yml'srun:step changes in lock-step, which plan 5's End state 8 freezes byte-identical apart from comments.Suggested fix
Decide whether
docs/learnings/archive/should be linted. If yes, fix at the source — makecmdLint's walk recursive — so CI and the wrapper stay one invocation, rather than adding a second target only to the wrapper.Close when the archive-lint question is decided and (if linted) the recursive walk lands with CI and wrapper still sharing one invocation.