Skip to content

spec liveness: template_manifest keys nothing reads (name, specVersion, skills, scaffold, visibility, publisher, isStarter) — enforce or remove under ADR-0049 #31035

Open

Description

@objectstack-fleet

repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2

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.

维护者速读

模板清单文件(objectstack.manifest.json)里有 7 个键,平台从来不读,或者只是读了提示一下就不往下发。按「要么执行、要么移除」的规则,需要逐个决定是让它生效还是退役。

Readings

Expected

  • Per key: enforce (name the reader) or retire (ADR-0087, minor before GA). Use the spec-property-retirement playbook.

Serial: after objectstack#30980 merges.

Suggested-grade: p2.

Activity

  1. added
    enhancementNew feature or request
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    domain:specDomain lane — seat card indexed by label:pm:seat
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 kept · domain:spec · unblocked · 2026-11-06T19:54Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB

    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/main 9d939c58, 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.

    Order: /mnt/project-files/spec-seat-1/r2026-11-06/dispatch-31035.md (frame FRAME.md beside it).

  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
        }
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:specDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions