I read this as a read-only feasibility and acceptance audit - I’ll trace the authoritative plan, candidate implementation, cleanup paths, and Task21-25 evidence, then return a decisive classification with exact safeguards and required approval.


I’ve confirmed Task25’s documented empty live baseline; I’m now tracing the later Task26 invite attempts and the shipped claim/registry implementation, because those post-cleanup records determine whether the same Telegram ID can still be “fresh.”


I read this as a read-only feasibility and acceptance audit - I traced the plan, immutable candidate, claim path, Task21-25 evidence, later Task26 invite records, and reset/cleanup interfaces.

# Verdict: TECHNICALLY_SAFE_BUT_PLAN_AMENDMENT

The Telegram actor `8527916639` can technically claim a new canonical invite after a clean runtime reset. The claim implementation does not blacklist previously used Telegram IDs. However, this cannot be called a “fresh synthetic identity” or an unamended Task26 rehearsal:

- The account and DM are not fresh.
- Task26 is release review, not a second Tasks21-25 live lifecycle.
- Candidate `2e0894ea...` explicitly classifies Tasks22-25 execution as historical and not execution on this successor.
- The current candidate exposes no supported customer-delete or rehearsal-reset command.
- The candidate checkpoint is only `READY_FOR_TASK26_SECURITY_READONLY_REAUDIT`, is `NOT_TASK26_PASS`, and records `normative_policy_current_verdict: FAIL`.

Minimal approval is therefore an explicit plan amendment defining freshness as a new logical lifecycle using the same Telegram actor, plus separate authorization for the supported profile-wide reset/rehearsal and subsequent service, Telegram, provider, and cleanup actions.

## Findings

### 1. Task25 cleanup

**Yes, at Task25 completion it removed all documented live rehearsal customer authority while retaining quarantined evidence.**

Task25 proved:

- empty registry;
- disabled delivery gate;
- zero jobs;
- no live delivery ledger;
- no customer/service-state authority;
- stopped gateway and no profile process;
- no PID/lock/orphan authority;
- 23 rehearsal scopes archived;
- Task24 receipt retained in verified archive `2009ac177177839cefddb98f285e27fa`.

References:

- `.omo/evidence/dualcoach-task-25.md`
- `.omo/evidence/dualcoach-task-25-evidence.json`
- `.omo/evidence/dualcoach-task-25-live-terminal-evidence.json`
- `.omo/evidence/dualcoach-task-25-evidence-index.json`
- Candidate binding: `...2e0894ea.../bindings/historical-archive-binding.json`

But that exact empty bootstrap baseline no longer exists: three later Task26 invite sessions were appended and expired:

- `cb_6S6RABpDgZ165V02A7qEzw`
- `cb_9yTz0oNwdU8s8hradru8BA`
- `cb_rmDnfrqA6gkmjoQEdwxu0g`

They have zero claims and no actor binding, but remain historical rows in the live bootstrap ledger. See the canonical-invite preparation/supersession receipts and:

- `.omo/evidence/task26/task26-fresh-canonical-invite-20260815T040558Z/expiry-cleanup-receipt.json`

### 2. Reusing Telegram ID `8527916639`

**Technically permitted after cleanup.**

The shipped wheel’s `RoomBootstrapStore.claim_rehearsal_customer_invite` checks:

- valid, currently `PREPARED` token;
- private DM: `user_id == chat_id`;
- actor is not owner;
- session has no prior claim;
- draft has no `customer_user_id`.

It does **not** search terminal sessions, archives, receipts, or historical registry rows for prior use of the Telegram ID.

`prepare_rehearsal_customer_invite` blocks only another nonterminal session with the same `customer_key`. `get_by_chat` considers only nonterminal sessions. Therefore an empty registry plus a new key/session permits the same Telegram ID through the normal claim path, without archive restore or direct JSON mutation.

References:

- Candidate wheel `af4a9d0...`, member `gateway/platforms/telegram_customer_bootstrap.py`
- `claim_rehearsal_customer_invite`
- `prepare_rehearsal_customer_invite`
- `get_by_chat`
- `gateway/platforms/telegram_customer_bootstrap_registration.py`

### 3. Freshness-contaminating residue

All of these must be inventoried or explicitly classified as historical before claiming freshness:

- Bootstrap ledger: expired/prepared/claimed sessions, SID hashes, draft keys, role claims, recovery attempts.
- Registry and mappings: customer rows, Telegram user/chat/topic address, profile-local customer records.
- Customer service-state and nutrition-onboarding session/projection files.
- Activation notices, activation audit/receipt/readiness authority.
- Generation jobs, leases, drafts, provider attempts, correction attempts.
- Owner/operator cards, callback receipts, message bindings, update IDs.
- Publication and delivery outboxes, emergency ledger, idempotency entries, `sent_audited` receipts.
- Scheduled deliveries, fences, claims, attempt locks, cron jobs/output.
- Telegram ingress/PTB receipt ledgers and any pending Bot API updates.
- Gateway state, PID/locks, watchers, observers, log followers, in-memory DM/card caches.
- Generic profile session/media caches if they contain this DM or customer key.
- Telegram server-side DM history and existing bot messages. These cannot be made objectively “never used” by resetting local state.
- Task21-25 archive and evidence repository, Task26 receipts, and senpi session logs containing the actor ID.

The 23 Task25 archive scopes cover the canonical customer lifecycle authorities, including registry, customer state, bootstrap, owner actions, onboarding publication, activation, scheduled delivery, recovery/readiness, and Telegram ingress receipts. They do not erase Telegram’s server-side chat history or every general-purpose cache outside those scopes.

### 4. Supported delete/disable/reset path

**No current-candidate normal command fully deletes one customer or resets the rehearsal.**

The candidate wheel exposes:

- `dualcoach_admin provider-auth check`
- `dualcoach_tasks21_25_controller arm|launch`

It exposes no customer `delete`, `disable`, or rehearsal `reset` command. The bootstrap API supports expiry, not deletion. Registration supports creation/reconciliation as disabled, not removal.

Task25 used a separately permission-sealed cleanup controller and then-historical `reset_rehearsal_profile`, archiving the complete scope before rebuilding an empty baseline. That was a canonical, audited profile-wide transaction, but it is not a normal operation exposed by candidate `2e0894ea...`.

Therefore:

- direct ledger/registry deletion is prohibited;
- archive restoration is prohibited;
- actor-specific scrubbing would require prohibited mutation;
- a new profile-wide reset requires explicit authorization and an authenticated supported reset artifact, not an improvised script.

References:

- `.omo/evidence/dualcoach-task-25-cleanup-controller.py`
- Candidate wheel entry points
- `.omo/evidence/dualcoach-recovery-runbook.md`, rehearsal cleanup procedure
- Plan Specifications 2, 3, 21 and 25

### 5. Can this objectively count as a new customer lifecycle?

**Yes as a new logical customer lifecycle, but not as a fresh Telegram identity under the unamended plan.**

It is objectively separable if all of these are new:

- canonical `customer_key`;
- bootstrap `session_id`;
- SID/token hash;
- onboarding session/revision;
- check-in event/revision;
- generation job and draft revision;
- card render identity/message binding;
- delivery idempotency key and receipt.

Historical data must remain unreachable from runtime projections and must never be restored or used to prepopulate the new lifecycle.

The amendment must say:

> “Fresh customer lifecycle” means a new canonical customer/session lineage on an empty runtime baseline. The synthetic Telegram account and DM are intentionally reused and are not claimed as a fresh identity or fresh Telegram surface.

Without that amendment, Specification 21’s “fresh synthetic identities and routes” and “fresh customer DM” acceptance language is not met.

Additionally, the current successor states:

> Tasks22-25 receipts are historical only and are not execution on successor `2e0894ea...`.

Reference:

- `...2e0894ea.../bindings/task22-25-reconciliation-index.json`

## Safe execution contract after approval

### Preflight — fail closed

1. Verify candidate digest exactly `2e0894eac92bc396cc4723bf1f18ebc653b95018dd41574df435941c235da925` and wheel SHA-256 `af4a9d0...`.
2. Require an amended-plan approval receipt and separate reset/live-action authorization.
3. Stop gateway/watchers; require `inactive/dead`, PID `0`, disconnected Telegram, no profile process or lock.
4. Verify all retained archives before mutation; never restore them.
5. Inventory every live authority listed above. Reject unknown roots, links, unsafe modes, open claims, outbox unknown outcomes, or pending deliveries.
6. Require empty registry, customer state, service-state, activation, owner-action, generation, delivery, cron, and publication authorities.
7. Require all existing bootstrap sessions terminal. No `PREPARED`, `REGISTERING`, consent, activation, or unresolved recovery attempt may exist.
8. Resolve old pending Telegram updates through normal ingress before minting the invite. Never use `drop_pending_updates`, raw `getUpdates`, cursor edits, or receipt deletion.
9. Verify the actor is not owner/staff authority and is absent from the staff group.
10. Record other-profile hashes/PIDs and provider-auth readiness.

### Reset and claim

1. Execute one authenticated, archive-first, profile-wide canonical rehearsal reset.
2. Verify the new archive and exact empty baseline.
3. Use a **new customer key**, not `task22_dm_rehearsal` or `task26_synthetic_rehearsal`.
4. Call `prepare_rehearsal_customer_invite` exactly once.
5. Expected initial authority:
   - new `cb_<22-char>` session ID;
   - `PREPARED`;
   - generation `1`;
   - no role claims;
   - `customer_user_id = null`;
   - one unexpired token/SID hash.
6. Subscribe the exact claim observer before starting the gateway.
7. Start the exact candidate; require truthful `running/connected`.
8. Actor `8527916639` presses Start exactly once in private DM.
9. Expected claim:
   - same new session ID;
   - `REGISTERING`;
   - generation `2`;
   - exactly one customer claim;
   - `user_id = chat_id = 8527916639`;
   - topic `0`;
   - newly observed Telegram message/update IDs.
10. Registration must create exactly one new disabled registry row and transition to `AWAITING_CONSENT`, normally generation `3`.
11. Every later event/job/draft/card/outbox/receipt ID must be new and predecessor-bound to this lineage.

Abort on old customer keys, old session/draft/card IDs, more than one accepted Start, a pre-existing registry reconciliation, nonzero delivery, pending provider outcome, unexpected Telegram backlog, or any historical archive access.

### Cleanup

- Disable before stopping.
- Reconcile generation and delivery to zero pending/unknown authority.
- Stop gateway/watchers.
- Run one authenticated archive-first reset.
- Verify empty live baseline, valid archives, truthful stopped runtime, no orphan processes/locks, and unchanged other profiles.
- Do not erase or rewrite Task21-25 evidence as part of rehearsal cleanup.

## Privacy and retention

Retaining the archive preserves auditability, exactly-once proof, incident reconstruction, and candidate provenance, but it retains pseudonymous personal data: Telegram identity, route/message identifiers, health/onboarding data, and delivery history. It needs:

- explicit retention purpose and duration;
- least-privilege access;
- private modes and no-link/no-symlink integrity;
- deletion or irreversible pseudonymization when the retention basis expires;
- separation from runtime lookup paths.

Deleting all historical evidence would reduce privacy exposure but would invalidate Task21-25 audit evidence and parts of candidate `2e0894ea...`’s provenance bindings. It must be a separately approved retention/deletion operation, followed by candidate/evidence resealing. It cannot be combined silently with rehearsal reset.

## Minimal approval required

1. **Plan amendment:** authorize reused Telegram actor/DM as a new logical lifecycle, explicitly waiving “fresh identity/account/DM” while requiring all-new canonical lifecycle IDs.
2. **Reset authorization:** approve one authenticated archive-first rehearsal reset before the claim and one cleanup reset afterward.
3. **Live-action authorization:** separately approve the service start, one invite, one Start action, synthetic provider work, owner actions, exactly one synthetic delivery, and final disable.
4. **Retention decision:** retain Task21-25 and Task26 historical evidence under a stated retention policy; do not claim complete personal-data erasure.

Until those approvals and a supported reset artifact are present, the operation must remain blocked.