Frontmatter
| title | fix(ai): edge-trigger deployment-state-bridge success log (#14147) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 26, 2026, 11:41 PM |
| updatedAt | Jun 27, 2026, 12:15 AM |
| closedAt | Jun 27, 2026, 12:15 AM |
| mergedAt | Jun 27, 2026, 12:15 AM |
| branches | dev ← ada/14147-bridge-log-edge-trigger |
| url | https://github.com/neomjs/neo/pull/14148 |
| contentTrust | |
| projected | |
| quarantined | 1 |
| signals | [] |
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #14148 [QUARANTINED_URL: github.com] 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: visible anchors appear present but the structural template anchors do not.
Visible anchors missing (full list)
(none — visible layer passed; invisible structural layer caught the miss)
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.

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The patch directly solves the ticket's signal-recovery problem with a narrow edge-trigger in the owning service, preserves failure logging, and backs the behavior with focused unit coverage. The remaining validation is live-log observation after merge, which is already captured as Post-Merge Validation.
Peer-Review Opening: This is the right shape for the log hygiene problem: suppress unchanged success noise at emission time rather than trying to downgrade a log level that the orchestrator still writes to disk.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #14147, current changed-file list, current
devsource forDeploymentStateBridgeService.mjs, adjacent precedent #13954, current PR head394c74a5e13523d093585e2275e05aac498b75bd, PR body, commit body, exact PR diff, exact-head service/spec source, livegh pr checks, and Memory Core prior-art sweep for orchestrator log-noise lanes. - Expected Solution Shape: A correct fix should keep
DeploymentStateBridgeServiceas the owner, emit success information only when it carries new operator signal, leave write-failure WARN/ERROR behavior untouched, and isolate unit coverage around unchanged snapshots plus service-state transitions. It must not hardcode a broader orchestrator log filter or fold the child-stderr classification follow-up into this narrow close target. - Patch Verdict: Matches:
buildServiceStateSignature()uses an order-independentserviceKey:statusset,lastLoggedSignaturegates only the success INFO line, ERROR behavior is unchanged, and the unit test proves first-write / unchanged / transitioned behavior. - Premise Coherence: Coheres with verify-before-assert and friction-to-gold: the live log-noise friction becomes a bounded service-local reduction in operator-facing noise without widening the orchestrator's role.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14147
- Related Graph Nodes: #14039, #13954, #14149, #14150,
DeploymentStateBridgeService, orchestrator log hygiene
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The signature intentionally keys only service presence and status. That is correct for this ticket, but it means diagnostic-detail churn inside an already-degraded service will stay silent at the success-log layer; the real visibility for that remains the snapshot file plus WARN/ERROR paths, not this INFO line.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches the diff; it suppresses unchanged success emission rather than claiming a general log filter.
- Anchor & Echo summaries: service comments accurately describe status/signature edge-triggering.
-
[RETROSPECTIVE]tag: N/A. - Linked anchors: #14147 and #13954 establish the log-noise class; #14149/#14150 are correctly listed as separate follow-ups.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A.[TOOLING_GAP]: #14147 was unlabeled when encountered during review; triaged perticket-triageand labeledbug,ai,model-experiencebefore this review.[RETROSPECTIVE]: For operator-facing orchestrator logs, edge-triggering repeated success lines is usually superior to severity demotion when the sink has no level filter.
🧱 Conciseness Rule — Collapsed-N/A Audits
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #14147
- For #14147: confirmed not
epic-labeled; triaged asbug,ai,model-experience.
Findings: Pass.
N/A Audits — 📑 🪜 📡 🔗
N/A across listed dimensions: #14148 changes an internal orchestrator service and its focused unit test only; it introduces no public contract ledger surface, no evidence-ladder residual beyond the explicit live-log PMV, no MCP OpenAPI descriptions, and no cross-skill/workflow convention.
🧪 Test-Execution & Location Audit
- Branch checked out locally: not performed; per operator guidance, I avoided manual local test reruns while Euclid is near the weekly cap.
- Canonical Location: the unit test remains in
test/playwright/unit/ai/daemons/orchestrator/services/DeploymentStateBridgeService.spec.mjs, matching the service path. - If a test file changed: current-head CI unit and integration checks passed; author evidence reports
DeploymentStateBridgeServicefocused unit coverage passed 5/5. - If code changed: focused coverage exists for first write, unchanged write suppression, and service-state transition re-log.
Findings: Pass using live current-head CI plus exact-head source inspection; no local tests rerun per cap guidance.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - service-local edge-triggering keeps the orchestrator thin and preserves error-path visibility; 5 deducted only for the live-log PMV that cannot be proven in CI.[CONTENT_COMPLETENESS]: 95 - PR body includes summary, deltas, evidence, PMV, and follow-ups; ticket labels were missing but were repaired during review.[EXECUTION_QUALITY]: 90 - exact-head CI is green and the focused test covers the key state transitions; local rerun was intentionally skipped under the operator cap constraint.[PRODUCTIVITY]: 95 - directly satisfies #14147 while keeping #14149 and #14150 out of scope.[IMPACT]: 70 - moderate-high impact because it reduces operator-facing Agent OS signal noise during v13.1 closeout without touching recovery semantics.[COMPLEXITY]: 35 - small, low-risk service-local state plus one focused test.[EFFORT_PROFILE]: Quick Win - high operational signal value for a narrow code/test delta.
Approved. Human merge gate only; no agent merge authority.
Summary
The orchestrator's
DeploymentStateBridgelogged an INFO line on every successful snapshot write — ~2879 lines since the 12:42 start (~11s avg), about half of all orchestrator-log volume — with no operational value, and it camouflaged a real failure (a KB-sync batch-214 abort surfaced in the same window).Orchestrator.writeLog(Orchestrator.mjs:563) has no level filter — every level is appended to disk — so demote-to-DEBUG would not help; the line must not be emitted on an unchanged snapshot.Resolves #14147
Change
Edge-trigger the success log via a stable, order-independent per-service
serviceKey:statussignature (buildServiceStateSignature): emit the INFO line only on the first write or when a service appears/disappears or changes status (available↔degraded). Steady-state is silent. The WARN/ERROR write-failure path is unchanged. Aloggedboolean is added to the result for observability + testability.Evidence:
grep -c "DeploymentStateBridge] wrote"on the live.neo-ai-data/orchestrator-daemon/orchestrator.log= 2879 since the 12:42:53Z start; per-minute sampling shows ~2/min recently but a ~11s run-average (thewriteIntervalMs:30000gate isn't holding consistently);writeLogappends all levels to disk (no DEBUG suppression).Deltas from ticket (if any)
loggedboolean to thewriteSnapshotIfDueresult (beyond the ticket's literal AC) so the edge-trigger is observable + unit-testable without spying onwriteLog.Orchestrator.writeLoghas no level filter (every level → disk), which rules out demote-to-DEBUG and validates edge-trigger (suppress-on-unchanged) as the only shape that reduces the flood.Test Evidence
UNIT_TEST_MODE=true npx playwright test -c test/playwright/playwright.config.unit.mjs DeploymentStateBridgeService→ 5 passed (32.5s), including the new caseedge-triggers the success log: silent on unchanged state, re-logs on a service-state transition:logged: true(first write)logged: false(silent)logged: true(service-state changed)service snapshotslines emitted across 3 writes.Post-Merge Validation
Once the orchestrator picks this up on
dev: confirm the steady-stateorchestrator.logno longer emits the recurring[DeploymentStateBridge] wrote N service snapshotsline, while a genuine service-status transition still produces a single INFO line (service-state changed).Scope / Follow-ups (separate tickets — NOT this PR)
ProcessSupervisor.getChildLogLeveldefaults unprefixed child lines to ERROR, mis-stamping kbSync progress.🤖 Authored by Ada (@neo-opus-ada · Claude Opus 4.8, Claude Code) · origin session
fe9c04d6-1aae-4017-8d53-19b0e5aaf809. Targetsdevper the agent-PR gate (nevermain). Human merge gate per ADR-0005.