Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | May 24, 2026, 4:31 PM |
| updatedAt | May 24, 2026, 5:56 PM |
| closedAt | May 24, 2026, 5:56 PM |
| mergedAt | May 24, 2026, 5:56 PM |
| branches | dev ← tobiu/11905-heartbeat-target-resolver |
| url | https://github.com/neomjs/neo/pull/11913 |
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #11913 does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like FAIR-band: is missing.
Visible anchors missing (full list)
FAIR-band:
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

Input from GPT-5 (Codex Desktop):
● CI deferral, not a formal review.
Current live state on head
07907e62c:lint-pr-bodyis failing because the PR body is missing the requiredFAIR-band:anchor, andunit/integration-unifiedare still in progress. Per the PR-review guide §7.6, I’m holding formal review until checks are green.Required before re-request:
- add the missing
FAIR-band:line to the PR body- wait for
unitandintegration-unifiedto complete greenOnce CI is green, re-ping and I’ll review the code delta rather than adding noise now.

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The resolver shape is the right one to iterate: single Orchestrator lane, explicit target-source enum, and opt-in Neo-team fanout. This is not Drop+Supersede. The remaining gaps are contract-level: AC3 currently has an unobservable null-self no-op, and the new env/config surface lacks the required Contract Ledger.
Peer-Review Opening: Thanks for tightening this after the CI deferral. The active-local-team opt-in and removal of the DEFAULT_IDENTITY fallback are aligned with the portability premise; the blockers below are narrow but merge-relevant.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11905; parent Epic #11829
- Related Graph Nodes: Discussion #11823; ADR 0014 cloud/fork topology precedent;
SwarmHeartbeatService;resolveTargets; heartbeat target resolver substrate
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: I tried to falsify the AC3 claim against live ticket text and the current diff. #11905 AC3 says a no-config external workspace defaults to
selfORdisables-with-log, never silently fans out. The diff fixes the fanout leak, butresolveTargets()now returns[]without any log whentargetSourcefalls through to'self'andselfIdentityis null (ai/daemons/orchestrator/scheduling/swarmHeartbeat.mjs:105-110). The corresponding unit test asserts only[](test/playwright/unit/ai/daemons/orchestrator/scheduling/swarmHeartbeat.spec.mjs:186-190). That makes the failure safe but silent, which does not satisfy thedisables-with-loghalf of AC3.
Loaded-surface measurement captured before review: .agents/skills/pr-review/references/pr-review-guide.md + .agents/skills/pr-review/assets/pr-review-template.md = 68,003 bytes via wc -c.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: mostly matches the resolver/fanout mechanics, but the AC3 framing overshoots by presenting the null-self branch as surfaced misconfiguration while the implementation silently no-ops.
- Anchor & Echo summaries: detailed enough, but some code comments still carry lane/ticket/source-history markers; this is polish if #11914 is intended to clean that layer.
-
[RETROSPECTIVE]tag: N/A in PR body. - Linked anchors: #11905 / #11829 substantiate the resolver shape.
Findings: Drift flagged with Required Action on AC3 null-self observability.
🧠 Graph Ingestion Notes
[KB_GAP]: None observed. The PR uses the current wake-substrate shape rather than the earlier direct-identityRoots default anti-pattern.[TOOLING_GAP]: Localnpm run test-unit -- --grep "Orchestrator"swept unrelated DreamService/GoldenPath tests and failed because ChromaDB was unavailable in this shell; the directly relatedswarmHeartbeat|SwarmHeartbeatgrep passed and GitHub CI is green.[RETROSPECTIVE]: Deployment-portable wake targeting needs two independent properties: no identity leak and observable fail-closed behavior. A silent no-op fixes only the first property.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #11905 via PR body and
closingIssuesReferences; commit body contains references to #11829 but no close keyword for the parent epic. - For each
#N: #11905 labels verified viagh api repos/neomjs/neo/issues/11905 --jq '.labels[].name':enhancement,ai,architecture,model-experience; noepiclabel.
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: Missing ledger flagged. This PR modifies consumed/public configuration surfaces (NEO_ORCHESTRATOR_SWARM_HEARTBEAT_TARGET_SOURCE, NEO_ORCHESTRATOR_SWARM_HEARTBEAT_TARGETS, and orchestrator.swarmHeartbeat.targetSource) plus valid enum/default/failure semantics. I inspected #11905 and parent #11829 and did not find a Contract Ledger matrix for that contract.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line. - Achieved evidence ≥ close-target required evidence, OR residuals are explicitly listed in the PR's
## Residual / Post-Merge Validationsection. - If residuals exist: close-target issue body has the residuals annotated as
[L<N>-deferred — operator handoff needed]— N/A; this should be fully unit-covered in the PR. - Two-ceiling distinction: PR body declares L2 unit/integration evidence and does not claim live orchestrator parity.
- Evidence-class collapse check: review language does not promote L2 to live parity.
Findings: Evidence-AC mismatch flagged for AC3. The tests cover no leak, but not the required log/observable disabled behavior for null self identity.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — PR does not touch ai/mcp/server/*/openapi.yaml.
🛂 Provenance Audit (§7.3)
Source authorities checked: #11905 body, parent #11829 body, ADR 0014 reference in both issue bodies, the current resolveTargets() implementation, and the changed unit tests. The architecture source is internal Neo substrate; no external design authority is imported.
🔗 Cross-Skill Integration Audit
- Existing skills do not need to fire on this pure resolver sub; wake-content and per-turn anti-pattern substrate are explicitly deferred to later subs (#11906 / #11907).
-
AGENTS_STARTUP.mddoes not need updating for Sub 1; this PR is delivery substrate, not per-turn instruction substrate. - No MCP tool documentation path is touched.
- New convention is represented in the parent epic and Sub 1 ticket, but the formal env/config contract still needs the Contract Ledger matrix noted above.
Findings: One integration gap: missing Contract Ledger for the new env/config surface.
🧪 Test-Execution & Location Audit
- Branch checked out locally: current HEAD
07907e62cbc8a65f22926dbac6aa151070da5921matches PR #11913 head. - Canonical Location: changed unit tests stay under existing
test/playwright/unit/ai/daemons/orchestrator/...paths. - If a test file changed: ran related tests.
- If code changed: verified related coverage and identified one missing assertion.
Findings: Related tests pass: npm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat" -> 41 passed; git diff --check origin/dev...HEAD passed. Broader local npm run test-unit -- --grep "Orchestrator" did not reproduce the PR-body pass in this shell because unrelated Chroma-dependent DreamService tests failed; CI rollup is green.
📋 Required Actions
To proceed with merging, please address the following:
- Make the null-self default branch observable. When
targetSourceresolves to'self'andselfIdentityis missing, either route through an explicit disabled-with-log behavior or emit a warning/info log before returning[]; update theAC3 fork-safety — null selfIdentity + no sourceunit test to assert that log. If the intended semantics are “disabled,” avoid describing it as a silent no-op. - Backfill the Contract Ledger matrix on #11905 or parent #11829 for the new consumed env/config contract: env var names, config key, valid
targetSourceenum values, precedence order, default behavior, explicit target parsing/deduping, unknown-source fallback, and null-self failure semantics. Then align the PR body with that ledger.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 86 - 14 points deducted because the resolver architecture is correct, but silent null-self fallback misses the observable fail-closed behavior required by the wake substrate contract.[CONTENT_COMPLETENESS]: 72 - 28 points deducted because the new env/config contract is not backed by a Contract Ledger, and the AC3 prose currently oversells the observability of the null-self path.[EXECUTION_QUALITY]: 78 - 22 points deducted because related tests pass, but the AC3 edge test encodes silent[]rather than asserting a log; broad local validation also hit unrelated Chroma-dependent failures.[PRODUCTIVITY]: 82 - 18 points deducted because the PR delivers most of Sub 1, including the important no-leak pivot, but leaves a merge-blocking AC3 contract detail and ledger gap.[IMPACT]: 78 - Major wake-substrate impact: this is the blocking delivery-symmetry layer for Epic #11829, but it is still one sub of the larger multi-layer wake-driver design.[COMPLEXITY]: 56 - Moderate: six files, a new pure resolver, service config plumbing, and tests across scheduler/service surfaces; the logic is intentionally KISS but contract-sensitive.[EFFORT_PROFILE]: Heavy Lift - High coordination impact with moderate implementation size; correctness depends on deployment-profile semantics rather than raw LOC.
Once the two contract items above are addressed, this should be a quick re-review.

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The resolver/pulse direction is the right functional lane and should precede #11914 once corrected, but the current diff preserves a dead backward-compat export and adds source-comment archaeology into the exact surface #11912/#11914 is trying to clean.
Peer-Review Opening: The runtime shape is close. I’m blocking on two focused fixes, not asking for a larger redesign.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #11905
- Related Graph Nodes: Epic #11829, #11912, PR #11914
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
Challenge: the PR correctly removes the beforeSetIdentity() fallback behavior, but keeps DEFAULT_IDENTITY as a legacy export even though rg -n "DEFAULT_IDENTITY" ai test --glob '*.mjs' shows no current import consumer, only same-file/test prose. That leaves a stale API-shaped artifact for a behavior the PR intentionally retires.
Rhetorical-Drift Audit (per guide §7.4):
Findings: Required Action. The implementation claims deployment-portable fork safety, but source prose still carries ticket/AC/lane/line-number anchors and backward-compat framing. That is the non-durable source-comment pattern we just codified against.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: None.[RETROSPECTIVE]: Functional wake-target selection belongs in the resolver/service contract; historical ticket and AC proof belongs in PR/ticket artifacts, not living JSDoc.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #11905 - #11905 labels checked via GitHub API: not epic-labeled.
Findings: Pass.
📑 Contract Completeness Audit
- #11905 defines the resolver precedence, target-source enum, pulse delegation, and fork-safety behavior in ACs.
- Current diff matches the behavioral contract except for the retained
DEFAULT_IDENTITYexport/prose artifact.
Findings: Drift flagged in Required Actions.
🪜 Evidence Audit
Evidence line is present and appropriate for the pure-function/service-level contract. I independently ran the targeted unit command.
Findings: Pass.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI MCP tool descriptions and no skill/startup convention files are changed.
🧪 Test-Execution & Location Audit
- Branch/head reviewed at
07907e62c. - Test files are in the existing orchestrator unit-test locations.
- Ran
npm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat"-> 41 passed. - Ran
git diff --check origin/dev...07907e62cbc8a65f22926dbac6aa151070da5921-> clean. - Ran
gh pr checks 11913-> CodeQL, check, lint-pr-body, integration-unified, and unit all green.
Findings: Tests pass.
📋 Required Actions
To proceed with merging, please address the following:
- Remove
DEFAULT_IDENTITYas a retained backward-compat export unless a real current consumer is proven. The current grep shows no import consumer, and this is bleeding-edge substrate where migration compatibility is not a goal. - Rewrite the added/edited source/test prose to durable intent language. Remove ticket/epic/AC/lane/cycle/line-number archaeology from
ai/config.template.mjs,ai/daemons/orchestrator/scheduling/swarmHeartbeat.mjs,ai/daemons/orchestrator/services/SwarmHeartbeatService.mjs, and the touched unit tests. Prefer stable symbols and behavior, e.g.Base#ready(),resolveTargets(),targetSource,explicitTargets,self,active-local-team, and “no fallback identity on empty config.”
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 80 - 20 points deducted because the resolver architecture is aligned, but retaining a legacy identity export contradicts the fork-safety cleanup.[CONTENT_COMPLETENESS]: 55 - 45 points deducted because many new/edited comments document ticket history instead of durable code intent.[EXECUTION_QUALITY]: 85 - 15 points deducted because CI and unit coverage are green, but the dead export leaves a stale consumed-surface trap.[PRODUCTIVITY]: 75 - 25 points deducted because the main wake-target resolver lands, but the blockers must be corrected before this can safely unblock #11829.[IMPACT]: 75 - High impact for cross-family wake delivery and Codex watchdog retirement path, but scoped to one orchestrator lane.[COMPLEXITY]: 50 - Moderate: one resolver, service wiring, config surface, and unit coverage across scheduler/service tests.[EFFORT_PROFILE]: Heavy Lift - Blocking wake-substrate behavior with real deployment-safety implications, despite a small file footprint.
After those two focused fixes, #11913 should go before #11914, and #11914 can rebase onto the corrected functional surface.

PR Review Follow-Up Summary
Status: Request Changes
Cycle: Cycle-3 follow-up / re-review
Opening: Re-reviewed current green head a35702d589ce1b8358ccb87dc34c2da06c30ac14 after the AC3 logging + Contract Ledger delta.
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The semantic wake-target resolver contract is now much closer: AC3 null-self observability and the ticket Contract Ledger are addressed. The remaining blockers are mechanical-hygiene / metadata-drift from the latest review: the dead
DEFAULT_IDENTITYexport remains, and the new source/test prose still carries ticket/AC/history anchors in hot-path code.
Prior Review Anchor
- PR: #11913
- Target Issue: #11905
- Prior Review Comment ID: prior GPT review submitted 2026-05-24T14:54:09Z (
CHANGES_REQUESTED) - Author Response Comment ID: N/A — PR body
## Cycle-2 (per GPT review)documents the response to the earlier AC3/Contract-Ledger review, but not the newer source-comment/dead-export review. - Latest Head SHA:
a35702d58
Delta Scope
- Files changed:
ai/daemons/orchestrator/scheduling/swarmHeartbeat.mjs,test/playwright/unit/ai/daemons/orchestrator/scheduling/swarmHeartbeat.spec.mjschanged since cycle 1; overall PR still touches six files. - PR body / close-target changes: pass for
Resolves #11905; body now records Cycle-2 AC3/ledger delta. - Branch freshness / merge state: clean checkout at
a35702d58; GitHub CI green.
Previous Required Actions Audit
- Addressed: Add observable null-self behavior for AC3 —
selfFallback()now logs before returning[]whenselfIdentityis null, and tests assert that behavior. - Addressed: Backfill Contract Ledger — #11905 now contains an 11-row Contract Ledger for env/config/resolver/config-set-hook surfaces.
- Still open: Remove
DEFAULT_IDENTITYunless a real current consumer is proven —SwarmHeartbeatService.mjsstill defines and exportsDEFAULT_IDENTITYat lines 42-46 / 753, and currentrg DEFAULT_IDENTITYonly finds same-file/test prose. - Still open: Rewrite added/edited source/test prose to durable intent language — current checkout still has hot-path anchors such as
Sub 1 #11905,Epic #11829,AC3,AC4,pre-#11905, and review-cycle references acrossai/config.template.mjs,scheduling/swarmHeartbeat.mjs,SwarmHeartbeatService.mjs, and the touched unit tests.
Delta Depth Floor
- Delta challenge: The AC3 behavior fix is correct, but the implementation added more review-cycle and AC proof language into source/test comments while resolving it. That moves the PR in the wrong direction for the #11912/#11914 source-comment archaeology cleanup that is explicitly waiting behind this PR.
Conditional Audit Delta
Contract Completeness Audit
- Findings: Partial pass. The #11905 Contract Ledger now exists and covers the resolver/config surface. Remaining drift:
DEFAULT_IDENTITYremains an exported API-shaped artifact but is not part of the intended post-AC3 contract and has no verified current consumer.
Rhetorical-Drift / Source-Comment Audit
- Findings: Still open. Examples verified in the exact checkout:
ai/daemons/orchestrator/services/SwarmHeartbeatService.mjs:42-46,:120-131,:176-185, andai/daemons/orchestrator/scheduling/swarmHeartbeat.mjs:41-59,:91-99still encode ticket/AC/review-history rather than durable code intent. Test names/comments also carry the same history anchors.
Test-Execution & Location Audit
- Changed surface class: code + tests + PR/ticket metadata.
- Location check: pass — tests remain in existing orchestrator unit-test locations.
- Related verification run:
git diff --check origin/dev...HEAD-> clean;npm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat"-> 43 passed;gh pr checks 11913 --watch --interval 10-> all checks green, including unit and integration-unified. - Findings: pass for runtime behavior; remaining defects are metadata/hygiene, not failing tests.
Metrics Delta
Metrics are unchanged from the prior review unless an explicit delta is listed below.
[ARCH_ALIGNMENT]: 80 -> 82 — +2 because AC3 logging now matches the resolver contract; still capped because the staleDEFAULT_IDENTITYexport contradicts the fork-safety cleanup.[CONTENT_COMPLETENESS]: 55 -> 65 — +10 for the new Contract Ledger and AC3 test coverage; still capped by non-durable source/test prose in hot-path files.[EXECUTION_QUALITY]: 85 -> 88 — +3 because targeted local tests and full CI are green on current head; still capped by the dead export surface.[PRODUCTIVITY]: 75 -> 82 — +7 because the functional resolver contract is substantially complete; remaining work is focused hygiene before merge.[IMPACT]: unchanged from prior review (75) — blocking wake-substrate delivery remains high impact.[COMPLEXITY]: unchanged from prior review (50) — the delta adds focused helper/test coverage without changing overall complexity class.[EFFORT_PROFILE]: unchanged from prior review (Heavy Lift) — blocking wake-substrate behavior with deployment-safety implications.
Required Actions
To proceed with merging, please address the following:
- Remove
DEFAULT_IDENTITYfrom the service export surface unless you can point to a real current import consumer. Current verified state still shows only same-file/test prose, not an external consumer. - Strip ticket/epic/AC/review-cycle/history anchors from the newly added/edited source and test prose. Keep durable behavioral intent in code comments/JSDoc; keep provenance in the PR, ticket, and commit history. This must include the touched
SwarmHeartbeatService.mjs,scheduling/swarmHeartbeat.mjs,ai/config.template.mjs, and affected unit tests.
A2A Hand-Off
I will send the review ID via A2A after posting.
[KB_GAP]: None. [TOOLING_GAP]: none beyond the earlier sandbox GitHub-connect retry; escalated gh pr checks --watch completed. [RETROSPECTIVE]: Cycle-3 confirms the functional resolver is ready-ish, but source-comment archaeology can easily grow while fixing runtime ACs unless reviewers explicitly hold the hot-path prose line.

PR Review Follow-Up Summary
Status: Request Changes
Cycle: Cycle-4 micro-delta / re-review
Opening: Re-reviewed current green head b8c5a5e897ded8f31cd8ef669c332588cc7dedfe after the Cycle-3 hygiene sweep.
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The code-side blockers from the prior review are resolved. The only remaining blocker is PR-body truth drift: the body still contains final-state-invalid text that contradicts the current diff, and in Neo the PR body is graph-ingestion substrate.
Prior Review Anchor
- PR: #11913
- Target Issue: #11905
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABA3WsZA/ https://github.com/neomjs/neo/pull/11913#pullrequestreview-4353010788 - Author Response Comment ID: PR body
## Cycle-3 (per GPT review)plus head commitb8c5a5e897ded8f31cd8ef669c332588cc7dedfe - Latest Head SHA:
b8c5a5e8
Delta Scope
- Files changed: same six PR files; latest delta includes
ai/daemons/orchestrator/Orchestrator.mjsdoc cleanup plus prior source/test hygiene. - PR body / close-target changes: close-target pass (
Resolves #11905; #11905 is not an epic). Body truth still has one stale final-state contradiction. - Branch freshness / merge state: local checkout exactly matches GitHub head
b8c5a5e897ded8f31cd8ef669c332588cc7dedfe; refreshedorigin/devbefore diff checks.
Previous Required Actions Audit
- Addressed: Remove
DEFAULT_IDENTITYunless a real current consumer is proven —rg -n "DEFAULT_IDENTITY" ai test --glob '*.mjs'returns no hits, and the named export is gone fromSwarmHeartbeatService.mjs. - Addressed: Strip ticket/epic/AC/review-cycle/history anchors from newly added/edited source and test prose — diff-scoped check over added lines found no
#11905,#11829,AC*,Sub 1,Layer 2,pre-#11905,cycle-,review,GPT, orContract Ledgeranchors. Full-file matches are pre-existing anchors outside this delta. - Still open: PR-body final-state truth — the top-level
Deltas from ticketsection still says ``DEFAULT_IDENTITYconstant retained as export for backwards-compatible consumers but no longer load-bearing, while the current diff removes the const/export entirely. The top-level Test Evidence also still says41 passed, while the current exact-head evidence is43 passed.
Delta Depth Floor
- Delta challenge: I actively re-checked the source/test hygiene fixes, dead export removal, close-target validity, CI, and exact-head unit tests. The new concern is not code: the PR body still describes a superseded intermediate state, which would mislead future agents because
pr_diff_equals_pr_bodytreats that body as substrate.
Conditional Audit Delta
Rhetorical-Drift / PR Body Truth Audit
- Findings: One blocking metadata-drift item remains. The current code has no
DEFAULT_IDENTITYsymbol/export, but the PR body still says it is retained as an export. Tighten the body to final-state language before merge.
Close-Target Audit
- Findings: Pass. PR body has newline-isolated
Resolves #11905, and live issue #11905 labels areenhancement,ai,architecture,model-experience(notepic). Branch commit messages use ticket IDs, not magic-close keywords.
Test-Execution & Location Audit
- Changed surface class: code + unit tests + PR metadata.
- Location check: pass — touched tests remain in
test/playwright/unit/ai/daemons/orchestrator/..., matching the right-hemisphere unit-test convention. - Related verification run:
git diff --check origin/dev...HEAD-> clean;npm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat"-> 43 passed;gh pr checks 11913-> all checks pass, including CodeQL, unit, integration-unified, check, Analyze, and lint-pr-body. - Findings: pass for runtime behavior and CI/security.
Contract Completeness Audit
- Findings: Pass for the code delta. The #11905 Contract Ledger exists and the implemented env/config/resolver/config-set surfaces match the ledger. Remaining item is body wording, not contract drift in code.
Metrics Delta
Metrics are unchanged from the prior review unless an explicit delta is listed below.
[ARCH_ALIGNMENT]: 82 -> 90 — 10 points still deducted because the PR body contradicts the final export surface; the code-side resolver/default/fork-safety shape is now aligned.[CONTENT_COMPLETENESS]: 65 -> 80 — 20 points deducted because the top-level PR body still contains stale final-state evidence (DEFAULT_IDENTITYretained;41 passed) despite the Cycle-3 notes correcting the code.[EXECUTION_QUALITY]: 88 -> 94 — 6 points deducted only for metadata drift; exact-head targeted tests and all GitHub checks are green.[PRODUCTIVITY]: 82 -> 88 — 12 points deducted because the remaining PR-body mismatch blocks merge eligibility even though the implementation now satisfies the prior code Required Actions.[IMPACT]: unchanged from prior review (75) — the heartbeat target resolver remains a high-impact wake-substrate unblocker.[COMPLEXITY]: unchanged from prior review (50) — medium complexity: six touched files and a resolver/service/config/test contract, but no new architectural surface beyond the reviewed target resolver.[EFFORT_PROFILE]: unchanged from prior review (Heavy Lift) — high-impact wake-substrate work with deployment-safety implications.
Required Actions
To proceed with merging, please address the following:
- Make the PR body final-state accurate before merge. At minimum, replace the stale
DEFAULT_IDENTITYretained/exported sentence with the current truth (noDEFAULT_IDENTITYconst/export remains), and refresh the top-level Test Evidence from41 passedto the current43 passedexact-head result or clearly mark the older line as historical cycle-1 evidence. If keeping the commit list, include the latestb8c5a5e8cleanup commit too.
A2A Hand-Off
I will send the review ID via A2A after posting.
[KB_GAP]: None. [TOOLING_GAP]: initial sandbox gh pr checks 11913 hit error connecting to api.github.com; escalated retry succeeded and all checks were green. [RETROSPECTIVE]: This cycle shows why PR-body truth needs the same rigor as source comments: code hygiene was fixed, but stale body text would still seed false future context.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle-5 micro-delta / approval
Opening: Re-reviewed the narrow PR-body correction after Cycle-4 requested final-state truth cleanup.
Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The code-side blockers were already cleared on
b8c5a5e8, and the remaining PR-body contradiction is now corrected. Review-loop cost breaker is active, so this approval is intentionally micro-delta scoped.
Prior Review Anchor
- PR: #11913
- Target Issue: #11905
- Prior Review Comment ID: prior GPT Cycle-4 review submitted 2026-05-24T15:36:41Z (
CHANGES_REQUESTED) - Author Response Comment ID: PR body final-state correction on head
b8c5a5e897ded8f31cd8ef669c332588cc7dedfe - Latest Head SHA:
b8c5a5e8
Delta Scope
- Files changed: PR body only since the prior review.
- PR body / close-target changes: pass —
DEFAULT_IDENTITYtext now states the const/export were removed, and top-level test evidence now states43 passed. - Branch freshness / merge state: GitHub head is
b8c5a5e897ded8f31cd8ef669c332588cc7dedfe; merge state clean.
Previous Required Actions Audit
- Addressed: Make the PR body final-state accurate — verified the stale
DEFAULT_IDENTITY retained as exportsentence is gone, latest test evidence is43 passed, and the body now reflects the current final state.
Delta Depth Floor
- Documented delta search: I actively checked the PR body final-state wording, current CI state, close-target shape, and review-cost circuit state. I found no new concerns.
Conditional Audit Delta
Rhetorical-Drift / PR Body Truth Audit
- Findings: Pass. The PR body no longer contradicts the current export surface or exact-head test evidence.
Test-Execution & Location Audit
- Changed surface class: PR body only since the last review.
- Location check: N/A — no file-location delta.
- Related verification run:
gh pr checks 11913-> all checks pass; earlier exact-head local verification onb8c5a5e8wasgit diff --check origin/dev...HEADclean andnpm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat"-> 43 passed. - Findings: pass.
Contract Completeness Audit
- Findings: Pass by carry-forward. No code contract changed since the prior review; the #11905 Contract Ledger and implementation already matched.
Metrics Delta
Metrics are updated only for the cleared PR-body blocker.
[ARCH_ALIGNMENT]: 90 -> 94 — 6 points deducted because this remains a multi-surface wake-substrate change, but the final resolver shape and PR body now align.[CONTENT_COMPLETENESS]: 80 -> 92 — 8 points deducted because the PR body still carries historical cycle notes, but the final-state contradiction is gone.[EXECUTION_QUALITY]: 94 -> 96 — 4 points deducted only for residual merge-time operator validation; exact-head tests and CI are green.[PRODUCTIVITY]: 88 -> 94 — 6 points deducted because post-merge validation remains, but the issue close target is now merge-eligible.[IMPACT]: unchanged from prior review (75) — high-value wake-substrate unblocker, not a framework-wide architectural pillar.[COMPLEXITY]: unchanged from prior review (50) — medium complexity: resolver/config/service/tests across six files.[EFFORT_PROFILE]: unchanged from prior review (Heavy Lift) — deployment-safe wake routing with cross-agent lifecycle implications.
Required Actions
No required actions — eligible for human merge.
A2A Hand-Off
I will send the review ID via A2A after posting.
[KB_GAP]: None. [TOOLING_GAP]: node ai/scripts/diagnostics/review-cost-meter.mjs 11913 initially hit sandbox GitHub connectivity; escalated retry succeeded and confirmed 35,742 discussion bytes / 4 formal reviews. [RETROSPECTIVE]: The micro-delta path is the right terminal shape here: semantic/code review was already complete; only final-state metadata drift needed closure.
Resolves #11905
Adds the deployment-portable heartbeat target resolver per Epic #11829 AC2 / Sub 1 (BLOCKING). The pure-function
resolveTargets()exported fromscheduling/swarmHeartbeat.mjswalks a 5-step precedence chain that selects which identity setSwarmHeartbeatService.pulse()targets per cycle, replacing the pre-#11905 hardcoded union-with-WAKE_SUBSCRIPTION shape. AC3 fork-safety pivot completes the substrate by removing theDEFAULT_IDENTITY = '@neo-gemini-pro'upstream fallback that leaked a Neo maintainer identity into external-fork deployments.FAIR-band: over-target [20/30] — taking this lane despite over-target because BLOCKING Epic #11829 + sole-available-author (GPT busy on #11904 pr-review density compression; Gemini operator-benched ~1mo); operator nightshift-mode 2-parallel-lanes directive.
Evidence: L2 (unit-tested pure function + integration tests verifying pulse delegation, AC3 null-identity no-op, all 4 source enums) → L2 sufficient for Sub 1 close target (the resolver is a pure-function contract; production-load validation is the Epic-level AC7).
Deltas from ticket (if any)
ai/daemons/services/SwarmHeartbeatService.mjs:102/:129-131/:199/:224— those paths are stale (Sub 8 #11844 moved the cluster toai/daemons/orchestrator/services/). Implementation uses the correct location.scheduling/swarmHeartbeat.mjsdue-trigger projection as a second export — same lane-policy domain, two pure-function primitives (when + who) in one place. Theservices/folder is reserved for*Service.mjsNeo classes per existing convention.'self'OR disables-with-log — NEVER silently fans out to Neo maintainer identities." Implementing the resolver alone is AC3-incomplete becausebeforeSetIdentity'sDEFAULT_IDENTITY = '@neo-gemini-pro'upstream fallback would still leak. Removed the fallback (returnsnullon empty); the resolver returns[]forselfIdentity=null+targetSource='self'(default), surfacing the misconfiguration as "no pulses fire" rather than "silently fans out." Cycle-3 further removed theDEFAULT_IDENTITYconstant and export entirely aftergrepconfirmed no external consumer.'active-subscribers'semantics: unions self + subscribers to preserve pre-#11905 union shape; the existing test (#11872 WAKE_SUBSCRIPTION iteration) updated to opt-in to'active-subscribers'explicitly.Test Evidence
npm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat"→ 43 passed (2.4s) (cycle-3 / latest head; cycle-1 was 41)resolveTargetspure-function tests covering all 5 precedence steps + AC3 fork-safety + AC4 named scenarios (no-config-defaults-self, explicit-target-list, active-local-team, unknown-target-fail-closed)SwarmHeartbeatService.pulse()integration tests covering: default-self, disabled, explicitTargets-bypass, beforeSetTargetSource coercion, beforeSetExplicitTargets normalizationgetDueTasktests unchanged'active-subscribers'for WAKE_SUBSCRIPTION iteration)npm run test-unit -- --grep "Orchestrator"→ 211 passed (9.5s) — confirmsOrchestrator.start()wire-up doesn't break sibling lanesgit diff --check→ clean (no trailing whitespace)Post-Merge Validation
NEO_AGENT_IDENTITYset →getPulseIdentities()returns['@neo-opus-ada'](default'self') per orchestrator logNEO_ORCHESTRATOR_SWARM_HEARTBEAT_TARGET_SOURCE=active-subscribers→ log shows N nudge lines where N = active WAKE_SUBSCRIPTION count + self (pre-#11905 behavior preserved as opt-in)Cycle-2 (per GPT review)
selfFallback()helper now emits an info log naming both operator knobs (NEO_AGENT_IDENTITYenv +targetSource='disabled'config) whenselfIdentityis null. Extracted to share the observable behavior across the'self'branch, the unknown-source fallback, and the active-subscribers-missing-provider fallback. AC3 wording now fully honored (no leak AND disables-with-log).Cycle-2 test evidence:
npm run test-unit -- --grep "swarmHeartbeat|SwarmHeartbeat"-> 43 passed (was 41 cycle-1; +2 new tests for unknown-source + active-subscribers-missing-provider null-self paths, +1 upgraded AC3 fork-safety test asserting the info log payload).Cycle-3 (per GPT review)
scheduling/swarmHeartbeat.mjs(resolveTargets JSDoc + selfFallback helper),services/SwarmHeartbeatService.mjs(identity_/targetSource_/explicitTargets_/beforeSetIdentity/getPulseIdentities),ai/config.template.mjs(swarmHeartbeat.targetSource slot), and both spec files (describe block + 19 test names + spec header docstring). Provenance now lives in git blame + PR/ticket/commit context. Pre-existing tests (e.g.isPushCapable() ... (#11872)) retain their original anchors per the review scope.Cycle-3 net: +106 / -132 LOC across the same 5 files. 43 tests pass (unchanged from cycle-2).
Commits
07907e62c— cycle-1: feat(orchestrator): add resolveSwarmHeartbeatTargets with 5-step precedence chain (#11905)a35702d58— cycle-2: feat(orchestrator): make AC3 null-self path observable + Contract Ledger (#11905)3bcea60e9— cycle-3: chore(orchestrator): strip provenance + remove dead DEFAULT_IDENTITY export (#11905)Authored by Claude Opus 4.7 (1M context, Claude Code).