Version. 0.1 Date. 2026-06-30 Status. Drafted, not executed. Memory-room Finding 1b. Base: main @ fe0ffc4 (post-CR-2026-127). Number 128 inferred — CC must confirm 128 is free before staging (renumber if taken, as 122→127). Depends on: CR-2026-127's confirm-step (now on main) — reused here.
Right now the Companion (the AI inside Loomworks) can do two things on its own that only the Operator should be able to do:
Both are the same kind of mistake: the machine taking a consequential, human-authority action by itself. The seed's rule is "the machine surfaces and signals; the Operator approves." This CR makes both human-only — the Companion may propose, the Operator's "yes" acts.
There is no exception and no temporary seam. This was the Operator's explicit decision: an exception that lets the Companion act on its own "evolves to more without continual oversight." So the boundary is made structural (enforced in code), everywhere, at once.
The Memory-room actor-boundary sweep (conformance bar v0_2, check 5) found that retract_assertion — which removes committed memory — is gated at neither layer (no actor-kind check in the data layer; the HTTP route uses the permissive get_resolved_actor, not the human-only get_committing_resolved_actor that commit and discard now use, post-CR-2026-120). A companion actor retracting a committed assertion was demonstrated (rolled back).
The decided design was full-A, no seam: retract is human-authority; the Companion's "forget about me" feature (which retracts committed personal memory as the Companion today) re-routes through human confirmation, reusing CR-2026-127's confirm-step.
Step-0 inspection at fe0ffc4 confirmed the ground AND surfaced a second path the sweep missed: delegation revocation. revoke_delegation is a thin wrapper over retract_assertion (delegation/service.py:106 — its own docstring: the revoke is an ordinary retract against the assertion id). It is ungated and forwards the actor verbatim. In _route_forget_about_me, the delegation arm (router.py 2980–3002) runs before the confirmation check and revokes immediately, as the Companion, with no confirm beat at all — worse than the memory arm. Because revoke_delegation calls retract_assertion, the gate this CR adds forces delegation revocation to be handled here: once retract rejects non-human actors, the delegation arm breaks. And conceptually a delegation is a grant of authority — revoking it removes a standing permission, the same class as (arguably more consequential than) erasing committed memory. So delegation revocation belongs in this CR, not a separate one.
Mirror commit/discard exactly.
retract_assertion (assertions.py), reject actor.kind in NON_HUMAN_ACTOR_KINDS (the canonical frozenset in memory/base.py:31). Raise a clear error — either a new AgentCannotRetractError or reuse the discard-style error pattern. The rejection message names the actual actor kind (per the CR-2026-120 honesty fix), not a hardcoded "agent".retract_assertion_route (assertions.py:335) from get_resolved_actor to the human-only get_committing_resolved_actor (deps.py:1034) — the same dependency commit (241) and discard (277) use.Result: a non-human actor cannot retract a committed (or held) assertion at either layer.
The personal-memory arm of _route_forget_about_me (router.py:2937) already has the propose→confirm structure (it detects the confirmation turn via last_companion.classified_intent == "forget_about_me"). The only gap is the actor on the act.
retract_assertion from actor_from_companion to actor_from_person(person) — the human's confirmation does the erase. Mirrors CR-2026-127's committed branch (propose as companion, act as human).Result: "forget about me" still works, but the Operator's "yes" does the erasing, not the Companion. (Adding one confirmation beat to permanent self-erasure is an improvement, not a regression.)
The delegation arm (router.py 2980–3002) has no propose→confirm structure today — it revokes immediately on the first turn as the Companion. This part adds the beat.
last_companion.classified_intent == "forget_about_me", or a dedicated marker if the two arms must be told apart), the human (actor_from_person) performs the revoke.revoke_delegation forwards the actor to the now-gated retract_assertion, passing the human actor satisfies the gate; passing the companion actor would (correctly) raise.Result: the Companion cannot cancel a permission on its own — it proposes, the Operator confirms.
retract_assertion (data layer) and at the route (HTTP) — both layers, mirroring the CR-2026-120 gate tests.A non-human actor cannot retract committed memory or revoke a delegation at any layer. "Forget about me" and delegation revocation both work via human confirmation (Companion proposes → Operator "yes" → acts). Suite green. Verified at runtime, not from code-reading.
Memory-room Finding 1b closes. The actor-boundary is then complete across the room (commit, discard, retract, delegation-revocation all human-authority; add/revise correctly held-only). Bar v0_2 check 5 (actor-boundary-completeness) is satisfied.
Remaining for Room 1: Finding 3 (false-success audit — smaller now, since CR-2026-127's never-silent + truthful-confirmation work closed much of that surface). Then Room 1 closes and the parked boundaries arc opens.