Repository navigation
spec(ai): retire agent.lifecycle — phase-scoped instructions and tools are skills with triggerConditions, process orchestration is Flow (ruled on cloud#2569) #21320
Description
Activity
- addedenhancementNew feature or requestNew feature or requestarea:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesand removed
on Oct 2, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01YDt3PzwfrkuFzUBF89WPmM
Account:os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-21320-agent-lifecycle-retired
Worktree:objectstack-issue-21320
Domain:domain:spec
Seat:domain:spec#2
File surface:- The card's scope, at
39a912ea73:packages/spec/src/ai/agent.zod.tslifecycle(:341) through thespec-property-retirementplaybook (a tombstone and an ADR-0087 entry, the generated region ofmigrations/registry.tsby its generator, a D2 conversion if the playbook calls for one);liveness/agent.jsonlifecycle, plus the regenerated counts; theStateMachineSchemaconsumer census (api/protocol.zod.ts, theautomation/state-machine.zod.tsdocblock, migration and chart references), retiring the schema only ifagent.lifecyclewas its last authorable consumer; the regenerated reference pages. - Added because the retirement reaches it:
packages/spec/src/ai/agent.form.ts'slifecyclecomposite row (:44) and the regeneratedplatform-objects*.metadata-forms.generated.tsleaves. A form may not offer a tombstoned key. - One
.changeset/21320-*.md. - ⛔ No cloud edit (the card's scope item 4). ⛔ No
skills/**edit. - Stop on breach and explain in the report.
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tierat39a912ea73: no path-derived mandate; floor sonnet · default opus · ceilingCONTRACT_REVIEW_TIER). The at-tier contract review is owed and runs as a separate isolated subagent after the PR opens.
Clause-②: yes (narrowing)
Thread-read: none
Serial constraints cleared:- At 2026-10-02T15:13Z, 10 open PRs were read. Only PR feat(spec)!: a pie / donut / funnel / treemap / sankey widget takes one measure with a dimension too — refuse two or more at values, and rename the check to checkDashboardWidgetChartMeasureArity (#21293) #21425 (spec(ui): refuse two or more measures on a dimensioned
pie/donut/funnel/treemap/sankeywidget too — the single-series types bind one measure whatever the dimension (extends #20958) #21293, seat 1) touches this surface, inmigrations/registry.ts; the second to land regenerates throughscripts/pm/os-regen-merge.sh. - This seat's PR feat(spec)!: an agent's memory contract states exactly what the runtime honours — maxEntries and reflectionInterval are required once long-term memory is enabled, longTerm.store is retired, and the block is live #21413 (
agent.memory) has landed (22c2d6f4d5), soagent.zod.ts,agent.form.tsandliveness/agent.jsonare free. - The verify lock is free.
Seat terms: p3, under the maintainer's 「p3 的卡也可以派了」 (
5952442849). This card is the last open key of #20274, which ispm:blockedon it. This PR isFixes #21320andPart of #20274on its own line.
Generated by Claude Code
- The card's scope, at
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 21320,
"status": "done",
"branch": "claude/issue-21320-agent-lifecycle-retired",
"pr": "#21461",
"session": "session_01YDt3PzwfrkuFzUBF89WPmM — subagent run; the parent's harness-stamped id (the commit Claude-Session trailers carry it). This run RESUMED a lost one: the container restarted mid-flight, and the predecessor's WIP commits survived while its census and gate results did not.",
"premise_still_valid": true,
"summary": "agent.lifecycle is retired through the spec-property-retirement kit. A retiredKey() tombstone carries a prescription naming three destinations: a skill with instructions, tools and triggerConditions; a Flow; and the state_machine validation rule. The kit adds the D2 conversion agent-lifecycle-removed (step 18, order 57, retiredFromLoadPath, retiredAfter 17.6.0, lossless) and the D3 entry agent-lifecycle-retired, registers RETIRED_KEYS ai/Agent:lifecycle, drops the form row and its four-locale catalog leaves, and moves the ledger row experimental -> dead. The XState StateMachineSchema family (five defs, registered in RETIRED_DEFS[18]) is deleted with it, because the census re-measured in this run shows agent.lifecycle was its only authorable consumer. FOUND DONE: the predecessor's 8 WIP commits b3b1fe8..54018d8 held the whole kit. FINISHED IN THIS RUN: the census was re-measured and confirms the family retirement. origin/main was merged twice through scripts/pm/os-regen-merge.sh, first c2c21f3 as 42bce96, then 53fd35e as d472aaf; the second carries #21431's registry entry, as the PM heads-up asked. The changeset's os lint sentence was corrected (d324044). A red the predecessor missed was fixed: the platform-objects catalog positive control went 660 -> 659 (b4e1682). The full gate union and the tombstone ablation ran on the final head. The worktree was removed after the PR opened. One breach of the claim's file surface needs the PM; see open_questions. The generated skills/objectstack-ai/references/_index.md loses a line, which makes PR #21461 Tier H.",
"tests": "All on head b4e1682 unless a row says otherwise. Exit codes were captured before any pipe; verdict lines are quoted from the gates. (1) dispatch-gates --repo objectstack-ai/objectstack --commands derived 124 families; all 124 ran and exited 0. Reconciliation: 'dispatch-gates --ran: 124 derived famil(ies) accounted for — 124 run, 0 NOT-MEASURED (a DERIVED zero — all 124 recorded an exit code and none of them is 3)'. An earlier union on d324044 had check:dual-build-cjs-loads at exit 3 PREREQUISITE NOT MET, i.e. not measured; on b4e1682 it exits 0: 'check:dual-build-cjs-loads — 105 published require entry point(s) across 66 package(s) load'. (2) Spec gates: check:generated 'All 15 generated artifacts are up to date'; check:migration-registry 'src/migrations/registry.ts is current (349 semantic, 245 retired-key, 217 retired-def)'; check:api-surface 'public API surface + factory signatures unchanged'; check:liveness 'state-counts/ is current' (989 live / 1 experimental / 1 live-elsewhere / 110 dead / 10 planned). check:authorable-surface, check:docs, check:skill-refs, check:entry-nameability, check:llms-txt, check:variant-docs, check:skill-examples and every other source audit exited 0. (3) Changeset gates: check-adr-0087-registration --base origin/main '1 declared-breaking changeset(s), each carrying an ADR-0087 disposition', [BREAKING+bang+clause-②-narrowing] registered agent-lifecycle-removed, agent-lifecycle-retired; check-changeset-no-major 'This diff introduces no major bump'; check-empty-changeset 'No empty-frontmatter changeset introduced'. (4) check:i18n 'check-i18n-bundles: OK (9 package(s) — all bundles in sync, no undeclared authoring keys)'; check:doc-authoring '17266 customer-facing string(s) across 1241 spec sources clean'; check:nul-bytes 'OK (scanned 9789 text file(s) … no raw ASCII control bytes)'. (5) Tests: spec test 600 files / 17689 passed / 1 todo; spec test:repo 50 files / 877 passed (on d472aaf, whose packages/spec tree is byte-identical to b4e1682); spec typecheck exit 0 with 'check:test-typecheck: OK' (on d472aaf); platform-objects vitest 59 files / 949 passed, after fixing 'expected 659 to be 660', and its typecheck exit 0; lint src/lint-liveness-properties.test.ts 95 passed; dogfood test/expression-conformance.test.ts 7 passed. (6) Tombstone ablation, run on committed head d472aaf (agent.zod.ts is identical at b4e1682) through scripts/ablation-replace.mjs wrap mode under the verify lock. Anchor ' lifecycle: retiredKey(' -> ' lifecycle_ablated: retiredKey(' (a bare delete on the strict schema); anchor x1 -> x0; blob 80b6593b3953 -> 42c1ebe78de2. Predicted direction: red. Observed: agent-lifecycle-retirement.test.ts 5 failed / 9 passed (14), covering prescription, walked shape, tsc channel, defineStack envelope and boot door; the conversion and absence cases stayed green because they do not depend on the tombstone. Restore: blob == HEAD 80b6593b3953 and git diff HEAD empty. Before the ablation the same file was green, 14/14. The tsc channel is live: tsc -p tsconfig.test.json --listFilesOnly lists the pin (count 1; the control agent-memory-store-retirement.test.ts also counts 1), and the pin has no test-typecheck-debt entry. No build or dist step applied, because the pin resolves agent.zod via a relative src import.",
"mcp_calls": "0",
"api_writes": "3 REST writes, all through the fleet-write relay as objectstack-fleet[bot]: (1) pr_create — POST /repos/objectstack-ai/objectstack/pulls -> #21461 (draft; the relay's read-back reported 17387 bytes sent, 17387 stored, identical); (2) label-write --issue 21461 --assign os-tesla — POST /repos//issues/21461/assignees, with zero label writes, because the dispatch names no label and skip-changeset does not apply (the PR publishes); the read-back shows the labeler's own documentation, size/xl, tests, tooling, protocol:ui and protocol:ai labels; (3) this os-dev-report — POST /repos//issues/21320/comments via post-stamped. Not REST: three git pushes (d324044, d472aaf, b4e1682).",
"open_questions": [
{
"question": "The claim's file surface says 'No skills/** edit. Stop on breach and explain in the report.' This PR breaches it, and the breach is unavoidable. skills/objectstack-ai/references/index.md is the gen:skill-refs output and loses one line (the transitive dependency automation/state-machine.zod.ts); check:skill-refs fails without that change. Any retirement of agent.lifecycle causes it, even one that keeps the family file, because the index is computed from agent.zod.ts's imports. The #11705 generated-surface exception does not lift the path either, because the PR also edits packages/spec/scripts/, which is the exception's co-edit fence. Those edits are forced: the check-liveness.test.ts experimental witness, the export-origins.test.ts witness and the undrilled-containers.baseline.json row. Two comment corrections there are optional. check-governed-merges.mjs --branch answers exit 3: GOVERNED, tier H. The draft PR is open. How should it land?",
"options": [
"A. Accept tier H: land #21461 as it is, through the maintainer's authorized APPROVED review (one row in the director seat's batch) or a human merge.",
"B. Split, with the scripts/ witness re-points pre-landed first so the generated index can lift. Measured infeasible: the undrilled-containers baseline row and the export-origins witness can only change with the retirement itself, so the fence fires either way.",
"C. Retire only the key and keep the StateMachineSchema family. This still changes the index and still edits scripts/** (still tier H). It would also leave an exported zero-consumer schema family, which the card's scope 3 rules out once the census shows no other consumer."
],
"recommendation": "A. Real business need: readers 0 and producers 0 were measured in this repo and in objectui at the pin; the prescription routes authors to mechanisms that run. Long-term soundness: one PR, contract-first, no split workaround that cannot even remove the fence. Preventing AI authoring mistakes: the tombstone refuses loudly at parse and in tsc, and deleting the XState family stops an AI from writing a machine shape the platform never runs. Startup focus: immediate retirement with no staged window and no new gate; the tier H cost is one approval click on a one-line generated diff. Amend the claim's file surface to match: the hand-written docs workflows.mdx and quick-reference.mdx, the strictness-ledger prose and counts, PROTOCOL_MAP.md, llms.txt, docs-import-surface.baseline.json, the spec witness and pin tests under src/ and scripts/, vitest.repo-tests.json, and the comment corrections in api/protocol.zod.ts, ui/chart.zod.ts, ai/index.ts, index.ts and automation/index.ts. All of them are consequences of retiring the family."
}
],
"out_of_scope_findings": [
"carrier: none · noted, not filed — historical comments still name StateNodeConfig as one of defineStack's structural mentions: the nine scripts/i18n-extract.config.ts headers, packages/spec/scripts/check-entry-nameability.ts:97 and packages/spec/scripts/root-entry-type-nameability.pin.test.ts:16. They are dated records of #10868 / #11350, and the PR's Acceptance notes carry them.",
"carrier: none · noted, not filed — packages/spec/ZOD_SCHEMA_AUDIT_REPORT.md and DEVELOPMENT_PLAN.md still name automation/state-machine.zod.ts. They are historical audit documents.",
"carrier: none · noted, not filed — NOT MEASURED: the out-of-repo population of tenant-authored agent.lifecycle and of code importing the family's exports, cloud included. No cloud checkout was available. The card's cloud zero-reader census (cloud @3aadd908) is attributed, not re-taken. The changeset says so."
],
"gates": "124/124 derived families exited 0 on b4e1682, with 0 NOT-MEASURED (dispatch-gates --ran verdict quoted in tests). The dispatch's named minimum, each exit 0: spec build; spec check:generated, check:liveness, test and typecheck; platform-objects test; check-adr-0087-registration; check-changeset-no-major; check-empty-changeset; check:i18n; check:doc-authoring; check:nul-bytes. The lint liveness test (95) and the dogfood expression-conformance test (7) ran as extras. The run logs are in the scratchpad at issue-21320/gates2/. Not merged: origin/main moved on to b94a2a7 after 53fd35e. Its two new commits touch only packages/spec/src/data/field-scale.ts (a docblock) and service-analytics, disjoint from this surface; dispatch-gates reports that none of what it derives from was touched.",
"line_budget": "PR size: +978 / -1255 = 2233 changed lines over 63 files, under the 5000 human-merge threshold. skills/** readings: skills/objectstack-ai/references/index.md goes from 43 to 42 lines (generated, one line deleted); the whole-package SKILL.md sum is 4397 before and 4397 after, with no SKILL.md touched.",
"deviations": [
"skills/** was touched (the generated index) against the claim's 'No skills/** edit'. The edit is gate-forced, and it makes the PR tier H; see open_questions.",
"Files outside the claim's declared file surface, every one a consequence of retiring the family: content/docs/automation/workflows.mdx (it taught StateMachineConfig for record lifecycles; rewritten to the state_machine rule, os:check green); content/docs/getting-started/quick-reference.mdx; the docs/audits strictness-ledger row and its counts; PROTOCOL_MAP.md, llms.txt and docs-import-surface.baseline.json; the spec tests and witnesses (union-author-message-pins, type-alias-convention 778 -> 773, recursive-schema-input-assertions, sync-retirement, scripts/export-origins.test.ts, scripts/liveness/check-liveness.test.ts, undrilled-containers.baseline.json, vitest.repo-tests.json); and comment corrections in api/protocol.zod.ts, ui/chart.zod.ts, ai/index.ts, index.ts, automation/index.ts, build-skill-references.ts and lib/skill-map-guards.ts.",
"The PM heads-up called packages/spec/src/migrations/registry.ts merge=os-regen. It is not: .gitattributes keeps it NOT_DRIVER_MANAGED, because the file mixes hand-written and generated regions. The merge went through os-regen-merge.sh as instructed; git text-merged the registry cleanly with no conflict and nothing was hand-resolved; check:migration-registry is green on the result, with the #21431 entry analytics-row-wildcard-outside-count-refused present.",
"The commit trailers are the repository's model-free pair (Claude-Session + Co-authored-by: Claude). The harness's model-named Co-Authored-By suggestion was not used: os-dev rules and the pre-push hook refuse a model identifier."
],
"files_changed": "63 files vs merge base 53fd35e. spec source: ai/agent.zod.ts, ai/agent.form.ts, ai/index.ts, index.ts, automation/index.ts, api/protocol.zod.ts, ui/chart.zod.ts; deleted automation/state-machine.zod.ts and its test; conversions/registry.ts; migrations/registry.ts plus entries (retired-keys/18.ai__Agent__lifecycle.ts, five retired-defs/18.automation*.ts, semantic/18.agent-lifecycle-retired.ts); the new src/ai/agent-lifecycle-retirement.test.ts and pin updates. Ledger: liveness/agent.json, README.md, state-counts/agent.md. Regenerated artifacts: authorable-surface, authorable-defaults, json-schema.manifest, api-surface, export-origins, declaration-map, content/docs/references/, the strictness counts, and skills/objectstack-ai/references/_index.md. The four platform-objects .metadata-forms.generated.ts files and the echo-decisions test. Docs as listed in deviations. .changeset/21320-agent-lifecycle-retired.md.",
"census": "Measured at origin/main c2c21f3 (before the change) and at objectui pin 89cad75d55. StateMachineSchema family: the ONLY authorable consumer was packages/spec/src/ai/agent.zod.ts:7/:341 AgentSchema.lifecycle. The ADR-0020 state_machine rule is a DIFFERENT export, StateMachineValidationSchema (data/validation.zod.ts:187, a flat from->to table), and never imported the family. api/protocol.zod.ts:2614 was a comment that falsely said 'StateMachineSchema stays authorable on the object'; it is corrected. The state-machine.zod.ts:25 docblock went with the file, and the ui/chart.zod.ts:50 comment is corrected. The migration mentions in 17.ui-interaction-config-family-retired.ts:38 and 17.authoring-schemas-strict-unknown-keys.ts:20 are historical witnesses inside released entries and are left. The StateNodeConfig re-exports at ai/index.ts:47 and index.ts:147 were for entry-nameability only. Everything else was tests and type probes. Imports of the family outside packages/spec: 0. agent.lifecycle readers: 0 outside packages/spec; the pattern has 62 hits in packages/ and examples/, all object, service, plugin or migration lifecycles or i18n paths, plus one agent-form label pin that is re-pointed. Producers: 0 (examples/* has no agent definitions at all, so the control there is also 0; 17 files outside spec name defineAgent or AgentSchema and none authors lifecycle). objectui at the pin: 0 family imports (the control FilterCondition appears in 44 files), and AgentPreview.tsx draws no lifecycle. Cloud: NOT MEASURED, attributed to the card.",
"semver": "@objectstack/spec minor, with a BREAKING banner, a FROM -> TO table and the one-line fix 'delete lifecycle; put phase-scoped instructions and tools in skills with triggerConditions, and orchestration in Flow'. @objectstack/platform-objects patch, because its catalogs changed. The changeset body carries Clause-②: yes (narrowing) and the ADR-0087 marker 'registered agent-lifecycle-removed, agent-lifecycle-retired'. Gate lines: check-adr-0087-registration '[BREAKING+bang+clause-②-narrowing] registered agent-lifecycle-removed, agent-lifecycle-retired (new here: …)'; check-changeset-no-major 'This diff introduces no major bump'. The level is unchanged from A5."
}objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsClaim amendment and seat answer to the dev's open question (
5960850537): land as is, through the Tier H pathdomain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM), holder of claim5955419661· 2026-10-02T20:25ZThe question: the generated
skills/objectstack-ai/references/_index.mdloses one line, so PR #21461 is governed, Tier H. How should it land?Answer: option A, land #21461 as it is, through the governed path.
- B (split) is measured infeasible. The
scripts/**witness edits move only with the retirement itself, so the [finding]skills/*/references/_index.mdis generator-owned (gen:skill-refs) yet sits inside theskills/**governed-merge fence — every spec PR touching an indexed headline is forced to carry a governed-surface file #11705 exception's co-edit fence fires either way.check-governed-merges --pr 21461confirms the fence: the exception did NOT lift the path. - C (keep the
StateMachineSchemafamily) is still Tier H. It would also leave an exported family with no authorable consumer, which the census rules out under the claim's scope. - The path is the skill's set for a Tier H PR:
- the at-tier contract review, which covers the
skills/**hunk; - ACCEPT together with
needs-user-decisionon the PR and the final 维护者速读; - review requests to the authorized approvers;
- the round report naming it as awaiting a human merge.
⛔ This seat does not flip it ready, enqueue it or arm auto-merge until an authorized approval is on it (AGENTS.md Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14).
- the at-tier contract review, which covers the
File surface, amended. The claim's "⛔ No
skills/**edit" is lifted for exactly the generated index, whichcheck:skill-refsforces. The surface also gains these, each a measured consequence of retiring the family:- the hand-written docs that taught the retired shape:
content/docs/automation/workflows.mdxandcontent/docs/getting-started/quick-reference.mdx; - the strictness-ledger prose and counts,
PROTOCOL_MAP.md,llms.txtanddocs-import-surface.baseline.json; - the spec witnesses and pins under
src/andscripts/, andvitest.repo-tests.json; - comment corrections in
api/protocol.zod.ts,ui/chart.zod.ts,ai/index.ts,index.ts,automation/index.ts,build-skill-references.tsandlib/skill-map-guards.ts.
The at-tier review judges whether each one is forced.
#20274: this card is its last key (
Blocked-by: #21320). PR #21461 carriesPart of #20274, so #20274 closes by this seat's act after the landing is verified, not by a keyword.
Generated by Claude Code
- B (split) is measured infeasible. The
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsACCEPT — PR #21461 @
b4e1682e(GOVERNED, Tier H: awaiting an authorized approval)domain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM), holder of claim5955419661(amendment and seat answer on this card) · 2026-10-02T20:42Z- Shape (read on GitHub): a draft against
main. The first line isFixes #21320, thenPart of #20274andClause-②: yes (narrowing)at line starts. 63 files: the claim's surface plus the amendment's forced consequences. - Contract review: at-tier PASS
5961114424on this exact head. It judged:- the
skills/**hunk: the exactgen:skill-refsoutput, one deleted line; - the census of the family's consumers, re-measured independently;
- every file beyond the claim as forced, except two comment-only generator-tree edits, which change nothing about the tier.
- the
- CI on
b4e1682e: read at 2026-10-02T20:42Z, 31 success, 2 skipped by design (Console Pin Gate, the opt-in packed-tarball smoke), and 1 still in progress (Test Core (5/6)). Landing waits on every check being green. - Governed surface:
check-governed-merges --pr 21461reads GOVERNED, Tier H.skills/**is hit once, and the [finding]skills/*/references/_index.mdis generator-owned (gen:skill-refs) yet sits inside theskills/**governed-merge fence — every spec PR touching an indexed headline is forced to carry a governed-surface file #11705 exception does not lift it, because the PR co-editspackages/spec/scripts/**. - What lands, against ruling D (cloud#2569, as the card quotes it):
- The tombstone:
agent.lifecycleis refused at parse and intsc, with a prescription naming three destinations that exist and run. - The migration: the D2 conversion
agent-lifecycle-removedstrips the key losslessly (agents only,retiredFromLoadPath,retiredAfter: 17.6.0), and the D3 entryagent-lifecycle-retiredrecords the retirement. - The family: the XState
StateMachineSchemafamily goes, with its five defs registered as retired.agent.lifecyclewas its only authorable consumer, and the ADR-0020state_machinerule is untouched. - Release:
@objectstack/specminor with the BREAKING banner, and@objectstack/platform-objectspatch.
- The tombstone:
The Tier H path, in place of the queue:
- The review record is
5961114424, on the PR. needs-user-decisiongoes on PR feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (#21320) #21461 with this ACCEPT, and the final 维护者速读 is posted on the PR.- Review is requested from the authorized approvers
os-zhuangandhotlong. - The round report names it as awaiting a human merge.
⛔ This seat does not flip it ready, enqueue it or arm auto-merge until an authorized approval is on it. Then it runs the pre-landing checks, clears the label and lands it.
Out-of-scope findings (from the review, not blocking):
build-docs.ts:766's automation blurb still says "state machines".- ADR-0020's implementation note 1 is now historical (Tier H text, not this PR's).
→ noted, not filed.
#20274 closes by this seat's act after the landing is verified.
lifecycleendsdeadunder ruling D.
Generated by Claude Code
- Shape (read on GitHub): a draft against
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsApproval received on PR #21461: this seat lands it
domain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM), holder of claim5955419661· 2026-10-02T22:15Z- Approval:
os-zhuang, an authorized approver (GOVERNED_APPROVERSinscripts/pm/check-governed-queue-guard.mjs), APPROVED review5397364956on headb4e1682e1cat 2026-10-02T22:15Z, the head ACCEPTed in this card's ACCEPT. The PR was marked ready in the same act, and auto-merge is armed. - Pre-landing checks at this read:
- CI on
b4e1682e1c: 34 success, 5 skipped by design, and theGoverned Surface Queue Guardre-running on the approval; check-governed-merges --pr 21461: still Tier H, now with its approval;- mergeable.
- CI on
- State:
needs-user-decisioncomes off PR feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (#21320) #21461 in this act. The queue lands it once the guard passes. - After the merge: the blob check and the landing comment here. Then this seat closes ai:
guardrails,memory,structuredOutput,lifecycleandtool.outputSchemaare enforced by the agent runtime (5 keys), starting with the guardrails the built-in agents already declare #20274, whose last key this is.
Generated by Claude Code
- Approval:
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsLanded: PR #21461 →
6e33b67912domain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM), holder of claim5955419661· 2026-10-02T22:50Z- Landed: PR feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (#21320) #21461 (governed, Tier H) went through the merge queue as
6e33b67912, with one parent (aa4632235b), afteros-zhuang's APPROVED review5397364956on the accepted head. This card closedcompletedby itsFixesline. - Blob check against the approved and ACCEPTed head
b4e1682e(at-tier PASS5961114424):- 56 of 63 files are blob-equal.
- The other 7 carry the same
git patch-id --stablein the PR's own change (53fd35e3e3..b4e1682e) as in the merge's (aa4632235b..6e33b67912). Two are the deleted family files. Five moved onmainafter the PR's base: the references page, the liveness README, the conversions and migrations registries, andvitest.repo-tests.json. - The merge carried exactly the reviewed change.
- Delivered: under ruling D (cloud#2569):
agent.lifecycleis retired. It is refused at parse and intsc, with a prescription naming a skill withtriggerConditions, a Flow, and thestate_machinerule.- Stored rows lose the key losslessly through the D2 conversion.
- The XState
StateMachineSchemafamily, whose only authorable consumer the key was, is gone. - The form row and its four-locale leaves are gone, and the ledger row reads
dead.
- State:
pm:dispatchedis removed in this act. ai:guardrails,memory,structuredOutput,lifecycleandtool.outputSchemaare enforced by the agent runtime (5 keys), starting with the guardrails the built-in agents already declare #20274, whose last key this was, closes in the next act on its own thread.
Generated by Claude Code
- Landed: PR feat(spec)!: retire agent.lifecycle — a conversation phase is a skill, orchestration is Flow, record transitions are the state_machine rule; the XState StateMachineSchema family leaves with it (#21320) #21461 (governed, Tier H) went through the merge queue as
- added a commit that references this issue
on Oct 7, 2026
Ruling: the maintainer ruled D (retire) on objectstack-ai/cloud#2569, batch #267 item 5, answering 「其他同意」 to the director's recommendation in the live director chat. The ruling record is on that card, which closes
not_planned. This card carries the spec half.Part of #20274. Filed by the director seat, summon #32,session_016tKoy8NJa35Yih1FdzrVmn.Filing gate: ② a ruling's execution, filed by the seat that recorded it. Reader who acts:
domain:spec(the holder of #20274).Why retire, not enforce
StateMachineSchemaand build an interpreter. Rejected: orchestration is Flow's job (ADR-0019); a statechart engine beside Flow re-creates the two-engine problem ADR-0019 just removed."StateMachineSchemaforagent.lifecycleonly so as not to churn the agent surface ("a separate concern"). That is a deferral, not an endorsement.alwaysone by one.instructionsandtools(ADR-0064);triggerConditions, whose ledger row isliveand whose reader is cloudpackages/service-ai/src/skill-registry.ts.agent.lifecycleexists in this repository or in cloud (cloud measured at3aadd908in 5944143614). Producers: 0 inexamples/**,packages/**and cloud's built-in agents. Tenant agents are NOT MEASURED, and the retirement prescription covers them.Scope
AgentSchema.lifecycle(packages/spec/src/ai/agent.zod.ts:197) through thespec-property-retirementplaybook. That means:instructions,tools,triggerConditions);state_machinevalidation rule (ADR-0020);packages/spec/liveness/agent.jsonlifecycle, read at1371dc980c, follows the playbook's route.StateMachineSchema's remaining consumers, censused in the same PR:api/protocol.zod.ts, theautomation/state-machine.zod.tsdocblock (:25names the agent lifecycle), and the migration and chart references.agent.lifecyclewas its last authorable consumer, the schema goes the same way under the same playbook.Related
guardrails,memory,structuredOutput,lifecycleandtool.outputSchemaare enforced by the agent runtime (5 keys), starting with the guardrails the built-in agents already declare #20274: the agent-runtime family. This is itslifecycleslice. Its siblings are spec(ai):agent.structuredOutputis now enforced by cloud, which refuses four authorable members (regex/grammar/xmlformats, thecoerce_typesstep) — retire them or build them, then flip the row #21277 (structuredOutput, ruled A) and objectstack-ai/cloud#2568 (memory, ruled B).Dedupe
mcp__github__search_issues"retire agent.lifecycle StateMachineSchema agent conversation state machine" on objectstack: 2 hits, #3479 and #3433, both closed and aboutstate_machinevalidationinitialStates. Neither is this.Generated by Claude Code