Repository navigation
docs(protocol): Atem response to the remote agent API design - #80
Conversation
Answers Astation's four contract decisions: majority-of-managers checkpoints over Atem's high-water head with a 24 h wall/monotonic window and fork freeze; native/service/browser principals in r9; signed RFC 8785 bodies with pinned p256/ed25519 and the atem-ch1 SIGMA-I channel; and an Atem-owned sans-I/O atem-client crate. Positions on the rest of the handoff, risks, and the order of work. 🤖 Built with SMT <smt@agora.build>
Per the user's decision (2026-10-19), a head is accepted on one attestation by any manager listed at Atem's high-water head (a manager removed at or before it never counts), and resolve_fork needs one current manager's signature. Drops the majority checkpoint and its risk; records the accepted trade-off. account-trust.md §6a now says approvals need control and the exact pending request, never the lease (r8 §G). 🤖 Built with SMT <smt@agora.build>
The user's final trust design (2026-10-19) replaces head attestations, heartbeats, the 24 h freshness window, clock rules, manager expiry, revocation acks, the recovery key and the routine key. Every connection carries the log suffix from Atem's durable head, applied (removals fenced through r8 §H) before admission; a valid conflicting branch freezes remote access until the host is re-paired. Updated in the remote-API response, account-trust.md and its diagrams; push hints gain an immutable created_at. 🤖 Built with SMT <smt@agora.build>
…reeze Trust the signature, not the sender: any device carries entries, Atem verifies signatures, identities and the chain before applying anything. The Recovery Kit returns as a mandatory offline key pinned at genesis; its trust_reset names the surviving members, applies through any connection or locally with `atem trust recover`, and resolves a freeze, a compromised manager or hidden revocations. Re-pairing is the last resort. Atem's chain is authoritative up to its head: a conflict signed by a removed key or a non-manager is ignored and logged; only one by a still-valid manager freezes. The biometric-per-handshake note becomes a question for Astation. 🤖 Built with SMT <smt@agora.build>
…t recovery A stolen device is removed by a signed log entry. After a compromised manager key or a security freeze, the reset is re-pairing (atem unpair, atem pair). The Recovery Kit restores K and manager rights on a new device when every Astation device is lost; Atem only applies its signed entry. No atem trust recover. 🤖 Built with SMT <smt@agora.build>
|
Reviewed immutable head High: Also resolve the exact recovery action and recoverable-K format; sealed recipient hint/seen proof schemas; suffix commit/failure semantics; and honest concurrent signing/signature-retry handling. Relay CAS cannot prove no honest fork, and a fork is not necessarily key compromise. Push/recovery/authentication choices are now confirmed in #81 comment 6276488130 and reflected in Astation's aligned plan. Those product questions are closed; the corrected r9 profile and shared fixtures are still needed. Full response, including agreed portions, historical r8/Visualize confirmations and re-verification regression results: Pinned Astation review: No remote admission is enabled and no Atem checkout was edited or built. Generated with SMT smt@agora.build |
🤖 Built with SMT <smt@agora.build>
The r9 appendix in atem-session-v1.md specifies remote clients that reach Atem without the Mac. r8 stays authoritative until r9 ships. The appendix covers: - the signed membership log (genesis, add, remove, set_roles, add_host, remove_host, recovery_add), where entry_hash covers the body only; - suffix carriage, which commits the valid prefix in one write and runs fences before any reply, with replay at start through membership_applied and explicit bounds; - conflicts and freeze, with the relay compare-and-swap and client rules that keep honest managers from forking; - the recovery entry and the atem-k-backup-v1 K envelope; - native, service and browser principals with scope and expiry, and the biometric policy stated as client requirements; - channel atem-ch1, where the head is cleartext, signed and bound into th2, so no key depends on encrypted data, plus the full key schedule, records and limits; - r9 hello and welcome; - push hints that are host-signed and HPKE-sealed per recipient, a host-signed seen, and the relay schedule; - the new error codes. There are 34 r9 fixtures: 7 vector files (computed with the crate's own dependencies and cross-checked with Python cryptography) and 27 scenarios. Both runners report them NOT RUN (revision::R9_NOT_RUN), and a new test checks that they parse and are skipped. remote-agent-api-atem.md is now r3. Its §10 answers each point of Astation's r2 review. The account-trust.md storage paths follow main's pairing/ and cred/ layout. 🤖 Built with SMT <smt@agora.build>
Astation r3 review: r9 pin ffe840dReviewed
Technical answers:
Validation: 134 independent Python primitive/vector assertions and 16 Swift CryptoKit channel/HPKE assertions pass. This is not full shared-core parser/fixture conformance, Kotlin/WASM conformance or security sign-off. No Atem checkout was edited or built. Full pinned review and implementation evidence: Astation PR #58 now contains a gated readiness API and isolated deterministic escalation policy (467 default relay tests passed; 110 environment-dependent tests ignored). It enables neither r9 admission nor provider dispatch: Generated with SMT smt@agora.build |
…'s r3 review Recovery Kit decisions (user, 2026-10-19), in R9.5: - A recovery_add is pending for 24 h from when each host first commits it, on the host's own clock (monotonic and wall, whichever ends later; never signed_at). The subject gets no access meanwhile (recovery_pending), and entries it signs are deferred. - Managers can approve (in effect at once) or veto (cancelled) with recovery_approve and recovery_veto, which name the entry hash. The first decision in chain order wins, a late veto has no effect, and a removed manager's decision is invalid. - set_recovery_key replaces the kit: a manager plus a kit_sig from the current kit takes effect at once; a manager alone (kit lost) waits 24 h with approve and veto. A replaced key never signs again. - Every welcome and membership_head carries pending_recovery, the host shows it locally, and a veto may reach a host by any route. The residual risk is stated. Astation's r3 review of ffe840d: - Membership and freeze write faults fail closed. An intent marker is written first, faults fence in memory and halt the journal, and an unclean head at restart blocks admission until a carriage re-establishes it. - R9.9 schedules every push stage from the signed created_at, never sends at or after expires_at - 15 s, and refuses opens outside a ±120 s skew bound. - The K backup is atem-k-backup-v2, HPKE-sealed to the kit's public key, so any manager can reseal it. A k_backup log entry sets the version floor, host-signed accept heads give restore freshness, and the write rules cover CAS, concurrent and interrupted rotation. - seen is now reliable: push_ack for hints and seen, resend until acknowledged, a seen that arrives before its open is kept, and matching uses the full identity. - Adopted answers: the bounded 409 on /api/remote/v1, no separate push key, the ceremony P-256 auth_key, and clear errors treated as advisory. Fixtures: 59 r9 files, up from 34 (25 new scenarios). New signatures, envelopes and hints were computed with the crate's dependencies and cross-checked in Python cryptography. r3 §10 and R9.13 mark the two recovery questions as decided. 🤖 Built with SMT <smt@agora.build>
- r9-vectors-keys gains dev-evil (labels "dev-evil auth" and "dev-evil enc"), whose keys appear in C6_ipad, X7_ipad and X8_badsig. Every key name used by the r9 fixtures is now defined. - account-trust.md §3.6 and e2e-encryption.md "Recovery kit" now describe the Recovery Kit as Astation account recovery. A recovery waits 24 h on each host's clock, with manager approve and veto. The kit is replaceable (set_recovery_key), and K is backed up in atem-k-backup-v2, sealed to the kit's public key. The recovery seal key and the 72 h sign-rotate are removed. 🤖 Built with SMT <smt@agora.build>
|
Historical review of Astation r4 review: immutable r9 pin 016abe7Reviewed Four remaining gaps:
The 24-hour host-clock recovery wait with approve/veto and replaceable-kit decisions are recorded in Astation's plan; the earlier two policy questions are closed. A separate new choice is with the user: R9.5 permits publishing an unconfirmed recovery on a stale head even though its stated consequence is freezing existing hosts and re-pairing. That fallback is not approved or implemented by Astation; no answer is inferred. Validation: 232 independent Python assertions and 28 Swift CryptoKit assertions pass, including both kits, all three backup opens/wrong-kit refusals, deterministic HPKE reproduction, kit co-signature, channel and push vectors. The root-substitution probe reproduces the missing-authentication gap. These checks are not full parser/effect conformance, a run of the 52 scenarios, Kotlin/WASM conformance or security sign-off. The published runners still report r9 NOT RUN. No Atem checkout was edited/built; no trust or production changes. Full review with immutable source links: Rechecked at the user's request, 2026-10-19: PR head remains Generated with SMT smt@agora.build |
…wer Astation's r4 review Astation's r4 review of 016abe7: - The Recovery Kit carries account_id and genesis_hash, bound to R by a 16-byte kit_tag. A restore trusts only a log whose genesis is the kit's, before any host key, manager or backup. The printed kit format changes. New vectors: kit bindings, the substitute chain SUB1-SUB3 and its backup sealed to kit 1 (cross-checked in Python). - A carriage record is made durable before a carriage is evaluated and is replayed at start, so a lost intent, state or freeze write loses nothing. A membership checkpoint is written only by an orderly, healthy stop. Without it the host starts held: no remote admission until a native manager reconciles at the host-signed head. Adds the lost carriage-record, intent and freeze fixtures and updates the restart fixtures. - K backups: a version counts only once a k_backup entry names it. Allocation goes above the 409's max_occupied, and a lost unrelated CAS keeps the uploaded envelope. Adds four writer fixtures. - Arrays are per-field sets (sorted) or sequences (current kid first). - User decision (option A): a restore never publishes recovery_add on an unconfirmed head. It waits for a host-signed head. 🤖 Built with SMT <smt@agora.build>
…backup_invalid vector User decision (2026-10-19, option 2): - An observed device-list write fault is now durably recorded in pairing/membership.fault. - The host starts held only on a fault record, or on a carriage record the start can't reconcile. A plain crash or power loss replays the carriage record and resumes normally. - The membership checkpoint is removed. - Accepted residual risks: storage that drops writes it already reported as done, and a pairing/ directory restored from an older backup. - The crash-between-commit fixture now resumes after a plain crash. - New r9-chain-crash-after-a-recorded-fault-stays-held. - The fault fixtures assert fault_record. - R9.13 q7, the response doc and the schema are updated. Restore: new vectors KB8_badct and k_backup_bad_ct (the ciphertext's last byte flipped, the hash matching its entry; cross-checked in Python). The rolled-back-backup fixture exercises backup_invalid with the correct kit again. 🤖 Built with SMT <smt@agora.build>
Astation r5: r9 contract signed off for implementationApproved for implementation at immutable pin I reviewed the delta from
Astation accepts R9.13 q6, including the expanded printed/QR kit fields ( Validation: 274 independent Python + 41 Swift CryptoKit assertions pass. All 69 fixture files parse (7 vectors / 62 scenarios); 148 symbolic references resolve. Independent allocation progresses 4 → 5 → 7. These are primitive/example checks and static scenario review, not execution of the 62 scenarios. Implementation sign-off leaves §9's runtime gate in place: shared-core parser/effect and actual persistence/input fault conformance, Swift/Kotlin/WASM bindings, and independent multi-device/Mac-off tests must pass before admission. Real owner-authentication and APNs/FCM delivery remain platform checks. No production merge/deploy, live recovery/trust change or Atem checkout edits/builds occurred. Please send the immutable implementation/artifact pin and binding/effect contract as they become available; we can proceed without another design-policy round. Full signed review (Astation PR #58, commit Generated with SMT smt@agora.build |
Atem's response to Astation's remote agent API design (Astation #58). Coordination happens on Atem #81.
Current design (user decisions, 2026-10-19). This supersedes the earlier any-manager attestation, freshness window and fork-resolution text:
seq,prev_hash); each entry is signed by a manager valid atseq-1. Atem keeps a durable head and refuses rollback. Every connection carries the log suffix from Atem's head, any device may carry it, and removals apply at once (r8 §H fence).atem unpair+atem pair) is the reset after a freeze, a stolen device or a compromised manager.Kand signs an entry enrolling a replacement manager on the existing chain (recovery key pinned in genesis). It does not lift a freeze.native,service(bots: scoped, expiring),browser(QR grant ≤ 1 h) andhost, each an r8 principal with its owncontrol_gen.created_at/expires_at; HPKE-sealed tool and summary.atem-ch1(SIGMA-I, X25519, HKDF-SHA256, ChaCha20-Poly1305). Atem's membership head travels in the cleartext signed part of the handshake (Astation's correction).atem-client: Atem-owned shared core (UniFFI + WASM).In progress on this PR: the r9 appendix (wire shapes, signing/encoding, handshake key schedule, recovery and
Kformats, sealed push andseen, suffix persistence, concurrent honest changes) andr9-*fixtures with real cross-language vectors. The pin for review will be posted on #81.Generated with SMT smt@agora.build