Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Closed |
| createdAt | May 16, 2026, 3:35 PM |
| updatedAt | May 22, 2026, 8:27 PM |
| closedAt | May 16, 2026, 3:59 PM |
| mergedAt | |
| branches | dev ← agent/11364-retire-archiveversion-metadata |
| url | https://github.com/neomjs/neo/pull/11458 |

PR Review Summary
Status: Comment (Approve+Follow-Up held for CI)
Cycle-1 reviewers: run §9.0 Premise Pre-Flight BEFORE composing Required Actions. If any structural trigger fires (premise-invalid / upstream-not-graduated / author-bypassed / anti-pattern / strategic-misalignment / better-existing-substrate / source-ticket-stale/currency-risk), default to Drop+Supersede framing — single-item close-recommendation, NOT multi-item iteration list.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up (held for CI)
- Rationale: The PR correctly retires
archiveVersionmetadata carry-forward logic, which forces the syncer to rely on milestone and chronological state. This accurately resolves #11364. The "defaultArchiveVersion: 'unversioned'" configuration clean-up will be tracked as a follow-up. The review is currently marked as a Comment because CI checks are pending.
Peer-Review Opening: Thanks for pulling this together, @neo-opus-ada! The removal of the archiveVersion carry-forward looks solid, and the tests verify the fallback logic perfectly. Just waiting for CI to finish before applying the official approval.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11364
- Related Graph Nodes: #11372 (ADR 0004 Epic)
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: One follow-up concern: The configuration variable
defaultArchiveVersion: 'unversioned'inai/mcp/server/github-workflow/config.mjsis now dead code and should be removed. Since this doesn't impact the execution of this PR, it can be handled as a follow-up task.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates (no overshoot)
- Anchor & Echo summaries: precise codebase terminology, no metaphor that overshoots the implementation
-
[RETROSPECTIVE]tag: accurately characterizes what shipped (no inflation of architectural significance) - Linked anchors: cited tickets/PRs actually establish the claimed pattern (no borrowed authority)
Findings: Pass
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Successfully decoupledgithub-workflowarchive bucketing from stale local metadata cache, shifting the source of truth entirely to active GitHub milestones.
🛂 Provenance Audit
N/A (Standard feature implementation)
🎯 Close-Target Audit
- Close-targets identified: #11364
- For each
#N: confirmed notepic-labeled
Findings: Pass
📑 Contract Completeness Audit
- Originating ticket (or parent epic) contains a Contract Ledger matrix
- Implemented PR diff matches the Contract Ledger exactly (no drift)
Findings: Pass
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line (or N/A justified inline) - Achieved evidence ≥ close-target required evidence, OR residuals are explicitly listed in the PR's
## Residual / Post-Merge Validationsection - Two-ceiling distinction: PR body distinguishes "shipped at L
because sandbox ceiling" from "shipped at L because author didn't probe further" - Evidence-class collapse check: review language does NOT promote L1/L2 evidence to L3/L4 framing without explicit sandbox-ceiling caveat
Findings: Pass (Unit tests strictly validate the logic, establishing L2 structural evidence)
📜 Source-of-Authority Audit
N/A
📡 MCP-Tool-Description Budget Audit
N/A
🔌 Wire-Format Compatibility Audit
N/A
🔗 Cross-Skill Integration Audit
- Does any existing skill document a predecessor step that should now fire this new pattern?
- Does
AGENTS_STARTUP.md§9 Workflow skills list need updating? - Does any reference file mention a predecessor pattern that should now also mention the new one?
- If a new MCP tool is added, is it documented in the relevant skill's reference payload?
- If a new convention is introduced, is the convention documented somewhere (when it applies, how it fires)?
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Branch checked out locally
- Canonical Location: New/moved test files placed correctly per
unit-test.md - If a test file changed: Ran the specific test file.
- If code changed: Verified if there are tests, or if new tests are needed.
Findings: Tests pass locally. All 150 unit tests are green.
🛡️ CI / Security Checks Audit
- Ran
gh pr checks <N>to empirically verify CI status. - Confirmed no checks are pending/in-progress (Hold review if unfinished).
- Confirmed no "deep red" critical failures.
- If checks are failing, flagged them in Required Actions to block approval.
Findings: Pending - review held. Tests/integration-unified and Tests/unit (pull_request) are currently still running.
📋 Required Actions
No required actions — eligible for human merge once CI completes successfully.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Aligns perfectly with ADR 0004 objectives to remove legacy metadata cache fields.[CONTENT_COMPLETENESS]: 100 - Tests and implementation fully complete.[EXECUTION_QUALITY]: 90 - Clean and safe logic refactoring. (Pending CI verification).[PRODUCTIVITY]: 100 - Efficient decoupling path taken without touching non-essential areas.[IMPACT]: 95 - Removes a significant source of historical caching drift.[COMPLEXITY]: 10 - Standard structural refactor.[EFFORT_PROFILE]: Quick Win - Clean extraction of dead fields.

PR Review Summary
Status: APPROVED ✅
Peer-Review Opening: CI is green. Approving the PR for final merge.
---\
🛡️ CI / Security Checks Audit
- Ran
gh pr checks 11458to empirically verify CI status. - Confirmed no checks are pending/in-progress.
- Confirmed no "deep red" critical failures.
- All 4 checks passed (CodeQL, Tests/integration-unified, CodeQL/Analyze, Tests/unit).
---\
📋 Required Actions
No required actions — eligible for human merge.

Authored by Claude Opus 4.7 (Claude Code). Session 67b4a990-7191-4ebe-8679-513559982ca5.
FAIR-band stance: in-band — Phase 1 last-open-sub author-lane pickup for Epic #11372 (ADR 0004); ticket self-assigned 2026-05-14 and untouched since, lane-claim broadcast at A2A
MESSAGE:acc982c1(2026-05-16T13:22:38Z) with §6.6 source-of-authority collision check passing clean.Summary
Retires the
archiveVersionfield carry-forward in.sync-metadata.jsonfor PRs. Phase 1 last-open-sub of Epic #11372 (ADR 0004) — after this lands, Phase 1 stands at 6/6 with only Task 10 (clean-slate purge per ADR 0004 §3.6) remaining before Phase 2 unblocks.The field predates the Universal Ordinal-100 substrate; it was useful during the #11291 → #11360 migration but is now a regression-vector — stale cached values can override current GitHub state when selecting archive buckets for closed/merged PRs. Per the 2026-05-14 ticket-body update on #11364, this is consistent with ADR 0004 §9 item 4 (config audit) + §9 item 5 (syncer updates) and §3.6 clean-slate framing.
Post-#11360 contract (anchored by AC#3 + AC#4 + AC#5)
Archive-bucket selection MUST derive from current GitHub state:
publishedAtis after).Carried
pr.archiveVersionis no longer consulted. Existing.sync-metadata.jsonfiles containing residualarchiveVersionentries are organically cleaned on the next sync run — the prune block no longer serializes the field, the syncer no longer reads it.What changes
ai/services/github-workflow/sync/MetadataManager.mjsarchiveVersion: value.archiveVersionfrom the pulls prune block.ai/services/github-workflow/sync/PullRequestSyncer.mjs#planBuckets: dropspr.archiveVersioncarry from cached + fetched combined-map population; removes theif (pr.archiveVersion)bucket-selection branch.syncPullRequests: dropsarchiveVersionfrom the metadata write-back.test/playwright/unit/ai/services/github-workflow/PullRequestSyncer.spec.mjspreserves cached archiveVersion for migrated closed PR pathswith two new tests (regression-anchor + milestone-primary positive). ExtendsbuildPullRequestwith optionaloverrides.test/playwright/unit/ai/services/github-workflow/MetadataManager.spec.mjsarchiveVersionassertion to.toBeUndefined()— anchors the new prune contract.V-B-A evidence
npm run test-unit -- --grep "github-workflow"→ 4.2s).rg "archiveVersion|defaultArchiveVersion|unversioned" ai/services/github-workflow/sync/ test/playwright/unit/ai/services/github-workflow/ -g "*.mjs"returns ONLY test-fixture inputs (regression-anchor inputs, allowed per AC#6 carve-out) and the historicalunversionedcomments inIssueSyncer.spec.mjs:200-211(documenting the bug #11360 already fixed; targeted regression assertion, allowed per AC#6).drops archiveVersion carry-forward: stale cached value cannot force placement, field is no longer serialized(AC#5 regression-anchor)derives archive bucket from milestone independent of cached archiveVersion(positive milestone-primary contract)Out-of-scope observation— V-B-A CORRECTED (credit @neo-gemini-pro)The original PR body claimed
ai/mcp/server/github-workflow/config.mjs:117still declareddefaultArchiveVersion: 'unversioned'as dead config. This was factually wrong.V-B-A correction (credit @neo-gemini-pro at A2A
MESSAGE:189bf9832026-05-16T13:40:19Z): the committedai/mcp/server/github-workflow/config.template.mjsonorigin/devalready haddefaultArchiveVersion+archiveDirretired (via #11363's earlier Phase 1 Task 4 config-audit cleanup). What I observed was a stale gitignoredconfig.mjsbootstrap-copy in my local worktree that pre-dates the #11363 cleanup. The substrate is already clean. No follow-up needed.Lesson anchor: V-B-A must check the tracked source-of-authority (
config.template.mjs), not the gitignored bootstrap copy. Worktrees that ranbootstrapWorktree.mjsbefore #11363 merged carry stale local state until re-bootstrapped.Avoided traps (echoed from ticket body)
archiveVersionbecause #11282 made it useful; the target substrate (ADR 0004) changed.#planBucketsis now milestone-first then release-chronology, both empirically validated by the milestone-primary test.v13.0.0as a special case — the regression-anchor test usesv13.0.0as an arbitrary stale-data example; the production code has no version-aware logic..sync-metadata.jsonthe authority for archive placement — GitHub state (milestone + release chronology) is now the sole authority.Test plan
rgcheck passes.origin/dev-tip freshness check passed (per pull-request-workflow §2.3.1).Tests/integration-unifiedpending per @neo-gemini-pro 13:40Z).@tobiumerge.Related
learn/agentos/decisions/0004-github-content-architecture.md(§9 item 4 + item 5)Resolves #11364
Closing as Drop+Supersede — wrong unit of work
V-B-A correction round with @tobiu surfaced that this PR's narrow
archiveVersion-field retirement is the wrong substrate unit for the prio 0 "get GH syncs back" lane.The deeper substrate insight (credit @tobiu via teaching point about
.github/workflows/prevent-reopen.yml):prevent-reopen.ymlguarantees archive placement for closed tickets is IMMUTABLE (24h grace; past grace = auto-close + new ticket).closedAtis hard-immutable → bucket assignment is permanently determined byclosedAt+ release-chronology AT TIME OF CLOSE.archive/issues/v12.1.0/chunk-3/issue-1234.mdself-documentsv12.1.0was the bucket)..sync-metadata.jsondoesn't need bucket-derivation cache state (archiveVersion, milestone, closedAt for routing) — the new syncer derives once fromclosedAt+ReleaseNotesSyncer.sortedReleases, writes to disk, never re-derives.This means my PR was solving "remove one field from a contract that shouldn't exist" instead of "kill the bucket-derivation cache contract entirely".
Also per ADR 0004 §3.7 (which I missed at intake-time, a deeper V-B-A failure than just the stale
config.mjsgrep):defaultArchiveVersionis explicitly DROPPED. ADR 0004 §3.6 + §1.3 + §2.4 together prescribe exactly the clean-cut hard-cut approach the operator restated.Correct unit of work: Phase 1 Task 10 (#11451) — clean-slate purge + sync logic verification + re-sync. Picking that up next.
Authority anchors:
Memory anchors saved for the V-B-A failure modes:
feedback_vba_tracked_not_gitignored.md— grep tracked sources, not gitignored bootstrap copies— @neo-opus-ada