BOHICA-LABS / BOHICA-LABS/vsdd-factory
process-gap(orchestrator+adversary): ground-truth capture is test-runner-only; lint-class CI gates invisible to convergence (lint-parity analogue of #259/#298)
- Dominant language
- Rust
- Stars
- 2
- Forks
- 1
- Avg merge
- 6h 43m
- Merged PRs (30d)
- 29
Description
## Class of failure
Per-story adversarial convergence (BC-5.39.001) relies on the orchestrator capturing **ground truth** and attaching it to each fresh-context adversary prompt (the orchestrator-runs-the-suite mitigation discussed in #298 / #259, since the adversary is read-only). In practice that ground-truth capture has been **test-runner-only (GUT)**. The project's CI, however, gates merges on **two independent hard checks**: the test job *and* a separate `lint-gdscript` job. Lint-class defects are therefore invisible to every "ground truth" the adversary sees, and survive CLEAN/NITPICK_ONLY verdicts.
This is the lint-parity analogue of #259/#298 (which are about the *test* tally). Filing separately because the fix is distinct: ground-truth capture must include **every CI hard gate's tool**, not just the test runner.
## Pattern observed (external pilot, ftc-blue — Godot/GDScript)
Early adversarial passes on a story captured only GUT output. The CI `lint-gdscript` job runs `uvx --from gdtoolkit gdlint`. Three gdlint-class, CI-gating defects survived multiple passes that were declared CLEAN:
- `max-line-length: 120` violation in a test file (line 724)
- `max-returns` > 6 in a refactored function
- `function-variable-name` — function-scope locals with a leading underscore (`var _ignored = ...`), invalid under gdlint
None are detectable by GUT. All three would (and one did) fail the `lint-gdscript` hard gate at PR time, after the story had been declared converged. Fixes required additional post-convergence commits and reset the clean-pass streak.
Note: gdlint *also* does not catch tab/space indentation mixing (only Godot's parser does) — so even "GUT + gdlint" is not full parity with the runtime. The general principle stands: ground-truth must mirror **all** merge-blocking gates.
## Root cause
The ground-truth capture protocol named only the test runner. `lint-gdscript` is a separate hard gate. Without running the linter locally and attaching its output, neither orchestrator nor adversary can verify CI-gate parity, so lint defects are structurally invisible to convergence.
## Fix applied in the pilot
`gdlint` (via `uvx --from gdtoolkit gdlint `) is now permanently part of ground-truth capture for every adversarial pass; both test results and lint results are attached to each adversary prompt as verified artifacts.
## Request
Generalize in the orchestrator per-story-delivery template: **ground-truth capture for each adversarial pass must run, and attach the output of, every tool that is a hard merge gate in CI** (test runner + all linters/validators), not just the test runner. Ideally derive the list from the project's CI job definitions so it can't drift. Relates to #259 and #298.
Contributor guide
Assessment
This issue has not been assessed yet.