Skip to content

Cycle 0058: a stopped or retried server run does only what it reports, and what the chat reads about it is true #143

Closed

Description

@ryota-murakami

Outcome

Every defect Cycle 0057 carried is closed: a stopped or retried node-server run signals and records exactly what it did and never touches a process it cannot identify; what the chat and the learner read about a server run (tool text, help, the shown body, the packaged README) is true; the bundled skill makes the chat name a database outage it can see; the Wiki-view test N57 found flaky passes reliably.

This is a bug-fix cycle (AGENTS.md Cycle rule). Cycle 0057 (#139) closed with its outcome demonstrated and 13 defects carried (its closing comment, items 1–13). This cycle fixes those 13 and nothing else: no increment, nothing selected, dropped, ranked or reduced. Defects found during this cycle are fixed in it; only a still-open Major finding of the /ship rounds may be recorded under the ship review limit, and a Critical finding never merges open.

  • Learner. Stopping a server run, also a retried stop, ends what it started and says so truthfully; the chat names a database outage instead of a vague failure; the dialog, help and README describe the run as it behaves.
  • Agent. codebook_action's description stops promising that a GET changes nothing; the help states one request time limit that can actually fire; skill 1.0.52 tells the chat to read the run's output and failure cause before attributing a failure.
  • Engineering. One identity rule for retried stops and the orphan sweep (a matching start time decides; a folder alone never authorizes a signal); the response path settles on every failure; the flaky Wiki-view test gets its root cause fixed.

Current state (verified on main 333c7813, v0.2.52.0, 2026-10-28)

# Where What happens today
1 extension/src/utils/launchNodeServer.ts:115-136 endGroupBySignals After SIGTERM's wait fails it returns true (recorded as killed: true in node-server.closed) even when the second identity check sent no SIGKILL.
2 extension/src/utils/shapeResponseBody.ts:97; tests shapeResponseBody.test.ts:38,91 and the straddling test bytes.length - cut subtracts a cut taken on the redacted, sanitized text from the original length; a sanitizer that lengthens the text makes the count wrong or negative (… -192 more bytes), and a test pins a mixed value.
3 extension/src/utils/confirmLaunchedGroup.ts:56-57 With no launch start time recorded, a readable leader in the launch folder is launched (folder alone authorizes a signal); with no start readable at launch or now, a matching folder is unverifiable.
4 extension/src/ownedNodeServerRun.ts:763-765 onDebuggerPause, releaseOwned; extension/src/vscodeNodeServerDebugger.ts:127,291,496 (releaseBegun) A pause that arrives after a non-paused stop began its detach is resumed by the detach and runs until SIGTERM: releaseOwned reads killFirst once, and the VS Code debugger reports no pause once its release began.
5 launchNodeServer.ts endGroupBySignals second mayStillSignal() A retried close runs its second identity check (ps and lsof, up to 3 s each) after the 5 s kill bound was spent, so SIGKILL can land after 5 s.
6 extension/src/utils/reapNodeServerOrphans.ts:113 An orphan whose start time matches but whose folder changed or could not be read is kept, never signalled, on every sweep, with nothing shown to the learner.
7 extension/src/protocol.ts:362; src/tests/nodeServerProtocol.test.ts:296 codebook_action's description says "a GET changes nothing"; a GET handler may change data. The test pins the sentence.
8 extension/src/utils/sendDeclaredRequest.ts:193-206 settled is set before shapeResponseBody(…, input.sanitize) runs; a throwing sanitizer leaves response unsettled.
9 ownedNodeServerRun.ts:924-933 continue A held learner pause is checked before the lifecycle, so a continue while the run is stopping answers LEARNER_PAUSED, not STALE_PAUSE.
10 extension/src/nodeServerHelp.ts:207; extension/README.md (What the run reports); CHANGELOG.md 0.2.52.0 The help says REQUEST_TIMEOUT counts running time only while a 15-minute wall-time timer exists; the README and the 0.2.52.0 entry name that 15-minute limit, but the run's 10-minute deadline (REPOSITORY_RUN_TIMEOUT_MS) ends the run first with RUNTIME_FAILED.
11 src/tests/launchNodeServer.test.ts (SIGTERM atMs < 1_200; launchFixture cleanup); src/tests/nodeServerJournalBounds.test.ts:37-38; src/tests/runningTimeLimit.test.ts:8 createClock; src/tests/bundledSkillServerRuns.test.ts readServerRuns A SIGTERM upper bound that a slow event loop can break; a launched fixture server left running when a later step fails; a computed (not hard-coded) expected byte count; two reused helpers without an @example.
12 extension/skills/codebook/SKILL.md (1.0.51) With the database stopped, N57's chat reported a 500 but did not name the outage although the run's output carried the connection error; the skill does not tell it to read the run's output and failure cause first.
13 src/tests/llmWikiView.test.ts:1347 "the message changes only when the tree reads the new rows…" fails now and then under the full suite (an extra change: with an empty message before the stop); it passes alone and in CI. Root cause unknown: a momentary empty message in the view (a visible flicker) or the test's synchronization.

Tasks

Each task closes with its fix and a test that fails without it (red first: copy aside + git checkout HEAD -- <file>, never git stash), or with recorded evidence that it is no defect. Non-behavioral parts (task 11's @example lines and its removed SIGTERM upper bound) close with the diff and a passing run instead of a red test. Source: Cycle 0057 (#139) closing comment item N. Test paths are under extension/src/tests/. Every time bound below counts from the stop's admission (sinceAdmissionMs; NODE_SERVER_KILL_BY_MS = 5,000 ms, NODE_SERVER_STOP_DEADLINE_MS = 10,000 ms).

  1. killed says what was sent (item 1; pt3 /ship pass 1, CodeRabbit CLI). endGroupBySignals returns true only when SIGKILL was sent. Tests (launcher, fixture server): a group that ends after SIGTERM records killed: false; a group that ignores SIGTERM records killed: true; a retried close whose identity check answers replaced sends nothing and records killed: false.
  2. The remainder count uses one text (item 2). … n more bytes counts the remaining bytes of the redacted, sanitized text (redacted.length - cut); the doc says so; the straddling and redaction tests hard-code the corrected numbers; a lengthening sanitizer never yields a negative count. Test: '/a'.repeat(4000) hidden as <workspace> shows a non-negative count equal to the shown text's remainder.
  3. A folder alone never authorizes a signal (item 3). Without a start time compared with the launch's, confirmLaunchedGroup answers unverifiable (or gone / replaced per the existing rules); the run reads the leader's start time again before the attach when the first read failed, so the folder-only path is rarer. Tests: no launch start + same folder → unverifiable; a start read that failed at spawn and succeeds before attach is recorded.
  4. A pause during the detach is ended, not resumed for long (item 4). The VS Code debugger reports a stop that arrives after its release began for the bound session (releaseBegun no longer drops it). The run, on a pause reported while a release without kill-first is under way, sends SIGKILL to the group at once: on a first release unconditionally, on a retry only after maySignal answers true (unverifiable sends nothing; the release's own failure path then applies). It journals node-server.late-pause-killed with the pid. The close's killed (task 1) counts only the close's own SIGKILL, so this close records killed: false; the run's journal holds both events. When a retry's identity check is still running as the detach completes, the SIGKILL is sent as soon as the check answers launched (the close's own SIGTERM sequence goes on meanwhile). Tests: debugger (a stop after release began is reported for the bound session, not for another session); run (a pause reported during the detach → SIGKILL before the detach settles; on a retry with an unverifiable group → no signal).
  5. SIGKILL by the kill bound on a retried close (item 5). A retried close checks the group's identity once, before SIGTERM. At the kill bound, when the group probe (isProcessGroupGone) answers that members remain, SIGKILL follows without a second identity check: the group has existed since the checked SIGTERM, and a group id is not given out while a member holds it. When the probe throws (it cannot tell), the close sends no SIGKILL and fails, so the stop fails retryably and names the pid; the 5 s bound is never stretched by a second check. Test (launcher, fixture server ignoring SIGTERM, times measured from the admission clock passed as sinceAdmissionMs): a retried close with killByMs: 1_200 whose confirmGroup resolves after 200 ms calls it once and sends SIGKILL before 1,600 ms; a probe that throws at the kill bound sends no SIGKILL and the close rejects.
  6. The sweep follows the run's identity rule and shows what it keeps (item 6). A matching start time is the launched leader whatever its folder (closed, as the run's retried stop does); a record kept because it cannot be verified is reported in Output › Codebook at each sweep with its pid and port. Tests: start matches + folder changed → closed; unverifiable + members → kept and reported.
  7. codebook_action makes no GET promise (item 7). The description says a GET is sent without the dialog and that the server's handler decides whether it changes data; the protocol test pins the new sentence and that "a GET changes nothing" is gone.
  8. The response settles on every failure (item 8). sendDeclaredRequest marks settled only after the response is shaped; a throwing shaper or sanitizer rejects response with REQUEST_FAILED and the fixed message "Codebook could not prepare the response body for display." (the thrown error is never quoted). Test: a throwing sanitizer → response rejects with that code and message within 1 s.
  9. A continue while stopping is a historical pause (item 9). continue refuses with STALE_PAUSE when the run is not live, before the held-pause check. Test: learner pause held, stop admitted (close held), continue → STALE_PAUSE; the state × call table gains this cell.
  10. One request time limit, stated truthfully (item 10). The help, the packaged README and a 0.2.53.0 CHANGELOG correction say: REQUEST_TIMEOUT after 30 s of running time (paused time excluded); a run whose request still waits at the run's 10-minute deadline ends with RUNTIME_FAILED. The 15-minute timer stays as an internal backstop and is not named. Tests: help text; README sentence (package test or doc test as present).
  11. Test hygiene (item 11). The launcher test asserts SIGTERM's order and leaves the time bound to the SIGKILL assertion; launchFixture registers the server group's cleanup at launch; nodeServerJournalBounds.test.ts hard-codes its expected bytes; createClock and readServerRuns get an @example. Evidence: each test passes and fails as described (the cleanup by a forced failure).
  12. The chat names a failure it can see (item 12; N57 O-1). Skill 1.0.52: when a run fails or answers 5xx, read the run's output tail and failure cause before attributing it, and name a cause the output shows (for example a refused database connection), labeled as observed output. Tests: skill text; native check N58 (below).
  13. The flaky Wiki-view test (item 13; N57 O-4). Find the root cause of the extra empty change: before the stop. If the view shows an empty message between states, fix the view so it never does (a learner-visible flicker); otherwise fix the test's synchronization (await the observable state, AGENTS.md Order and isolation). Tests: a deterministic reproduction (an injected delay or ordering in the test) fails before the fix and passes after; and the file passes 20 times in a row under load: in a separate worktree of the same commit (its own node_modules and dist, built first), node --test extension/dist/tests/llmWikiView.test.js runs 20 times while one pnpm --dir extension test runs in the main checkout, recorded with counts (a separate checkout keeps the two builds apart, AGENTS.md Order and isolation).
  14. N58 native check (closes the native part of task 12). Space local:codebook-qa, VS Code 1.142.0, QA profile "Codebook QA 0049", the PR's final candidate VSIX installed normally (hash recorded); Copilot Chat Agent with GPT-6.1 Luna if the picker lists it after searching 6.1 and luna, else GPT-6.1 Terra. Target: the pinned P08 clone /Users/lume/qa/c57/switch-time at 4f68953, clean; Postgres stopped with pg_ctl -D ~/qa/c57/pg18data stop and restarted after with LC_ALL=en_US.UTF-8 pg_ctl -D ~/qa/c57/pg18data -l ~/qa/c57/pg18-server.log start. One natural question, new wording, about how sign-in finds a user (POST /api/auth/sign-in/email reaches the user lookup at apps/api/src/db/client.ts:254, Part A of Cycle 0057: a Node HTTP server of a real repository is explained live (node-server profile) #139). A run that never reaches the database counts as a failed attempt; one further attempt with a new question is allowed, then the check is FAIL. A missing model follows AGENTS.md Development target (NOT RUN with the picker list; the Codex extension after observed credit exhaustion). Pass: the chat names the database outage and cites the run's output for it, gives no source-only answer as if observed, and lsof -nP -iTCP:4100 -sTCP:LISTEN, polled every second from the moment codebook_stop answers, shows no listener within 10 s. Evidence: stills of the answer and the status, SHA-256 here, files private.

Acceptance criteria

  1. Tasks 1–13 each close with their fix and a red-first test, or with recorded evidence; task 11's @example lines and removed SIGTERM upper bound close with the diff and a passing run, and its fixture cleanup with a forced failure. Every test states protects=…; fails_when=…; no_claim=….
  2. N58 (task 14) passes in VS Code on the cycle's final candidate, with its identities and evidence hashes recorded here; otherwise task 12 stays open.
  3. The 15-check exact-HEAD gate passes on the PR's final tree, in this order: from extension/: pnpm format:check, typecheck, lint, health:static, dupes, dead-code, test; the five Reader DOM checks (node extension/scripts/<check>-qa.mjs verify <new folder> for study-bootstrap, wiki-reader-dom, study-reading-pose, understanding-focus, repository-return); from extension/: pnpm test:package, then pnpm health; from the root: node --test .codex/restore-product-context.test.mjs. It with required CI and the local CodeRabbit CLI on its final range. Every finding of those is fixed before merge; only a still-open Major finding of the /ship rounds may be recorded under the ship review limit, and a Critical finding never merges open.
  4. pnpm --dir extension health:static and pnpm --dir extension health pass against their committed baselines (extension/fallow-health-baseline.json, extension/fallow-health-measured-baseline.json).
  5. Every user-visible change has a CHANGELOG 0.2.53.0 line and a packaged README sentence; skill 1.0.52.
  6. Real-process tests (fixture, CI) pass on the final head, and the pinned-clone tests pass locally on it with both databases up: CODEBOOK_NODE_SERVER_CLONES='{"switch-time":"<clone>","nsx":"<clone>"}' node --test extension/dist/tests/ownedNodeServerRun.pinnedClones.test.js (4 tests; clones of laststance/switch-time 4f68953 and laststance/nsx 502545c7 with their documented local stacks), since the run and launcher change.
  7. The closing comment states that nothing is carried, or names what the ship review limit recorded.

Testing plan

Counts are estimates; the tasks above name the required cases.

Layer What Count
Unit confirmLaunchedGroup folder-only; shapeResponseBody remainder; sweep judgment; help and README text; skill text +8
Host (harness, fake debugger and clock) pause during detach; retried-close SIGKILL by the bound; killed record; continue while stopping; throwing sanitizer; sweep report +7
Real process (fixture) close killed record; launchFixture cleanup +2
Flake deterministic reproduction of task 13; 20-run stress +1
Native N58 in VS Code 1 take

Rules for the implementing agent

  1. Acceptance criteria are the protects / fails_when / no_claim profile of each test. Never "make the tests pass".
  2. Real code and real tests land in the same change; a placeholder, a stub assertion or a deferred test is not done.
  3. Any change to a test, validator, CI step, timeout, tolerance, threshold, snapshot or suppression pragma is reported on its own line with its justification, before any other result.
  4. A reported command names the command and its observed result; a command not run is not reported; stderr is never silenced in a cited command.
  5. A report is a claim until the parent re-executes it: say what was verified, reused and not checked.
  6. Red first for every behaviour change (copy aside + git checkout HEAD -- <file>; never git stash).

Rollback

Revert the PR. No stored data, MCP shape or saved study changes; the orphan record format stays; the skill moves one version (1.0.51 → 1.0.52).

Effort

Part Estimate
Tasks 1, 3, 5, 6 (identity and close) 3 h
Task 4 (pause during detach: debugger + run) 3 h
Tasks 2, 7, 8, 9, 10 (body, text, settle, continue, docs) 2 h
Task 11 (test hygiene) 1 h
Task 12 + N58 2 h
Task 13 (root cause + fix) 2 h
Reviews, gate, CI 3 h

Files

File Change
extension/src/utils/launchNodeServer.ts Tasks 1, 5
extension/src/utils/shapeResponseBody.ts Task 2
extension/src/utils/confirmLaunchedGroup.ts, extension/src/ownedNodeServerRun.ts Tasks 3, 4, 9
extension/src/vscodeNodeServerDebugger.ts Task 4
extension/src/utils/reapNodeServerOrphans.ts, extension/src/extension.ts (Output entry if needed) Task 6
extension/src/protocol.ts Task 7
extension/src/utils/sendDeclaredRequest.ts Task 8
extension/src/nodeServerHelp.ts, extension/README.md, CHANGELOG.md Task 10
extension/src/tests/* Tests, task 11
extension/skills/codebook/SKILL.md Task 12
extension/src/llmWikiView.ts or extension/src/tests/llmWikiView.test.ts Task 13 (by root cause)

Out of scope

Owner decisions

  • Standing: the owner's goal (every resource to the product; never spend money or break the law). The owner cannot answer: 「返事ができないので、選択肢はReccomendをpickしてください🙇」, so each decision takes the recommended option, named here.
  • D1 (recommended): one pull request codex/cycle-0058 (13 small fixes in the run, its text and one test file; one gate and one review loop).
  • D2 (recommended): a folder alone never authorizes a signal (task 3): safety over a retry that succeeds on a weaker identity; the second start read makes the folder-only case rare.
  • D3 (recommended): the sweep reports kept records instead of aging them out (task 6): a record is the only trace of a server that may still run.
  • D4 (recommended): keep the 15-minute timer as an unnamed backstop (task 10); the docs name the limits that can fire.
  • D5 (recommended): N58 in VS Code only (task 14), where O-1 was observed; Cursor shares the skill body.
  • D6 (owner, 2026-10-28): pause after this cycle's merge. 「このサイクルのPRがマージされたら、一旦作業を中断してください」: finish this cycle through its merge and the closing comment, then stop; no next /spec or cycle until the owner's explicit message.
  • D7 (owner, 2026-10-28, answered A): the Node 26.12.1 bump goes to its own pull request. The owner's commit 12672469 (Node 26.12.1 in .node-version and package.yml) landed on this cycle's branch; on it CI's health check refused (reference pinned to 24.21.0) and four tests failed on Node 26. It is kept unchanged on codex/node-26 (draft chore(ci): bump Node.js to 26.12.1 (needs the Node 26 migration before merge) #145, where the Node 26 migration happens) and reverted here (ad13920c), so this cycle merges on the verified Node 24.21.0.

Next action

Activity

  1. ryota-murakami commented on Oct 27, 2026

    @ryota-murakami
    ContributorAuthor

    Entry (2026-10-28, implementing)

    • Reads, in this session after its latest compaction: PRODUCT_GOAL.md in full (goal version 10, 444 lines); Cycle 0057's Issue and its closing comment (the 13 carried defects this Issue copies). AGENTS.md is in context as project instructions.
    • Image: docs/designs/assets/codebook-product-spec-v9.png opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa (matches Design target). Regions 1 (live), 2 (replay), 3 (DeepWiki) and the shortcut strip found. This bug-fix cycle serves region 1's server form (stopping, what the chat reads) and adds no increment.
    • Gap audit (bug-fix cycle): baseline main 333c7813 (v0.2.52.0), the head that Cycle 0057's closing comment audited. The rows this cycle touches are AC-LIVE (server runs: stop, retried stop, orphan sweep, response display, tool text, help) and AC-SKILL (1.0.52); every other row keeps Cycle 0057: a Node HTTP server of a real repository is explained live (node-server profile) #139's audit (no source change since). The tasks above are the gap list; nothing else is selected.
    • State: branch codex/cycle-0058 from main 333c7813, clean. Tools: Node 24.21.0 for the suite, Node 26.10.0 for the pinned clones, Docker for their databases, the Space local:codebook-qa for N58.
    • Plan: three parallel parts on QA-owned worktrees, integrated on codex/cycle-0058: A (tasks 1, 3, 4, 5, 6, 9 and task 11's launcher-test items), B (tasks 2, 7, 8, 10, 12 and the rest of task 11), C (task 13); then N58, /ship, the gate, CI, the local CodeRabbit CLI and merge.
  2. ryota-murakami commented on Oct 27, 2026

    @ryota-murakami
    ContributorAuthor

    Integration and N58 (2026-10-28 JST, before /ship)

    Integrated on codex/cycle-0058 at 6473c5c3: part A (tasks 1, 3, 4, 5, 6, 9 and task 11's launcher tests), part B (tasks 2, 7, 8, 10, 12 and the rest of task 11) and part C (task 13). All three were red first; for part B's tests that the part did not run against the old code, the driver swapped the four source files back to main and saw 7 tests fail for the expected reasons.

    • Full suite on 6473c5c3: 7,911 tests, 7,901 pass, 0 fail, 10 skipped. Static checks (format:check, typecheck, lint, health:static, dupes, dead-code): exit 0.
    • Task 13 root cause: a real flicker in the LLM Wiki view, not the test: when a VS Code watch stops, the run's end fires a refresh before the run marker becomes the stopped-watch reservation, and a read in that gap found neither, so the message went empty for a moment. The view now keeps the shown message while its own marker settles (deterministic red-first test in llmWikiViewReadLoop.test.ts). Under load: llmWikiView.test.js passed 20 of 20 in a separate worktree of the same commit while the full suite ran in the main checkout.

    N58 (task 14): PASS

    Item Value
    Candidate codebook-c58-6473c5c3.vsix, SHA-256 e90eda189af43e3041b72ed8b51b1a0b11810e03be4c067afc5850a70aa4550c, installed normally (version line not yet bumped, so the hash identifies it)
    Skill loaded 1.0.52, SHA-256 a00b5d1a…, contains the new sentence
    Host Space local:codebook-qa, VS Code 1.142.0, QA profile "Codebook QA 0049"
    Chat Copilot Chat Agent, GPT-6.1 Terra (Medium); picker luna → GPT-5.6 Luna, GPT-6 Luna; 6.1 → GPT-6.1 Sol, GPT-6.1 Terra (no GPT-6.1 Luna)
    Target pinned P08 clone 4f68953, clean; Postgres stopped with pg_ctl stop before the question, restarted after
    Question 「サインインのとき、APIはどうやってユーザーを探しているの? このリポジトリのAPIサーバーを実際に動かして確かめながら説明して。」

    What happened: the start was accepted on its first declaration (the start confirmation showed the new description; VS Code summarized the action as "Sends an HTTP request — may change remote state"); the learner confirmed the POST in Codebook's dialog; the run paused at apps/api/src/app.ts:66; after continue the response was 500, and the chat read the server output (the lookup SQL failed after the application's own deadline passed during the pause) and said it would try once more with a short pause. The stop freed port 4100 within 1 s. The second run (confirmed again in its own dialog) answered 500 at once, and the chat wrote that the output records ECONNREFUSED on the database connection, so the lookup result and the sign-in outcome are unconfirmed, and that starting Postgres would allow checking them. It then proposed docker compose up -d --wait db; the learner chose Skip (the trial keeps the database down; the Space runs Postgres from Homebrew). The final answer separates the source-derived lookup (auth.ts:33, auth.ts:4), the observed request path and SQL, and the outage named from the output. No listener remained after the run.

    Evidence: 8 stills in the Mac's ignored artifacts/cycle-0058/n58/ with SHA256SUMS (verified on both sides): 02-dialog.png 22469e22…, 05-econnrefused-named.png 230733e6…, 06-final-answer.png 05f24f03…, the picker searches abb7ae9f… and 25e1d9aa….

    Next: /ship (version 0.2.53.0, CHANGELOG with the correction of the 0.2.52.0 time-limit sentence), the gate, CI, the local CodeRabbit CLI, merge.

  3. ryota-murakami commented on Oct 27, 2026

    @ryota-murakami
    ContributorAuthor

    Entry after a context compaction (2026-10-28, /ship in progress)

    • Reads after this compaction: PRODUCT_GOAL.md in full (goal version 10, 444 lines, every line); this Issue with its comments. AGENTS.md is in context as project instructions (unchanged on disk this session).
    • Image: docs/designs/assets/codebook-product-spec-v9.png opened with an image tool: 1024 × 1536, 1,878,402 bytes, SHA-256 f189ee82…caf2aa (matches Design target). Regions 1 (live), 2 (replay), 3 (DeepWiki) and the shortcut strip found.
    • State: branch codex/cycle-0058 at 9c82de33 with one uncommitted test (the /ship coverage audit's added readLlmWikiViewFacts.test.ts case, rated ★★★). Rows touched stay AC-LIVE (server runs) and AC-SKILL (1.0.52); the rest keep Cycle 0057: a Node HTTP server of a real repository is explained live (node-server profile) #139's audit.
    • Next: /ship Step 7 records the coverage gate (100%), then the review passes, version 0.2.53.0, CHANGELOG, PR, the gate, CI, the local CodeRabbit CLI, merge.
  4. ryota-murakami commented on Oct 27, 2026

    @ryota-murakami
    ContributorAuthor

    Cycle 0058 closing (2026-10-28): outcome demonstrated, merged in PR #144

    Outcome: demonstrated. Every defect Cycle 0057 carried is closed. A stopped or retried node-server run signals and records only what it did, and never signals a process group it cannot identify. What the chat and the learner read about a server run (tool text, help, the shown body, the packaged README) is true. With skill 1.0.52 the chat names a failure cause it can see: in N58, with the database stopped, it named the refused database connection as observed output. The Wiki-view flake was a real flicker and is fixed.

    Delivery: PR #144, squash a2b0d4ac, version 0.2.53.0 (skill 1.0.52, MCP API 1.8).

    Checks on the merged head ad13920c:

    • 15-check exact-HEAD gate: every check exit 0 (the suite 7,921 tests, 7,911 pass, 0 fail, 10 skipped; test:package 1,081 / 1,071 / 0 / 10; health 86 A; five Reader DOM checks; the restore-context hook test), on Node 24.21.0
    • required CI: 23 checks pass (the main-push-only split-files job and hosted CodeRabbit skipped)
    • local CodeRabbit CLI on the final range: 1 minor finding fixed red first (0ca807e1), then 0 findings on that tree (ad13920c has the same tree)
    • pinned-clone real-process tests: 4/4 on afbf15ff (switch-time 4f68953, nsx 502545c7). The run and launcher are unchanged since; the later commits touch only the Wiki facts reader.
    • package: VSIX packaged and checked (0.2.53, skill 1.0.52)

    Tasks

    1. killed says what was sent: fixed in 538bfc00.
    2. The remainder count uses one text: fixed in 72cc602c.
    3. A folder alone never authorizes a signal: fixed in 538bfc00.
    4. A pause during the detach is ended: fixed in 538bfc00. Hardened by review in 45fbb62e (only while that release runs and the group has members) and a3c400ae (the debugger reports a stop during the release at once, so a following continued cannot drop it).
    5. SIGKILL by the kill bound on a retried close: fixed in 538bfc00, revised by review in a3c400ae. The second identity check is kept and starts 1 s before the bound (NODE_SERVER_KILL_CHECK_LEAD_MS). A group found replaced gets no SIGKILL, and a check that has not answered by the bound sends nothing and fails the stop. This was Codex's structured-review P1: the task's original "no second check" plan let a reused group id be killed. The plan review changed how this task closes; the defect itself stays closed.
    6. The sweep follows the run's identity rule and reports what it keeps: fixed in 538bfc00. The orphan record's cwd doc was corrected in 45fbb62e.
    7. codebook_action makes no GET promise: fixed in 72cc602c.
    8. The response settles on every failure: fixed in 72cc602c. Its message now also says the server answered, with the HTTP status (a3c400ae).
    9. A continue while stopping is STALE_PAUSE: fixed in 538bfc00.
    10. One request time limit, stated truthfully: fixed in 72cc602c. The 0.2.52.0 sentence is corrected in the 0.2.53.0 CHANGELOG.
    11. Test hygiene: fixed in 538bfc00, 72cc602c and 9c82de33.
    12. The chat names a failure it can see (skill 1.0.52): fixed in 72cc602c.
    13. The flaky Wiki-view test was a real flicker: fixed in 4f4abbe5. Review hardened it in 45fbb62e and 227afb27 (the message is kept exactly while the marker change is pending), a3c400ae (the settle is judged with the run facts) and 0ca807e1 (a marker read during the run).
    14. N58: PASS on 6473c5c3 (the comment above). It did not run again on the review fixes.

    Review: /ship reached its three-cycle review cap with converged:false. Under the owner's ship review limit, every last-round finding was fixed, including the Step 11 adversarial findings and the local CodeRabbit CLI finding. No Critical or Major defect stays open, so no Issue records one.

    Owner decisions taken during delivery:

    • D6: pause after this merge.
    • D7: the Node 26.12.1 pin bump that landed on the branch went to its own draft PR #145, where the Node 26 migration happens: the health baseline retaken with the new pins, and four tests that fail on Node 26. It is no defect of this cycle and is not carried.

    Gap rows changed:

    Carried defects: none. Every carried and found defect is closed.

    Next cycle: a feature cycle (/spec from PRODUCT_GOAL.md and the gap audit). The candidate is O2, saving a server run as a learning replay. Per D6, work pauses after this merge until the owner's explicit message.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    cycleOne bounded experiment or product increment

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions