feat(authz): verify human proofs for offline account linking - #2401
Merged
Merged
Conversation
Co-Authored-By: coreplane-switchboard[bot] <318072483+coreplane-switchboard[bot]@users.noreply.github.com>
coreplane-switchboard
Bot
requested a review
from justinhelmer
as a code owner
September 26, 2026 02:37
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds replaceable Access and Slack human-proof adapters with a replay-safe, bounded handoff to the atomic link transaction. Signed-proof and adversarial tests establish the offline ceremony without enabling account linking for users.
Why: U2c #2387 needs verified human subjects before U2b #2389's transaction can safely bind them. Email and bot credentials cannot establish control; record 0081 remains proposed and grants no live authority.
Where to look
Feedback wanted: Challenge the claim-before-exchange/crash boundary and the signed human-subject checks. Confirm that no live linking or person-derived authority becomes reachable.
Risk: 1,219 changed lines; considered splitting adapters from ceremony, kept together to prove the handoff. Incorrect proof admission could misbind future users, but no live caller exists. Revert this additive slice before enablement; existing ingress and email bridge are unchanged.
Verified: 110 focused tests pass; scoped types, lint, formatting, hygiene and spec/docs/decision gates pass. Exact-head CI and independent review remain pending; a person merges.
Decisions (5)
Validation (14 criteria)
For agents
Bound unit branch retained as contracted. Initial rebase was caa2887; final pre-push rebase advanced to 358c21a without conflicts. No generated artifacts or decision records changed. Scoped /tmp/tsconfig-u2c.json extends the repository tsconfig, sets absolute rootDir and node_modules/@types typeRoots, and includes src/channels/linkProof*.ts, src/core/identity/.ts and src/core/identity/testing/.ts. Initial external config lacked typeRoots and could not resolve Node types; corrected before the passing gate. Full suite/typecheck/verification are CI-only and were not run locally. Independent fresh-context review is unavailable to this coding child; parent Ship owns it. Cross-model review skipped in this non-interactive run. Live transport logging/redaction and cookie/CSRF/rate-limit acceptance remain deliberately unproven because no ingress is installed.
🤖 Generated with Claude Code