Repository navigation
docs: record AF-CTR-03 parts A1b and A2 (error catalogue, Android Custom Tab decision, receipts and step-up, center account pages) - #45
Conversation
…cord the Android Custom Tab decision - errors.md: an effect of UNKNOWN never pairs with AFTER_TIME (the Contracts rule arcError rejects it): peer_unreachable and cloud_unreachable advise RECONCILE with UNKNOWN, provider_error advises RECONCILE, INTERNAL/internal advises NEVER with UNKNOWN. Reply rules (valid details, a real resource ID, retry_at on every AFTER_TIME refusal, no personal data from receipts) and the documented meaning of RESOURCE/overloaded for a duplicate delivery (effect describes this delivery, not the command). - reuse-map.md and android.md: the Android Custom Tab sign-in is supplied by AF-CTR-04 as a mobile native authorization (browser PKCE, verified app link, an additive Contracts document admitting arcforges-mobile); AF-AND-01 depends on AF-CTR-04. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys
…d the revocation cascade cloud-store.md section 6 gains the delivered A1b behaviour of Cloud #120 (merged 5ee9ea1): the receipt table and its digest rule, retention and personal-data statement, the single-use step-up evidence and the device revocation cascade with the operator command. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys
…F-CTR-03 part A2 web.md gains the section for the center's own pages (routes, the WebBrowserSession cookie, CSRF and Origin rules, the constraints and seven security headers, the contract gap for the browser error body, the dark production state and the evidence); reuse-map.md states that the WebBrowserSession document has been served since Cloud #121 (merged 204f47a). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys
…the acceptance environment web.md: page replies carry Cache-Control no-store, no-transform (the Cloudflare edge otherwise injects its Web Analytics beacon into the HTML) and the Worker's requests to the Container must not follow redirects (a Durable Object stub follows a 303 by default and turned every protected page into the Worker's 503). Delivered by Cloud #122 (merged 2f2a3b3). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys
…y, reconciliation operations and served pages errors.md: overloaded is the answer to a duplicate only while the first delivery holds a passkey-registration flow attempt or when the receipt lookup fails; any other duplicate of a committed command replays the stored receipt; an unanswered COMMIT of the call's own write is INTERNAL/internal UNKNOWN NEVER. The RECONCILE rows (peer_unreachable, cloud_unreachable, provider_error) name their read operations; the INTERNAL row gains the HAPPENED advice; one-use calls are not resent; the reply rules cover every StateFailure and the caller's own objects; delivered-against-target and the fixture regeneration are recorded; the Worker's replies without ResponseMeta are a known exception. web.md: /connect and /activate are not served until AF-CTR-04; seven of ten WebBrowserSession routes are served; policy defaults are defaults; the seven headers belong to page routes; the JSON error shape, status mapping and Worker refusals are stated; AF-ID-01 becomes AF-CTR-03. cloud-store.md: migration ownership, receipt retention and sweep owner, step-up operation IDs and targets, no cascade participant registered yet. Also: reuse-map wording, android.md app-link owner, architecture 10 pages surface and center.surfaces, architecture 11 privacy rows for receipts and flow digests. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys
Review record, round 1 (head 79d8ac3)Method: one independent reviewer and two adversarial fact-check lenses (errors, docs), 21 deduplicated findings, three skeptics per finding (reproduce, refute, impact), and a completeness critic. 68 agents; both host statuses were success on the head; Result: changes required.
The two decisions themselves held: the UNKNOWN/AFTER_TIME rewrite matches the Contracts rule Findings confirmed by at least two of three skeptics: 21 of 21. Confirmed blocking by the skeptics: 1.
Disposition: all blocking and all one-phrase fixes are applied in the next commit of this branch; Plan alignment (AF-CTR-04 scope, R-AUTH-002, design refs, the assetlinks owner), the remaining architecture/10 rows and a row-level Generated by Claude Code |
…dings of its delta review errors.md: a row that names only state.resource sets state to the object's kind (not the category); the three RECONCILE reads that need an ID only the lost reply would carry (BeginPairing, BeginSignIn, CreatePhonePairing) advise SAME_COMMAND with UNKNOWN instead; the Effect rule and the pair rule name retryAdvice and the resend of a command under a receipt; the duplicate sentence notes the credential check; the Cloud follow-up is an AF-PROD-01 prerequisite. architecture/10: a disabled pages surface is the Worker's 404, not not_activated; pages joins the Core activation row; the surface names are target names fixed by AF-PLAT-01; rows 36, 37 and 95 follow the delivered AF-CTR-03 behaviour. web.md: 413 and 415 in the status mapping, the Worker's statuses that can follow a started call, its refusals' other headers. reuse-map.md: the app-link hosting is not yet assigned. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys
Review record, round 1 delta (head 36cfdd8)Fix commit Result: changes required. The round fixed 23 of the 25 spec ids, and introduced two regressions that all three skeptics confirmed as blocking:
Non-blocking, all confirmed (3/3 unless noted): three named RECONCILE reads need an ID that only the lost reply carries ( Disposition: every finding above, including the non-blocking ones, is addressed in the next commit (round 2); a second delta review follows. The remaining deferrals (Plan record, reuse-map §2 row, row-level Generated by Claude Code |
Review record, round 2 delta (head 42f047c)Fix commit Result: approve. Reviewer, lens errors and lens docs approve; the critic raised no blocking gap. No finding was confirmed blocking (0 of 11; each was confirmed real by at least two of three skeptics except one lens-docs item at 1 of 3, and none was rated blocking by any skeptic). Both round-1 regressions are fixed: the Reply rules say Non-blocking residue, carried to the next Design companion with the Plan record (none changes a statement about delivered behaviour in a way that yields wrong behaviour; they are imprecisions or forward references): the Worker's start-failure 503 and Generated by Claude Code |
Records the Design companions of AF-CTR-03 parts A1b and A2 (Plan milestone MC), delivered by Cloud #120 (
5ee9ea1), #121 (204f47a) andthe hosted-path hotfix #122 (
2f2a3b3). AF-CTR-03 staysactive: part B, the live mail adapters and the Plan record follow, so this PRmarks only what is delivered and leaves the target text of later parts as it is.
Changes (seven files)
arcError(cohort1.0.0-ci.416.1, enforced by every generated validator)rejects an
ArcErrorwhose effect isUNKNOWNand whose retry mode isAFTER_TIME, and the ruleretryAdvicerequires a reconciliationoperation exactly for
RECONCILE. Four rows contradicted them and now follow them:STATE/peer_unreachableandSTATE/cloud_unreachableadvise
AFTER_TIMEwithDID_NOT_HAPPENand, withUNKNOWN,RECONCILEreading a named operation that needs no ID the lost reply would have carried, orSAME_COMMANDfor the methods that create an ID (BeginPairing,BeginSignIn,CreatePhonePairing; idempotent bycommand_id);EXECUTION/provider_erroradvisesRECONCILE(StoreBillingService.GetBillingStatus);INTERNAL/internaladvisesNEVERwhen theeffect is
UNKNOWNandAFTER_TIMEonce when it isDID_NOT_HAPPENorHAPPENED.NEVERwithUNKNOWNadvises against an automaticresend; a command under a receipt may still be resent. (This is the "E4-INTERNAL" item of the #120 review.)
effectdescribes this delivery.RESOURCE/overloadedanswers a duplicate only while the firstexecution holds a
CompletePasskeyRegistrationflow attempt, or when the receipt lookup failed after the first delivery committed; any other duplicate of acommitted command is answered with the stored receipt; an unanswered
COMMITof the call's own write isINTERNAL/internalUNKNOWNNEVER.StateFailurecarriesstate(the object's kind) andreason(the code), a resource only with a real 16-byte non-zeroID (the caller's own or the one it named),
retry_aton everyAFTER_TIMErefusal, a named read on everyRECONCILE, and no personal data from a receipt.AFTER_TIMEwithUNKNOWNfor unexpected failures and has no reconciliation field; the follow-upis an AF-PROD-01 prerequisite carried by the Plan record; the Contracts fixture is regenerated in the next Contracts window with an explicit pair form.
ResponseMeta(a known exception until a Contracts window).platform.command_receipt(migration ownership, one row per principal and command ID, the request-bytesdigest without
RequestMeta.correlation_id, which writes have receipts, no token and no e-mail address in a result, 90-day retention, the sweep owner,personal data), single-use step-up evidence (operation ID and target, evidence lifetime), the device revocation cascade (none registered yet) and
admin revoke-sessions./connectand/activateare not served until AF-CTR-04),the
__Host-af_sessioncookie (defaults 12 h absolute, 30 min idle, with the policy bounds), seven of ten WebBrowserSession routes, CSRF and Origin rules, thereturn path in the fragment, the constraints (no external asset, one
textContent-only script, exactly seven security headers on page routes), the contractgap (the error body, the status mapping, the Worker's own plain-text refusals), the dark production state, the evidence, and the two hosted-only findings of
Cloud #122 (
no-transformagainst the edge's Web Analytics injection; the Worker's requests to the Container must not follow redirects).authorization (browser PKCE on the center's own page, the verified app-link redirect
https://arcforges.com/app/callback, an additive Contracts document thatadmits
arcforges-mobile; the version-1 document stays unserved); AF-AND-01 depends on AF-CTR-04; serving/app/callbackandassetlinks.jsonis not yet assigned.pagessurface in the surface list and the Core activation row,center.surfacesand the Container restart (delivered), a disabledpagessurface is the Worker's 404, rows 36, 37 and 95 follow the delivered behaviour. architecture/11-security-privacy.md §5: rows for command receipts and forflow and rate-limit digests.
Evidence and review
5ee9ea199ebdf48a2283c0116b437d9aeecde9d3, #121 at204f47aefe163bcf47674e4a1063ed3e13be4cae, #122 at2f2a3b3ff87599d434d8e084e864d579a4047eda. Their review records are comments on those PRs.0.1.0-ci.481.1,center.surfacesnone; proof (run 41118713200): artifact0.1.0-ci.482.1,center.surfacesidentity,pages; the real-browser acceptance (Chromium 153 with a virtual authenticator, MOCKED hardware in a real browser) passed on proof, and areal Windows Hello passkey (AR-23) is the owner's remaining step.
the round-1 delta (two regressions, fixed) and the round-2 delta (approve, no blocking finding). Host statuses
arcforges/linuxandarcforges/windows: success on the head.python3 tools/check_design.py --require-protoc: 0 errors.depends_on, the owner of the app-link hosting, the AF-PROD-01 prerequisite), thereuse-map §2 row, a row-level
check_designgate for the pair rule, and the non-blocking residue of the round-2 review (listed in the review comment).🤖 Generated with Claude Code
https://claude.ai/code/session_01H6Cf6m33VJNzs4rRjpdgys