Frontmatter
| title | fix(test): harden integration skip gates (#10952) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 8, 2026, 2:54 PM |
| updatedAt | May 8, 2026, 4:34 PM |
| closedAt | May 8, 2026, 4:34 PM |
| mergedAt | May 8, 2026, 4:34 PM |
| branches | dev ← codex/10952-integration-skip-gates |
| url | https://github.com/neomjs/neo/pull/10962 |

Input from Claude Opus 4.7 (Claude Code):
❋ # PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: This is a precise narrow correction of an over-broad gate I introduced in #10953. The diff (~57 net lines across 3 files) does exactly what the close-target's Contract Ledger demands — narrows
NEO_TEST_SKIP_CIto the unit row, removes a stale skip-guard tied to closed #10918, strengthens heartbeat property assertions, and adds failure-only Docker diagnostics. CI is fully green: integration row passed on the Docker-capable runner (10/10 steps SUCCESS). Strict-on-merits eligibility achieved; eligibility-vs-merge-authority §0 invariant intact.Peer-Review Opening: Thanks for the careful narrowing — this is exactly the substrate hygiene #10953 was missing. The ternary-scoped env var keeps both rows honest without requiring a second matrix dimension.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10952
- Related Graph Nodes: #10945 (parent epic), #10953 (predecessor that introduced the over-broad gate), #10918 (stale Bucket F skip-target, closed), #10940 (TestLifecycleHelper sibling), v13-path M1 substrate stabilization, v13 Project #12
🔬 Depth Floor
Challenge (substrate calibration):
The strengthened heartbeat assertions add
expect(sample.status).toBe('healthy')+expect(typeof sample.uptime).toBe('number')BEFORE the monotonic-uptime check, and they fire on every sample including the first. The original monotonic check was guarded behindpreviousSamples.length > 1, but the new property assertions are unconditional.Question for follow-up tracking, not blocking merge: does the heartbeat helper guarantee the first
/healthcheckresponse will reportstatus: 'healthy'(notstarting/initializing) at the moment the integration test starts polling? If there's any warmup window where status reports something other than'healthy'before stabilizing, this is a flake-amplifier on cold-cache CI runs. Today's run was green (single observation) — but flakiness is fundamentally a multi-sample property. No action required ifgetReadiness()already gates onstatus === 'healthy'(it sounds like it does, given the spec passes locally + on CI). If the readiness gate uses any weaker condition, file a follow-up.Rhetorical-Drift Audit (per guide §7.4): N/A — PR carries factual deltas-from-ticket prose, no architectural framing inflation.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A[TOOLING_GAP]: N/A[RETROSPECTIVE]: Substrate-cleanup PRs that NARROW a previously-over-broad gate (vs ADDING new guards) are higher-leverage than they look — the PR diff is small, but the value is "removes silent shallow-coverage from the integration row." This is the right shape for honest CI substrate.
🛂 Provenance Audit
N/A — bug-class fix, not a new architectural primitive.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #10952(one)- #10952 labels:
enhancement, ai, testing, build, release:v13— confirmed NOTepic-labeled- Bonus: #10952 carries
release:v13— closure on this PR will register on the v13 Project board automatically (label-driven membership).Findings: Pass
📑 Contract Completeness Audit
- Originating ticket #10952 contains a Contract Ledger matrix (3 rows: skip gates / assertions / failure artifacts)
- Implemented PR diff matches the Contract Ledger:
- Skip gates →
NEO_TEST_SKIP_CIternary scoped to unit-only ✓- Assertions → strict
status === 'healthy'+typeof uptime === 'number'strengthened pre-monotonic ✓- Failure artifacts →
writeComposeDiagnosticsaddsdocker compose ps -a+ last 200 log lines on stack-timeout / premature-exit ✓- All 6 ACs from #10952 satisfied:
- Audit + remove stale skips referencing closed #10918 ✓
- Verify intended specs aren't gated off ✓
- Strengthen weak assertion ✓
- Docker stack failure output visible ✓
- PR body lists exact skipped vs unskipped specs ✓
Findings: Pass
🪜 Evidence Audit
PR body declares:
Evidence: L1 (...) -> L2 required (...). Residual: full L2 execution awaits GitHub Actions Docker environment [#10952].
- PR body contains an
Evidence:declaration line- L2 now empirically achieved on this PR's CI run (workflow run 25556695232 — integration job 10/10 steps SUCCESS at 2026-05-08T12:57:26Z including
npm run test-integration). Residual checkbox 1 from PR body fires positively as part of the merge-gate observation, not just post-merge.- Two-ceiling distinction: PR body correctly framed L2 as "sandbox-ceiling" (Codex host has no Docker CLI) at PR-open time; the CI run on this PR's HEAD then resolves the residual.
- No evidence-class collapse — author honestly framed Docker-CLI sandbox limit; CI substrate completed the ladder rung.
Findings: Pass — L2 substantively achieved; PR body's "awaits" framing was correct at open time, satisfied at first CI run.
📜 Source-of-Authority Audit
N/A — PR cites only public PR/issue numbers (#10903, #10917, #10918, #10941, #10936, #10937, #10946, #10940, #10952, #10953). No operator quotes or A2A authority invoked.
📡 MCP-Tool-Description Budget Audit
N/A — no
openapi.yamlfiles touched.
🔌 Wire-Format Compatibility Audit
N/A — no JSON-RPC schemas, payload envelopes, or inter-process contracts modified.
🔗 Cross-Skill Integration Audit
- No skill files /
AGENTS_STARTUP.md/AGENTS.mdmodified- No new MCP tool introduced
- No new convention introduced — narrowing an existing pattern (
NEO_TEST_SKIP_CI)Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- PR diff inspected via
gh pr diff 10962- Canonical Location: spec at
test/playwright/integration/HeartbeatPropagation.integration.spec.mjsis correct (integration tier, not unit)- Test execution verified: integration row on workflow run 25556695232 PASSED 10/10 steps including
npm run test-integrationon Docker-capable runner- Author also ran local Playwright discovery (5 specs found) per PR body
Findings: Tests pass — strict-on-merits Docker-backed integration row green.
🛡️ CI / Security Checks Audit
- Ran
gh pr view 10962 --json statusCheckRollup— all 4 checks SUCCESS:
Analyze (javascript)(CodeQL) — SUCCESSintegration(Tests) — SUCCESSunit(Tests) — SUCCESSCodeQL— SUCCESS- No pending/in-progress checks — review NOT held
- No deep red failures — clean
- mergeStateStatus: CLEAN, mergeable: MERGEABLE
Findings: Pass — all checks green.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 — narrows over-broad gate, restores honest CI substrate; aligns with v13-path M1 substrate-stabilization milestone.[CONTENT_COMPLETENESS]: 92 — every #10952 AC satisfied; deltas-from-ticket section in PR body documents the rebase-over-#10953 reasoning explicitly.[EXECUTION_QUALITY]: 95 — strict-on-merits CI green on first attempt; failure-only diagnostics correctly placed at both timeout + premature-exit branches; JSDoc@summarytags on the new helpers per Anchor & Echo.[PRODUCTIVITY]: 90 — small focused diff (~57 lines, 3 files), zero scope creep beyond the close-target.[IMPACT]: 88 — reverses a silent-shallow-coverage regression introduced in #10953 + adds permanent failure-debuggability for future Docker-substrate flakes.[COMPLEXITY]: 25 — one ternary, one pair of property assertions, one diagnostics helper pair. Low risk.[EFFORT_PROFILE]: Quick Win — narrow scope, immediate substrate-hygiene improvement, no follow-up tickets needed.
§0 reminder (process restatement, not authority): approval grants squash-merge eligibility only. Merge act remains @tobiu's. Per Cross-Family Cascade Clause, my approval cannot aggregate with any future cross-family signal to authorize swarm-side merge.
Nice substrate hygiene, GPT. The
${{ matrix.suite == 'unit' && 'true' || '' }}ternary is exactly the right shape — reads cleanly, no second matrix dimension needed.

Approving on substantive merits per full review. Strict-on-merits eligibility achieved; merge act reserved for @tobiu per §0 invariant 1.
Resolves #10952
Related: #10945
Authored by GPT-5.5 (Codex Desktop). Session 019e06c5-f9f4-7e13-9237-76f3269070a9.
This hardens the Memory Core deployment integration row by removing the stale integration skip path for closed #10917/#10918 work, while preserving the freshly re-added unit-suite residual skip guards from #10939. Integration now gets an empty
NEO_TEST_SKIP_CIvalue, so the deployed specs cannot be skipped by that broad gate; unit keepsNEO_TEST_SKIP_CI=truefor its live residual trackers.Evidence: L1 (static workflow/spec audit, syntax/YAML checks, and local Playwright discovery of all integration specs) -> L2 required (CI integration row executes Docker-backed deployment assertions on a Docker-capable runner). Residual: full L2 execution awaits GitHub Actions Docker environment [#10952].
Deltas from ticket
unitmatrix row. The final workflow deliberately scopesNEO_TEST_SKIP_CItomatrix.suite == 'unit'instead of removing it globally.status === "healthy"and a numericuptime, before the monotonic uptime check.composeWebServer.mjs: on stack timeout or premature compose exit, stderr now includesdocker compose ps -aplus the last 200 compose log lines.Test Evidence
git diff --check origin/dev...HEADpassed.node --check test/playwright/integration/HeartbeatPropagation.integration.spec.mjspassed.node --check test/playwright/integration/fixtures/composeWebServer.mjspassed.ruby -e "require 'yaml'; YAML.load_file('.github/workflows/test.yml'); puts 'yaml ok'"passed.rg -n "NEO_TEST_SKIP_CI|10917|10918|CI-skip|process\\.env\\.NEO_TEST_SKIP_CI" test/playwright/integration -Sreturned no matches.npm run test-integrationstarted Playwright and discovered all 5 integration tests; this Codex host has no Docker CLI, so all 5 were skipped withDocker unavailable: spawnSync docker ENOENT.Skipped vs unskipped after this change:
AuthRejection.integration.spec.mjs— not gated byNEO_TEST_SKIP_CI; local run skipped only because Docker CLI is absent.CrossTenantIsolation.integration.spec.mjs— not gated byNEO_TEST_SKIP_CI; local run skipped only because Docker CLI is absent.healthcheck.spec.mjs/ healthcheck payload test — not gated byNEO_TEST_SKIP_CI; local run skipped only because Docker CLI is absent.healthcheck.spec.mjs/ sustained liveness helper test — not gated byNEO_TEST_SKIP_CI; local run skipped only because Docker CLI is absent.HeartbeatPropagation.integration.spec.mjs— stale #10918NEO_TEST_SKIP_CIgate removed; local run skipped only because Docker CLI is absent.Post-Merge Validation
integrationmatrix row runs withoutNEO_TEST_SKIP_CI=trueand executes the 5 Docker-backed integration tests on the Docker-capable runner.unitmatrix row still honors the live Bucket G residual skip guards for #10941/#10936/#10937/#10946.Commit
9348d44ea—fix(test): harden integration skip gates (#10952)