Skip to content

feat(j5): terminate archived participant obligations - #21

Merged
Jacksondr5 merged 1 commit into
j5/mainfrom
j5/a9-lifecycle-closure
Aug 30, 2026
Merged

Jacksondr5 merged 1 commit into
j5/mainfrom
j5/a9-lifecycle-closure

Conversation

@Jacksondr5

Copy link
Copy Markdown
Owner

Problem

Retiring an A2A participant could silently strand open exchanges, leaving the counterparty waiting without a truthful terminal fact.

Fix

  • Add an idempotent lifecycle bridge for committed thread.archived and thread.deleted events: registered participants retire with complete participant.left history and their open exchanges become exchange.dropped.
  • Deliver one platform-authored terminal lifecycle notice through the normal delivery pipeline; keep retired participants hidden from active membership while the ledger remains readable.
  • Add ArchiveFactsService as a display-only, composable AR2 read boundary; placement is a discriminated unknown/none/known state pending ratification.
  • Close the A3/A9 race with a permit-and-transaction conditional silence append, so a stale silence notice cannot follow a committed drop.
  • Add migration 008_LifecycleClosure, expanding terminal exchange state while opaquely preserving A4 inbox rows across SQLite parent-table rebuilds.

Settled scope and migration contracts

  • The DV5 product decision and the archive-flow settlement defer all Squadron archive surface/schema work to SC4-later; this PR intentionally adds no archive operation, HTTP/MCP surface, or Squadron schema.
  • The updated A9 ticket records the Option-A migration contract: preserve every A4 inbox field byte-for-byte in one transaction and flag future parent rebuilds for a shared helper.
  • Migration 008 follows merged 006/007. SQ1 owns 009 in feat(j5): add Squadron creation surface #20; its interim manifest is intentionally non-contiguous until this PR merges. Whichever PR lands second will rebase and verify the full ordered 001–009 manifest.

Verification

  • Independent exact-head review: READY at 8861c66386fe5b4cf2a4b13bc719d3fa8df3b860; targeted domain/migration/runtime suites, mutation controls, typecheck, and lint passed.
  • Final isolated Codex Luna E2E: real archive produced participant.left -> exchange.dropped -> one delivered lifecycle_notice; the waiter acknowledged “I won’t retry or replace the retired participant”; an archived-sender reply failed closed with A2ASenderRetiredError and appended zero events. Evidence: Traycer artifact a9-luna-e2e (worktree-local state; exact-PID teardown).

Coverage limits

AR2 is service-complete but has no route or MCP registration until the human archive-dialog surface is ratified. Squadron archive, warn/confirm UI, and re-entry semantics remain deliberately out of scope.

Built with Codex / GPT-5.6.

@coderabbitai

coderabbitai Bot commented Aug 30, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3a3f509a-af28-4d36-abc5-4cb4b48f5c66

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). labels Aug 30, 2026
@Jacksondr5

Copy link
Copy Markdown
Owner Author

Final lifecycle E2E attestation

At exact head 8861c66386fe5b4cf2a4b13bc719d3fa8df3b860, an isolated real Codex Luna run drove thread.archive for a registered receiver. The production pipeline persisted complete-payload participant.left, exchange.dropped (receiver-retired, replyRequired=false, retryAllowed=false, replacementRequired=false), one lifecycle_notice terminal message.sent, and a delivered receipt. The waiter received the terminal notice and replied: “Understood. I won’t retry or replace the retired participant.”

Negative control: the archived participant’s reply was rejected with A2ASenderRetiredError, appended zero ledger events, and terminal-notice count stayed one. Server state was worktree-local and shut down via captured PID only. Full evidence is retained in Traycer artifact a9-luna-e2e.

Posted by an AI agent on Jackson's behalf.

@Jacksondr5
Jacksondr5 merged commit d07d0cc into j5/main Aug 30, 2026
13 checks passed
@Jacksondr5
Jacksondr5 deleted the j5/a9-lifecycle-closure branch August 30, 2026 21:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ effective changed lines (test files excluded in mixed PRs). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant