- idempotency built, reviewed, then reverted WHOLE to the tag
archive/porch-idempotency. Not a design failure: it passed its gates.
It provokes a C-runtime SIGSEGV in wo_arena_alloc/wo_str_new under
concurrent call()-parked callers
- the evidence for that attribution: over ten gate runs every failure
was an idempotency leg and none was the limiter's, which drives the
same pool through the same call/park machinery. The begin arm has 5x
the allocation sites inside receive and moves a whole Req plus a
Handler through the mailbox
- before the split the suite reported 0 to 6 failures run to run; after
it, five consecutive runs at 56 checks, 0 failures
- PoolMsg loses digest/req/handler, and NullHandler/dummy_req/fresh_req
go with them — every rate-limit count used to allocate a throwaway
Req it never read
- IdempotencyKey is KEPT and commented: the schema is settled and the
digest-as-column decision cost a review round to get right
- the limiter's saturation 503 has no leg of its own now (§19 drove
Idempotent). Stated in the README rather than papered over — a
deterministic leg needs a slow actor, and only the reverted arm was
- new: porch 9 (idempotency, on hold) and language 41 (the arena crash,
with the reproduction harness and the evidence that localises it)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 79e6da4465133dc555e913c960d544ef1c7bedd8)
- stored/replayed headers widen from content-type only to an allowlist
(content-type, location, etag, cache-control), matched case-insensitively
-- a redirect() lost its Location on its own first response, not just replay
- add pool_slots(Pool) -> multi PoolSlot and pool_of(multi PoolSlot) -> Pool
- Pool is demand-promoted to traced (WO-E222) and can't live in actor
state; PoolSlot/multi PoolSlot never is, the same shape chat/main.wo's
Room already holds directly -- this is what lets an app actually shard
across N actors per connection instead of a forced one-slot pool
- log a genuine pool_select trap instead of silently folding it into 503
- fix stale comments: the prune below IS a delete-then-insert (of a
fresh row, not the same one) contradicting the doc comment above it;
the catch shape referenced in two comments had changed
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit b738269314f01a95dee1341437c7661ce9e28730)
- Add digest field to store sha256(method|path|body) separately from key
- Enables detection of "same key, different body" in future tasks
- Update idempotent.wo insert to compute and store digest value
- Typechecker passes: exit 0
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 3a9bddcd1e3c11f5b371ce54cafc373685ca08b6)