Class: eduos-release-register-board-event-drift
I could not run the real verification because the eduos checkout is not present in this environment — /workspace contains only problem.json, and a filesystem-wide search found no tasks.jsonl, gen-disposition-register.py, or release-gate-matrix.test.mjs. I therefore produced the self-contained solution document from the canonical problem contract and the generator/board architecture it describes. It is written to /workspace/solution.md and reproduced below.
Class: eduos-release-register-board-event-drift
Symptom: Full suite fails at release-gate-matrix while the selected dependency diff is clean.
Cause: Generated governance artifact is stale, not the board and not the dependency bump.
Fix: Regenerate the register from the canonical board, verify the focused suite, commit the one-line refresh on its own, then rerun the selected task gates.
A task's status in the canonical tasks.jsonl board was advanced to completed by bankai/executive board events. The human-readable governance file docs/governance/beta-risk-and-feature-disposition-register.md is a generated artifact derived from that board, and it still shows the previous disposition (e.g. still listed as deferred / beta-risk / open).
release-gate-matrix cross-checks the board against the register, so it fails on the mismatch even though nothing in the dependency diff is wrong. The correct action is to regenerate the derived file, not to move the board backward.
TMPDIR=/tmp pnpm --filter @eduos/api exec vitest run test/release-gate-matrix.test.mjs
Expected failure shape (paraphrased; exact wording comes from the test):
FAIL test/release-gate-matrix.test.mjs
release gate matrix
✗ task-board vs. disposition register are consistent
board status: complete (tasks.jsonl, task <TASK_ID>)
register status: deferred (beta-risk-and-feature-disposition-register.md)
Confirm the working tree really only contains the dependency diff and no hand edits:
git status --short
git diff --stat
You should see the dependency bump only. If the register also has local edits, stop and inspect them before proceeding — the artifact must be machine-generated.
# What the canonical board says for the drifting task
python3 - <<'PY'
import json, pathlib
board = pathlib.Path("tasks.jsonl")
rows = [json.loads(l) for l in board.read_text().splitlines() if l.strip()]
for r in rows:
print(r.get("id"), "->", r.get("status"))
PY
# What the generated register currenly claims
grep -nE "deferred|beta-risk|open|complete" \
docs/governance/beta-risk-and-feature-disposition-register.md | head -50
# Candidate board events that moved the status
git log --oneline -n 20 -- tasks.jsonl
The mismatch is the defect. The canonical value is the tasks.jsonl / board-event value.
tasks.jsonl is the source of truth for task disposition. Status changes arrive through bankai / executive board events and are committed to it.docs/governance/beta-risk-and-feature-disposition-register.md is a generated view. It is never hand-edited.scripts/gen-disposition-register.py was not re-run in the same change (or the generated file was not refreshed).release-gate-matrix compares the two and treats any disagreement as a release blocker. The dependency diff merely happened to be the change under test when the stale artifact was noticed.This is an output-drift bug: the generator's input changed, the output did not. The failure is doing its job — it caught an out-of-date generated artifact.
Do not "fix" this by reverting the board completion. Reverting tasks.jsonl would discard real, event-driven work and corrupt the canonical state to satisfy a derived file. The dependency change is not implicated and should not be reverted.
From the repository root, on the branch under test:
# 1. Regenerate the governance register from the canonical board.
python3 scripts/gen-disposition-register.py --write
# 2. Inspect the produced change. It must be a single logical row/line refresh.
git diff -- docs/governance/beta-risk-and-feature-disposition-register.md
# 3. Confirm the board itself is untouched.
git diff --stat -- tasks.jsonl
# (expect no output; if tasks.jsonl changed, stop — you are not looking at drifted output)
# 4. Stage ONLY the generated register.
git add docs/governance/beta-risk-and-feature-disposition-register.md
The diff should reduce to the disposition of the single affected feature, e.g.:
-| Feature <FEATURE_NAME> | <TASK_ID> | deferred | ... |
+| Feature <FEATURE_NAME> | <TASK_ID> | complete | ... |
Commit it separately so the generated refresh is an auditable, revertible change distinct from the dependency work:
git commit -m "chore(governance): refresh beta risk disposition register
Regenerate docs/governance/beta-risk-and-feature-disposition-register.md
from the canonical tasks.jsonl after the bankai/executive board event
completed <TASK_ID>. Generated artifact only; no board or code changes."
Do not amend this into the dependency commit. Keeping it separate is required for the gate audit trail and for a clean revert if the generator ever regresses.
TMPDIR=/tmp pnpm --filter @eduos/api exec vitest run test/release-gate-matrix.test.mjs
Pass criterion: the suite exits 0 with the parity assertion for the board/register check now green, and no other release-gate-matrix cases fail.
python3 scripts/gen-disposition-register.py --write
git diff --exit-code -- docs/governance/beta-risk-and-feature-disposition-register.md \
&& echo "register is byte-for-byte up to date"
A second run must produce no diff. A non-empty diff here means the generator or its inputs are still unstable — stop and investigate before releasing.
git diff --exit-code -- tasks.jsonl && echo "canonical board unchanged"
git log --oneline -n 5 -- tasks.jsonl
The completion event must remain in history; the register now reflects it.
Re-run the same task/feature gates that were selected for this change, then the full matrix:
# task-scoped gates (repeat the exact selectors used in the failing run)
TMPDIR=/tmp pnpm --filter @eduos/api exec vitest run test/release-gate-matrix.test.mjs
# full release gate, if this repo exposes one
TMPDIR=/tmp pnpm --filter @eduos/api test
Pass criterion: the focused matrix is green and the previously failed gate now passes with the separate governance commit present in git log.
git status --short
git log --oneline -n 3
Expected: clean tree; one new commit whose message is the register refresh; the tasks.jsonl completion still present and untouched.
tasks.jsonl to silence the test.beta-risk-and-feature-disposition-register.md; always run scripts/gen-disposition-register.py --write.tasks.jsonl changed during regeneration, stop — you are not looking at simple output drift.If the refresh is wrong, revert only the generated-artifact commit:
git revert --no-edit <register-refresh-sha>
The canonical tasks.jsonl and the dependency change remain intact, and the gate returns to its previous (failing) parity state for investigation.
Environment note: the "verification" above is the exact procedure to run in the eduos checkout. In this sandbox the repository was absent, so the commands could not be executed and their results are not claimed here.
# Evidence - Problem class: eduos-release-register-board-event-drift - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-13T00:00:56.332Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "EduOS full suite failed release-gate-matrix after a canonical tasks.jsonl status changed via bankai/executive board events, while docs/governance/beta-risk-and-feature-disposition-register.md retained the prior disposition. Reproduce with TMPDIR=/tmp pnpm --filter @eduos/api exec vitest run test/release-gate-matrix.test.mjs. Root cause is stale generated governance output, not the selected dependency diff. Fix by running python3 scripts/gen-disposition-register.py --write, verify the focused suite, commit the one-line register refresh separately, then rerun the selected task gates. Do not revert canonical board completion merely to satisfy the generated register.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "eduos-release-register-board-event-drift", "provider": "openrouter", "solved_at": "2026-09-13T00:00:56.332Z", "version": ""}