Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
61a75a5
chore(pm): upgrade conductor to 0.48.0
cfdude Sep 22, 2026
7b222be
chore(conductor): register node-support-policy (0.49.0) with the Node…
cfdude Sep 25, 2026
3256cc2
fix(openspec): restore the 0.48.0 main-spec sync lost to a reset
cfdude Sep 25, 2026
aa48c88
docs(lessons): an openspec archive writes the main specs too — stage …
cfdude Sep 25, 2026
d750b35
docs(openspec): propose node-support-policy (0.49.0)
cfdude Sep 25, 2026
8a73f75
docs(openspec): revise node-support-policy for Gate 1 and cross-spec …
cfdude Sep 25, 2026
9fa4163
docs(openspec): close node-support-policy confirmation residue
cfdude Sep 25, 2026
7b5dcaa
fix(hook): one reporter, no colour, and an unreadable count refuses
cfdude Sep 25, 2026
6b07a08
test(assert): every rung file installs the git shim in its own process
cfdude Sep 25, 2026
93e25e2
fix(test): the git shim removes its temp directory at process exit
cfdude Sep 25, 2026
cb946eb
fix(test): the harness's empty cache is removed at exit; a real git c…
cfdude Sep 25, 2026
0831d90
docs(test): comments no longer state the single-process half as their…
cfdude Sep 25, 2026
b7ba061
perf(hook): per-file isolation — the probe and the Node-18 loop are d…
cfdude Sep 25, 2026
ada05a3
feat(engine): the support floor, a per-call runtime version, and brie…
cfdude Sep 25, 2026
d45ee0e
test(assert): the no-network walk refuses raw sockets, TLS, datagrams…
cfdude Sep 25, 2026
0449e9e
feat(ci): the supported-major filter as a committed dev script, prove…
cfdude Sep 25, 2026
a09b2fe
feat(ci): a matrix of every supported major computed from the schedul…
cfdude Sep 25, 2026
85670f8
fix(certify): one reporter, the ℹ parse only, and nothing recorded ov…
cfdude Sep 25, 2026
459deac
ci(throwaway): point the schedule URL at a 404 — exercise the fallbac…
cfdude Sep 25, 2026
bf38390
ci(throwaway): real schedule URL, fallback [22,24] — exercise the mis…
cfdude Sep 25, 2026
1a7e031
ci(throwaway): bench the assertion half per-file vs single-process on…
cfdude Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .conductor/render-stamp.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"renderedAt": "2026-09-22T11:09:55.972Z",
"stateRevision": 1329,
"stateMtimeMs": 1790075395433.4475
"renderedAt": "2026-09-25T02:55:20.604Z",
"stateRevision": 1351,
"stateMtimeMs": 1790304919963.0427
}
85 changes: 82 additions & 3 deletions .conductor/state.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"version": 1,
"active": null,
"active": "node-support-policy",
"epics": [
{
"id": "pm-fix-link-flag-validation-and-update",
Expand Down Expand Up @@ -10058,17 +10058,72 @@
"attributedCommits": [],
"createdAt": "2026-09-22T11:09:54.629Z",
"touchedAt": "2026-09-22T11:09:54.633Z"
},
{
"id": "node-support-policy",
"title": "Node support policy: support the oldest non-EOL Node major (floor 22 today, 24 after 2027-04-30); CI matrix 22/24/26; retire Node 18 pin, stale actions (v4 on EOL node20 runtime), and old-Node workarounds; correct every 'Node 18+' claim",
"priority": "P1",
"status": "active",
"role": "epic",
"lane": "openspec",
"links": [],
"reconcileNeeded": false,
"attributedCommits": [
"d750b35f8850a502a77207253c949b9fe6069a30",
"8a73f75539e33537d1bb131c310ae66fb2693b20",
"9fa4163fa1ff7012d8f0a19714c6ae9cf2e44947",
"7b5dcaacde92cb0aa113e4039489cd1ef2cbe59d",
"6b07a089a8e9175a373f224f12834dbe6245bf0c",
"93e25e2a383365d4c3781e17feca5c842157851e",
"cb946ebfa6986d7e11215c664591c29a38d5f5bd",
"0831d90597ac62c70fb50ea4f7276eda5f48cd94",
"b7ba061a837ff4d2f93d0734d52556d604f96604",
"ada05a398bf8e87b843ebcc7beda5c8f4a262e62",
"d45ee0e011a7065a2ad9b68aed01876fba4f3a4c",
"0449e9e4119acdab76f60407ba2c014973100598",
"a09b2fe8e8d6eaecf9b8da989ca8b548383d4260"
],
"createdAt": "2026-09-23T20:29:57.349Z",
"touchedAt": "2026-09-25T02:55:19.958Z",
"notes": [
{
"at": "2026-09-23T20:29:58.242Z",
"actor": "agent",
"text": "lane: openspec not (none routed) — changes the hook/CI contract the suite-certification spec governs, plus a user-facing requirement across README and pm-plugin.dev; needs a spec record, not a claude-code tweak. Policy stated by Rob 2026-09-23: 'support the oldest version of Node that isn't end-of-life'; test at least 22, 24, 26."
},
{
"at": "2026-09-23T20:31:00.595Z",
"actor": "agent",
"text": "Benchmark 2026-09-23 (16 CPUs, darwin-arm64, clone 61a75a5, logs scratchpad/node-bench/logs): assertion half P-mode (process-per-file) 13.0-14.9s on 18/20/22/24/26 — version barely matters; S-mode (--test-isolation=none) 24-27s, ~2x SLOWER than P on every version that has it. Engine cold start (brief): 18=65.8ms, 22/24/26=48-50ms. Homebrew node 26.9 cold start 107.7ms vs nodejs.org 26.10 49.9ms (bare startup 83ms vs 24ms; brew links libnode dynamically). Node 22 accepts only --experimental-test-isolation. Node 18 hung test 3.1 (filed as issue)."
},
{
"at": "2026-09-25T00:50:47.952Z",
"actor": "agent",
"text": "Rob 2026-09-24: approved — drop single-process (per-file mode), CI matrix from schedule.json, actions v7, delete isolation probe + reporter dual-parse + [ -f ] loop where the floor allows, EOL warning in brief, fix Node 18+ claims, fix #220. Leave Homebrew node alone (out of scope)."
}
],
"release": "0.49.0",
"startedAt": "2026-09-25T00:50:49.159Z",
"gateReview": {
"gate1": {
"verdict": "pass",
"reviewedAt": "2026-09-25T01:49:24.566Z",
"baseSha": "aa48c885fd965d091ebb804a1e379fd79b47bd24",
"headSha": "9fa4163fa1ff7012d8f0a19714c6ae9cf2e44947",
"reviewer": "two fresh-context lenses (A correctness/testability reproduced on 22/24/26 binaries; B absent-edit sweep) + confirmation: round 1 fail (2 C: zero-count CI pass, unfalsifiable scenario; 9 I), fixed 8a73f75; confirmation fail (2 I), fixed 9fa4163; 2026-09-24"
}
}
}
],
"detourStack": [],
"pmVersion": "0.47.0",
"pmVersion": "0.48.0",
"tracker": {
"system": "github-issues",
"repo": "cfdude/pm",
"direction": "inward"
},
"platform": "claude-code",
"revision": 1329,
"revision": 1351,
"reviewMode": "thorough",
"releases": [
{
Expand Down Expand Up @@ -10508,6 +10563,30 @@
"reviewer": "inline foreground cross-spec review of the 0.48.0 spec set (2 spec files: suite-certification, engine-invocation) — no fresh-context subagents were available in this run, so the reviewer is the applying agent, which read both deltas in full and answered the six questions. BLOCKS (fixed in this commit): engine-invocation's 'the invocation that used the in-memory store created no file' scenario was unreachable — init() writes CLAUDE.md (rules.mjs:1097) and .gitignore through raw fs, both deliberately outside the store per design D1, so the scenario was narrowed to the store's own footprint with an explicit boundary paragraph added. Contradiction: none — suite-certification's rungs and engine-invocation's per-call store agree; the rung's process claim ('both rungs, one invocation, one process') does not collide with 'two invocations in one process are independent' because they are different claims about different things. Double ownership: none — engine-invocation owns the caller's contract and states the store boundary; suite-certification owns rung membership and names the store only as the mechanism a unit test obtains a value through. Unmeetable: the one above, now fixed. Gaps vs the proposal's What Changes: none found — the three artifacts I1 added (session-claim.json, commit-observe.json+.lock, write-conflicts.log.prev) and the render's three reads (projectMd pre-image :306, the stamp's mtime test :356, detoursLog :276) are each carried by a task (1.2, 1.3). Vocabulary: ok within the spec set; POLISH declined — the file rung's directory is still named assert/ (the half's own name) while the unit rung's is unit/, and the spec's 'the two rungs SHALL be named on disk' is satisfied but the names are not parallel; renaming is out of this change's scope. Chokepoints: homeOf() (certification.mjs:63) and the two-glob runner invocation shared by the hook and ci.yml are each owned by exactly one capability. Recorded after the amendment above, so the hash covers the amended text."
}
}
},
{
"id": "0.49.0",
"intent": "Node support policy: support the oldest non-EOL Node major; CI matrix from Node's schedule; per-file test mode; old-Node workarounds retired",
"deferred": [],
"crossSpecReview": {
"verdict": "pass",
"reviewedAt": "2026-09-25T01:49:23.900Z",
"specs": [
{
"key": "node-support-policy/specs/engine-invocation/spec.md",
"sha256": "401d86fff77dbbd5e770551120a6b1f44b30e6525485449e73cd70416c8a677f"
},
{
"key": "node-support-policy/specs/runtime-support/spec.md",
"sha256": "8e45f8d91c5777626f4229b52dc9b6659a444a6fa69cfff08bdb5d8b8724b9a3"
},
{
"key": "node-support-policy/specs/suite-certification/spec.md",
"sha256": "70101f30c3ac802656c19a2221e60e514e5dc9865246c77dcdf81ff88a6526b4"
}
],
"reviewer": "two fresh-context lenses (coherence; falsifiability) + one confirmation: round 1 fail (BLOCKS: 'supported' R1/R2 contradiction over 23/25/27; bounded-wait over-wide; schedule filter unfalsifiable; zero-count CI pass; unfalsifiable version-default scenario; collapsed-half message; unit fs ban vs shim), fixed at 8a73f75; confirmation fail (end clause untested; twin coupling), fixed at 9fa4163; 2026-09-24"
}
}
],
"archiveBackfilledAt": "2026-08-27T04:52:42.658Z"
Expand Down
Loading
Loading