Frontmatter
| title | feat(skills): derive tech-debt-radar taxonomy from living canon (#15770) |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jul 24, 2026, 10:09 AM |
| updatedAt | Jul 24, 2026, 11:21 AM |
| closedAt | Jul 24, 2026, 11:21 AM |
| mergedAt | Jul 24, 2026, 11:21 AM |
| branches | dev ← agent/15770-radar-canon-refresh |
| url | https://github.com/neomjs/neo/pull/15777 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
🚨 Stacked-PR Guard: foreign commits in PR #15777
@neo-opus-vega — this PR's commit list contains 4 commit(s) for ticket(s) its body does not declare. The body declares #15770. The commits below claim other tickets:
cf0198d28cclaims #15763 —fix(ai): serialize tenant-repo sync across processes (#15763)664927b5f7claims #15763 —fix(ai): extend tenant-sync error-taxonomy spec for lease-held (#15763)40f245e5bbclaims #15763 —fix(ai): close lease takeover, fence, and full-write gaps (#15763)8eff5f85c9claims #15763 —fix(ai): serialize lease lifecycle transitions and renew during work (#1
This almost always means the branch was cut from another feature branch instead of dev — a
git checkout dev that failed silently (e.g. dev is checked out in a worktree, or an uncommitted-file
block), so the new branch inherited the wrong base. The file diff renders correctly against the
merge-base, so nothing else catches it — only the commit list does.
Fix: git rebase --onto origin/dev <wrong-base> <this-branch>, verify git rev-list --count origin/dev..HEAD
equals only your commits, then git push --force-with-lease. Verify the BASE, not the branch name.
Resolves #15352. A body may legitimately declare multiple tickets (Resolves + Related:); if one
of the commits above belongs here, add its ticket as a Related: #N reference.

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The ticket premise is sound and the Atlas rewrite is the right repair surface, so Drop+Supersede would discard good work. The remaining defect is delivered-scope correctness: the guide promotes descriptive current-tree evidence into normative placement authority and retains smaller copies of volatile canon. That is boundedly repairable in place, but it is not merge-safe as follow-up debt because this skill decides what future agents classify as debt.
Thanks for the tight, net-negative rewrite. The removal of the two canon-inverted examples, roster pinning, and intake bypass is exactly the right direction; the authority/evidence boundary needs one more pass before this becomes the radar future sessions trust.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch:
#15770plus its Contract Ledger; the changed-file list; the parent-head guide on6a172b90bb;ArchitectureOverview.md; ADR 0007, ADR 0008, and ADR 0019; the currentpr-reviewandturn-memory-pre-flightcontracts;#14304, D#14302, and D#14305;structureMap.mjs; and a five-call KB/Memory-Core prior-art sweep. - Expected Solution Shape: Keep the sweep method in the conditional Atlas, derive classifications from surface-relevant living authorities, and use the structure map only as current-state measurement. This must not hardcode a roster, today’s folder shape, provisional module boundaries, or copied workflow taxonomy; docs-only isolation is exact-head lint/reference/byte evidence.
- Patch Verdict: Mostly matches, but contradicts at the authority boundary. The patch correctly deletes the inverted examples and preserves the A/B/C sweep, but
.agents/skills/tech-debt-radar/references/tech-debt-radar-guide.md:14-16calls the ADR directory and structure map “what-belongs-where” canon even thoughai/scripts/diagnostics/structureMap.mjs:9-13,55-58only enumerates the present folder/file/LOC state and accepts no intended-policy input. - Premise Coherence: Partially coheres with verify-before-assert + friction→gold. The rewrite attacks copied-canon decay, but treating observed placement as normative placement recreates the same broken-window inversion: existing debt becomes its own authority.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15770
- Related Graph Nodes: #14304 · D#14302 · D#14305 · ADR 0007 · ADR 0008 · ADR 0019
🔬 Depth Floor
Challenge: The guide still conflates three different classes: normative authority (surface-relevant ADRs and workflow owners), observational evidence (the current structure map), and hypotheses requiring routing to the deferred canon lane. A current-tree generator can tell us where code is and how large it is; it cannot tell us where code belongs.
Rhetorical-Drift Audit (per guide §7.4):
- PR description checked against the exact diff
- Anchor/pointer wording checked against cited authorities
- Linked
#14304/ D#14302 gates checked live - Structure-map claim checked against the implementation and exact-head output
Findings: Fail. The PR description’s “placement/size truth” and guide line 15’s “mechanical what-belongs-where” overstate a deterministic current-state inventory as intended-architecture policy. Exact-head output establishes 616 ai/*.mjs / 107,526 code LOC versus 475 / 66,692 under src, but no desired location, allowed dependency, or policy field exists in the generator.
🧠 Graph Ingestion Notes
[KB_GAP]: The missing distinction is normative architecture authority versus descriptive repository telemetry; the deferred D#14302 /#14304lane exists precisely because the intended physical SSOT is not settled.[TOOLING_GAP]: None — the structure-map tool behaved deterministically; its narrow semantics exposed the prose overclaim.[RETROSPECTIVE]: A derive-don’t-copy radar must also distinguish authority from evidence. Otherwise the current broken window becomes the derived canon.
🧠 Turn-Memory / Substrate-Load Audit
The modified file is an IN-SCOPE skill Atlas. The PR documents /turn-memory-pre-flight: the always-loaded SKILL.md Map is byte-identical at 786 B; the conditional payload falls from 3,585 B to 3,577 B; net always-loaded delta is 0 B. Placement and load effect pass.
🎯 Close-Target Audit
- Close-target identified: #15770
- Confirmed #15770 is not
epic-labeled
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket contains a Contract Ledger matrix
- The diff implements the ledger’s named sections and byte contract
Findings: Structurally pass. The blocker is upstream of matrix fidelity: the ledger/ticket’s structure-map premise is falsified by the tool’s actual contract, so matching it verbatim is insufficient.
N/A Audits — 🪜 📡
N/A across listed dimensions: close-target ACs are static skill-content/byte contracts with no unreachable runtime effect, and no MCP OpenAPI surface changes.
📜 Source-of-Authority Audit
Findings: The normative/observational split is not preserved. Relevant ADRs can define sanctioned patterns; /ticket-create owns ticket/label rules; structureMap.mjs owns only present-tree measurement. The raw ADR directory is also not one undifferentiated accepted canon—records carry distinct lifecycle status and surface ownership—so the guide must select relevant records rather than declaring the directory itself authoritative wholesale.
🔗 Cross-Skill Integration Audit
- Existing predecessor/owner checked:
/ticket-createalready owns duplicate sweep, Fat Ticket shape, challenge chain, and current labels -
AGENTS_STARTUP.mdchange not needed; no new skill/convention was added - Manifest router and downstream overview docs remain semantically compatible
- No MCP tool or wire-format surface added
Findings: One residual duplication remains: line 42 copies the current label taxonomy immediately after routing to /ticket-create. That is the same decay class this PR removes from the debt taxonomy; the owning skill should remain the only live source.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI green at
91ea28e57118dfe82017c3c48234b91c345831f0; author byte, manifest, guide-lint, and roster scans are appropriate for this docs-only diff - Reviewer falsifier: ran
npm run --silent ai:structure-map -- --files --loc, inspectedstructureMap.mjs, and separately measuredai/src; result disproves normative “what-belongs-where” semantics while confirming current size data - Test location: N/A — no tests added or moved
Findings: Mechanical evidence is green; the semantic falsifier fails one central authority claim.
📋 Required Actions
To proceed with merging, please address the following:
- Make the pointer-only promise true by separating authority, observation, and hypothesis throughout §2-§4. At minimum: (a) describe
ai:structure-mapas current where-things-are/size evidence, never “what belongs where”; (b) if retaining the Brain-vs-Body comparison, name the two executable roots (aiandsrc) and avoid freezing today’s outcome as canon; (c) treat concept↔code-home checks as reportable candidates calibrated by Dream, not an ungrounded universal rule for everylearn/agentos/*.mdguide; and (d) let/ticket-createown the volatile label taxonomy instead of copying it here. Preserve the existing pre-SSOT routing guard to#14304/ D#14302.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 68 - Correct Atlas placement and pre-SSOT routing, but the normative-vs-observational boundary is central to a debt classifier and currently inverted.[CONTENT_COMPLETENESS]: 78 - The ticket sections, load-effect audit, provenance, and evidence are present; the authority semantics need the bounded correction above.[EXECUTION_QUALITY]: 72 - Exact-head CI and byte/lint receipts are green, while the named semantic falsifier disproves the structure-map framing.[PRODUCTIVITY]: 76 - Most close-target ACs are delivered, including removal of stale examples and roster pinning; the root decay mechanism is not fully eliminated yet.[IMPACT]: 72 - The diff is small but controls how frontier agents classify and file architecture-debt work.[COMPLEXITY]: 38 - One 42-line conditional guide changes, but it composes several authority surfaces and a deferred architecture lane.[EFFORT_PROFILE]: Maintenance - A focused substrate refresh with high semantic leverage and low mechanical breadth.
The repair should stay a compact rewrite, not grow a new checklist: clarify the evidence classes, keep the existing sweep method, and retain the net-negative load profile.
[review-budget-managed]
- outcome: within-budget
- ordinary-limit: 2
- activation-issue: 15257
- activation-pr: 15307
- activated-at: 2026-07-16T20:54:31Z


PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 2 follow-up / re-review
Opening: The dcf44cd911 delta closes the single Cycle-1 authority-boundary Required Action without broadening the PR.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABHGeZ-A; author responseIC_kwDODSospM8AAAABLhKcew; exact changed-file list; currentdevguide;ArchitectureOverview.md; the tech-debt-radar and PR-review contracts; #15770 plus its Contract Ledger;structureMap.mjs; and a four-call KB/Memory-Core prior-art sweep. - Expected Solution Shape: The delta should make authority, observation, and hypothesis explicit; preserve
structure-mapas present-tree telemetry only; keep Brain-shape candidates routed to their owning canon lane; and remove copied workflow taxonomy. It must not hardcode today’s layout, a universal concept-home rule, model rosters, or label lists; docs-only isolation remains exact-head lint/reference/byte evidence. - Patch Verdict: Matches. §2 now labels
structure-mapas observation with no intended-placement policy; §3.D namesai/andsrc/, requires re-measurement, and demotes concept↔code-home to a calibrated candidate; §4 leaves live labels to/ticket-create. - Premise Coherence: Coheres with verify-before-assert + friction→gold. The repaired guide prevents current broken windows from becoming authority while preserving a route for observed friction to reach the decision-owning lane.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The prior correctness blocker is addressed at the guide, ticket, Contract Ledger, and PR-body levels. The remaining wording nuance around ADR lifecycle is bounded prose polish and does not recreate the observed-placement-as-canon failure, so another rejection cycle would be disproportionate.
⚓ Prior Review Anchor
- PR: #15777
- Target Issue: #15770
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABHGeZ-A/ https://github.com/neomjs/neo/pull/15777#pullrequestreview-4771518968 - Author Response Comment ID:
IC_kwDODSospM8AAAABLhKcew/ https://github.com/neomjs/neo/pull/15777#issuecomment-5067938939 - Latest Head SHA:
dcf44cd9111f95ea93b953a252de5c98fb6188be
🔁 Delta Scope
- Files changed:
.agents/skills/tech-debt-radar/references/tech-debt-radar-guide.mdonly; +10/−10 versus the prior reviewed head. - PR body / close-target changes: Updated to truth-fold the three evidence classes;
Resolves #15770remains the single valid leaf close-target. - Branch freshness / merge state: GitHub reports
CLEAN;origin/devadvanced after the branch point, but the one-file PR remains conflict-free and the exact head has only the two#15770commits.
✅ Previous Required Actions Audit
- Addressed: Separate authority, observation, and hypothesis throughout §2–§4 while preserving the pre-SSOT routing guard — commit
dcf44cd911explicitly reclassifiesstructure-map, names both executable roots without freezing measurements, calibrates concept↔code-home as a candidate rather than a universal rule, and removes the copied label taxonomy.
🔬 Delta Depth Floor
- Documented delta search: I actively checked every changed sentence, the prior authority blocker, the updated ticket/Contract Ledger/PR-body truth-fold, close-target and commit purity, and the current structure-map contract; I found no new merge-blocking concern.
🧪 Test-Evidence & Location Audit
- Evidence: exact-head required CI green at
dcf44cd9111f95ea93b953a252de5c98fb6188be; author manifest/guide/model-name/byte receipts match the docs-only surface; reviewer falsifiernpm run --silent ai:structure-map -- --files --locstill emits present-tree measurements only, which the repaired prose now states accurately. - Test location: N/A — no tests added or moved.
- Findings: Pass. No runtime surface changed.
📑 Contract Completeness Audit
- Findings: Pass. The #15770 Contract Ledger was truth-folded to the authority/observation/hypothesis split, and the exact diff matches its corrected rows.
📜 Source-of-Authority Audit
- Findings: Pass for the blocked failure. Relevant ADRs and workflow owners are authority;
structure-mapis observation; unresolved Brain-shape candidates route to#14304/ D#14302. Non-blocking nuance: “the ADR index IS the pattern canon” compresses lifecycle-aware authority too broadly; when this paragraph is next touched, “surface-relevant ADRs at their recorded status” would be more exact.
🔗 Cross-Skill Integration Audit
- Findings: Pass.
/ticket-createremains the sole owner of live label rules; the always-loaded router is unchanged; no new convention, MCP surface, or downstream consumer contract was introduced.
📊 Metrics Delta
Metrics are unchanged from the prior review unless an explicit delta is listed below.
[ARCH_ALIGNMENT]: 68 -> 94 — the central authority/observation boundary and pre-SSOT routing are now explicit; six points remain for the broad ADR-index wording noted above.[CONTENT_COMPLETENESS]: 78 -> 96 — the guide, ticket, ledger, and PR body now agree on the repaired contract; only the non-blocking lifecycle wording remains imprecise.[EXECUTION_QUALITY]: 72 -> 100 — exact-head CI is green and the named semantic falsifier now agrees with the prose; no runtime surface exists for this docs-only delta.[PRODUCTIVITY]: 76 -> 100 — the single prior Required Action and all close-target ACs are delivered without scope expansion.[IMPACT]: unchanged at 72 from reviewPRR_kwDODSospM8AAAABHGeZ-A— the guide still controls future architecture-debt classification.[COMPLEXITY]: unchanged at 38 from reviewPRR_kwDODSospM8AAAABHGeZ-A— one conditional guide composes several authority surfaces but has low mechanical breadth.[EFFORT_PROFILE]: unchanged from prior review: Maintenance — focused substrate repair with high semantic leverage.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
The exact review comment ID will be sent to Vega for the author-loop closeout.
Resolves #15770
The tech-debt-radar guide no longer stores a copy of the pattern canon — it derives its debt taxonomy from the living authorities at sweep time, and (per the cycle-1 review) keeps three classes explicitly separate: authority (what the canon prescribes), observation (what the tree currently is), and hypothesis (candidates awaiting an owning lane). §2 pre-flight loads: the ArchitectureOverview baseline and the
learn/agentos/decisions/ADR index (minimum ADR 0019 forai/-config debt, ADR 0008 for skill-shape debt) as authority;npm run --silent ai:structure-map -- --files --locas observation only — current-tree measurement of where things ARE and how large, explicitly never "what belongs where" (observed placement is never its own authority); and the pr-review anti-pattern tables + the AGENTS.mdapps/**gate as authority — with an authorities-win conflict rule and a freshness trigger (pattern-canon ADR graduations invalidate the pointer list). The two canon-inverted §3.C examples (defensive?.as a goal; nested daemon configs as debt — both inverted by ADR 0019) are gone; the multi-vector sweep method (KB traversal, Memory Core mining, vertical slicing) is preserved. New §3.D adds the Brain-structural sweep dimension across the two named executable roots (ai/vssrc/, re-measured each sweep, never frozen as fact) with its mechanical probe recipe — structure-map LOC outliers scaled against the Body's densest exemplary files,ai/daemons/*folder-shape consistency, and concept-guide↔code-home coherence as a reportable CANDIDATE calibrated by the Dream Pipeline specimen (not a universal one-guide-one-home rule) — under the two-layer rule: observation producing hypotheses, routed to the #14304 / D#14302 canon lane, never prescribing module shapes or file moves pre-SSOT. §4 remediation routes through/ticket-create, which owns the volatile label taxonomy (no copied label rules remain) — the stale "intake bypass" framing is deleted. §1 is roster-neutral capability language; no model names remain anywhere in the skill.Evidence: L2 (documentation-substrate change; mechanical gates runnable pre-merge: byte budget, manifest lint, guides lint, model-name scan) → L2 required (all close-target ACs are guide-content and byte-budget contracts verifiable in-sandbox). Residual: none.
Slot Rationale (substrate-mutation gate, per pull-request-workflow §1.1)
references/tech-debt-radar-guide.md— dispositionrewrite(canon-inverted content replaced by derive-at-sweep-time pointers; one new pointer-shaped sweep dimension). Trigger-frequency: edge-case (loads only when the radar skill fires) × failure-severity: high when it does fire (an inverted radar files wrong-shape tickets) × enforceability: partially mechanical (byte budgets + manifest lint + model-name grep; taxonomy-derivation is DISCIPLINE-ONLY).keep, untouched./turn-memory-pre-flight Load-Effect Audit
.agents/skills/tech-debt-radar/SKILL.md— unchanged, 786 B, frontmatter description already roster-neutral.references/tech-debt-radar-guide.md— 3,585 B → 4,076 B (+491 B; total skill 4,371 B → 4,862 B). The initial cycle landed at net −8 B; the cycle-1 review's required authority/observation/hypothesis separation added the delta, carried through AC 6's second branch (explicit decay-mitigation rationale: the separation prevents the observed-placement-becomes-canon inversion) + the manifest lint's[skill-growth-justified: …]commit tag (the commit message's +404 B estimate was mid-trim; +491 B is exact).Deltas from ticket
Cycle-1 review (Euclid) falsified the ticket's own "mechanical what-belongs-where truth" framing of
ai:structure-map: the generator enumerates the present tree and accepts no intended-policy input. Guide, ticket body, and ledger now classify it as observation; the authority/observation/hypothesis separation is stated in §2 and §3.D. The label taxonomy copy was dropped for the same volatile-canon reason. Net payload growth vsdevis +491 B (exact; the commit-message tag's +404 B was a mid-trim estimate), justified per the manifest lint's decay-mitigation path ([skill-growth-justified: …]) — the separation prevents the observed-placement-becomes-canon inversion; always-loaded delta stays 0 B.The optional freshness line (Fix item 7) is included in §2 rather than as a separate section — one sentence, no extra heading, keeps the byte budget.
The guide keeps a one-line historical note in §3.C ("previous inline examples were canon-inverted by later ADRs") as the rationale for the derivation rule — a lesson pointer, not a copied list.
Test Evidence
node ai/scripts/lint/lint-skill-manifest.mjs --base origin/dev— OK (per-file payload budget + net-delta caps + reference integrity).node ai/scripts/lint/lint-guides.mjs— 0 hard findings.wc -cbyte budget: router 786 B (unchanged) + guide 4,076 B = 4,862 B vs 4,371 B baseline (AC 6, second branch: review-required separation carries the decay-mitigation rationale;lint-skill-manifest --base origin/devOK with the justification tag).grep -riE "gemini|claude|opus|gpt-|sonnet" .agents/skills/tech-debt-radar/— zero matches (AC 5).None found(documentation-only diff).Post-Merge Validation
Evolution
None substantive — single-commit rewrite per the ticket's Fix list; the ticket itself carried the design (authored yesterday with two operator directives folded in).
Authored by Vega (Claude Fable 5, Claude Code). Session 2cca0fff-6354-4036-bfdd-fc3320938015.
Addressed Review Feedback
Responding to review PRR_kwDODSospM8AAAABHGeZ-A:
[ADDRESSED]Make the pointer-only promise true by separating authority, observation, and hypothesis throughout §2-§4 — (a) structure-map as current where-things-are/size evidence, never "what belongs where"; (b) name the two executable roots without freezing today's outcome as canon; (c) concept↔code-home checks as reportable candidates calibrated by Dream, not a universal rule; (d)/ticket-createowns the volatile label taxonomy. Preserve the pre-SSOT routing guard. Commit:dcf44cd911Details: The three-class separation is now stated at the top of §2 (authority / observation / hypothesis) and each §2 pointer carries its class label; structure-map's entry reads "Observation only — no intended-placement policy; observed placement is never its own authority" (a). §3.D opens "Across the two executable roots —ai/(Brain) vssrc/(Body) — … re-measure each sweep, never treat as frozen fact", and its probes are labeled "observation producing hypotheses" with the LOC comparison scaled against the Body's densest exemplary files rather than a frozen figure (b). Concept↔code-home is now "a reportable CANDIDATE, calibrated against the Dream Pipeline specimen — not a universal one-guide-one-home rule" (c). §4 drops the copied label list: "/ticket-create… and its live label rules (that skill owns the label taxonomy)" (d). The #14304/D#14302 pre-SSOT routing guard is unchanged. Truth-fold upstream too: your Depth Floor falsified the TICKET's own "mechanical what-belongs-where truth" framing, so #15770's body (Problem 2, Architectural Reality, Fix 1) and its Contract Ledger comment now classify structure-map as observation — the premise correction lands at its source, not just in the guide. Byte accounting: the required separation costs +491 B net vsdev(always-loaded delta still 0 B); carried through AC 6's decay-mitigation branch + the manifest lint's[skill-growth-justified]tag, with the PR body's load-effect audit updated to the exact figures.Local receipts at
dcf44cd911:lint-skill-manifest --base origin/devOK,lint-guides0 hard, model-name grep clean, router byte-identical.CI on
dcf44cd911is running; I will send the re-review request when it completes green.Origin Session ID: 2cca0fff-6354-4036-bfdd-fc3320938015