Repository navigation
Conversation
|
Validated at I reproduced the defect causally on unmodified Defect reproduced on unmodified
|
|
This PR and #155 make the same fix: both make I checked this locally on Windows (tsc and vitest run directly, not
Differences:
Which one to keep is up to the maintainers and the two authors (@ZedLab1, @maho0638). |
|
Thanks @vanilla3 for testing both trees, and good to see the same fix reached independently. For context: #155 has been open since 11 September, and bdunn77 independently validated the same head (2a2c436). Placing its check before |
|
Thanks @vanilla3 and @ZedLab1 for the independent comparison and for linking #155. I agree these PRs address the same write-boundary invariant, and #155 predates this submission. Both regressions have now been demonstrated to fail on unmodified main and pass with either implementation (apart from their message wording); my exact-head fork CI also passed 104 root + 42 MCP + 33 Worker tests: https://github.com/maho0638/tclk/actions/runs/38313393911. The |
What
tclk_post_framenow refuses to post a decoded frame when the transport DID that will authenticate the room record does not matchframe.from.This covers both posting paths:
did/sig/nonceTECHNOCORE_SIGNING_KEYThe no-identity challenge path is unchanged; the caller-signed retry is checked before any POST.
Why
The transcript verifier treats the transport sender binding as mandatory: a signed record only advances when
frame.from === record.sender.Before this change,
tclk_post_framedecoded the frame but discarded that decoded value, then allowed either a caller DID or the configured signer DID to authenticate a frame naming a differentfrom. Technocore could therefore accept and permanently append a signed record that this package's ownfoldTranscriptnecessarily rejects later as<type>.from does not match the record sender.This is a fail-closed consistency fix at the MCP write boundary. It does not change the tclk/1 wire format or state machine.
Regression coverage
Added transport tests proving that:
fromdiffers from the configured signer DID;fromdiffers from the supplied DID;Checks
mainat5cc4ab93efbc8999a3a7e1471b639deca25998eaCHANGELOG.mdupdated under[Unreleased]pnpm install --frozen-lockfile && pnpm -r --include-workspace-root buildpnpm -r --include-workspace-root test13 Oct 2026 exact-head verification: fork-only GitHub-hosted Ubuntu CI successfully tested source head
2df756bcbe5778e37fed1c82f133fe06ecb51e94: frozen install, complete recursive build, root 104/104, MCP 42/42, Worker 33/33 (179/179), plus commit-message gate. Evidence: https://github.com/maho0638/tclk/actions/runs/38313393911. The fork validation PR is temporary; it will not be merged. Upstream GitHub Actions may still require maintainer approval.Overlap and maintainer decision
Independent review on 16 Oct identified that earlier #155 fixes the same sender-binding invariant. Both PRs prevent mismatched signer/frame writes before fetching, and both regression pairs fail on unmodified main; only one implementation should merge. #155 performs its guard before allocating a nonce, while this PR's server-signed path allocates one before refusal; neither changes the wire protocol. Independent comparison. I defer selection to maintainers and will not open a second competing PR; if #155 is selected, this PR can be closed as superseded.