You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec liveness: template_manifest keys nothing reads (name, specVersion, skills, scaffold, visibility, publisher, isStarter) — enforce or remove under ADR-0049 #31035
Filing gate: (c) should-fix carried from a contract review (#30980, review 6692597068 ③c). Enrolling objectstack.manifest.json in the liveness ledger as template_manifest (PR #30980) recorded 7 keys dead.
A per-key retire follows ADR-0087 through the playbook's normal route. A key whose fate is not mechanical (enforce or retire) goes on a decision card, not into the PR.
Claim: PM loop round 6 · 2026-11-06T21:09Z
Session: session_01L9qibzzqHZdAVqgBAvxXKB
Account: os-tesla (the card's assignee)
Branch: claude/project-thread-5986qn (the card thread's designated branch; dev session session_01L9qibz5AiZzgut2WFyXVqW)
Worktree: objectstack-issue-31035
Domain: domain:spec
Seat: domain:spec#1
File surface: packages/spec/src/marketplace/template-manifest.zod.ts (retiredKey tombstones per spec-property-retirement), packages/spec/liveness/template_manifest.json, retired-keys migration entries, shipped template manifests that write a retired key, os package publish's uncarriedManifestWarnings where it names a retired key, regenerated artefacts, one changeset. A per-key table goes to the seat before any edit. ⛔ a key whose fate is not mechanical (it goes to a decision card)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high (p2)
Clause-②: no
Metadata-protocol: none
Responsibility: objectstack.manifest.json (objectstack, packages/spec marketplace) declares seven keys no reader honours. An author who writes visibility, publisher or isStarter, or name, specVersion, skills or scaffold, changes nothing. ADR-0049 says enforce or remove. This reaches every template author today.
Thread-read: 6694088718
Premise: holds. On origin/main9d939c58, packages/spec/liveness/template_manifest.json records the seven keys dead.
Serial constraints cleared: #30980 merged (468e0c16da)
Not governed. A retirement narrows the published schema, so it owes one contract review at CONTRACT_REVIEW_TIER, run by the seat.
{
"issue": 31035,
"status": "done",
"branch": "claude/project-thread-5986qn",
"pr": "https://github.com/objectstack-ai/objectstack/pull/31064",
"session": "session_01L9qibz5AiZzgut2WFyXVqW",
"premise_still_valid": true,
"summary": "Retired five of the seven dead TemplateManifest keys per the seat's Go: name, specVersion, skills, scaffold, visibility are retiredKey() tombstones with per-key prescriptions (visibility names --visibility, specVersion names engines.protocol). ADR-0087: five RETIRED_KEYS_BY_MAJOR[18] rows, one D3 entry marketplace-template-manifest-inert-keys-retired + STEP18_RATIONALE fragment, no D2 conversion (not a stack collection member, the category precedent). os package publish refuses a manifest declaring visibility before any network call and warns (non-fatal) naming the other four for deletion. Blank template, the three connector-app manifests and the scaffolder (delete m.name) stop writing them; sync-template-versions.mjs no longer stamps specVersion (battery floors re-measured). Liveness rows keep dead with REMOVED notes; generated artefacts and four docs pages updated. Changeset: spec minor, cli minor, create-objectstack patch; Clause-②: no (narrowing), Metadata-protocol: narrowed, BREAKING banner, adr-0087 marker. publisher and isStarter untouched (hotcrm service-mode producer) pending a decision card. Premise held on origin/main 115a43ad.",
"tests": "head 4f2f3c85: spec test (local) Test Files 820 passed (820), Tests 25908 passed | 1 todo; spec test:repo Test Files 91 passed (91), Tests 1551 passed; spec check:test-typecheck exit 0, check:generated exit 0. On 58b292e7 (4f2f3c85 only adds a path to vitest.repo-tests.json): create-objectstack 24 files / 369 tests passed + typecheck exit 0; cli unit 396/396 files (5 re-run green after a declaration build; first run red on a dts-less local build) + typecheck exit 0; connector-docusign/github/stripe pnpm test 28/14/20 passed; sync-template-versions --self-test exit 0 (44 assertions). Ablations via ablation-replace.mjs: publish visibility guard disabled -> 1 red (refused by name before any network call); specVersion tombstone -> z.string().optional() -> 2 red (refusal at own path; engines.protocol prescription); both restored green.",
"gates": "dispatch-gates --commands derived 134 families; all 134 exit 0 (record /mnt/project-files/spec-seat-1/r2026-11-06/out/31035-gates-ran-4f2f3c85.list); --ran: 134 derived, 134 run, 0 NOT-MEASURED, 0 UNRUN. First pass: one finding fixed in 4f2f3c85 (check:cross-package-test-inputs: the tree-walking pin belongs in vitest.repo-tests.json); four exit 3 (prerequisite) re-run green after prerequisites: check-plugin-teardown-shape --self-test (fixture commit 621a4876 fetched at depth 1), check:skill-examples, check:dual-build-cjs-loads, check:i18n-coverage (declaration build of ./packages/* and ./packages/*/*). check-platform-checklist --changed-from origin/main exit 0. PR check-runs: not read at report time.",
"dogfood_battery": "head 4f2f3c85, full, no OS_TEST_SHARD, closure built first, under os-verify-lock: Test Files 429 passed | 3 skipped (432), Tests 3569 passed | 41 skipped (3610); lock VERDICT command-exit 0 (held 1462s)",
"line_budget": "583 additions / 274 deletions over 41 files (857 lines), under the 3,000-line threshold; no skills/** touched; check-governed-merges --test exit 0; no path-derived Tier H",
"files_changed": [
".changeset/31035-template-manifest-inert-keys-retired.md",
"content/docs/deployment/cli.mdx",
"content/docs/deployment/marketplace-handbook.mdx",
"content/docs/getting-started/your-first-project.mdx",
"content/docs/references/marketplace/template-manifest.mdx",
"content/docs/upgrading.mdx",
"docs/audits/2026-07-unknown-key-strictness-ledger.counts/marketplace.md",
"packages/apps/connector-docusign/objectstack.manifest.json",
"packages/apps/connector-github/objectstack.manifest.json",
"packages/apps/connector-stripe/objectstack.manifest.json",
"packages/cli/src/commands/package/publish.ts",
"packages/cli/test/package-publish-namespace.test.ts",
"packages/cli/test/package-publish-taxonomy.test.ts",
"packages/cli/test/package-publish-uncarried-manifest-keys.test.ts",
"packages/create-objectstack/src/index.ts",
"packages/create-objectstack/src/package-name.test.ts",
"packages/create-objectstack/src/package-name.ts",
"packages/create-objectstack/src/scaffold-description.test.ts",
"packages/create-objectstack/src/template-consistency.test.ts",
"packages/create-objectstack/src/template-version-stamps.test.ts",
"packages/create-objectstack/src/templates/blank/objectstack.manifest.json",
"packages/spec/authorable-surface/marketplace.json",
"packages/spec/liveness/README.md",
"packages/spec/liveness/state-counts/template_manifest.md",
"packages/spec/liveness/template_manifest.json",
"packages/spec/scripts/check-template-manifests.ts",
"packages/spec/src/marketplace/package-namespace.test.ts",
"packages/spec/src/marketplace/taxonomy.test.ts",
"packages/spec/src/marketplace/template-manifest-id.test.ts",
"packages/spec/src/marketplace/template-manifest-inert-keys-retirement.test.ts",
"packages/spec/src/marketplace/template-manifest.zod.ts",
"packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__name.ts",
"packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__scaffold.ts",
"packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__skills.ts",
"packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__specVersion.ts",
"packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__visibility.ts",
"packages/spec/src/migrations/entries/semantic/18.marketplace-template-manifest-inert-keys-retired.ts",
"packages/spec/src/migrations/registry.ts.template",
"packages/spec/vitest.repo-tests.json",
"scripts/cross-package-test-inputs.mjs",
"scripts/sync-template-versions.mjs"
],
"deviations": "(1) Claim said Metadata-protocol: none; declared narrowed per the seat's ruling (tombstones), spec bump minor. (2) The four inert keys warn rather than refuse in os package publish (every pre-release blank scaffold carries them); only visibility refuses — named in the PR body as strikeable. (3) .github/workflows/release.yml keeps a comment about the manifest stamp; governed file, left for a maintainer. (4) Harness assignee/reviewer MCP step skipped per the frame; PR opened through the relay as a draft. (5) A container restart killed the first gate sweep; it was re-run from the start of the list.",
"mcp_calls": "reads only (GitHub issue/PR reads during the premise check; exact count not retained across a context compaction); 0 writes",
"api_writes": "2 — fleet-write relay POST /repos/objectstack-ai/objectstack/dispatches (pr_create #31064, read-back identical 11240 bytes), post-stamped issue comment on #31035 (this report)",
"open_questions": [
"publisher and isStarter: hotcrm scripts/lib/marketplace-listing.mjs#packageUpsertBody sends both from its manifest in service mode, so retire / re-classify live-elsewhere / keep dead+warn is a maintainer decision card (options A/B/C in the per-key table)."
],
"security_findings": "none",
"out_of_scope_findings": [
"hotcrm carrier, next platform bump (same carrier as category #30980): its objectstack.manifest.json still writes name, specVersion, skills (and category); test/docs-declared-versions.test.ts and test/marketplace-listing.test.ts go red on the first bump to a spec carrying this change.",
"check:template-manifests walks only create-objectstack's templates; the three connector manifests are now covered by the new tree-scoped pin, not by that gate."
],
"per_key_table": [
{
"key": "name",
"verdict": "retired",
"readers": "none (create-objectstack wrote it, never read)",
"replacement": "package.json name / manifestId"
},
{
"key": "specVersion",
"verdict": "retired",
"readers": "none of the value (sync script stamped, tests asserted)",
"replacement": "manifest.engines.protocol"
},
{
"key": "skills",
"verdict": "retired",
"readers": "none (whole catalog installed)",
"replacement": "none needed"
},
{
"key": "scaffold",
"verdict": "retired",
"readers": "none (variables never prompted, postInstall never run)",
"replacement": "none needed"
},
{
"key": "visibility",
"verdict": "retired; publish refuses by name",
"readers": "publish read it only to warn",
"replacement": "os package publish --visibility"
},
{
"key": "publisher",
"verdict": "excluded, decision card",
"readers": "hotcrm service-mode upsert sends it",
"replacement": "pending"
},
{
"key": "isStarter",
"verdict": "excluded, decision card",
"readers": "hotcrm service-mode upsert sends is_starter",
"replacement": "pending"
}
]
}
Activity
objectstack-fleet commentedon Nov 6, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 kept ·
domain:spec· unblocked · 2026-11-06T19:54Z⛔ Not a claim.
template_manifestkeys are recordeddeadin the liveness ledger since PR feat(spec)!: one marketplace taxonomy — business functions, industries, a solution type and maturity replace the single category #30980 (name,specVersion,skills,scaffold,visibility,publisher,isStarter). Enforce or retire each under ADR-0049, with thespec-property-retirementplaybook.domain:speckept. PR feat(spec)!: one marketplace taxonomy — business functions, industries, a solution type and maturity replace the single category #30980 merged at 19:16Z, sopm:blocked→pm:queue.Generated by Claude Code
objectstack-fleet commentedon Nov 6, 2026
domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB
Claim: PM loop round 6 · 2026-11-06T21:09Z
Session:
session_01L9qibzzqHZdAVqgBAvxXKBAccount:
os-tesla(the card's assignee)Branch:
claude/project-thread-5986qn(the card thread's designated branch; dev sessionsession_01L9qibz5AiZzgut2WFyXVqW)Worktree:
objectstack-issue-31035Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/src/marketplace/template-manifest.zod.ts(retiredKey tombstones perspec-property-retirement),packages/spec/liveness/template_manifest.json, retired-keys migration entries, shipped template manifests that write a retired key,os package publish'suncarriedManifestWarningswhere it names a retired key, regenerated artefacts, one changeset. A per-key table goes to the seat before any edit. ⛔ a key whose fate is not mechanical (it goes to a decision card)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate),effort: high(p2)Clause-②: no
Metadata-protocol: none
Responsibility:
objectstack.manifest.json(objectstack,packages/specmarketplace) declares seven keys no reader honours. An author who writesvisibility,publisherorisStarter, orname,specVersion,skillsorscaffold, changes nothing. ADR-0049 says enforce or remove. This reaches every template author today.Thread-read: 6694088718
Premise: holds. On
origin/main9d939c58,packages/spec/liveness/template_manifest.jsonrecords the seven keysdead.Serial constraints cleared: #30980 merged (
468e0c16da)Not governed. A retirement narrows the published schema, so it owes one contract review at
CONTRACT_REVIEW_TIER, run by the seat.Order:
/mnt/project-files/spec-seat-1/r2026-11-06/dispatch-31035.md(frameFRAME.mdbeside it).objectstack-fleet commentedon Nov 6, 2026
domain:spec#1 · os-tesla · session_01L9qibz5AiZzgut2WFyXVqW
os-dev-report
{ "issue": 31035, "status": "done", "branch": "claude/project-thread-5986qn", "pr": "https://github.com/objectstack-ai/objectstack/pull/31064", "session": "session_01L9qibz5AiZzgut2WFyXVqW", "premise_still_valid": true, "summary": "Retired five of the seven dead TemplateManifest keys per the seat's Go: name, specVersion, skills, scaffold, visibility are retiredKey() tombstones with per-key prescriptions (visibility names --visibility, specVersion names engines.protocol). ADR-0087: five RETIRED_KEYS_BY_MAJOR[18] rows, one D3 entry marketplace-template-manifest-inert-keys-retired + STEP18_RATIONALE fragment, no D2 conversion (not a stack collection member, the category precedent). os package publish refuses a manifest declaring visibility before any network call and warns (non-fatal) naming the other four for deletion. Blank template, the three connector-app manifests and the scaffolder (delete m.name) stop writing them; sync-template-versions.mjs no longer stamps specVersion (battery floors re-measured). Liveness rows keep dead with REMOVED notes; generated artefacts and four docs pages updated. Changeset: spec minor, cli minor, create-objectstack patch; Clause-②: no (narrowing), Metadata-protocol: narrowed, BREAKING banner, adr-0087 marker. publisher and isStarter untouched (hotcrm service-mode producer) pending a decision card. Premise held on origin/main 115a43ad.", "tests": "head 4f2f3c85: spec test (local) Test Files 820 passed (820), Tests 25908 passed | 1 todo; spec test:repo Test Files 91 passed (91), Tests 1551 passed; spec check:test-typecheck exit 0, check:generated exit 0. On 58b292e7 (4f2f3c85 only adds a path to vitest.repo-tests.json): create-objectstack 24 files / 369 tests passed + typecheck exit 0; cli unit 396/396 files (5 re-run green after a declaration build; first run red on a dts-less local build) + typecheck exit 0; connector-docusign/github/stripe pnpm test 28/14/20 passed; sync-template-versions --self-test exit 0 (44 assertions). Ablations via ablation-replace.mjs: publish visibility guard disabled -> 1 red (refused by name before any network call); specVersion tombstone -> z.string().optional() -> 2 red (refusal at own path; engines.protocol prescription); both restored green.", "gates": "dispatch-gates --commands derived 134 families; all 134 exit 0 (record /mnt/project-files/spec-seat-1/r2026-11-06/out/31035-gates-ran-4f2f3c85.list); --ran: 134 derived, 134 run, 0 NOT-MEASURED, 0 UNRUN. First pass: one finding fixed in 4f2f3c85 (check:cross-package-test-inputs: the tree-walking pin belongs in vitest.repo-tests.json); four exit 3 (prerequisite) re-run green after prerequisites: check-plugin-teardown-shape --self-test (fixture commit 621a4876 fetched at depth 1), check:skill-examples, check:dual-build-cjs-loads, check:i18n-coverage (declaration build of ./packages/* and ./packages/*/*). check-platform-checklist --changed-from origin/main exit 0. PR check-runs: not read at report time.", "dogfood_battery": "head 4f2f3c85, full, no OS_TEST_SHARD, closure built first, under os-verify-lock: Test Files 429 passed | 3 skipped (432), Tests 3569 passed | 41 skipped (3610); lock VERDICT command-exit 0 (held 1462s)", "line_budget": "583 additions / 274 deletions over 41 files (857 lines), under the 3,000-line threshold; no skills/** touched; check-governed-merges --test exit 0; no path-derived Tier H", "files_changed": [ ".changeset/31035-template-manifest-inert-keys-retired.md", "content/docs/deployment/cli.mdx", "content/docs/deployment/marketplace-handbook.mdx", "content/docs/getting-started/your-first-project.mdx", "content/docs/references/marketplace/template-manifest.mdx", "content/docs/upgrading.mdx", "docs/audits/2026-07-unknown-key-strictness-ledger.counts/marketplace.md", "packages/apps/connector-docusign/objectstack.manifest.json", "packages/apps/connector-github/objectstack.manifest.json", "packages/apps/connector-stripe/objectstack.manifest.json", "packages/cli/src/commands/package/publish.ts", "packages/cli/test/package-publish-namespace.test.ts", "packages/cli/test/package-publish-taxonomy.test.ts", "packages/cli/test/package-publish-uncarried-manifest-keys.test.ts", "packages/create-objectstack/src/index.ts", "packages/create-objectstack/src/package-name.test.ts", "packages/create-objectstack/src/package-name.ts", "packages/create-objectstack/src/scaffold-description.test.ts", "packages/create-objectstack/src/template-consistency.test.ts", "packages/create-objectstack/src/template-version-stamps.test.ts", "packages/create-objectstack/src/templates/blank/objectstack.manifest.json", "packages/spec/authorable-surface/marketplace.json", "packages/spec/liveness/README.md", "packages/spec/liveness/state-counts/template_manifest.md", "packages/spec/liveness/template_manifest.json", "packages/spec/scripts/check-template-manifests.ts", "packages/spec/src/marketplace/package-namespace.test.ts", "packages/spec/src/marketplace/taxonomy.test.ts", "packages/spec/src/marketplace/template-manifest-id.test.ts", "packages/spec/src/marketplace/template-manifest-inert-keys-retirement.test.ts", "packages/spec/src/marketplace/template-manifest.zod.ts", "packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__name.ts", "packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__scaffold.ts", "packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__skills.ts", "packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__specVersion.ts", "packages/spec/src/migrations/entries/retired-keys/18.marketplace__TemplateManifest__visibility.ts", "packages/spec/src/migrations/entries/semantic/18.marketplace-template-manifest-inert-keys-retired.ts", "packages/spec/src/migrations/registry.ts.template", "packages/spec/vitest.repo-tests.json", "scripts/cross-package-test-inputs.mjs", "scripts/sync-template-versions.mjs" ], "deviations": "(1) Claim said Metadata-protocol: none; declared narrowed per the seat's ruling (tombstones), spec bump minor. (2) The four inert keys warn rather than refuse in os package publish (every pre-release blank scaffold carries them); only visibility refuses — named in the PR body as strikeable. (3) .github/workflows/release.yml keeps a comment about the manifest stamp; governed file, left for a maintainer. (4) Harness assignee/reviewer MCP step skipped per the frame; PR opened through the relay as a draft. (5) A container restart killed the first gate sweep; it was re-run from the start of the list.", "mcp_calls": "reads only (GitHub issue/PR reads during the premise check; exact count not retained across a context compaction); 0 writes", "api_writes": "2 — fleet-write relay POST /repos/objectstack-ai/objectstack/dispatches (pr_create #31064, read-back identical 11240 bytes), post-stamped issue comment on #31035 (this report)", "open_questions": [ "publisher and isStarter: hotcrm scripts/lib/marketplace-listing.mjs#packageUpsertBody sends both from its manifest in service mode, so retire / re-classify live-elsewhere / keep dead+warn is a maintainer decision card (options A/B/C in the per-key table)." ], "security_findings": "none", "out_of_scope_findings": [ "hotcrm carrier, next platform bump (same carrier as category #30980): its objectstack.manifest.json still writes name, specVersion, skills (and category); test/docs-declared-versions.test.ts and test/marketplace-listing.test.ts go red on the first bump to a spec carrying this change.", "check:template-manifests walks only create-objectstack's templates; the three connector manifests are now covered by the new tree-scoped pin, not by that gate." ], "per_key_table": [ { "key": "name", "verdict": "retired", "readers": "none (create-objectstack wrote it, never read)", "replacement": "package.json name / manifestId" }, { "key": "specVersion", "verdict": "retired", "readers": "none of the value (sync script stamped, tests asserted)", "replacement": "manifest.engines.protocol" }, { "key": "skills", "verdict": "retired", "readers": "none (whole catalog installed)", "replacement": "none needed" }, { "key": "scaffold", "verdict": "retired", "readers": "none (variables never prompted, postInstall never run)", "replacement": "none needed" }, { "key": "visibility", "verdict": "retired; publish refuses by name", "readers": "publish read it only to warn", "replacement": "os package publish --visibility" }, { "key": "publisher", "verdict": "excluded, decision card", "readers": "hotcrm service-mode upsert sends it", "replacement": "pending" }, { "key": "isStarter", "verdict": "excluded, decision card", "readers": "hotcrm service-mode upsert sends is_starter", "replacement": "pending" } ] }