① Current PM
🟢 os-justin , session session_01RPo7FUd6bSnAfkWMAKi848. Re-seated 2026-10-08T13:42Z on the maintainer's word in this session's chat: 「你不用下班,周流量还剩 9%,可以再处理3个任务。」 (corrected from 「95」 in the same minute). This revokes the sign-off brief 6058760197 (same session, nothing changed hands in between). First seated 2026-10-07T15:00Z.
Terms: three more cards, chosen small and certain because the weekly quota is the binding constraint (S/M, no design rounds, no L passes), then the seat stands down again under the handover checklist. batch 1 : one subagent in flight at a time (dev, review and census each count). This is the maintainer's last explicit concurrency term, 「当前任务处理完,合并后并发改为1」.
Wake: a fresh self-bound hourly Routine, recreated at re-seat.
Charter: .claude/skills/pm-dispatch/references/lanes/spec.md.
Release state: .changeset/pre.json is present on main (next), so a breaking change is major. docs(pm-dispatch): a card that narrows a published accept set is Clause-② no, stays in its lane and owes one contract-review-tier review before the queue #22223 's rule applies: a card that only narrows is Clause-②: no, and still owes a contract review before the queue.
Stale assignee: os-sam is still on this post. The sign-off's unassign was refused by the relay (run 37769625000), and it is left for the maintainer.
② Ledger
Landed this shift: 11 cards closed, plus five partial landings.
[v18] retire the {var} template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 pass 1 , PR feat(spec)!: flow value slots refuse the {…} template dialect, naming the CEL spelling of each token (#19939, C half) #22259 → 0e9e7b7066 (6058684331). Released to pm:queue with the kept half ({$User.*} premise-bound ruling, then the date macros after formula: CEL has no string form for a Timestamp (string(today()) has no overload), so #19939 cannot refuse {NOW()} / {TODAY() ± N} in flow value slots — the sub-card #11182's ruling D names #22277 ).
spec(print page) ① of #8346: a page gains an optional print declaration, a linted printable-block subset, the list-export retirement sentence made true, and the three zero-reader document schemas retired #22158 , PR feat(spec)!: a page gains an optional print declaration and a linted printable block subset; the zero-reader document schemas retire whole (#22158) #22193 → 326a90a4a3 (6058198073). This is ① of export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346 .
finding(metadata-protocol): a second package-less draft save of a package-owned item is refused 409 METADATA_CONFLICT with no If-Match — the save door's head read and the repository's draft package inheritance read different rows #22128 , PR fix(metadata-protocol): one head row per /meta write address — a second unpinned package-less draft save is accepted (#22128) #22185 → 3b493184e1 (6054530879).
public forms: sharing.publicLink reads as the "Generated public share URL" but is only a slug — the authored path (/forms/contact-us) answers 404, and the real anonymous URL (/_console/f/<slug>) is shown to the author nowhere #22079 , PR fix(spec): the sharing.publicLink describe says the value is a slug and names where it is served #22159 → d7c5c332b3 (6052412835).
finding(lint): the object save door gives no build verdict on validation conditions, field-rule slots (requiredWhen etc.), option visibleWhen or action predicates; os build refuses them, a metadata save stores them (#22019's sibling) #22032 pass 3 , PR fix(lint)!: the object save door gives the build's option visibleWhen verdict (#22032 pass 3) #22151 → aa9447c70b (6052663932). Pass 4 has since landed under another seat (73a0a6bf1).
meta(/meta door): the draft read serves no version token, so no client can pin its first draft save with If-Match; the 409 METADATA_CONFLICT body names the current version only in prose #22114 , PR feat(meta): the /meta item read serves the version token, If-None-Match: * pins a first write, and the 409 carries currentVersion #22126 → 8f2e808117 (6051690870).
lint: a conditional validation rule's nested then / otherwise predicate is never validated, so os build passes and the object save door stores a predicate the top-level rule would refuse #22042 , PR fix(lint)!: a conditional validation rule's nested then / otherwise predicate meets the build's expression verdict, at os build and the object save door (#22042) #22127 → 8fc50b7647 (6050263684).
spec: a notify node's refused title / message is told to write '{{record.name}}', the spelling the build's flow-double-brace-interpolation rule then flags on the same node and the notify renderer does not resolve #22081 , PR fix(spec): a notify title / message refusal prescribes the single-brace {record.name} its renderer reads #22124 → 15ec50e528 (6048918984).
migrate meta: the stack-derived relevance proof that #20620's ruling names as the only exit for a notice is unbuilt — 17.7.0 still prints all 304 protocol-18 manual notices to an app none of them applies to #22072 , PR feat(spec,cli): a structured relevance question takes a semantic notice off os migrate meta's default list (counted; --all lists it) #22115 → cdeabec848 (6048807445).
lint: promote relationship/master-detail-required from warning to error, scoped to controlled_by_parent — ruled for the v18 boundary (Direction 1 of #8772) #9139 , PR feat(lint)!: relationship/master-detail-required refuses the three unsafe master-reference shapes at error on a controlled_by_parent object #22109 → ace0a53852 (6044183998).
spec(flow): FlowSchema accepts edges whose source/target names no node and repeated (source,target) pairs; the engine then runs the target once per incoming edge #22088 , PR feat(spec)!: FlowSchema refuses an edge whose endpoint names no node of its graph, and a repeated edge #22119 → db4c45b8c3 (6045851301).
Partials: build: a script node's undeclared config key passes objectstack validate, compile and registerFlow, then fails every run — the key half of #21898's class (subflow by reading) #21982 (PR feat(spec)!: the build doors refuse an undeclared key on a script / subflow node config, with its location #22129 ), spec: author-visible describe/refusal strings carry internal references (II18nService.getDefaultLocale(), a ruling date, manifest.id, com.steedos.crm) #22093 (PR fix(spec): author-facing describes and refusals drop service-interface names, ruling dates and foreign example ids #22125 ) and finding(lint): the object save door gives no build verdict on validation conditions, field-rule slots (requiredWhen etc.), option visibleWhen or action predicates; os build refuses them, a metadata save stores them (#22019's sibling) #22032 pass 2 (PR fix(lint)!: the object save door gives the build's field-rule-slot verdict (#22032 pass 2) #22117 ). The remainders are named on each card.
Filed this shift: #22111 , #22116 , #22118 , #22128 , #22141 , #22157 , #22158 , #22188 , #22260 , #22269 , #22270 , #22271 , #22277 , objectstack-ai/objectui#11880 and objectstack-ai/objectui#11958 .
Splits and placements made by this seat:
export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346 (ruled B′): split into ① spec(print page) ① of #8346: a page gains an optional print declaration, a linted printable-block subset, the list-export retirement sentence made true, and the three zero-reader document schemas retired #22158 (landed), ② print page ② of objectstack#8346: render a page that declares print — the print CSS mapping, the 13 printable blocks on paper, and the record page's "print" action (browser print preview) objectui#11958 (pm:on-hold until an installable @objectstack/spec exports PagePrintSchema), ③ print page ③ of #8346: a render service with one headless-Chromium driver renders a print page under the requesting user's principal and archives the PDF as a sys_file (M2) #22269 (domain:services, pm:queue), ④ print page ④ of #8346: a record-page "generate PDF" action that calls the render service and attaches the archived PDF to the record #22270 (pm:blocked on print page ③ of #8346: a render service with one headless-Chromium driver renders a print page under the requesting user's principal and archives the PDF as a sys_file (M2) #22269 ) and the skill card skills: the Studio author's page skill learns the print page (page.print, the printable block subset, its lint) now that #22158 has landed — #8346 ruling B′ #22271 (domain:skills, Tier H). The parent is pm:blocked on all four (6058277685).
[Direction · v18] Retire the flat object/filter data-binding family — dataSource as the single data-binding door (re-anchor of the deleted #6590 tracker) #11509 (ruled A-narrow): pm:blocked on page elements bind data through the node-level dataSource only: the repeater reads it, record_picker and number drop their flat-key fallbacks, the designer writes it (objectui half of objectstack#11509, ruled A-narrow) objectui#11880 . When that closes, the next gate is the console pin covering it, then the spec retirement.
Open items, named for the successor (each carried on its card; ⛔ none claimed):
Measure on the real route: finding(metadata-protocol): a second package-less draft save of a package-owned item is refused 409 METADATA_CONFLICT with no If-Match — the save door's head read and the repository's draft package inheritance read different rows #22128 's contract review 6053978836 ③ escalated an org-axis case. The credential carry-forward's active fallback, for an org-scoped save over an env-wide active row, may drop a stored credential. It is pre-existing and read in source only. If the credential drops, file it as class (a) with [security] GET /api/v1/meta/datasources still serves stored cleartext credentials — the metadata read path has no per-type redaction hook #8154 and finding(metadata-protocol): a second package-less draft save of a package-owned item is refused 409 METADATA_CONFLICT with no If-Match — the save door's head read and the repository's draft package inheritance read different rows #22128 as history.
The hotcrm migration of [v18] retire the {var} template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 's refused spellings (71 sites; 20 more after the kept half). This needs a seat that can reach objectstack-ai/hotcrm.
Governed-surface follow-ups for the domain:skills lane:
[v18] flow text slots: read ADR-0032 §3's {{ }} delimiter instead of single-brace {token} (notify title/message and the other flow string slots), converting only what renders the same #22110 (the text-slot half of the {var} dialect) is no longer serial-blocked: [v18] retire the {var} template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 pass 1 has landed.
Stale relay requests: runs 37642366763 (#8346 ) and 37642386458 (#9139 , closed), from the 2026-10-07 15:06–15:20Z incident, still read queued at this sign-off.
Lane at sign-off:
pm:queue: [v18] retire the {var} template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 (p2, its kept half), build: a script node's undeclared config key passes objectstack validate, compile and registerFlow, then fails every run — the key half of #21898's class (subflow by reading) #21982 (p2, remainder), [v18] flow text slots: read ADR-0032 §3's {{ }} delimiter instead of single-brace {token} (notify title/message and the other flow string slots), converting only what renders the same #22110 (p2), and p3: spec: author-visible describe/refusal strings carry internal references (II18nService.getDefaultLocale(), a ruling date, manifest.id, com.steedos.crm) #22093 , skills: the published lint-rules table says relationship/master-detail-required is a warning, which PR #22109 makes false on a controlled_by_parent object #22111 , [maintainer] validate: the field-no-consumers warning is one 856-character line, printed by validate, build and dev alike — one-line verdict + rule: id + a pointer to the full reasoning (os explain, which today takes only schema names) #22161 , metadata-protocol/spec: the _drafts header carries no label, so a draft-only item can only be shown by its machine name (ListDraftsResponseSchema drops the label the repository already reads) #22200 , plugin-approvals: sys_approval_request's 8 action visible predicates read record.viewer, a block the service attaches on read, and the shared expression validator refuses all 8 as an undeclared field #22211 , [finding] the @objectstack/hono catch-all's 409 METADATA_CONFLICT names the current version only in prose: measure whether the hosted runtime's PUT /meta reaches it, and if so carry currentVersion as data (a packages/spec change) #22222 , spec(data): a date or datetime field declares its deadline semantic — dueLike with settledWhen (per-record CEL), so overdue wording and colour derive from one declaration and the name-pattern guess retires (objectui#11815 ruled D) #22227 , spec(ui): field-level conditionalFormatting — a field declares [{ condition, style }] cell rules (CEL over value and record), the row block's own grammar, for presentational rules that carry no semantic (maintainer-directed) #22228 , runtime strings in the domain:spec packages carry tracker numbers (spec 175 and lint 83 messages): this lane's share of the #20513 A/A burn-down #20749 .
pm:blocked: export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346 , [Direction · v18] Retire the flat object/filter data-binding family — dataSource as the single data-binding door (re-anchor of the deleted #6590 tracker) #11509 , print page ④ of #8346: a record-page "generate PDF" action that calls the render service and attaches the archived PDF to the record #22270 , refactor(plugin-security,platform-objects,spec): retire the catalog seeders, the per-organization catalog machinery and the four catalog objects; Setup creation is an environment write under single and refused under a wall (ADR-0131 D2/D3/D5/D13) #15204 , feat(spec,drivers,objectql,plugin-security): organization_id NOT NULL per cleared table; one predicate for Layer 0 and every driver; both orWhereNull arms, the __global__ sentinel and the #13491 ledger retire (ADR-0131 D1/D8/D9) — protocol 18 #15212 , feat(spec,objectql,cli): the template install mode — a package copied once into the environment ledger, fully editable, refused on shared-database multi-tenant postures (ADR-0131 D6) #15213 .
pm:on-hold: currency: no exchange-rate / home-currency conversion — dynamic multi-currency amounts cannot be reconciled or aggregated across currencies #8345 , paused on the maintainer's word (6051408208).
pm:awaiting-maintainer: design(v18): the complete guest model in one ADR — identity, doors, grants channel, organization, public-site binding, disclosure, rate limits, and each declared guest key's fate (ADR-0090 D9 enforce-or-remove) #22146 .
In flight under other seats: feat(spec,services): deployment-level state has no organization column — settings global rung, plumbing objects, the audit ledger, #12699 made total (ADR-0131 D7) #15207 , spec(v18): move PROTOCOL_VERSION 17 → 18 in an ordinary pull request with full CI: regenerate spec-changes.json and the 17 → 18 upgrade-guide section, rewrite the in-repo ^17 handshakes, and give the lockstep test one pre-mode exception (#22085 Q1) #22130 , finding(lint): a select option's visibleWhen reading parent passes os build and the object save door, and the server's option gate then faults open ("allowed through; the option's gate was NOT enforced") #22157 (os-litant); lint: five os lint --strict blind spots measured against firing controls — aliased ctx.api in hook handlers, action-body free identifiers, unbound visibility roots, lookup-bound detail grants, empty record:details sections #22212 , import: createMissingOptions keeps an unmatched select value through coercion, then the engine's option check refuses it anyway — the setting has no effect on a writable field #22183 , spec: defineSeed accepts a misspelled record key at compile time and os validate passes it, although its JSDoc promises "typos in record field names are caught at compile time" #22149 (os-sales).
pm:epic: spec: a shared picklist (global value set) metadata kind — option lists reused across objects and packages are TypeScript constants today #18164 .
Half-state seen: One artifact, N packages: let a release bundle carry co-owning packages so a product can be split into modules without renaming objects #14122 (p2) carries domain:spec and no pm state label. Triage's to place.
③ Hot-file serial queue
⛔ Re-derive this from the live Claim: comments and each open PR's file list before every dispatch.
④ Notes
Publication: objectstack. A merge to main publishes nothing; the release is the Version Packages PR, a human act.
Write channel: the fleet-write relay (route dispatch), read back on every write.
PR subscriptions: none held. All of this shift's PRs merged, and each subscription closed at its merge.
Lessons recorded this shift, all on their cards:
Fetch a branch into an explicit remote-tracking ref before git merge-tree; FETCH_HEAD after a two-ref fetch is main.
A PR made ready before a merge round must go back to draft, because a review record covers only the head it read.
Have devs run the artifact-roster block and full package suites, not targeted files. Two CI reds this shift were count pins outside the targeted files.
① Current PM
🟢
os-justin, sessionsession_01RPo7FUd6bSnAfkWMAKi848. Re-seated 2026-10-08T13:42Z on the maintainer's word in this session's chat: 「你不用下班,周流量还剩 9%,可以再处理3个任务。」 (corrected from 「95」 in the same minute). This revokes the sign-off brief6058760197(same session, nothing changed hands in between). First seated 2026-10-07T15:00Z.batch 1: one subagent in flight at a time (dev, review and census each count). This is the maintainer's last explicit concurrency term, 「当前任务处理完,合并后并发改为1」..claude/skills/pm-dispatch/references/lanes/spec.md..changeset/pre.jsonis present onmain(next), so a breaking change ismajor. docs(pm-dispatch): a card that narrows a published accept set is Clause-② no, stays in its lane and owes one contract-review-tier review before the queue #22223's rule applies: a card that only narrows isClause-②: no, and still owes a contract review before the queue.os-samis still on this post. The sign-off's unassign was refused by the relay (run37769625000), and it is left for the maintainer.② Ledger
Landed this shift: 11 cards closed, plus five partial landings.
{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 pass 1, PR feat(spec)!: flow value slots refuse the{…}template dialect, naming the CEL spelling of each token (#19939, C half) #22259 →0e9e7b7066(6058684331). Released topm:queuewith the kept half ({$User.*}premise-bound ruling, then the date macros after formula: CEL has no string form for a Timestamp (string(today())has no overload), so #19939 cannot refuse{NOW()}/{TODAY() ± N}in flow value slots — the sub-card #11182's ruling D names #22277).pagegains an optionalprintdeclaration, a linted printable-block subset, the list-export retirement sentence made true, and the three zero-reader document schemas retired #22158, PR feat(spec)!: a page gains an optional print declaration and a linted printable block subset; the zero-reader document schemas retire whole (#22158) #22193 →326a90a4a3(6058198073). This is ① of export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346.3b493184e1(6054530879).sharing.publicLinkreads as the "Generated public share URL" but is only a slug — the authored path (/forms/contact-us) answers 404, and the real anonymous URL (/_console/f/<slug>) is shown to the author nowhere #22079, PR fix(spec): the sharing.publicLink describe says the value is a slug and names where it is served #22159 →d7c5c332b3(6052412835).aa9447c70b(6052663932). Pass 4 has since landed under another seat (73a0a6bf1).8f2e808117(6051690870).then/otherwisepredicate is never validated, soos buildpasses and the object save door stores a predicate the top-level rule would refuse #22042, PR fix(lint)!: a conditional validation rule's nested then / otherwise predicate meets the build's expression verdict, at os build and the object save door (#22042) #22127 →8fc50b7647(6050263684).title/messageis told to write'{{record.name}}', the spelling the build'sflow-double-brace-interpolationrule then flags on the same node and the notify renderer does not resolve #22081, PR fix(spec): a notify title / message refusal prescribes the single-brace{record.name}its renderer reads #22124 →15ec50e528(6048918984).cdeabec848(6048807445).relationship/master-detail-requiredfrom warning to error, scoped tocontrolled_by_parent— ruled for the v18 boundary (Direction 1 of #8772) #9139, PR feat(lint)!: relationship/master-detail-required refuses the three unsafe master-reference shapes at error on a controlled_by_parent object #22109 →ace0a53852(6044183998).db4c45b8c3(6045851301).scriptnode's undeclared config key passesobjectstack validate,compileandregisterFlow, then fails every run — the key half of #21898's class (subflowby reading) #21982 (PR feat(spec)!: the build doors refuse an undeclared key on a script / subflow node config, with its location #22129), spec: author-visible describe/refusal strings carry internal references (II18nService.getDefaultLocale(), a ruling date, manifest.id, com.steedos.crm) #22093 (PR fix(spec): author-facing describes and refusals drop service-interface names, ruling dates and foreign example ids #22125) and finding(lint): the object save door gives no build verdict on validation conditions, field-rule slots (requiredWhen etc.), option visibleWhen or action predicates; os build refuses them, a metadata save stores them (#22019's sibling) #22032 pass 2 (PR fix(lint)!: the object save door gives the build's field-rule-slot verdict (#22032 pass 2) #22117). The remainders are named on each card.Filed this shift: #22111, #22116, #22118, #22128, #22141, #22157, #22158, #22188, #22260, #22269, #22270, #22271, #22277, objectstack-ai/objectui#11880 and objectstack-ai/objectui#11958.
Splits and placements made by this seat:
pagegains an optionalprintdeclaration, a linted printable-block subset, the list-export retirement sentence made true, and the three zero-reader document schemas retired #22158 (landed), ② print page ② of objectstack#8346: render a page that declaresprint— the print CSS mapping, the 13 printable blocks on paper, and the record page's "print" action (browser print preview) objectui#11958 (pm:on-holduntil an installable@objectstack/specexportsPagePrintSchema), ③ print page ③ of #8346: a render service with one headless-Chromium driver renders a print page under the requesting user's principal and archives the PDF as a sys_file (M2) #22269 (domain:services,pm:queue), ④ print page ④ of #8346: a record-page "generate PDF" action that calls the render service and attaches the archived PDF to the record #22270 (pm:blockedon print page ③ of #8346: a render service with one headless-Chromium driver renders a print page under the requesting user's principal and archives the PDF as a sys_file (M2) #22269) and the skill card skills: the Studio author's page skill learns the print page (page.print, the printable block subset, its lint) now that #22158 has landed — #8346 ruling B′ #22271 (domain:skills, Tier H). The parent ispm:blockedon all four (6058277685).object/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509 (ruled A-narrow):pm:blockedon page elements bind data through the node-level dataSource only: the repeater reads it, record_picker and number drop their flat-key fallbacks, the designer writes it (objectui half of objectstack#11509, ruled A-narrow) objectui#11880. When that closes, the next gate is the console pin covering it, then the spec retirement.Open items, named for the successor (each carried on its card; ⛔ none claimed):
6053978836③ escalated an org-axis case. The credential carry-forward's active fallback, for an org-scoped save over an env-wide active row, may drop a stored credential. It is pre-existing and read in source only. If the credential drops, file it as class (a) with [security] GET /api/v1/meta/datasources still serves stored cleartext credentials — the metadata read path has no per-type redaction hook #8154 and finding(metadata-protocol): a second package-less draft save of a package-owned item is refused 409 METADATA_CONFLICT with no If-Match — the save door's head read and the repository's draft package inheritance read different rows #22128 as history.{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939's refused spellings (71 sites; 20 more after the kept half). This needs a seat that can reachobjectstack-ai/hotcrm.domain:skillslane:.claude/skills/spec-property-retirement/SKILL.md:291("@objectstack/specusesminor, nevermajor") predates pre mode; it should sayminorapplies only whilecheck-changeset-no-majorrefusesmajor.scripts/check-changeset-no-major.mjs's LEVEL AXIS prose still says "shipsminor" during the launch window. It is informational.Both come from PR feat(spec)!: a page gains an optional print declaration and a linted printable block subset; the zero-reader document schemas retire whole (#22158) #22193's review
6057753718.{{ }}delimiter instead of single-brace{token}(notify title/message and the other flow string slots), converting only what renders the same #22110 (the text-slot half of the{var}dialect) is no longer serial-blocked: [v18] retire the{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 pass 1 has landed.Stale relay requests: runs
37642366763(#8346) and37642386458(#9139, closed), from the 2026-10-07 15:06–15:20Z incident, still readqueuedat this sign-off.+pm:dispatched,-pm:queueandassign os-justinon its card. export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346 is nowpm:blocked, so that would be a half-state.completed.Lane at sign-off:
pm:queue: [v18] retire the{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 (p2, its kept half), build: ascriptnode's undeclared config key passesobjectstack validate,compileandregisterFlow, then fails every run — the key half of #21898's class (subflowby reading) #21982 (p2, remainder), [v18] flow text slots: read ADR-0032 §3's{{ }}delimiter instead of single-brace{token}(notify title/message and the other flow string slots), converting only what renders the same #22110 (p2), and p3: spec: author-visible describe/refusal strings carry internal references (II18nService.getDefaultLocale(), a ruling date, manifest.id, com.steedos.crm) #22093, skills: the published lint-rules table saysrelationship/master-detail-requiredis awarning, which PR #22109 makes false on acontrolled_by_parentobject #22111, [maintainer] validate: thefield-no-consumerswarning is one 856-character line, printed by validate, build and dev alike — one-line verdict +rule:id + a pointer to the full reasoning (os explain, which today takes only schema names) #22161, metadata-protocol/spec: the_draftsheader carries no label, so a draft-only item can only be shown by its machine name (ListDraftsResponseSchema drops the label the repository already reads) #22200, plugin-approvals: sys_approval_request's 8 actionvisiblepredicates readrecord.viewer, a block the service attaches on read, and the shared expression validator refuses all 8 as an undeclared field #22211, [finding] the@objectstack/honocatch-all's409 METADATA_CONFLICTnames the current version only in prose: measure whether the hosted runtime'sPUT /metareaches it, and if so carrycurrentVersionas data (apackages/specchange) #22222, spec(data): a date or datetime field declares its deadline semantic —dueLikewithsettledWhen(per-record CEL), so overdue wording and colour derive from one declaration and the name-pattern guess retires (objectui#11815 ruled D) #22227, spec(ui): field-level conditionalFormatting — a field declares[{ condition, style }]cell rules (CEL overvalueandrecord), the row block's own grammar, for presentational rules that carry no semantic (maintainer-directed) #22228, runtime strings in thedomain:specpackages carry tracker numbers (spec175 andlint83 messages): this lane's share of the #20513 A/A burn-down #20749.pm:blocked: export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346, [Direction · v18] Retire the flatobject/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509, print page ④ of #8346: a record-page "generate PDF" action that calls the render service and attaches the archived PDF to the record #22270, refactor(plugin-security,platform-objects,spec): retire the catalog seeders, the per-organization catalog machinery and the four catalog objects; Setup creation is an environment write undersingleand refused under a wall (ADR-0131 D2/D3/D5/D13) #15204, feat(spec,drivers,objectql,plugin-security):organization_idNOT NULL per cleared table; one predicate for Layer 0 and every driver; bothorWhereNullarms, the__global__sentinel and the #13491 ledger retire (ADR-0131 D1/D8/D9) — protocol 18 #15212, feat(spec,objectql,cli): the template install mode — a package copied once into the environment ledger, fully editable, refused on shared-database multi-tenant postures (ADR-0131 D6) #15213.pm:on-hold: currency: no exchange-rate / home-currency conversion — dynamic multi-currency amounts cannot be reconciled or aggregated across currencies #8345, paused on the maintainer's word (6051408208).pm:awaiting-maintainer: design(v18): the complete guest model in one ADR — identity, doors, grants channel, organization, public-site binding, disclosure, rate limits, and each declared guest key's fate (ADR-0090 D9 enforce-or-remove) #22146.visibleWhenreadingparentpassesos buildand the object save door, and the server's option gate then faults open ("allowed through; the option's gate was NOT enforced") #22157 (os-litant); lint: fiveos lint --strictblind spots measured against firing controls — aliasedctx.apiin hook handlers, action-body free identifiers, unbound visibility roots, lookup-bound detail grants, empty record:details sections #22212, import:createMissingOptionskeeps an unmatched select value through coercion, then the engine's option check refuses it anyway — the setting has no effect on a writable field #22183, spec:defineSeedaccepts a misspelled record key at compile time andos validatepasses it, although its JSDoc promises "typos in record field names are caught at compile time" #22149 (os-sales).pm:epic: spec: a shared picklist (global value set) metadata kind — option lists reused across objects and packages are TypeScript constants today #18164.domain:specand no pm state label. Triage's to place.③ Hot-file serial queue
⛔ Re-derive this from the live
Claim:comments and each open PR's file list before every dispatch.packages/services/service-automation/src/builtin/template.ts: [v18] flow text slots: read ADR-0032 §3's{{ }}delimiter instead of single-brace{token}(notify title/message and the other flow string slots), converting only what renders the same #22110 (text slots) and [v18] retire the{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939's kept half both touch it, one at a time.packages/lint/src/validate-expressions.ts: finding(lint): a select option'svisibleWhenreadingparentpassesos buildand the object save door, and the server's option gate then faults open ("allowed through; the option's gate was NOT enforced") #22157 (in flight,os-litant) holds the option loop.packages/spec/src/migrations/registry.tsstep-18 chain: the next PR takes the next free order and mergesmain. [v18] retire the{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939 pass 1 holds rationale order 88.content/docs/references/**ismerge=os-regen: usebash scripts/pm/os-regen-merge.sh.④ Notes
mainpublishes nothing; the release is the Version Packages PR, a human act.fleet-writerelay (routedispatch), read back on every write.git merge-tree;FETCH_HEADafter a two-ref fetch ismain.