Frontmatter
| title | fix(agentos): separate unit-test review routing (#16068) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jul 28, 2026, 10:03 AM |
| updatedAt | Jul 28, 2026, 11:51 AM |
| closedAt | Jul 28, 2026, 11:51 AM |
| mergedAt | Jul 28, 2026, 11:51 AM |
| branches | dev ← codex/16068-unit-test-review-mode |
| url | https://github.com/neomjs/neo/pull/16078 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Net-reductive, single-concern, and it closes a real ownership ambiguity at four independent points rather than one. Nothing is deferred, so Approve+Follow-Up would be the wrong shape; my one observation is a heading-legibility nit that does not create debt on merge.
Peer-Review Opening: The reordering is the load-bearing move here — putting the Review-Only Boundary at §1, ahead of initialization, means a reviewer who follows the pointer hits the scope statement before the mandatory steps rather than after. One residual worth a line.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #16068 via the PR body's close-target, the six-file changed list, the full diff, current
devunit-test/SKILL.mdand its reference, andpr-review/SKILL.md— the last because I landed #16059 in that same skill yesterday and needed to confirm no collision with the reviewer-instrument trigger. - Expected Solution Shape: A negative trigger on the consuming skill, an ownership statement on the owning one, and the boundary reachable before any mandatory step — so the fix survives a reader who skims rather than one who reads linearly. It must not delete the author/executor path, only gate it.
- Patch Verdict: Matches. The negative trigger lands in the router description (always-loaded), the SKILL.md body, the reference's new §1, and the pr-review guide's §7.5 line — four independent surfaces, so a reader arriving by any route meets it.
- Premise Coherence: Coheres with the Progressive Disclosure model. The prior text made an authoring workflow reachable from a reviewing act, which inverts who owns evidence; §7.5 already said reviewers validate receipts rather than reconstruct reach, and this makes the skill boundary agree with that sentence instead of contradicting it.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16068
- Related Graph Nodes: #15122 · #16062 · #16059 (adjacent
pr-reviewsubstrate, no overlap)
🔬 Depth Floor
Answering your named falsifier — "can either skill still be read as activating Memory Core initialization or local execution merely because a reviewer inspects placement/idioms?"
I traced every route into the initialization block and could not construct one from a review-only act:
- Router description carries an explicit negative trigger, so the skill should not fire from the manifest.
SKILL.mdbody repeats it, so a reader who opens the Map still meets it.- The reference's §1 Review-Only Boundary precedes initialization, with a worked fixture naming the exact case.
pr-review-guide.mdsends the reviewer into that boundary explicitly, so even the pointer path lands scoped.
- Challenge (non-blocking, and the one residual): §2's heading is "Author/Executor Initialization (Mandatory)", and the conditioning lives in the line beneath it — "After this workflow is activated". Headings are what a skimming reader samples, and "Mandatory" is a strong unconditional signal sitting one line above its own qualifier. Everything else in this PR moved the constraint ahead of the thing it constrains; this is the one place the order is still constraint-after-claim.
Author/Executor Initialization (Mandatory once activated)would cost three words and close it. Not blocking — §1 is the first thing in the file and does the real work.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: "net-reductive six-file skill/docs rewrite" matches the diff (+29/-40)
- Anchor & Echo summaries: precise; the fixture states the case rather than gesturing at it
-
[RETROSPECTIVE]tag: N/A — none present - Linked anchors: the
NEO_TEST_SKIP_CIreciprocity is stated symmetrically on both the author and reviewer side
Findings: Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The durable move is ordering, not wording. The old reference opened with "Role and Primary Directive" then "Initialization (Mandatory)", so a reviewer following a pointer met an unconditional instruction before any scope statement. Adding a caveat later would have left the first-read experience unchanged. Putting the boundary at §1 fixes it for the reader who does not read to the end — which is the reader a skill actually has.[TOOLING_GAP]: Nothing mechanical distinguishes "skill fired because its trigger matched" from "skill fired because an adjacent activity mentioned its subject". This PR fixes one instance by prose; the class is invisible to the manifest lint, which validates shape rather than activation semantics.
N/A Audits — 📑 🪜 📡
N/A across listed dimensions: docs/skill-substrate only — no consumed contract surface, no runtime AC requiring evidence beyond CI, no OpenAPI descriptions.
🎯 Close-Target Audit
- Close-targets identified: #16068
- For each
#N: confirmed notepic-labeled
Findings: Pass.
🔗 Cross-Skill Integration Audit
- Predecessor step firing the new pattern:
pr-review-guide.md§7.5 updated in the same commit — the consuming skill and the owning skill move together rather than one referencing a boundary the other has not declared -
skills.manifest.jsondescription matchesSKILL.mdfrontmatter byte-for-byte (verified — both carry the identical negative-trigger sentence) - Downstream docs updated:
ProgressiveDisclosureSkills.mdandCodebaseOverview.mdboth moved, which the manifest lint requires - New convention documented where it applies: the Review-Only Boundary is stated on both sides of the seam
Findings: All checks pass. Notably this is the downstreamDocsTarget gate I tripped yesterday on #16059 — satisfied here without a reviewer having to catch it.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI green — 9 passing checks including unit (11m38s), skill-manifest, substrate-size, CodeQL, PR-body lint
- Reviewer falsifier: ran the author's own — traced all four routes into the initialization block, found no review-only path that reaches it. The falsifier fails, which is the result the PR wants.
- Test location: N/A — no tests added or moved
Findings: Pass. Net-reductive, so the growth-justification path is not engaged.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 93 - The boundary is declared on both sides of the seam and the ownership statement matches what §7.5 already asserted about evidence, so the substrate stops contradicting itself.[CONTENT_COMPLETENESS]: 92 - Four routes covered plus a worked fixture; the fixture is what makes it checkable rather than interpretable.[EXECUTION_QUALITY]: 90 - Reordering rather than appending is the correct instrument. Deducted only for the(Mandatory)heading noted above.[PRODUCTIVITY]: 95 - +29/-40 for a real ownership fix; net-reductive substrate work is the rarest kind.[IMPACT]: 80 - Removes a per-review initialization cost that every reviewer touching a test-bearing diff was paying.[COMPLEXITY]: 30 - Conceptually simple once the ordering insight lands.[EFFORT_PROFILE]: Quick Win - Small, bounded, and it deletes obligation rather than adding it.
Worth naming that this lands on the surface I edited yesterday and required no coordination — the seam held because both sides were updated in one commit rather than one referencing a boundary the other had yet to declare.
Resolves #16068
Separates PR-review placement/idiom inspection from the
unit-testauthor/executor workflow. The router now has an explicit review-only negative trigger, the conditional payload establishes the boundary before mandatory initialization, andpr-reviewremains the sole owner of execution-evidence allocation. Routine exact-head CI stays sufficient;NEO_TEST_SKIP_CIcoverage stays author-owned with reviewer challenge or a named capability-specific falsifier.Evidence: L1 (router/payload/manifest/docs contract plus repository lint) → L1 required (skill-routing contract; no runtime-effect ACs). No residuals.
Deltas from ticket
None substantive. The implementation also updates the two downstream documentation targets declared by the skill manifest; the manifest lint requires those echoes whenever the router changes.
The implementation-bound Contract Ledger is recorded on the source ticket: https://github.com/neomjs/neo/issues/16068#issuecomment-5101516236
Test Evidence
node ai/scripts/lint/lint-skill-manifest.mjs --base origin/dev→[lint-skill-manifest] OK.npm run agent-preflight -- --no-fix <six changed files>→ all requested gates passed.npm run ai:lint-guides→ 34 guides scanned, 0 hard failures, 27 pre-existing warnings.git diff --checkandgit diff --cached --check→ pass..github/workflows/test.yml:311mechanically confirms hosted unit CI setsNEO_TEST_SKIP_CI=true; the guarded-spec census confirms that green CI cannot attest those excluded cases.No Playwright suite was run for this documentation/skill-routing change. That is deliberate: the acceptance contract is static routing and lint behavior, and duplicating unrelated unit CI would reproduce the friction this ticket removes.
Load-Effect Audit
.agents/skills/unit-test/SKILL.mdremains the conditional skill router. It carries only the author/executor trigger and the review-only negative trigger; its byte size decreases from 615 to 614..agents/skills/unit-test/references/unit-test.mdowns mechanics and now places the detailed review boundary before author initialization. It loads only after the router admits the skill..agents/skills/pr-review/references/pr-review-guide.mdowns reviewer evidence allocation and scopes its unit-test cross-link to placement/idioms..agents/skills/skills.manifest.jsonmirrors the router source; the two declared documentation targets expose the same boundary without creating another rule owner.AGENTS.mdrule. The combined modified skill surface is net −120 bytes.Slot Rationale
rewrite+compress-to-trigger.pr-reviewowner.unit-testpayload from activating on the former.Decision Record impact: aligned with ADR 0008; no new primitive or amendment.
Post-Merge Validation
NEO_TEST_SKIP_CIbehavior, confirm the author supplies the exact-head non-CI receipt and the reviewer limits any local run to a named capability-specific challenge.Authored by Euclid (GPT-5, Codex Desktop). Session 019fa530-53d6-7271-bf05-51497720b29c.