Context
Graduated from Discussion #17780 at §6.2 quorum (Claude [AUTHOR_SIGNAL] + non-author GPT [GRADUATION_APPROVED] @ 18153737). Runway anchor: D#17782 Wave 2. Gates neomjs/neo#17500's cutover feasibility.
Scope cut 2026-08-26 — operator KISS ruling, zero tolerance for added machinery. Four clauses removed as machinery for problems we do not have at N=3 enforcement targets; two were also built on a dead premise. Details in Cut Scope below. The cut is a reduction against an operator ruling, not a quorum bypass and not a weakened bar: every surviving AC keeps its original strength. @neo-gpt-emmy (signatory) and @neo-gpt (OQ8 author) are notified.
The Problem
Enforcement custody in neo is distributed by author-location, not subject. The split makes that fail three measured ways on cut day:
- Leaving teeth (fails loud):
.husky/pre-push:16 — guard 2 of 3 under set -e — invokes ai/scripts/lint/check-commit-authorship.mjs, a Brain executable that leaves. Every Engine push then dies mid-chain, reading as "my push is broken".
- Inverse straddles (police ghosts): stay-side teeth guarding leaving subjects (
aiconfig-antipattern-lint, aiconfig-test-mutation-lint, atomic-write-shape-lint) go silently green forever once the subject departs.
- Trigger starvation (silently never runs):
pull_request path filters watching ai/** never match post-move. The workflow stops running, and the absence of a run is not a red.
Coupling measured across three snapshots: 19 files/69 ai/scripts refs at neomjs/neo#17500's filing → 20/75 → 20/73 (467fd122f3). 21 of 44 workflows carry Brain-coupled teeth — re-measured at origin/dev on 2026-08-26; the body said 20 and the coupling grew by one while this ticket sat, which is the same direction the three snapshots above already trace. Read-back coordinate and the AC-1 baseline are at comment 5426844579.
The binding reality that sizes this ticket: live dev requires exactly one status context — integration-parity — out of 44 workflows. A green workflow that is not a required context gates nothing. That single fact is why the binding half of this work is one read-back, not a subsystem.
The Fix
- The authorship guard leaves with the Brain — it is not relocated. Measured, not assumed:
check-commit-authorship.mjs imports ai/graph/agentCoAuthorEmails.mjs, which imports ai/graph/identityRoots.mjs — 509 lines with 37 ai/ importers including configBase.mjs, the memory-core MCP server, and the daemons. That is Brain core. Moving the script to buildScripts/util/ would not sever the crossing, only lengthen it — PR neomjs/neo#17273 established exactly this and moved the file into ai/ for that reason. The Engine therefore drops the invocation; the guard travels with ai/ in neomjs/neo-agent-brain#13's receive set.
- Teeth move with their subject. Brain-coupled workflows land in
neo-agent-brain with or before the code they police. Each repo carries its own workflow files — no reusable-workflow indirection layer for two repos.
- Fission only where a file genuinely straddles.
test.yml splits along its existing run_integration / run_parity seam (integration→Brain, parity/e2e→Engine). engine-brain-boundary-lint becomes two one-sided guards. Any other straddler gets ONE named owner in the PR — never a cross-plane watcher.
- Binding: verify, don't police. Confirm
integration-parity still exists and is still required after the split, read back once and recorded in the PR.
Acceptance Criteria
Cut Scope (2026-08-26)
| cut |
was |
why |
| The org registry with enrollment/onboarding/retirement semantics |
AC-8 |
A lifecycle subsystem for three enforcement targets. Canonical deleted its own enrollment.json in the same de-bloat pass. Revisit when N justifies it; @neo-gpt's OQ8 field-ownership ruling survives as the design note for that day. |
| Binding read-back receipts + out-of-band mutation drift detection |
AC-6 |
A committed policeman for a mutable surface guarding one required context — the same machinery class this week's SSOT incident just killed. AC-4's one-time read-back covers the split. |
| Binding column across all 44 census rows |
AC-1 |
Six fields × 44 rows of documentation against a live reality of one required context. |
neomjs/.github reusable workflows + aggregated per-repo caller (ED1+ED2) |
Fix §1 |
Doubly dead: it rode D#17756's committed-bundle distribution, which the operator overturned in favour of an npm dependency (workflows do not travel by npm anyway), and an indirection layer costs more than a workflow file in each of two repos. |
| AC-10 org Actions-policy read |
AC-10 |
Completed 2026-08-25: policy gates nothing for our bots. Result recorded here; the AC has nothing left to do. |
Out of Scope
Skill distribution (D#17756 / neomjs/neo#17798 — npm dependency, never copied bytes) · the extraction wave itself (#17500) · seat binding (D#17644) · plan-tier changes · the deployed-plane severe test (D#17782 Waves 0/4) · rewriting any guard's logic — custody moves, behavior does not.
Discussion Criteria Mapping
D#17780 pre-ticket gates 1–5 satisfied at graduation (anchors in the Discussion body rev-4). Its carried ACs mapped one-to-one into this ticket's original AC-1…AC-10; four are now cut per the operator ruling above, with the rationale recorded row-by-row rather than silently dropped.
Signal Ledger
| Family |
Identity |
Signal |
Anchor |
claude |
@neo-opus-vega |
[AUTHOR_SIGNAL] |
18153699 @ rev-4 |
gpt |
@neo-gpt-emmy |
[GRADUATION_APPROVED] (supersedes her DEFERRED) |
18153737 @ rev-4 |
unknown (ox) |
@neo-preview |
substantive input (OQ3/OQ4 receipts, independent census); no formal marker |
18153354 · 18153564 |
Unresolved Dissent
None on the graduated shape. The 2026-08-26 scope cut is operator-authorized and open to challenge by either signatory.
Unresolved Liveness
@neo-gemini-pro: operator_benched per §6.5; revalidation on reactivation is not Tier-2-required for this artifact.
Related
Related: neomjs/neo#17500 · neomjs/neo#17798 · D#17780 · D#17756 · D#17782 · D#17644
Origin Session ID: fa8ebb22-864a-4f04-b9fd-8b6f2c22bcc4
Retrieval Hint: "enforcement custody teeth move with subject one required context KISS cut"
Context
Graduated from Discussion #17780 at §6.2 quorum (Claude
[AUTHOR_SIGNAL]+ non-author GPT[GRADUATION_APPROVED]@ 18153737). Runway anchor: D#17782 Wave 2. Gates neomjs/neo#17500's cutover feasibility.The Problem
Enforcement custody in
neois distributed by author-location, not subject. The split makes that fail three measured ways on cut day:.husky/pre-push:16— guard 2 of 3 underset -e— invokesai/scripts/lint/check-commit-authorship.mjs, a Brain executable that leaves. Every Engine push then dies mid-chain, reading as "my push is broken".aiconfig-antipattern-lint,aiconfig-test-mutation-lint,atomic-write-shape-lint) go silently green forever once the subject departs.pull_requestpath filters watchingai/**never match post-move. The workflow stops running, and the absence of a run is not a red.Coupling measured across three snapshots: 19 files/69
ai/scriptsrefs at neomjs/neo#17500's filing → 20/75 → 20/73 (467fd122f3). 21 of 44 workflows carry Brain-coupled teeth — re-measured atorigin/devon 2026-08-26; the body said 20 and the coupling grew by one while this ticket sat, which is the same direction the three snapshots above already trace. Read-back coordinate and the AC-1 baseline are at comment 5426844579.The binding reality that sizes this ticket: live
devrequires exactly one status context —integration-parity— out of 44 workflows. A green workflow that is not a required context gates nothing. That single fact is why the binding half of this work is one read-back, not a subsystem.The Fix
check-commit-authorship.mjsimportsai/graph/agentCoAuthorEmails.mjs, which importsai/graph/identityRoots.mjs— 509 lines with 37ai/importers includingconfigBase.mjs, the memory-core MCP server, and the daemons. That is Brain core. Moving the script tobuildScripts/util/would not sever the crossing, only lengthen it — PR neomjs/neo#17273 established exactly this and moved the file intoai/for that reason. The Engine therefore drops the invocation; the guard travels withai/in neomjs/neo-agent-brain#13's receive set.neo-agent-brainwith or before the code they police. Each repo carries its own workflow files — no reusable-workflow indirection layer for two repos.test.ymlsplits along its existingrun_integration/run_parityseam (integration→Brain, parity/e2e→Engine).engine-brain-boundary-lintbecomes two one-sided guards. Any other straddler gets ONE named owner in the PR — never a cross-plane watcher.integration-paritystill exists and is still required after the split, read back once and recorded in the PR.Acceptance Criteria
.husky/pre-pushdrops thecheck-commit-authorship.mjsline andcommit-authorship-lint.ymlleaves with the guard; afterwards.husky/*and.github/workflows/**reference nothing underai/(mechanical grep witness in the PR). Removal merges only after neomjs/neo-agent-brain#13 lands the guard in the Brain (receive-before-remove). Named consequence, not papered over: Engine-side agent-commit authorship is then unenforced in the Engine. Closing it needs either a duplicated roster (SSOT violation) or a distribution mechanism (new machinery) — both refused today; the gap is recorded here for a post-split decision and nothing is built for it now. (Original AC-1 said "relocate tobuildScripts/util/". Falsified 2026-08-26 against the tree — see Fix §1.)test.yml's integration half, and the Brain-side boundary guard land inneo-agent-brainwith or before the code they police, with merge-order evidence; verified before the neo-side removal merges.test.ymlfission: integration→Brain, parity/e2e→Engine along the existing classifier seam; both halves green in their plane.integration-parity(or its named successor) exists and is still a required context on the branch that needs it; read-back output pasted in the PR. No receipt files, no drift detector.npm install, zero org access, hooks and CI run clean (D#17782 goal 5).Cut Scope (2026-08-26)
enrollment.jsonin the same de-bloat pass. Revisit when N justifies it; @neo-gpt's OQ8 field-ownership ruling survives as the design note for that day.neomjs/.githubreusable workflows + aggregated per-repo caller (ED1+ED2)Out of Scope
Skill distribution (D#17756 / neomjs/neo#17798 — npm dependency, never copied bytes) · the extraction wave itself (#17500) · seat binding (D#17644) · plan-tier changes · the deployed-plane severe test (D#17782 Waves 0/4) · rewriting any guard's logic — custody moves, behavior does not.
Discussion Criteria Mapping
D#17780 pre-ticket gates 1–5 satisfied at graduation (anchors in the Discussion body rev-4). Its carried ACs mapped one-to-one into this ticket's original AC-1…AC-10; four are now cut per the operator ruling above, with the rationale recorded row-by-row rather than silently dropped.
Signal Ledger
claude@neo-opus-vega[AUTHOR_SIGNAL]gpt@neo-gpt-emmy[GRADUATION_APPROVED](supersedes her DEFERRED)unknown(ox)@neo-previewUnresolved Dissent
None on the graduated shape. The 2026-08-26 scope cut is operator-authorized and open to challenge by either signatory.
Unresolved Liveness
@neo-gemini-pro:operator_benchedper §6.5; revalidation on reactivation is not Tier-2-required for this artifact.Related
Related: neomjs/neo#17500 · neomjs/neo#17798 · D#17780 · D#17756 · D#17782 · D#17644
Origin Session ID: fa8ebb22-864a-4f04-b9fd-8b6f2c22bcc4
Retrieval Hint: "enforcement custody teeth move with subject one required context KISS cut"