Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
250 commits
Select commit Hold shift + click to select a range
1dc9a2c
ocapn: phase 0 port of OCapN/Goblins to Prologos
claude Apr 27, 2026
a4852e2
ocapn: bring the suite to green on Racket 8.10 — 117/117 tests pass
claude Apr 27, 2026
300d384
ocapn: tcp-testing-only netlayer + simulated netlayer + locator
claude Apr 27, 2026
7e6fc5d
goblin-pitfalls: revise #0-#10 after testing on a real toolchain
claude Apr 27, 2026
d7982df
goblin-pitfalls: slim DELETED entries to one-liners; delete #15
claude Apr 27, 2026
fbc93af
ocapn: address 10 Copilot review comments on PR #28
claude Apr 27, 2026
d0c88db
ocapn: revert recursive table replace — caused 120s CI timeouts
claude Apr 27, 2026
d90441e
ocapn: add Level-3 acceptance + Copilot-fix coverage tests (10 cases)
claude Apr 28, 2026
737d5d6
ocapn: convert defn-match-on-arg to canonical multi-arity defn
claude Apr 28, 2026
5daee01
ocapn: revert transport-eq? to nested match — multi-arity hits #18
claude Apr 29, 2026
9097c9b
ocapn: Phase 1 — Syrup wire codec (encoder + decoder + 13 tests)
claude Apr 29, 2026
88e208d
ocapn: Phase 2 — CapTP frame codec (encoder + decoder + 6 tests)
claude Apr 29, 2026
f96abea
ocapn: Phase 3 — live tcp-testing-only handshake (2 tests)
claude Apr 29, 2026
2e11b64
ocapn: Phase 4 — verified interop with @endo/ocapn (CI gate + 22 vect…
claude Apr 29, 2026
6c107d5
ocapn: Phase 5 — live Racket↔Node wire exchange (bidirectional, 2 tests)
claude Apr 30, 2026
d72595d
ocapn: Phase 6 — bidirectional op:start-session handshake (1 test)
claude Apr 30, 2026
d238e62
ocapn: Phase 7 — multi-message conversation (3 frames each direction)
claude Apr 30, 2026
fd7b737
ocapn: Phase 8 — conversational state machine (RPC-style, 1 test)
claude May 1, 2026
eef4ac7
ocapn: skip interop tests in main suite — covered by interop CI
claude May 1, 2026
c88423f
ocapn: skip heavy OCapN tests in runner, run them via raco test directly
claude May 1, 2026
88b41b9
ocapn: Phases 9/10/11 + decoder perf profile
claude May 1, 2026
70e36f7
ocapn: Phase 12 — wire-OUT bridge (vat resolution → outbound op:deliv…
claude May 4, 2026
7c68af6
ocapn: Phase 13 — decoder perf fix (25× faster on multi-arity records)
claude May 4, 2026
6341a4e
ocapn: Phase 14 — state-aware dispatch for op:listen + op:gc-*
claude May 4, 2026
958e894
ocapn: Phase 15 — session question-table mapping (auto-allocate local…
claude May 4, 2026
1909fd3
ocapn: Phase 16 — wire-OUT pump (auto-emit bytes on promise resolution)
claude May 4, 2026
4e0c9c2
ocapn: Phase 17 — Error type for broken promises (3 tests)
claude May 4, 2026
525aef9
ocapn: Phase 18 — connection lifecycle composer (4 tests)
claude May 4, 2026
d209afb
ocapn: Phase 19 — syrup-bytes ctor (opaque bytestrings)
claude May 4, 2026
573a040
ocapn: Phase 20 — UTF-8 byte-length aware encoder
claude May 4, 2026
258220d
ocapn: Phase 21 — promise pipelining (pipeline-deliver target-aware s…
claude May 4, 2026
106c331
ocapn: Phases 22 + 23 — DEFERRED with rationale (language blockers)
claude May 4, 2026
e96611a
ocapn: post-implementation review + roadmap link
claude May 4, 2026
ea5a943
ocapn: distill PIR lessons into principles documents
claude May 4, 2026
ec5948a
ocapn: Phase 24 scaffolding — bridge-driven responder interop test
claude May 4, 2026
06067a4
ocapn: Phase 24 unblock — library helper + hand-coded ops
claude May 4, 2026
a39e8a2
ocapn: Phase 24 — restore decode-op for real interop
claude May 5, 2026
287e37e
ocapn: pitfall #31 — measured decoder perf bug (~150s for 50-byte input)
claude May 5, 2026
81ef576
docs: decoder perf root-cause investigation (pitfall #31)
claude May 5, 2026
30fe7d7
ocapn: extend test-bridge-perf to scaling test (N=1, 5, 10, 20)
claude May 5, 2026
c1eb221
docs: decoder perf fix PIR — 3 attempts, all NEGATIVE
claude May 5, 2026
ab9657e
ocapn: add pitfall #31 profiler harness (skip-listed)
claude May 5, 2026
af3898b
ocapn: revert profiler harness — broke CI's raco pkg install --auto
claude May 5, 2026
a55817f
ocapn: pitfall #31 root cause IDENTIFIED — shift, not cache
claude May 5, 2026
1cdeb1c
docs: substitution perf survey — bug + 5 solutions with citations
claude May 5, 2026
4f6b3f0
interp: pitfall #31 fix — looseBVarRange short-circuit on shift (2.4x…
claude May 6, 2026
ff0ebad
docs: pitfall #31 — issue #45 relationship + bridge-interop re-enable…
claude May 6, 2026
6f2e077
interp: pitfall #31 fix step 2 — looseBVarRange on subst (40.8x speed…
claude May 6, 2026
fa4f717
ocapn: bridge-interop test re-enabled — peer-questioner: don't gate o…
claude May 6, 2026
b2b4a80
ocapn: model the CapTP handshake — bridge emits op:start-session reply
claude May 6, 2026
4b92416
ocapn: model the CapTP handshake as bridge state — single drive call …
claude May 6, 2026
bced0fb
docs: pitfall #32 — multi-constructor data types break cross-module i…
claude May 6, 2026
bececde
docs: pitfall #32 — link to issue #60
claude May 6, 2026
b971818
test: re-enable 4 perf-skipped tests post-looseBVarRange fix
claude May 6, 2026
2723cd5
test: hard-fail OCapN interop tests on missing Node deps; remove from…
claude May 6, 2026
5d12f2a
ocapn(phase 25.1): add op-deliver-to-answer variant; decoder discrimi…
claude May 6, 2026
f406d0b
ocapn(phase 25.2): outbound question table in BridgeState + outbound-…
claude May 6, 2026
dc03b94
ocapn(phase 25.3): dispatch op-deliver-to-answer — resolve local prom…
claude May 6, 2026
f633e5a
ocapn(phase 25.4): questioner-side interop test — Prologos asks Node,…
claude May 6, 2026
ddd6397
docs: pitfall #33 — :refer-all chains don't establish type identity f…
claude May 6, 2026
359c2a6
docs: pitfall #33 — link to issue #61
claude May 6, 2026
275b159
ocapn(phase 26): multi-turn questioner conversation interop test
claude May 6, 2026
b0fd931
ocapn(phase 27): bridge-send-question — atomic vat-side ask helper
claude May 6, 2026
bff5555
ocapn(phase 28): high-level connection-ask — questioner-side companio…
claude May 6, 2026
59f3da7
ocapn(phase 29): bidirectional peer-to-peer interop — Prologos asks A…
claude May 6, 2026
ba0d362
ocapn(phase 30): high-level captp-ask in core.prologos
claude May 6, 2026
2ae40b3
docs: OCapN GC plan — manual reference counting first, automatic via …
claude May 6, 2026
32f3fea
ocapn(phase 31): bs-remove-question + bs-remove-outbound-question hel…
claude May 6, 2026
e1d2dda
ocapn(phase 32): outbound GC release API — release-answer + release-i…
claude May 6, 2026
85d2464
ocapn(phase 33): inbound op:gc-answer wired to bs-remove-question
claude May 6, 2026
2e62fc9
docs: OCapN refr-import plan — runtime Refr ADT, decoder integration,…
claude May 6, 2026
3d8c069
ocapn(phase 34a): Refr ADT — single-constructor with kind tag, smart …
claude May 6, 2026
14a68a0
ocapn(phase 34c): imports-refcount field on BridgeState + bs-incr-imp…
claude May 6, 2026
372fb9d
ocapn(phase 34b): decoder hook — extract refrs from inbound args, aut…
claude May 6, 2026
9db5901
ocapn(phase 34e): release-import wired to bs-decr-import — actual cou…
claude May 6, 2026
7c797e6
ocapn(phase 34d): refr-to-syrup encoder — Refr → wire-shaped SyrupValue
claude May 6, 2026
2308ce0
ocapn(phase 34f): refr-in-args interop test — auto-track + release en…
claude May 6, 2026
0d08adc
docs: pitfalls #34 + #35 from Phase 34 — data ctor return type implic…
claude May 6, 2026
3811ea7
ocapn(phase 36): exports-refcount field + bs-incr/decr-export + inbou…
claude May 6, 2026
eb48102
ocapn(phase 37): desc:import-object decode + encode — 5th refr kind
claude May 6, 2026
e68af4e
ocapn(phase 37): cross-impl gate — desc:import-object round-trip with…
claude May 7, 2026
2b0304b
ocapn(phase 38): wire-level promise pipelining (responder-side)
claude May 7, 2026
3f1fb74
ocapn(phase 39): questioner-side promise pipelining (sender)
claude May 7, 2026
a0c8620
ocapn(phase 40): pipelining cross-impl gate — Node Q + pipelined chai…
claude May 7, 2026
6dc1b23
ocapn(phase 41): wire-out closure — forward queued msgs on desc:expor…
claude May 7, 2026
1eca865
ocapn(phase 42): local-actor pipeline forwarding — deliver locally on…
claude May 8, 2026
f134733
ocapn(phase 43): wire-out forwarding cross-impl gate + syrup-int deco…
claude May 8, 2026
42f6640
ocapn(phase 44): chained-answer pipelining — forward via wire on reso…
claude May 8, 2026
6f1120c
ocapn(phase 45): break-forward queued delivers' answers — emit Error …
claude May 8, 2026
14c6d7e
ocapn(phase 46): plain-value-as-error forwarding — never drop the queue
claude May 8, 2026
6fca1de
ocapn(phase 47): GC pipelined-msgs after pump emits — keep queue bounded
claude May 8, 2026
a990e2f
ocapn(phase 48): op:listen notification on resolution — wire-out + GC
claude May 8, 2026
532a1e4
ocapn(phase 49): break + plain-value cross-impl gates against @endo/o…
claude May 8, 2026
2e27be7
docs: record pitfalls #36-#38 from OCapN Phase 47-49 + syntax rule
claude May 9, 2026
5df8334
ocapn(phase 50): declarative release-import — auto-emit op:gc-export …
claude May 9, 2026
2f46e29
ocapn(phase 51): late op:listen handling + multi-listener ordering pi…
claude May 9, 2026
ef8d9da
ocapn(phase 52): gift-table scaffolding for desc:import-object handoff
claude May 9, 2026
c0efdd5
ocapn(phase 53): OCapN protocols as session types — specification + d…
claude May 18, 2026
8a103d6
docs(roadmap): capture OCapN branch state + outstanding session-types…
claude May 19, 2026
6d10c58
ocapn(phase 52b): op:deposit-gift / op:withdraw-gift wire ops + dispatch
claude May 19, 2026
97ad93c
ocapn(phase 53.a): refine session payload types from String to CapTPOp
claude May 19, 2026
07d73d3
docs(roadmap): record Phase 53.a commit hash
claude May 19, 2026
6d199a6
docs: flag Phase 52b as non-canonical + log methodology pitfall #43
claude May 19, 2026
c28f44e
ocapn(phase 53.d): :throws SyrupValue on broken-promise protocols
claude May 19, 2026
1a67f23
ocapn(phase 52b revised): gift handoff via bootstrap-method dispatch …
claude May 19, 2026
c0991f9
ci(interop): add Phase 52b bootstrap-gift cross-impl test; update roa…
claude May 19, 2026
8f64907
docs: PIR for OCapN Phases 37–53.d (pipelining + GC + session types +…
claude May 19, 2026
5b25d4b
ocapn(compliance gate): add ocapn-test-suite (Python) as CI gate
claude May 19, 2026
7734bdb
ocapn(phase 58): crypto handshake — first ocapn-test-suite test passes
claude May 19, 2026
04d28db
docs(roadmap): record Phase 58 commit hash
claude May 19, 2026
9c2d285
ocapn(rename + ffi + framing): captp-bridge → captp-core; libsodium F…
claude May 19, 2026
13c99fb
ocapn(phase 58.b): crypto FFI accessible from Prologos via captp-core
claude May 19, 2026
d05fa52
ocapn(phase 58.b-2): handshake bytes builder lives in Prologos
claude May 19, 2026
4bec150
ocapn(phase 58.b-3): server uses Prologos handshake; delete Racket fi…
claude May 21, 2026
727cf2e
ocapn(phase 58.c): validate inbound op:start-session, abort on bad ve…
claude May 21, 2026
879e4ef
ocapn(phase 58.d): verify inbound op:start-session location signature
claude May 21, 2026
4434bf4
docs(roadmap): record OCapN Phase 58.b/c/d completion
claude May 21, 2026
ba19595
ocapn(phase 58.e): gate op_abort test_abort_before_setup
claude May 21, 2026
532912d
ocapn(phase 59a): server drives captp-core connection-step
claude May 22, 2026
f78b921
docs(roadmap): record OCapN 58.e + 59a; break out 59b scope
claude May 22, 2026
1c90206
Merge remote-tracking branch 'origin/main' into claude/ocapn-prologos…
claude Jul 27, 2026
a17f89f
docs(ocapn): CHECKUP after merging 700 commits of main
claude Jul 27, 2026
4ae90b3
fix(ocapn tests): migrate fixtures off the retired current-prelude-env
claude Jul 27, 2026
bbbfc27
docs(ocapn): correct the fixture-replacement claim; record merge + CI…
claude Jul 27, 2026
75843d1
docs(ocapn): pitfall #43 — .pnet cache-hit restore writes params, not…
claude Jul 27, 2026
366f85f
ocapn(phase 59b, part 1): responder-side resolve-me reply + fetch method
claude Jul 27, 2026
b5fba8c
ci: fix test.yml YAML syntax error — the full suite has not run since…
claude Jul 27, 2026
0befd6b
fix(driver): dual-write registries on .pnet cache-hit restore (#78)
claude Jul 27, 2026
0070f1e
fix(ocapn): move incoming-deliver after dispatch-deliver — pitfall #16
claude Jul 27, 2026
07a8ae9
test(ocapn): add a DIAGNOSTIC op_deliver test to measure the fetch path
claude Jul 27, 2026
b62288c
revert(ocapn): back out Phase 59b part 1 — captp-core to last known-g…
claude Jul 27, 2026
11b15c3
docs(pitfalls): add #44 — module loader reports type mismatch as "Unb…
claude Jul 27, 2026
7f0b920
Merge remote-tracking branch 'origin/main' into claude/ocapn-prologos…
claude Jul 27, 2026
1e23deb
ocapn(phase 59b, part 1): fetch bootstrap method via resolve-me replies
claude Jul 27, 2026
20dd7a7
docs(ocapn 59b): work list for part 2 — the five bootstrap objects
claude Jul 27, 2026
55bb15e
docs(ocapn 59b): correct the part-2 worklist — measured gap is 7 mech…
claude Jul 27, 2026
1c5a2ca
docs(ocapn 59b): fix ordering section contradicting the correction ab…
claude Jul 27, 2026
20e959e
ocapn(phase 59b part 2): resolve-me reply path for non-fetch delivers
claude Jul 27, 2026
70b55fa
ocapn(phase 59b part 2): seed the Echo bootstrap object; find the rea…
claude Jul 27, 2026
6595a01
fix(ocapn interop): pass connection ids as Nat literals — unblocks st…
claude Jul 27, 2026
c5e2df2
docs(ocapn 59b): correct my "two phantom mechanisms" claim — one was …
claude Jul 27, 2026
520d460
ocapn(phase 59b part 2): orphan-listener pump stage — mechanism 6
claude Jul 27, 2026
e27d81d
docs(ocapn 59b): the rm-decode hypothesis is REFUTED — do not chase it
claude Jul 27, 2026
8b0c757
docs(ocapn 59b): logic chain PROVEN correct — the fault is at the wir…
claude Jul 27, 2026
b0e869b
docs(ocapn 59b): wire descriptors are correct too — the difference is…
claude Jul 27, 2026
ee294e5
docs(ocapn 59b): BUG LOCALIZED — fetch corrupts state for the next de…
claude Jul 27, 2026
531c196
docs(ocapn 59b): emitted-collision suspect REFUTED — narrow to remain…
claude Jul 27, 2026
0d67c4d
docs(ocapn 59b): listener probe was INCONCLUSIVE by construction — ho…
claude Jul 27, 2026
734432d
docs(ocapn 59b): fault is in the PUMP, not routing — deliver register…
claude Jul 27, 2026
689f8fe
docs(ocapn 59b): every enumerated state field is IDENTICAL — differen…
claude Jul 27, 2026
aadc873
docs(ocapn 59b): pump is IDENTICAL on both paths — my probe does not …
claude Jul 27, 2026
0995e1f
docs(ocapn 59b): drain-fuel is 5N — the fuel suspect is refuted too
claude Jul 27, 2026
bb9ce9a
docs(ocapn 59b): aborted-flag suspect refuted — handing over with a m…
claude Jul 27, 2026
276a005
docs(ocapn 59b): WARNING — the committed repro is NOT reliable; fetch…
claude Jul 27, 2026
6622ee5
docs(ocapn 59b): the failure is NONDETERMINISTIC — establish a stable…
claude Jul 27, 2026
382ca3d
docs(ocapn 59b): NOT nondeterministic — deterministic 0; prime suspec…
claude Jul 27, 2026
d65d486
docs(ocapn 59b): fuel refuted (100x makes no difference) — final hand…
claude Jul 27, 2026
fae355b
docs(pitfalls): add #45 — a module function's behaviour depends on th…
claude Jul 27, 2026
145565c
docs(pitfalls): #45 addendum — the variable is IMPORT ORDER; culprit …
claude Jul 27, 2026
25a8b94
ocapn(phase 59b part 2): FIRST op:deliver test passes — upstream 4 ->…
claude Jul 27, 2026
c889829
docs(ocapn): full 24-test upstream suite baseline — 5 pass, independe…
claude Jul 27, 2026
535c2b8
docs(ocapn 59b): design note — the single blocker for 3 of 5 objects …
claude Jul 27, 2026
53dabfb
ocapn(phase 59b part 3): Vat gains `outbound` — behaviours can finall…
claude Jul 27, 2026
3ce4f12
ocapn(phase 59b part 3): behaviours can SEND — greeter emits real op:…
claude Jul 27, 2026
c88d609
docs(pitfalls): #46 silent fuel exhaustion; #37 third occurrence; #45…
claude Jul 27, 2026
0ce8a2a
ocapn(59b p3): seed greeter at export 1N, raise drain-fuel, drop stem…
claude Jul 27, 2026
b65e6c9
ocapn(59b p3): greeter must read TAGGED descriptors, not bare syrup-refr
claude Jul 27, 2026
88e1d7b
ocapn(59b p3): keep greeter out of the gate — implemented, verified, …
claude Jul 27, 2026
65de297
docs(ocapn 59b): greeter E2E failure REPRODUCED OFFLINE — six hypothe…
claude Jul 27, 2026
7f59ea9
docs(ocapn 59b): REFUTE my own FFI-stash suspect; link greeter probe …
claude Jul 27, 2026
f0d3005
ocapn(59b p3): connection-step must carry the PUMP's vat; nat-payload…
claude Jul 27, 2026
8c4af36
fix(typing): scope the bounded typing run's fuel exhaustion — it was …
claude Jul 27, 2026
250f331
fix(subst): loose-bvar-range under-reported on association-pair field…
claude Jul 27, 2026
2af5005
ocapn(59b p3): greeter interop passes — two silent bugs on the no-rep…
claude Jul 27, 2026
a8be8d7
docs(ocapn 59b): measured full-suite interop status + exact gating pe…
claude Jul 27, 2026
e868b22
docs(ocapn): CORRECTION — all 24 upstream tests are reachable over TC…
claude Jul 27, 2026
05b119a
ocapn(59b p4): op:listen interop passes — promise-resolver object + v…
claude Jul 27, 2026
8594ff2
ocapn: fix a test that encoded the pre-verb broken-promise contract; …
claude Jul 27, 2026
d29ed8c
Merge origin/main (55 commits) — main's #58 substitution perf + #78 p…
claude Jul 28, 2026
5e1a7ef
docs(ocapn): decode-op root cause — Syrup DICTIONARY support is missi…
claude Jul 28, 2026
2342bd3
feat(syrup): DICTIONARY support — the handoff frames now decode; and …
claude Jul 28, 2026
d99c6b5
ocapn: exporter handoff handler lands and replies; gift table must go…
claude Jul 28, 2026
1ff0074
docs(ocapn): cross-connection gift store — design note, layering first
claude Jul 28, 2026
a26dde4
fix(ci): plumb --file-timeout through the runner; REVERT the bridge-t…
claude Jul 28, 2026
feb2489
docs(ocapn): correct the worklist — the bridge-test split was reverte…
claude Jul 28, 2026
bf9b90c
fix(ci): partition test-ocapn-bridge.rkt out of the batch runner — 30…
claude Jul 28, 2026
1f1bd84
docs: correct the timing diagnosis — "cost is per-FILE" was wrong; me…
claude Jul 28, 2026
5c6a260
perf: the memory report forced TWO major GCs per command — 2.3x of te…
claude Jul 28, 2026
9541a8e
docs(perf): profile the OCapN server workload — 76% of every frame is…
claude Jul 28, 2026
9f004ab
perf: memoize whole-program capability inference on an env-generation…
claude Jul 28, 2026
04adfdd
ocapn(59b p5): exporter-global gift table — third-party handoff passe…
claude Jul 28, 2026
6b0badb
ocapn(59b p5): handoff-receive is single-use — replay guard; interop …
claude Jul 28, 2026
57a1607
docs(ocapn): wait_deposit_gift — the flow that needs no cross-connect…
claude Jul 28, 2026
2466f32
fix(perf): widen the capability-inference memo key — the registry is …
claude Jul 28, 2026
0f26b9f
ocapn(59b p6): parked withdrawals — answer with a promise, settle on …
claude Jul 28, 2026
190f572
docs(ocapn): invalid_signature is blocked on a LOSSY record round-tri…
claude Jul 28, 2026
96ce659
ocapn: splicing re-encoder + the raw-byte length prefix — the signatu…
claude Jul 28, 2026
ce1e25d
ocapn(59b p7): verify the handoff-receive signature — interop 12 -> 13
claude Jul 28, 2026
5105e82
docs(ocapn): invalid_signature done — the byte-length bug it turned u…
claude Jul 28, 2026
8f5ec4a
fix(reduce): nf must RE-FIRE from-nat, not rebuild the node
claude Jul 28, 2026
f4a23bf
fix(tests): give WS temp files a per-process name — the batch flake w…
claude Jul 28, 2026
bbf55ed
ocapn(59b p8): emit op:gc-exports — interop 13 -> 16
claude Jul 28, 2026
34e1d7f
ocapn(59b p9): outbound sends become real questions; op:gc-answers — …
claude Jul 28, 2026
afaf479
fix(ci): set PLT_CS_COMPILE_LIMIT at job level — an interpreted build…
claude Jul 28, 2026
acf157e
docs: pitfall #51 — CI ran an interpreted compiler
claude Jul 28, 2026
c874bb0
ocapn(59b p10): promise pipelining — the Car Factory chain; interop 1…
claude Jul 28, 2026
707a28c
docs(ocapn): 19 of 24 — the last five are one capability, scoped
claude Jul 28, 2026
d4c3099
ocapn(59b p11): outbound connections — the server can dial
claude Jul 28, 2026
19dd613
ocapn(59b p12): crossed-hellos mitigation — interop 19 -> 21
claude Jul 28, 2026
52e5071
ocapn(59b p13): third-party handoff, RECEIVER side — interop 21 -> 23
claude Jul 28, 2026
0fe14b2
docs(ocapn): 23 of 24 — scoping for the last test
claude Jul 28, 2026
ad673ed
ocapn(59b p14): third-party handoff, GIFTER side — interop 24 of 24
claude Jul 28, 2026
2984d4a
docs(ocapn): known gaps, shortcomings and workarounds at 24/24
claude Jul 28, 2026
bae33ae
OCapN: close the handoff auth bypass, make the codec self-inverse, la…
claude Jul 29, 2026
beeb385
OCapN: land the test-server, CI and Node-peer fixes; make the wire sp…
claude Jul 29, 2026
22ff69c
OCapN: act on the adversarial verification pass
claude Jul 29, 2026
2da056b
docs(ocapn): record what the gap fixes actually did, including where …
claude Jul 29, 2026
9f22d3d
OCapN: SyrupValue gains sets and floats; the plain-value error names …
claude Jul 29, 2026
a235502
OCapN: op:listen carries wants-partial, undecodable frames abort, loc…
claude Jul 29, 2026
fa48408
OCapN: close five more gap entries; two others dissolve under their o…
claude Jul 29, 2026
064f9b0
docs(ocapn): record the §1.2 M3 attempt, including why it was reverted
claude Jul 29, 2026
077812e
OCapN: the signed handshake gets unit coverage, and ParsedSS the acce…
claude Jul 29, 2026
86b9bb9
OCapN: a forwarded pipelined deliver keeps its reply channel (§1.2 M3)
claude Jul 29, 2026
5921156
docs(ocapn): final status -- ten closed, two dissolved, one half, thr…
claude Jul 29, 2026
101bbf1
OCapN: eff-connect -- the first of §0.2's three primitives, and what …
claude Jul 29, 2026
4469f01
OCapN: act-step-pending, the enlivener moves into the vat, and the CI…
claude Jul 29, 2026
61c98fb
docs(ocapn): mark 0.3 closed -- export 5 has a real actor now
claude Jul 29, 2026
2370374
docs(ocapn): the remaining 0.2 work as a worked design, not a label
claude Jul 29, 2026
ba0d30b
OCapN: the enliven slot is a real export now (§1.7 M7 closed)
claude Jul 29, 2026
ae94753
test(ocapn): pin beh-sink -- absorbs a message, answers nothing
claude Jul 29, 2026
ccd75d2
docs(ocapn): status summary matches the entries again
claude Jul 29, 2026
e65e0f8
docs(ocapn): the connection registry is the gift table shape, not a n…
claude Jul 29, 2026
6dbcfe8
docs(pitfalls): #52-#54 — language and runtime findings from the hand…
claude Aug 1, 2026
872e064
OCapN: rebuild the handoff substrate — signing, the registry, and bot…
claude Aug 1, 2026
4feb7cf
OCapN: both handoff roles run in Prologos; the Racket scanners are de…
claude Aug 1, 2026
d52b4a5
docs(pitfalls): #55, #56 and the interop-environment note
claude Aug 1, 2026
b169c88
docs(ocapn): the gaps document has nothing open
claude Aug 1, 2026
47b2daa
docs(pitfalls): #57 — the CI interop failure, characterised and not ours
claude Aug 1, 2026
39dab4c
ci(interop): clear the .pnet cache before the one step that regressed…
claude Aug 1, 2026
ff99a8c
docs+ci: #57 — my probe cleared the wrong directory, and so did my lo…
claude Aug 1, 2026
18e8eae
docs+ci: #57 — cache exonerated properly; probe reverted; cause still…
claude Aug 1, 2026
3416776
docs(pitfalls): #57 widened — it is module loading on CI, wearing thr…
claude Aug 1, 2026
cec97e4
Merge remote-tracking branch 'origin/main' into claude/ocapn-prologos…
claude Aug 1, 2026
ffd0dda
merge main (120 commits) + in-flight diagnostic harnesses
claude Aug 1, 2026
f1e230b
chore: subagent harness zzcols — reader syntax dump with line/col
claude Aug 1, 2026
38a4e52
fix(ocapn): join two multi-line `let` values — main's LET series stop…
claude Aug 1, 2026
105c60f
docs: correct the record — CI tests the PR MERGE commit, and #57 was …
claude Aug 1, 2026
0bb8cb3
fix(ocapn): Tier 1 + 2 — the live bugs the review found, and the test…
claude Aug 1, 2026
9cfa0b1
fix(ocapn): Tier 3 — redeem a give ONLY over a connection we dialled
claude Aug 1, 2026
b998b18
refactor(ocapn): Tier 4 — delete the dead stratum, fix the lying comm…
claude Aug 1, 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
69 changes: 69 additions & 0 deletions .claude/rules/prologos-syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,38 @@ it) and `=` never binds.
```
Body at the **same** indent as `|` is a layout violation (currently produces a hard parser error; tracked in issue #27 for diagnostic improvement). Body indent must be **strictly greater than** the `|` column.

- **Never write three-deep nested `match` as a single function body.** Three-deep nested `match` inside a single function body fails to elaborate at *import time* with "Unbound variable" errors in Prologos's current elaborator. The fix is mechanical: factor into a chain of single-match helpers. Each helper does one `match`, returns to the caller, the caller does the next `match`. Same semantics for the user, no elaborator failure. OCapN Phases 15 and 21 both shipped this workaround; codified after the second occurrence. Until the underlying elaborator bug is fixed, this is the safe pattern.
```
;; WRONG — fails at import time
defn pipeline-deliver [target args v]
match [lookup-actor target v]
| some _ -> send-only target args v
| none ->
match [lookup-promise target v]
| none -> v
| some pst ->
match pst
| pst-unresolved msgs -> ...
| _ -> v

;; RIGHT — helper chain
spec deliver-to-promise Nat SyrupValue PromiseState Vat -> Vat
defn deliver-to-promise [pid args pst v]
match pst | pst-unresolved msgs -> ... | _ -> v

spec deliver-to-promise-or-drop Nat SyrupValue Vat -> Vat
defn deliver-to-promise-or-drop [target args v]
match [lookup-promise target v]
| none -> v
| some pst -> deliver-to-promise target args pst v

spec pipeline-deliver Nat SyrupValue Vat -> Vat
defn pipeline-deliver [target args v]
match [lookup-actor target v]
| some _ -> send-only target args v
| none -> deliver-to-promise-or-drop target args v
```

## Application style

- **Uncurried** -- `defn foo [x y z] body`, `spec f A B -> C`. Multiple arguments in one bracket group.
Expand All @@ -93,6 +125,38 @@ it) and `=` never binds.
- **Pipeline `|>` and `compose`** for chaining named functions -- `|> 5 inc dbl sqr` is idiomatic.
- **Eval is implicit** -- write `[f x]` not `eval [f x]`. Top-level expressions just evaluate.
- **Don't wrap outer tree** -- top-level forms are implicit.
- **Keep multi-arg applications on a single line.** A continuation line whose first token is a bare identifier is parsed as a sibling form, not as more args to the previous head. Pitfalls #36 and #38 (goblin-pitfalls log) both stem from this:
```
;; WRONG — `es as qs p oqs ir er pm` is parsed as an application of `es` to 7 args
bridge-state [list-filter-listeners-by-notified ls notified]
es as qs p oqs ir er pm

;; WRONG — `let X := EXPR` value can't span lines; reader sees no value for X
let step1 := [captp-incoming-with-state op1 [alloc-vat sa]
[bridge-state-with-our-session ver loc]]

;; RIGHT — all positional args on the function-head line; break BEFORE a bracketed sub-call (which becomes the last arg) if the line gets too long
bridge-state [list-filter-listeners-by-notified ls notified] es as qs p oqs ir er pm
```
If a line is unavoidably long, factor a sub-expression to a separate `let` or top-level helper rather than splitting positional args.

- **Single-arg `defn` over a `data` type uses `defn name [arg] match arg | ...`, NOT multi-arity `defn name | [pat1] -> ... | [pat2] -> ...`.** The latter shape can cause the elaborator to lift a phantom 2nd parameter (pitfall #37 in goblin-pitfalls). Multi-arity `defn` is fine for 2+ args; for one-arg over a data type, prefer `match`:
```
;; WRONG — inferred type becomes `PromiseState SyrupValue -> [Option SyrupValue]` (2 args)
spec resolution-syrup-of-pst PromiseState -> [Option SyrupValue]
defn resolution-syrup-of-pst
| [pst-unresolved _] -> none
| [pst-broken r] -> some [wrap-error r]
| [pst-fulfilled v] -> some v

;; RIGHT — inferred type matches the spec
spec resolution-syrup-of-pst PromiseState -> [Option SyrupValue]
defn resolution-syrup-of-pst [pst]
match pst
| pst-unresolved _ -> none
| pst-broken r -> some [wrap-error r]
| pst-fulfilled v -> some v
```

## Type annotations

Expand All @@ -115,6 +179,11 @@ it) and `=` never binds.
- Trait methods: short names (`eq?`, `from`, `add`)
- Module paths use `::` not `.` -- `str::length`, `prologos::data::nat`
- Dot access is for map keys -- `user.name` -> `[map-get user :name]`
- **NEVER use `->` in identifiers** (silently fails to compile per pitfall #35). Use `-to-` for converters: `refr-to-syrup`, `op-to-syrup`, `syrup-to-op`. The Common Lisp / Scheme convention `refr->syrup` is incompatible with Prologos's WS-mode reader, which parses `->` as the function-arrow type operator inside any identifier.

## Data type definitions

- **Constructor signatures have IMPLICIT return type** (per pitfall #34). Write `data X { ctor : T1 -> T2 }` to mean "ctor takes 2 args of types T1 and T2 and returns X." Do NOT write `ctor : T1 -> T2 -> X` — that means "takes 3 args (T1, T2, X) and returns X." Existing examples: `data Listener { listener : Nat -> Nat }`, `data QEntry { q-entry : Nat -> Nat }`. Symptom of getting it wrong: smart constructors fail with `Type mismatch [Pi T -> Result -> Result]`.

## Relational syntax (`defr` / `rel` / goals)

Expand Down
17 changes: 15 additions & 2 deletions .claude/rules/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,24 @@
- **Full suite**: add `--all` flag. Also: `--jobs N`, `--timeout N`, `--no-record`, `--no-skip`
- **Targeted tests (CRITICAL — use this, not bare `raco test`, after any production edit)**: `racket tools/run-affected-tests.rkt --tests tests/test-X.rkt --tests tests/test-Y.rkt` runs specific files with SCOPED PRECOMPILE (driver.rkt + the listed tests, ~0.5s incremental). This keeps test `.zo` linklets fresh after export changes in production modules, which `raco test FILE` alone does NOT do. Repeat `--tests FILE` per file (conventional command-line multi-arg pattern). **When to use targeted mode**: any time you've edited production code AND want to run specific tests — e.g., iterating on a failing test during development, verifying a fix hits the right paths, confirming a subset of tests before running the full suite. Avoids the class of "passes individually, fails in batch" / "reference to a variable that is not exported" (linklet mismatch) errors. Observed failure pattern: `raco make typing-propagators.rkt` + `raco test tests/test-X.rkt` → test's cached `.zo` holds a stale linklet snapshot of typing-propagators's exports; when exports changed, linklet-mismatch or silent wrong-results. The targeted runner's scoped precompile closes this gap. Origin: PPN 4C Phase 3c retrospective (2026-04-20) — the earlier sessions' runs didn't hit it because changes were internal (no export-surface changes); Phase 3c added multiple new provides and surfaced the gap.
- **Reporting**: `racket tools/benchmark-tests.rkt --report` / `--trend FILE` / `--compare REF` / `--slowest N`
- **Skip list**: `tests/.skip-tests` -- 2 pathological perf tests skipped by default (use `--no-skip` to include)
- **Skip list**: `tests/.skip-tests` -- pathological perf tests + batch-worker-incompatible tests skipped by default (use `--no-skip` to include). When a test is genuinely incompatible with the batch worker (e.g., spawns subprocesses with `(exit 0)` skip-guards that kill the worker, exceeds the 120s per-file timeout for legitimate reasons), partition rather than patch the worker. The OCapN track skipped 9 tests (`test-ocapn-vat.rkt`, `test-ocapn-acceptance-l3.rkt`, plus 7 Node-spawning interop tests) and ran them via `raco test` directly in a separate CI workflow (`.github/workflows/interop.yml`). Patching the batch worker to handle subprocess-spawning would have been 1+ days of compiler infrastructure work; the partition was 30 minutes. Rule: **when test infrastructure mismatches a test's needs, partition rather than patch**; document in `.skip-tests` with the reason and the alternate runner.
- **Microbench from Phase 1 in protocol stacks** -- protocol stacks (codecs, wire serializers, parsers over byte streams) have asymmetric latency hidden in tight inner loops. A microbench at the encode/decode boundary catches it during Phase 1 instead of Phase 9. OCapN's decoder shipped slow through Phases 1–8 because every test was a single small case; Phase 9's pipelined RPC was the first thing fast enough to expose the regression, and Phase 13 needed a tail-recursive accumulator + inline destructure for a 25× speedup. **Operational rule**: when implementing a codec/serializer/parser, every Phase 1 should include `tools/bench-ab.rkt` runs of encode + decode at varying message counts (1, 10, 100). Catching the perf bug at Phase 1 saves the multi-phase regression chain.
- **Guideline**: Keep test files under ~20 test-cases / ~30s wall time for good thread-pool parallelism
- **Delimiter check after .rkt edits**: Run `tools/check-parens.sh <file>` after EVERY edit to a `.rkt` file, BEFORE `raco make`. Instant (~100ms, read-only). Catches mismatched `()`, `[]`, `{}` with exact line:column. Eliminates trial-and-error bracket-balancing during compilation.
- **Pre-compilation**: Both runners call `raco make driver.rkt` AND all test files before tests (skip with `--no-precompile`). The suite runner's `precompile-modules!` compiles BOTH — test files are NOT in driver.rkt's dependency graph, so `raco make driver.rkt` alone does NOT recompile them.
- **Compile limit (`PLT_CS_COMPILE_LIMIT=1000000`) — ADOPTED (Rel T1 SUB.2, owner-blessed 2026-07-24)**: the runners (`run-affected-tests.rkt`, `bench-ab.rkt`) `putenv` it at startup, so all suite/bench builds get it automatically (subprocesses inherit; explicit user override respected). The compiler's giant match functions (shift/subst ~340 arms, whnf/nf ~990) exceed the CS default (10000) and fall back to the INTERPRETER — measured: shift ~830× faster compiled; suite 211→173s (−18%). **Manual `raco make` outside the runners should set it in the shell** (else the touched modules silently rebuild interpreted and the next suite run eats the difference): `PLT_CS_COMPILE_LIMIT=1000000 raco make driver.rkt`. ⚠ A/B measurement trap: `touch FILE && raco make` does NOT recompile (SHA short-circuit) — delete the `.zo`/`.dep` to force a true recompile. Evidence: `docs/tracking/2026-07-24_SUBSTITUTION_CONTAINMENT_DEFECT.md` §4.2.
- **Compile limit (`PLT_CS_COMPILE_LIMIT=1000000`) — ADOPTED (Rel T1 SUB.2, owner-blessed 2026-07-24)**: the runners (`run-affected-tests.rkt`, `bench-ab.rkt`) `putenv` it at startup, so all suite/bench builds get it automatically (subprocesses inherit; explicit user override respected). The compiler's giant match functions (shift/subst ~340 arms, whnf/nf ~990) exceed the CS default (10000) and fall back to the INTERPRETER — measured: shift ~830× faster compiled; suite 211→173s (−18%). ⚠ **CI must set it at the JOB level, not rely on the runners** (added 2026-07-28): the
workflows precompile with a bare `raco make`, which does NOT putenv it, and the `.zo`
that step produces is interpreted for the rest of the job. This is not a slow-build
nuisance — the OCapN interop gate reported **14 passed / 1 errored** on CI while passing
**17/17** locally, and rebuilding locally without the limit reproduced 14/1 exactly.
Upstream's tests carry their own wall-clock budgets (15s for a GC round trip), so
interpreted reduction FAILS rather than merely lagging. All three workflows now set
`env: PLT_CS_COMPILE_LIMIT: 1000000` at job level, and
`tools/interop/run-ocapn-test-suite.sh` exports it itself so the gate does not depend on
its caller. **When a CI-only failure has no local repro, check the build environment
before the code** — an interpreted build is a different program.

**Manual `raco make` outside the runners should set it in the shell** (else the touched modules silently rebuild interpreted and the next suite run eats the difference): `PLT_CS_COMPILE_LIMIT=1000000 raco make driver.rkt`. ⚠ A/B measurement trap: `touch FILE && raco make` does NOT recompile (SHA short-circuit) — delete the `.zo`/`.dep` to force a true recompile. Evidence: `docs/tracking/2026-07-24_SUBSTITUTION_CONTAINMENT_DEFECT.md` §4.2.
- **Separate compile from test timing**: When measuring suite wall time for performance comparison, run `raco make driver.rkt` as a SEPARATE step first, THEN run the test suite with `--no-precompile`. Compilation time varies by cache state and pollutes wall time measurements.
- **Stale test `.zo` auto-recompile** -- When `--no-precompile` is used, the runner now detects stale test `.zo` files (older than the production `.zo`) and auto-recompiles them before running. This fixes the historical trap where `raco make driver.rkt` + `--no-precompile` left test `.zo` stale (because tests aren't in driver's dependency graph). Stale test `.zo` silently produced wrong results via batch-worker `dynamic-require`. With auto-recompile, the runner just handles it — typical repair <5s when only a few files are stale. Use `--force-stale-zo` to override (for intentional reproduction of old behavior); otherwise the runner keeps you safe. Confirmed trap in BSP-LE Track 2B Phase T-a diagnosis (multiple cycles of "passes individually, fails in batch").
- **DAG impact**: `prelude.rkt` or `syntax.rkt` -> nearly all tests; single `.prologos` lib -> 1-15 tests; single test -> 1 test
Expand Down
Loading
Loading