Skip to content

mcporter 0.14.1 cutover record corrected (leftover 0.13.13 daemon retired); socraticode mixed-version procedure - #345

Merged
seathatflowsinourveins merged 7 commits into
mainfrom
claude/mcporter-daemon-correction-20260926
Sep 26, 2026
Merged

seathatflowsinourveins merged 7 commits into
mainfrom
claude/mcporter-daemon-correction-20260926

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Sep 26, 2026 •

Copy link
Copy Markdown
Collaborator

What

This PR is on hold for the v2026.09.26.1 release window, until session 9a sends WINDOW DONE. It edits evidence/receipts/mcporter-0141-qualification-20260925.json, which release_due tracks.

1. mcporter 0.14.1: cutover record corrected, leftover 0.13.13 daemon retired

The 2026-09-25 cutover record said two things that were wrong:

  • "No mcporter daemon was running before the switch";
  • "the next call started a 0.14.1 daemon".

On 2026-09-26 a read-only check found PID 129979 still running tools/mcporter-0.13.13 … daemon start --foreground on the production socket ~/.mcporter/daemon/user.sock, while bin/mcporter named 0.14.1:

  • startedAt was 20:09:44Z on 09-25;
  • the socket mtime was the same;
  • the daemon's two keep-alive socraticode servers were last used at 20:09:44Z and 20:09:45Z.

The coordinator's session record gives the cause, though the record itself is not retained. My own pre-switch baseline call, mcporter list socraticode, went through 0.13.13 at 20:09:43.395Z, in the same command as the relink. That was after a 20:09:11Z precondition check had found no daemon. So the precondition was stale by the time of the switch.

  • Fix, retained in evidence/artifacts/mcporter-0141-daemon-correction-20260926/retire.txt.
    • The run first asserted the PID's 0.13.13 command line and that activeCalls summed to 0.
    • The native mcporter daemon stop through 0.14.1 exited 0. The PID, its two children and the socket were then gone.
    • A production call socraticode.codebase_health exited 0 and started PID 744797 on tools/mcporter-0.14.1, which is now the only mcporter daemon process.
  • The receipt gets an addendum, and the decision record gets a dated correction in its mcporter section.
  • limitations[4] ("a mixed-version daemon cutover" not exercised) still holds. This was a retirement, not a qualification of mixed-version operation.

2. socraticode 1.15.0: mixed-version source review and cutover procedure

This adds a dated update to the socraticode section of docs/decisions/2026-09-25-workstation-sota-refresh.md. It is a pinned source review at v1.14.0 (2218f251) and v1.15.0 (f6191f07); nothing was run.

  • The cross-process coordination code is byte-identical between the two tags: lock.ts, watcher.ts, indexer.ts, graph-inputs.ts, graph-analysis.ts, code-graph.ts, symbol-graph-store.ts and startup.ts.
  • Locks and watcher. Locks are proper-lockfile directories under os.tmpdir()/socraticode-locks. They go stale after 120 s, refresh every 30 s and are not retried. There is one watcher per project, whatever its version. Mixing versions causes no lock stealing and no duplicate writes.
  • Mixed-version effects:
    • Graph flip-flop: graph-inputs.ts:609 checks the builder's version with a strict inequality, so each version rebuilds a graph the other built.
    • Cleanup race: at startup, cleanup of old symbol-graph generations is coordinated only inside one process (coordinateProject, an in-memory promise chain). A server that starts during another's build may delete that build's staging generation. This comes from reading the code and was not reproduced; codebase_graph_build recovers from it.
    • codebase_stop SIGTERMs the index-lock holder, even when it belongs to another session.
  • Decision unchanged. The cutover waits until at least 2026-10-01T11:01Z, the end of the 7-day cooldown. The update records a 6-step coordinated procedure for that date.

Checks

  • scripts/validate.py (uv, py3.13) returned {"components": 69, "hashed_files": 6892, "profiles": 4, "receipts": 158, "status": "passed"}. That covers integrity and scope only.
  • The component matrix and grand list were regenerated with no change.
  • core.hooksPath is scripts/git-hooks, and gitleaks found no leaks.

Review

The Codex cross-family review (codex exec -s read-only, gpt-6-astra, high) of the first head returned DISAGREE with 5 findings:

  1. Which call started the daemon, and that its children were socraticode 1.14.0, were stated as fact without retained output.
  2. The watcher and write guarantees were overstated.
  3. codebase_stop was described as always sending SIGTERM.
  4. Lock staleness was confused with lock-directory removal.
  5. Because of 4, the procedure waited for the lock directory to disappear.

The fixes are in 2361d77c:

  • the two unretained claims are now attributed to the coordinator's records;
  • the guarantees are narrowed to what the lock protects;
  • the proper-lockfile stale-removal behaviour is cited (v4.1.2 lockfile.js:67-86);
  • step 4 now waits on live holders.

The Codex recheck marked all 5 FIXED and found one new wording defect: contention skips rather than queues (indexer.ts:1052-1062). 0c6ddcc7 fixes it. The recheck also matched the sha256 and byte counts of all 5 files against manifests/evidence.json. There is no third review round, because the review loop is bounded.

SOTA sources

🤖 Generated with Claude Code

Scout and others added 2 commits September 26, 2026 11:09
…retired); socraticode mixed-version procedure

- The mcporter cutover record said no daemon ran at the switch and that a 0.14.1 daemon
  started afterwards. In fact the coordinator's pre-switch baseline call through 0.13.13
  auto-started a 0.13.13 daemon on the production socket at 20:09:44Z, and it served 0.14.1
  clients until 2026-09-26. It was drained and stopped with the native 'mcporter daemon
  stop', and a production call started a 0.14.1 daemon (retire.txt). Adds a receipt
  addendum and a dated correction in the decision record.
- socraticode 1.15.0: a pinned source review of v1.14.0 and v1.15.0 found the coordination
  code byte-identical, with two mixed-version effects: graph flip-flop (strict version
  inequality) and an in-process-only generation-cleanup race. It also records a
  coordinated cutover procedure. The deferral to 2026-10-01T11:01Z stands.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…evidence manifest

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Sep 26, 2026
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

Scout and others added 5 commits September 26, 2026 11:15
- Attribute to the coordinator's unretained records two things the retained output doesn't
  show: which call started the daemon, and that its children were socraticode 1.14.0.
- Narrow the watcher and write guarantees to what the lock actually protects: operations
  that go through the lock, within one lock directory.
- codebase_stop: cooperative cancel locally, SIGTERM only for another process's lock.
- proper-lockfile: a stale directory is removed at the next acquisition and does not
  vanish on its own. Step 4 of the procedure now waits on live holders, not on directory
  absence.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
… residual)

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
…ow-up files

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant