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
skills(objectstack-platform) + docs: an email-template override names a locale its base ships; a new locale carries no overrides (#28746 follow-up) #28778
Filing gate: ③ the Skills-docs: follow-up owed line of PR #28777 (#28746), filed by the seat before ACCEPT as the review checklist requires. ⛔ Not a claim. Graded by this seat: p3 (documentation of a rule the gate now enforces; nothing the pages teach is falsified, they are silent on the locale), under 「定级你可以自己决定」 (Leehom, 2026-11-01).
Reach: an AI author or developer customizing a vendor email template through a <base>.custom pair, who learns from the skill or the docs that a same-name item with overrides replaces the base item, and so declares overrides on a locale the base never shipped. After PR #28777 that write is refused (declared_package_ships_no_such_item).
Wanted
skills/objectstack-platform/SKILL.md, the ADR-0146 customization paragraph (it lists email_template among the honoured types): one sentence that an email template is one item per (name, locale), so an override names a locale the base ships, and a locale the base does not ship is added without overrides.
content/docs/concepts/metadata-lifecycle.mdx, the ADR-0146 section (≈ line 117, "bears a base item's name"): the same rule for email_template: the name and a locale the base ships.
Claim: PM loop round 1
Session: session_017ihL2g7RyXa8ErM6GAkHyc
Account: marchtian
Branch: claude/issue-28778-email-template-locale
Worktree: objectstack-issue-28778
Domain: domain:skills
Seat: domain:skills#2
File surface: skills/objectstack-platform/SKILL.md (the ADR-0146 customization paragraph) and content/docs/concepts/metadata-lifecycle.mdx (the ADR-0146 section), plus the changeset the published skill package owes.
Container & model: M, mode:subagent, model: claude-fable-5-1 (dispatch-gates --tier: MANDATORY on skills/**, clause ①, no one-line exit), effort: high; then an independent CONTRACT_REVIEW_TIER review by a separate agent.
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card (a Skills-docs: follow-up owed line)
Thread-read: none
Premise: holds — PR #28777 is merged (5bb7834a41), so the gate refuses an overrides on a locale the base does not ship; on main the skill paragraph (L134) and the docs section (L114–) say nothing about the locale.
Serial constraints cleared: no open PR touches the file surface above (read over every open PR).
Landing: Tier H (skills/**). The PR stays draft with needs-user-decision until an authorised approver acts.
{
"issue": 28778,
"status": "done",
"branch": "claude/issue-28778-email-template-locale",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28814",
"head": "7390bef4d67963533b28c1979cf4a92bafdcac8b",
"session": "session_017ihL2g7RyXa8ErM6GAkHyc",
"premise_still_valid": true,
"summary": "One sentence added to the ADR-0146 customization paragraph of skills/objectstack-platform/SKILL.md (an email template is one item per (name, locale): an override names a locale the base ships; a locale the base does not ship is added without overrides), and the same rule in content/docs/concepts/metadata-lifecycle.mdx (the 'bears a base item's name' sentence now says the name AND a locale the base ships for an email_template, plus a bullet 'A new locale is not an override' naming the 403 NOT_OVERRIDABLE refusal and the os validate row). The rule was taken from the landed gate, not the card. A patch changeset on @objectstack/skills. Draft PR, no assignees, no reviewers; skills/** is Tier H, landing waits for an authorised APPROVED review.",
"files_changed": [
"skills/objectstack-platform/SKILL.md (+3/-6 lines; the L131 paragraph gains the sentence; four filler clauses and the eight-type enumeration tightened)",
"content/docs/concepts/metadata-lifecycle.mdx (+7/-1 lines; ADR-0146 section L117-119 and a new bullet after 'The reads agree')",
".changeset/28778-email-template-override-locale.md (new; '@objectstack/skills': patch; Clause-②: no; Metadata-protocol: none)"
],
"token_budget": {
"file": "skills/objectstack-platform/SKILL.md",
"ceiling": 6012,
"before": "6012 tokens (24045 counted bytes; headroom 0 tokens / 3 bytes) · 462 lines",
"after": "6005 tokens (24020 counted bytes; headroom 7) · 459 lines",
"package_before": "all skills/*/SKILL.md: 4561 lines · 56274 tokens",
"package_after": "all skills/*/SKILL.md: 4558 lines · 56267 tokens",
"ratchet_authored_total_after": "181895 / 190761 (57 files; only this file moved, -7)",
"paid_by": [
"same paragraph: 'page, app, dataset, doc, book, mapping, flow and action wait for their doors' -> 'the rest of OVERRIDABLE_METADATA_TYPES wait for their doors' (the honoured five stay named; the docs page keeps the full list)",
"'Undeclared keys are handled per surface, and the two postures are worth keeping straight:' -> '..., in two postures:'",
"'Every stack needs a manifest to identify itself in the ecosystem:' -> 'Every stack needs a manifest:'",
"Runtime Boot Sequence intro line 'Understanding how ObjectStack starts helps debug and customize:' removed",
"driver table intro 'Pick based on your environment:' removed (the table's Best For column carries it)",
"no re-wrap counted; no rule dropped; no ceiling moved"
]
},
"tests": "No code change; no test added or moved. Verification is the gate set below. No ablation (docs and skill prose only).",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at head 7390bef4d6 derives 71 commands (3 paths, 30 changed lines, merge base c064d3a246). All 71 run locally, exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?): 71/71 exit 0. --ran reconciliation with exit codes: '71 derived famil(ies) accounted for — 71 run, 0 NOT-MEASURED (a DERIVED zero — all 71 recorded an exit code and none of them is 3)'. Prerequisites: pnpm install --frozen-lockfile; pnpm build --concurrency=2 under os-verify-lock.sh (VERDICT command-exit 0, held 1011s). Key verdict lines: check-skills-token-ratchet 'skills/objectstack-platform/SKILL.md is 6005 tokens (ceiling 6012; headroom 7)' and '57 authored bundle file(s) within their ceilings'; check:skill-frame-sync, check:skill-identifier-liveness, check:skill-top-level-keys, check:skill-compatibility exit 0; spec check:skill-docs, check:skill-examples, check:docs, check:variant-docs, check:yaml-examples exit 0; check:doc-anchors, check:doc-authoring, check:overlay-whitelist-table, check:docs-single-h1, check:doc-frontmatter, check:docs-spec-enumerations, check:docs-transcript-drift exit 0; check-empty-changeset, check-changeset-no-major, check-adr-0087-registration (--base origin/main) exit 0; check:nul-bytes, check:pm-skill-id-lint exit 0. CI families not run locally (type-check lanes, Build Docs, Build Core, main-push batteries): the PR's check-runs carry them; CI status at report time: in_progress.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"deviations": [
"Local-only families check:dev-prereqs and check:skill-frame-freshness not run: the diff touches neither a packages/spec build nor a four-axis frame file, and the derivation does not name them.",
"pr_create carried no labels: the dispatch names none and skip-changeset does not apply (@objectstack/skills publishes skills/**); the intersection is empty, reported here rather than written. The PR now carries documentation, size/s and tooling — set by the labeler, another actor, left as is.",
"The PR body's first line is the order-mandated attribution comment (harness form), kept as the one sanctioned exception; no other HTML comment in any artefact.",
"pnpm build held the shared verify lock 1011s (16m51s) — a full build was needed because the derived spec and dist gates read dist; noted for the seat, not filed."
],
"mcp_calls": "0 — no MCP GitHub tool was called (reads via gh api REST; writes via scripts/pm only)",
"api_writes": "2 relay dispatches, both POST /repos/objectstack-ai/objectstack/dispatches (fleet-write): pr_create -> objectstack-ai/objectstack#28814 (run 41351997855, success, read-back identical 8412/8412 bytes), and this os-dev-report comment on #28778 via post-stamped.mjs. Plus 1 git push to origin/claude/issue-28778-email-template-locale (not REST).",
"facts": [
"packages/metadata-core/src/item-key-discriminators.ts:68-70 — ITEM_KEY_DISCRIMINATORS holds one entry: email_template: { field: 'locale', canonical: 'en-US' }; an email template is one item per (name, locale).",
"packages/metadata-core/src/item-key-discriminators.ts:96-100 — itemDiscriminator keys a body that declares no locale as the canonical member ('en-US').",
"packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:280-282 — overrideWriteMemberOf reads the member off that table (never a type literal); undefined for every name-identified type.",
"packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:299-302 — overrideWriteIdentityOf joins the item's identity with its member for a pair-identified type; the one identity every door compares shipped and incoming items on.",
"packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:448-455 — judgeOverrideWrite refuses declared_package_ships_no_such_item when closure.shippers lacks the base at the body's member; the sentence names the locale via ITEM_KEY_DISCRIMINATORS[type].field and prescribes removing overrides to keep it as the pair's own item.",
"packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:535-542 — the thrown form of a refuse verdict is code NOT_OVERRIDABLE, status 403.",
"packages/qa/dogfood/test/email-template-override-unshipped-locale.dogfood.test.ts:125 — control pin: fr-FR without overrides is the pair's own new member and is served (:89 and :97 pin the save-door and per-item-publish refusals; :117 the en-US shipped-locale override served).",
"packages/cli/src/utils/override-declarations.test.ts:125,151 — os validate reports declared_package_ships_no_such_item for the pair's fr-FR declaration; :161 and :173 the undeclared fr-FR addition and a dependent's fr-FR template produce no row.",
"skills/objectstack-platform/SKILL.md on main c064d3a246: the L134 paragraph named email_template among the honoured types and said nothing about the locale; measured 6012 tokens against ceiling 6012 (scripts/check-skills-token-ratchet.mjs:584).",
"content/docs/concepts/metadata-lifecycle.mdx on main: L117 'bears a base item's name' and the 'The reads agree' bullet named email_template with no locale rule."
],
"open_questions": [],
"out_of_scope_findings": []
}
{
"issue": 28778,
"status": "done",
"round": "patch round after contract review 6564277480 (PASS, one should-fix); delta over report 6564145197",
"branch": "claude/issue-28778-email-template-locale",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28814",
"head": "dd9e43d1e5650d6c761501d7ea4646bd5cd21ed7 (was 7390bef4d6)",
"session": "session_017ihL2g7RyXa8ErM6GAkHyc",
"premise_still_valid": true,
"summary": "The should-fix: the re-stated honoured-types clause was stale for flow. Verified on origin/main 663b7c08ee before editing: CONDITIONS_DELIVERED = new Set(['flow']) (packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:231), isOpenOverrideType admits a type whose D9 conditions are delivered (:242-246), declinesStoredRow serves the pair's declared override of a shipped flow name (packages/metadata-protocol/src/protocol-lock-state.ts:142-148); main has not moved on the three touched files since the merge base c064d3a246. The skill clause now reads 'today only for a view, dashboard, report, email_template, translation or flow (the rest of OVERRIDABLE_METADATA_TYPES wait for their doors)'; the docs page's 'The reads agree' bullet names flow among the honoured six and its waiters enumeration is page, app, dataset, doc, book, mapping and action. One commit, pushed; no other change.",
"files_changed": [
"skills/objectstack-platform/SKILL.md (1 line; +6 bytes in the L131 clause)",
"content/docs/concepts/metadata-lifecycle.mdx (3 lines in the 'The reads agree' bullet)"
],
"token_budget": "skills/objectstack-platform/SKILL.md: 6007 tokens (24026 counted bytes) against ceiling 6012, headroom 5 (was 6005 / headroom 7 at 7390bef4d6; main 6012 / headroom 0). Ratchet verdict on dd9e43d1e5: 'skills/objectstack-platform/SKILL.md is 6007 tokens (ceiling 6012; headroom 5)' · '57 authored bundle file(s) within their ceilings'. No ceiling moved; nothing cut this round.",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at dd9e43d1e5: the same 71 commands as round 1 (3 paths, 36 changed lines vs merge base c064d3a246). All 71 re-run on this head, exit codes captured before any pipe: 71/71 exit 0. --ran with exit codes: '71 derived famil(ies) accounted for — 71 run, 0 NOT-MEASURED (a DERIVED zero — all 71 recorded an exit code and none of them is 3)'. Dists from the round-1 build reused (no package source changed). CI on dd9e43d1e5 not waited for.",
"deviations": [
"PR #28814's body still carries round-1 readings (6005 tokens / headroom 7, the honoured-five wording in What changes): the dev writes the body once and does not PATCH it; the seat may amend with this delta — after: 459 lines · 6007 tokens; package 4558 lines · 56269 tokens.",
"Local-only families check:dev-prereqs and check:skill-frame-freshness still not derived or run (unchanged reasoning)."
],
"mcp_calls": "0 (cumulative 0)",
"api_writes": "this round: 1 relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, this comment via post-stamped.mjs) + 1 git push (not REST). Cumulative: 3 dispatches (pr_create #28814, report 6564145197, this delta) + 2 git pushes.",
"facts": [
"packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:231 (origin/main 663b7c08ee) — const CONDITIONS_DELIVERED: ReadonlySet of string = new Set(['flow']).",
"packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:242-246 — isOpenOverrideType: disposition overridable AND (no conditions OR CONDITIONS_DELIVERED has the type); :227-229 says action's door is not cut, so action keeps the not-yet-available refusal.",
"packages/metadata-protocol/src/protocol-lock-state.ts:142-148 — declinesStoredRow: for a shipped flow name, the one row that is the shipping package's declared override (judged by isServedOverrideRowOf on the row's own package_id and body) is served; every other stored row of the name stays declined.",
"git log c064d3a246..origin/main on the three touched files: empty (main moved 7 commits, none on them)."
],
"open_questions": [],
"out_of_scope_findings": [
"observation, not filed (read-only inference; no runtime reach): the header docblock of packages/metadata-protocol/src/served-override.ts:44-46 on origin/main still says 'flow and action wait for ADR-0146 D9's conditions' while CONDITIONS_DELIVERED and declinesStoredRow serve the flow override; comment text only. carrier: #28577 (the flow-drift owner the review names)."
]
}
ACCEPT → PR #28814 comment 6564497798 (head dd9e43d1e5650d6c761501d7ea4646bd5cd21ed7; contract review PASS 6564277480 → patch round 6564445482 → delta PASS 6564484664). The PR is a draft with needs-user-decision, and os-zhuang and hotlong are requested as reviewers; it waits on an authorised approver.
Landed 2026-11-02T00:22Z: PR #28814 merged as 7f4cbc9d97 (merge queue; readied and enqueued by os-zhuang). Seat ACCEPT 6564497798. Card #28829 (stacked on this PR) now merges main so its diff is its own.
Activity
objectstack-fleet commentedon Nov 1, 2026
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc
Claim: PM loop round 1
Session:
session_017ihL2g7RyXa8ErM6GAkHycAccount:
marchtianBranch:
claude/issue-28778-email-template-localeWorktree:
objectstack-issue-28778Domain:
domain:skillsSeat:
domain:skills#2File surface:
skills/objectstack-platform/SKILL.md(the ADR-0146 customization paragraph) andcontent/docs/concepts/metadata-lifecycle.mdx(the ADR-0146 section), plus the changeset the published skill package owes.Container & model:
M,mode:subagent,model: claude-fable-5-1(dispatch-gates --tier: MANDATORY onskills/**, clause ①, no one-line exit),effort: high; then an independentCONTRACT_REVIEW_TIERreview by a separate agent.Clause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card(aSkills-docs: follow-up owedline)Thread-read: none
Premise: holds — PR #28777 is merged (
5bb7834a41), so the gate refuses anoverrideson a locale the base does not ship; onmainthe skill paragraph (L134) and the docs section (L114–) say nothing about the locale.Serial constraints cleared: no open PR touches the file surface above (read over every open PR).
Landing: Tier H (
skills/**). The PR stays draft withneeds-user-decisionuntil an authorised approver acts.objectstack-fleet commentedon Nov 1, 2026
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc
os-dev-report
{ "issue": 28778, "status": "done", "branch": "claude/issue-28778-email-template-locale", "pr": "https://github.com/objectstack-ai/objectstack/pull/28814", "head": "7390bef4d67963533b28c1979cf4a92bafdcac8b", "session": "session_017ihL2g7RyXa8ErM6GAkHyc", "premise_still_valid": true, "summary": "One sentence added to the ADR-0146 customization paragraph of skills/objectstack-platform/SKILL.md (an email template is one item per (name, locale): an override names a locale the base ships; a locale the base does not ship is added without overrides), and the same rule in content/docs/concepts/metadata-lifecycle.mdx (the 'bears a base item's name' sentence now says the name AND a locale the base ships for an email_template, plus a bullet 'A new locale is not an override' naming the 403 NOT_OVERRIDABLE refusal and the os validate row). The rule was taken from the landed gate, not the card. A patch changeset on @objectstack/skills. Draft PR, no assignees, no reviewers; skills/** is Tier H, landing waits for an authorised APPROVED review.", "files_changed": [ "skills/objectstack-platform/SKILL.md (+3/-6 lines; the L131 paragraph gains the sentence; four filler clauses and the eight-type enumeration tightened)", "content/docs/concepts/metadata-lifecycle.mdx (+7/-1 lines; ADR-0146 section L117-119 and a new bullet after 'The reads agree')", ".changeset/28778-email-template-override-locale.md (new; '@objectstack/skills': patch; Clause-②: no; Metadata-protocol: none)" ], "token_budget": { "file": "skills/objectstack-platform/SKILL.md", "ceiling": 6012, "before": "6012 tokens (24045 counted bytes; headroom 0 tokens / 3 bytes) · 462 lines", "after": "6005 tokens (24020 counted bytes; headroom 7) · 459 lines", "package_before": "all skills/*/SKILL.md: 4561 lines · 56274 tokens", "package_after": "all skills/*/SKILL.md: 4558 lines · 56267 tokens", "ratchet_authored_total_after": "181895 / 190761 (57 files; only this file moved, -7)", "paid_by": [ "same paragraph: 'page, app, dataset, doc, book, mapping, flow and action wait for their doors' -> 'the rest of OVERRIDABLE_METADATA_TYPES wait for their doors' (the honoured five stay named; the docs page keeps the full list)", "'Undeclared keys are handled per surface, and the two postures are worth keeping straight:' -> '..., in two postures:'", "'Every stack needs a manifest to identify itself in the ecosystem:' -> 'Every stack needs a manifest:'", "Runtime Boot Sequence intro line 'Understanding how ObjectStack starts helps debug and customize:' removed", "driver table intro 'Pick based on your environment:' removed (the table's Best For column carries it)", "no re-wrap counted; no rule dropped; no ceiling moved" ] }, "tests": "No code change; no test added or moved. Verification is the gate set below. No ablation (docs and skill prose only).", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at head 7390bef4d6 derives 71 commands (3 paths, 30 changed lines, merge base c064d3a246). All 71 run locally, exit codes captured before any pipe (cmd > log 2>&1; EXIT=$?): 71/71 exit 0. --ran reconciliation with exit codes: '71 derived famil(ies) accounted for — 71 run, 0 NOT-MEASURED (a DERIVED zero — all 71 recorded an exit code and none of them is 3)'. Prerequisites: pnpm install --frozen-lockfile; pnpm build --concurrency=2 under os-verify-lock.sh (VERDICT command-exit 0, held 1011s). Key verdict lines: check-skills-token-ratchet 'skills/objectstack-platform/SKILL.md is 6005 tokens (ceiling 6012; headroom 7)' and '57 authored bundle file(s) within their ceilings'; check:skill-frame-sync, check:skill-identifier-liveness, check:skill-top-level-keys, check:skill-compatibility exit 0; spec check:skill-docs, check:skill-examples, check:docs, check:variant-docs, check:yaml-examples exit 0; check:doc-anchors, check:doc-authoring, check:overlay-whitelist-table, check:docs-single-h1, check:doc-frontmatter, check:docs-spec-enumerations, check:docs-transcript-drift exit 0; check-empty-changeset, check-changeset-no-major, check-adr-0087-registration (--base origin/main) exit 0; check:nul-bytes, check:pm-skill-id-lint exit 0. CI families not run locally (type-check lanes, Build Docs, Build Core, main-push batteries): the PR's check-runs carry them; CI status at report time: in_progress.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "deviations": [ "Local-only families check:dev-prereqs and check:skill-frame-freshness not run: the diff touches neither a packages/spec build nor a four-axis frame file, and the derivation does not name them.", "pr_create carried no labels: the dispatch names none and skip-changeset does not apply (@objectstack/skills publishes skills/**); the intersection is empty, reported here rather than written. The PR now carries documentation, size/s and tooling — set by the labeler, another actor, left as is.", "The PR body's first line is the order-mandated attribution comment (harness form), kept as the one sanctioned exception; no other HTML comment in any artefact.", "pnpm build held the shared verify lock 1011s (16m51s) — a full build was needed because the derived spec and dist gates read dist; noted for the seat, not filed." ], "mcp_calls": "0 — no MCP GitHub tool was called (reads via gh api REST; writes via scripts/pm only)", "api_writes": "2 relay dispatches, both POST /repos/objectstack-ai/objectstack/dispatches (fleet-write): pr_create -> objectstack-ai/objectstack#28814 (run 41351997855, success, read-back identical 8412/8412 bytes), and this os-dev-report comment on #28778 via post-stamped.mjs. Plus 1 git push to origin/claude/issue-28778-email-template-locale (not REST).", "facts": [ "packages/metadata-core/src/item-key-discriminators.ts:68-70 — ITEM_KEY_DISCRIMINATORS holds one entry: email_template: { field: 'locale', canonical: 'en-US' }; an email template is one item per (name, locale).", "packages/metadata-core/src/item-key-discriminators.ts:96-100 — itemDiscriminator keys a body that declares no locale as the canonical member ('en-US').", "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:280-282 — overrideWriteMemberOf reads the member off that table (never a type literal); undefined for every name-identified type.", "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:299-302 — overrideWriteIdentityOf joins the item's identity with its member for a pair-identified type; the one identity every door compares shipped and incoming items on.", "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:448-455 — judgeOverrideWrite refuses declared_package_ships_no_such_item when closure.shippers lacks the base at the body's member; the sentence names the locale via ITEM_KEY_DISCRIMINATORS[type].field and prescribes removing overrides to keep it as the pair's own item.", "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:535-542 — the thrown form of a refuse verdict is code NOT_OVERRIDABLE, status 403.", "packages/qa/dogfood/test/email-template-override-unshipped-locale.dogfood.test.ts:125 — control pin: fr-FR without overrides is the pair's own new member and is served (:89 and :97 pin the save-door and per-item-publish refusals; :117 the en-US shipped-locale override served).", "packages/cli/src/utils/override-declarations.test.ts:125,151 — os validate reports declared_package_ships_no_such_item for the pair's fr-FR declaration; :161 and :173 the undeclared fr-FR addition and a dependent's fr-FR template produce no row.", "skills/objectstack-platform/SKILL.md on main c064d3a246: the L134 paragraph named email_template among the honoured types and said nothing about the locale; measured 6012 tokens against ceiling 6012 (scripts/check-skills-token-ratchet.mjs:584).", "content/docs/concepts/metadata-lifecycle.mdx on main: L117 'bears a base item's name' and the 'The reads agree' bullet named email_template with no locale rule." ], "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 1, 2026
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc
os-dev-report
{ "issue": 28778, "status": "done", "round": "patch round after contract review 6564277480 (PASS, one should-fix); delta over report 6564145197", "branch": "claude/issue-28778-email-template-locale", "pr": "https://github.com/objectstack-ai/objectstack/pull/28814", "head": "dd9e43d1e5650d6c761501d7ea4646bd5cd21ed7 (was 7390bef4d6)", "session": "session_017ihL2g7RyXa8ErM6GAkHyc", "premise_still_valid": true, "summary": "The should-fix: the re-stated honoured-types clause was stale for flow. Verified on origin/main 663b7c08ee before editing: CONDITIONS_DELIVERED = new Set(['flow']) (packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:231), isOpenOverrideType admits a type whose D9 conditions are delivered (:242-246), declinesStoredRow serves the pair's declared override of a shipped flow name (packages/metadata-protocol/src/protocol-lock-state.ts:142-148); main has not moved on the three touched files since the merge base c064d3a246. The skill clause now reads 'today only for a view, dashboard, report, email_template, translation or flow (the rest of OVERRIDABLE_METADATA_TYPES wait for their doors)'; the docs page's 'The reads agree' bullet names flow among the honoured six and its waiters enumeration is page, app, dataset, doc, book, mapping and action. One commit, pushed; no other change.", "files_changed": [ "skills/objectstack-platform/SKILL.md (1 line; +6 bytes in the L131 clause)", "content/docs/concepts/metadata-lifecycle.mdx (3 lines in the 'The reads agree' bullet)" ], "token_budget": "skills/objectstack-platform/SKILL.md: 6007 tokens (24026 counted bytes) against ceiling 6012, headroom 5 (was 6005 / headroom 7 at 7390bef4d6; main 6012 / headroom 0). Ratchet verdict on dd9e43d1e5: 'skills/objectstack-platform/SKILL.md is 6007 tokens (ceiling 6012; headroom 5)' · '57 authored bundle file(s) within their ceilings'. No ceiling moved; nothing cut this round.", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at dd9e43d1e5: the same 71 commands as round 1 (3 paths, 36 changed lines vs merge base c064d3a246). All 71 re-run on this head, exit codes captured before any pipe: 71/71 exit 0. --ran with exit codes: '71 derived famil(ies) accounted for — 71 run, 0 NOT-MEASURED (a DERIVED zero — all 71 recorded an exit code and none of them is 3)'. Dists from the round-1 build reused (no package source changed). CI on dd9e43d1e5 not waited for.", "deviations": [ "PR #28814's body still carries round-1 readings (6005 tokens / headroom 7, the honoured-five wording in What changes): the dev writes the body once and does not PATCH it; the seat may amend with this delta — after: 459 lines · 6007 tokens; package 4558 lines · 56269 tokens.", "Local-only families check:dev-prereqs and check:skill-frame-freshness still not derived or run (unchanged reasoning)." ], "mcp_calls": "0 (cumulative 0)", "api_writes": "this round: 1 relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, this comment via post-stamped.mjs) + 1 git push (not REST). Cumulative: 3 dispatches (pr_create #28814, report 6564145197, this delta) + 2 git pushes.", "facts": [ "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:231 (origin/main 663b7c08ee) — const CONDITIONS_DELIVERED: ReadonlySet of string = new Set(['flow']).", "packages/metadata-protocol/src/protocol-packaged-base-refusal.ts:242-246 — isOpenOverrideType: disposition overridable AND (no conditions OR CONDITIONS_DELIVERED has the type); :227-229 says action's door is not cut, so action keeps the not-yet-available refusal.", "packages/metadata-protocol/src/protocol-lock-state.ts:142-148 — declinesStoredRow: for a shipped flow name, the one row that is the shipping package's declared override (judged by isServedOverrideRowOf on the row's own package_id and body) is served; every other stored row of the name stays declined.", "git log c064d3a246..origin/main on the three touched files: empty (main moved 7 commits, none on them)." ], "open_questions": [], "out_of_scope_findings": [ "observation, not filed (read-only inference; no runtime reach): the header docblock of packages/metadata-protocol/src/served-override.ts:44-46 on origin/main still says 'flow and action wait for ADR-0146 D9's conditions' while CONDITIONS_DELIVERED and declinesStoredRow serve the flow override; comment text only. carrier: #28577 (the flow-drift owner the review names)." ] }objectstack-fleet commentedon Nov 1, 2026
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc
ACCEPT → PR #28814 comment 6564497798 (head
dd9e43d1e5650d6c761501d7ea4646bd5cd21ed7; contract review PASS 6564277480 → patch round 6564445482 → delta PASS 6564484664). The PR is a draft withneeds-user-decision, and os-zhuang and hotlong are requested as reviewers; it waits on an authorised approver.objectstack-fleet commentedon Nov 2, 2026
domain:skills#2 · marchtian · session_017ihL2g7RyXa8ErM6GAkHyc
Landed 2026-11-02T00:22Z: PR #28814 merged as
7f4cbc9d97(merge queue; readied and enqueued by os-zhuang). Seat ACCEPT 6564497798. Card #28829 (stacked on this PR) now mergesmainso its diff is its own.