Repository navigation
Closed
Labels
domain:specDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2High: required for production / M2tests
Description
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Filing gate: ③ a task on the maintainer's word: 「该补审核的都要补」 (2026-11-08, triage's session), after the Fable review of #31424 found that #31334 (routed by triage to domain:devx) landed a packages/spec hunk as PR #31358 with no spec seat review. ⛔ Not a claim.
维护者速读
- 问题: 规则规定「触
packages/spec的卡一律归 spec 席」(lanes/server.mdL6;lanes/spec.mdL9、L12),但实际执行中,server、skills、devx、ui、cloud 车道的 PR 常常顺手改 spec,没有经过 spec 席。 - 查了什么: 11-06 以来合入 main、改动
packages/spec/src的 PR 共 56 个,其中 29 个的卡不在 spec 车道,而且 PR 和卡上都没有 spec 席的记录。另有 1 个(PR feat(spec): RestrictionProfileSchema, the closed shape of what a target environment does not let metadata do #31191)有 spec 席记录,已排除。 - 为什么是 p1: 这些协议改动已在 main 上,下次发版就会发布(「发版本优先的都p1」)。
- 要做的: spec 席逐个补审每个 PR 的 spec 改动部分。没问题的写一行「审过」;有问题的立修复卡。
- 根因不在本卡: 红线没有机械执行,分诊在定车道时也没有执行它。这一点已记在 [Decision] Keep
domain:devxanddomain:serveras separate lanes, or merge them? Measured load and boundary friction, 2026-11-08 #31424 的修正第 2 条下。
The list (spec hunk size from git show --numstat, packages/spec/src only)
Tier A, shape or contract changes (review first):
- PR feat(spec,driver-sql,service-datasource): Oracle Database as a federation dialect — read live, write behind both opt-ins, never managed #31351 (driver-sql: Oracle as a federation dialect — an external datasource over Oracle Database reads (and, double opt-in, writes) live, with type-compat and the predicate emitters modelling oracle #31328, Oracle federation): 7 files +629 −15,
data/datasource,data/config-registry - PR feat(spec,security): a controlled_by_parent object may declare an optional master #30940 (controlled_by_parent admits an optional master (1/3): spec, lint and the read owner branch: a null-master detail row is readable by its owner only #30905, controlled_by_parent optional master): 12 files +524 −128,
conversions/*,data/* - PR feat(spec): a field group's requiresFeature hides the group where a deployment feature is off; Edit organization hides Parent Organization and Sort Order on one organization #30810 (Edit organization: hide Parent Organization and Sort Order on a single-organization deployment with a field-group requiresFeature #30692, field group
requiresFeature): 5 files +232 −31,data/object.zod.ts,data/object.form.ts - PR feat(spec): a map settings specifier; the lifecycle retention overrides and quotas use it #31386 (Setup: replace developer wording and hand-written JSON with fields a business administrator can use #30208,
mapsettings specifier): 2 files +175 −3,system/settings-manifest.zod.ts - PR feat(service-push)!: push sends through the hosted push relay, authenticated by the server's cloud binding #30749 (service-push: send through the hosted relay transport (push-relay.zod.ts wire, cloud binding credential) #29920, hosted push relay): 8 files +151 −48,
api/push-relay.zod.ts,contracts/cloud-binding-service.ts - PR fix(i18n): a Traditional Chinese session reads and edits the Traditional entry of an inline label map #31068 (A Traditional Chinese console reads and writes the Simplified entry of an inline label map #30910, zh-Hant label resolver): 2 files +137 −24,
ui/i18n-label-resolver.ts - PR feat(audit): record the administrator on writes made while impersonating a user #30800 ([Decision] Actions taken while impersonating a user are recorded only under that user #30213, impersonating administrator): 3 files +53 −2,
kernel/execution-context.zod.ts,data/hook.zod.ts - PR feat(objectql): restore a recycle-bin entry under its original ids and emit data.record.restored (#30237 PR 3) #31220 (engine: snapshot deletes into the recycle bin, restore under original ids, purge, and the TTL reap (#3146 slice 3) #30237, recycle-bin restore): 7 files +50 −24,
api/events.zod.ts, error-code ledger - PR feat(messaging): store a push device's origin at registration and carry it in every push to the device #30705 (notifications: store the push device's origin on sys_user_device and copy it into push data (ruling B on #29642, server half) #29768, push device origin): 4 files +39 −17,
system/push-device.zod.ts,api/protocol.zod.ts
Tier B, ledger, registry and contract-doc entries:
- PR feat(objectql,spec): purge and empty the recycle bin, and delete a record for good (ADR-0148) #30990 (engine: snapshot deletes into the recycle bin, restore under original ids, purge, and the TTL reap (#3146 slice 3) #30237): 3 files +39 −5,
data/data-engine.zod.ts,data/hook-api.ts - PR feat(mcp)!: delete_record refuses a call without confirm: true #30861 (MCP delete_record refuses a call without confirm: true (ACTION_CONFIRMATION_REQUIRED), the run_action confirmation gate widened to deletes #30813): 3 files +50 −6, error-code ledger,
contracts/ai-service.ts - PR feat(mcp): delete_records deletes many records of one object in one confirmed call #31024 (MCP: delete records by filter in one confirmed call, with refusals grouped by reason, instead of one delete_record per row #30891): 2 files +24 −10, error-code ledger,
contracts/ai-service.ts - PR fix(audit): name the impersonating administrator on identity writes and on an approval decided while impersonating #30874 (Impersonation attribution follow-ups after #30213: plugin-auth identity writes and the approval resume decider segment #30851): 1 file +23 −3,
contracts/automation-service.ts - PR feat(objectql,plugin-sharing): an organization authors its own assignment rules as sys_assignment_rule records #30760 ([Decision] Can an organization author its own assignment rules, or do they stay package-declared only? #30066): 3 files +18 −6,
automation/assignment-rule.zod.ts,kernel/metadata-plugin.zod.ts - PR fix(service-storage): a member attaches a file from the browser again — the upload's own completion attaches it as them, after #31031 #31072 (no card): 1 file +18 −1,
api/storage.zod.ts - PR fix(mcp, runtime)!: MCP describe_object answers the same field-masked object schema the /meta door answers (ADR-0106) #31042 (no card): 1 file +16, error-code ledger
- PR feat(cloud-connection)!: refuse a managed upgrade that renames or retypes a stored field until it is declared or confirmed #31243 (Package upgrade plan: one framework comparison of installed vs new version (fields, types, renames, seeds) as a dry run; declared
renamedFromis planned, an undeclared rename or type change is refused unless confirmed (epic cloud#3652 Q3) #30884): 1 file +14, error-code ledger - PR feat(metadata-protocol, cloud-connection): an unmanaged install can take a target namespace #30997 (An unmanaged install can take a target namespace: the copy is re-namespaced at install through the duplicate-package rename engine #30794): 1 file +12 −1,
api/package-lifecycle.zod.ts - PR fix(cloud-connection): name the cloud-binding service in its contract, and read an empty controlPlaneUrl one way #30956 (cloud-binding: name the service in its spec contract, and give controlPlaneUrl one reading of an empty option (follow-up to #29920) #30762): 1 file +10 −1,
contracts/cloud-binding-service.ts - PR feat(rest)!: serve ?names= on the /meta/:type list and close its query set #30709 (Metadata API: no batch by-names read, so the Console roster gate costs one /meta/object request per name #29236): 2 files +8 −16,
api/protocol.zod.ts - PR feat(objectql,platform-objects): keep a by-id delete's rows in the recycle bin (ADR-0148) #30780 (engine: snapshot deletes into the recycle bin, restore under original ids, purge, and the TTL reap (#3146 slice 3) #30237): 2 files +5 −4,
data/recycle-bin.zod.ts, platform object names - PR feat(spec,i18n): register the delete_package platform tool and label it in every pack (cloud#3656) #31037 (spec: PLATFORM_TOOLS_BY_PACKAGE['service-ai-studio'] lists delete_package, with chatbot.tool.delete_package labels in every ui locale (blocks cloud#3656) #31020): 1 file +5 −1,
system/platform-tool-names.ts - PR feat(rest, client): a tenant-admin REST door for the record-currency code backfill #30809 (rest + sdk: tenant-admin door for the record-currency backfill — a REST twin of
os migrate record-currency-codes, scoped to the caller's organization (multi-currency, epic #8345, ruling C item B) #30675): 1 file +2 −1,api/rest-server.zod.ts - PR fix(metadata-protocol,runtime): a seed row a person deleted is no longer inserted again by the next seed replay (per-organization record of landed seed keys) #31083 (seed loader: a declared seed row a person deleted comes back under a new id at the next seed replay — record landed keys per organization and skip the ones now absent #31021): 1 file +1, platform object names
- PR feat(scripts): codemod-split-protocol --members moves the bodies E1 refuses, unedited, and retires nineteen protocol.ts facade rows #30954 (Facade codemods: retire the codemod-limit exception rows in the facade gate registry (protocol.ts, engine.ts, sql-driver.ts) #30147): 1 test file +3 −1
Tier C, JSDoc examples and describe text only:
- PR docs(spec): guard the nullable amount in the docs examples and the validation condition example #31358 (docs: nullable
record.amountcompared unguarded in gated positions on nine more docs pages and the validation spec example (after #31206) #31334):data/validation.zod.ts+3 −3, plus the regenerated reference. This is triage's routing miss. - PR docs(skills): name ignore as the seed mode default and the minimal-preset job/queue exception; correct three capability comments #31377 (Platform skill and nearby code still misstate the minimal preset, the seed mode default and two capability comments #31299):
kernel/platform-capabilities.ts+8 −8 - PR docs(skills,spec): the fieldPatches example patches options only on a field that declares them, so HotCRM accepts it #30995 (skills+spec: the taught fieldPatches example patches crm_account.industry's options, but HotCRM's industry is picklist-bound, so a copy is refused at install #30944):
data/object.zod.ts+7 −3 - PR docs(skills, spec): guard the nullable amount in the approval-flow and hook-condition examples #31322 (skills + spec: approval-flow edge conditions in state-machines-and-approvals.md and the HookSchema.condition example compare a nullable amount unguarded, which the publish-time null-guard rule refuses #31206):
data/hook.zod.ts+2 −2
How
- One comment per PR, on this card. Format:
Reviewed: PR #N · OKorReviewed: PR #N · issue → #fix-card. - Read each hunk on
main(git show <merge-sha> -- packages/spec/src). Judge it against the spec seat's own rules: the enforce-or-remove rule, the liveness ledger, describe/JSDoc truth,Clause-②narrowing, and the changeset. - Tier A first. The card closes when all 29 lines are posted.
- A defect found is its own card in the owning lane: spec for spec text, otherwise wherever the fix lands.
Related: #31424 (amendment 2), #31334, PR #31358.
Generated by Claude Code
Metadata
Metadata
Assignees
Labels
domain:specDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2High: required for production / M2tests
Activity
objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Claim: PM loop round 5 · 2026-11-08T09:47Z
Session:
session_017ihL2eAG5J8aqAyPZif4BJ(the seat itself; review-only card, no card thread)Account:
marchtianBranch: none (no code; one
Reviewed:comment per PR on this card)Worktree: the seat's container checkout, read-only on
origin/mainDomain:
domain:specSeat:
domain:spec#4Ruling-ref: the maintainer's 「该补审核的都要补」 as filed by triage on this card
File surface: none written. Read: each listed PR's merge commit,
packages/spec/srchunk only (git show <merge-sha> -- packages/spec/src)Container & model:
M, seat session; Tier A hunks are read by independent Fable sub-agents in batches, and Tier B/C by the seat. A defect becomes its own card in the owning laneClause-②: no — review only, no diff
Metadata-protocol: none
Responsibility: n/a — post-hoc review of merged spec hunks
Thread-read: none
Premise: holds (the 29 PRs are listed with merge state on the card; the seat re-reads each merge commit on
main)Serial constraints cleared: none (read-only; disjoint from #31380 / PR #31456)
objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31351 · OK
nits accepted, no card (an orphan JSDoc block above
managedDriverList()at datasource.zod.ts:603-621;ORACLE_DEFAULT_PORTexported but the factory hard-codes 1521)Evidence:
federationOnlyrow key is read:FEDERATION_ONLY_DRIVER_IDS/isFederationOnlyDriver(main packages/spec/src/data/driver/config-registry.zod.ts:551-573) → managed-oracle and ssl-block refusals at datasource.zod.ts:1044-1059, mirrored by the factory's last door (packages/services/service-datasource/src/default-datasource-driver-factory.ts:867-884). EveryOracleConfigSchemakey is read (factory :850-859: connectString verbatim, else host:port/serviceName, username→user, password = bound secret), matching the oracle.zod.ts header. Type-compatoraclearm is reached:dialectNameis 'oracle' (packages/drivers/driver-sql/src/sql-driver-managed-drift.ts:66), introspection re-attaches NUMBER(p,s)/RAW(n) (sql-driver-oracle-introspection.ts:73-82),typeVocabularypasses it toisCompatible/suggestFieldTypeForSqlType(external-datasource-service.ts:407-411, 949-957, 1339). Changeset: spec minor,Clause-②: yes (widening),Metadata-protocol: added; the type narrowing ofresolveDatabaseDriverId/DATABASE_DRIVER_SELECTION_IDSis declared with its one-line fix. ADR-0015 §4.6/§5.1 carry Oracle (docs/adr/0015-external-datasource-federation.md:412-476). All hunks still on main. Nits (accepted): a dangling JSDoc block sits abovemanagedDriverList()instead offederationOnlyDriverOnManagedRefusal()(datasource.zod.ts:603-621);ORACLE_DEFAULT_PORTis exported but imported nowhere outside oracle.zod.ts — the factory hard-codes 1521 (:854).Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30940 · issue → #31470
the same omitted
requiredon a solemaster_detailis a REQUIRED master throughObjectSchema.create()and an OPTIONAL master through the raw parse /defineStack; the semantic entry and changeset prose name only the first reading [should-fix]Evidence: diff controlled-by-parent-master.ts:881-893 —
controlledByParentMasterOfreadsrequired === false, and the object refinement runs on the parsed map where an omittedrequireddefaults tofalse(object.zod.ts docblock, diff :1170-1175). Pinned by the hunk's own tests:ObjectSchema.safeParseadmits the omission as{field:'order', optional:true}whilecreate()yieldsoptional:false(diff controlled-by-parent-master.test.ts:674-688);defineStackwith an omittedrequirednow returnsrequired: falsewhere it previously threw (main packages/spec/src/conversions/cbp-master-detail-required-defaulted.test.ts:117-129). The runtime acts on that reading: plugin-security opens the owner arm onrel.optional(security-plugin-cbp-relation.ts:170-172, security-plugin-cbp-write-gate.ts:529). The semantic entry says an omittedrequired"keeps meaning required throughObjectSchema.create()and on stored rows" (main migrations/entries/semantic/18.cbp-optional-master-admitted.ts:39-41, 63) and never names thedefineStack/raw-parse door; onlyos lint(relationship/master-detail-required, packages/lint/src/data-model-rules.ts:433) reports it. Otherwise sound:controlledByParentMasterOflive in plugin-security, objectql, lint, cli, verify, ui; spec minor,Clause-②: yes (widening),Metadata-protocol: added; rationale order 119 present.Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30810 · OK
Evidence: main still carries the hunk (object.zod.ts:1322-1349, object.form.ts:120). Enforced: lowered into
visibleWhen, which both renderers evaluate fail-closed withfeaturesin scope (ui/plugin-detail record-details.tsx:252-260; ui/plugin-form fieldGroups.ts:107; ui/react useExpression.ts:50); lint accepts only the lowered gate (packages/lint validate-expressions.ts:1054, :3886); consumer sys-organization.object.ts:352; liveness/object.json:113 books it. Widening declaredClause-②: yes,Metadata-protocol: added, specminor. Describe/JSDoc match consumers;RequiresFeatureSlotexport is the exported function's parameter type.Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31386 · OK
Evidence:
keyColumn/columns[](settings-manifest.zod.ts:608-611, map refusal :683-689) are read on main since PR #31451 (merged 09:22Z, same row #30208/#31391): ui/apps/console/src/pages/settings/SettingsMapField.tsx:297pickLocalized(spec.keyColumn?.label, …)and the column headers; pinned by SettingsView.mapRows-31391.test.tsx. Server side readstype,columns[].name,columns[].kind(service-settings map-shape.ts:44-53). options-fallback/any-key sentence (:605) matches settings-service.ts:1383-1388, :1983-1984, :2010-2016; LIFECYCLE_DURATION_REGEX object.zod.ts:881 matches "h/d/w/y". specminor,Clause-②: yes (widening),Metadata-protocol: added. Nit (accepted, house precedent :646/:657/:667): refusingkeyColumn/columnson non-map types (:711-716) narrows what the non-strict object (:434) used to strip. The headers' translation is #31453.Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30749 · OK
nit as merged (the
controlPlaneUrl()JSDoc named only the declined spellings for'', and'cloud-binding'was spelled in two packages); both already fixed onmainby #30956Evidence: main contract cloud-binding-service.ts:40-54 now carries the blank-value sentence and
CLOUD_BINDING_SERVICE, read by cloud-connection-plugin.ts:329 and service-push relay.ts:10. Strictdatadrops no refinement: PushDeliveryDataSchema is a plainz.object(push-delivery.zod.ts:100-116); relay.ts:130 parsesPushRelayRequestSchemabefore send, :175 readsretryable; rate-limitretryableliteral true (push-relay.zod.ts:206), quota inherits default false (errors.zod.ts:429). Boot refuses relay only viaisControlPlaneDeclined()(push-plugin.ts:122, capability-arg.ts:71); recipient locale push-channel.ts:6,74; ADR-0012 §6.1 exists. Changeset: specpatchwithMetadata-protocol: none,!, ADR-0087 marker;yes (narrowing)is allowed by lanes/spec.md.Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31068 · OK
nit accepted, no card: the JSDoc at i18n-label-resolver.ts:202 still says "six-limb rule" above a module that now documents a 2–3 script limb; the patch changeset's
Metadata-protocol: noneis arguable (a changed zh-Hant resolution meaning), not re-shippedEvidence: main packages/spec/src/ui/i18n-label-resolver.ts:163
scriptEntryKeyand :278 call site still carried; limb table :43. Same limb in ui/packages/i18n/src/pickLocalized.ts:38-49, both reading platform-locales.ts:77-88 / :129 (onlyzhsplits, ROWS :25-35). Consumers on main: service-analytics dataset-compiler.ts, metadata-protocol protocol-record-reads.ts, cli i18n-coverage.ts, lint i18n-walk.ts. No accept/refuse change;.changeset/30910-spec-label-resolver-script-preference.mdpatch, Clause-② no. Stale prose: i18n-label-resolver.ts:202 "six-limb rule".Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30800 · OK
Evidence:
ExecutionContext.impersonatedByset by core resolve-authz-context.ts:644-673 and assemble-execution-context.ts:364 (never on guest); copied toprovenance.impersonatedByby objectql engine-execution-plumbing.ts:145-151; stamped by plugin-audit audit-writers.ts:2248 / impersonation-attribution.ts:31-34.AutomationContext.impersonatedByset at runtime/domains/automation.ts:237, action-execution.ts:2752, trigger-record-change record-change-trigger.ts:610,813-815; read by service-automation runtime-identity.ts:344-438, cleared on decider hand-off run-resume.ts:356. Describe claimsys_session.impersonated_bymatches spec/contracts/auth-service.ts:467, auth-config.zod.ts:95. All three members optional ⇒ pure widening; changeset spec minor, Clause-② yes (widening), Metadata-protocol added — level follows the kind. "Four marks" prose hook.zod.ts:1381 still true on main.Tier A · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.10 remaining items
objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31243 · OK
Evidence: row in the
@objectstack/cloud-connectionsection (:1387), additive only. Emitted by cloud-connection/src/marketplace-install-local-plugin.ts:594,4212 (409), read by cli/src/commands/package/install.ts:299 as the comment says. specpatch,Clause-②: yes (narrowing)(allowed),Metadata-protocol: none.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30997 · OK
Evidence:
targetNamespaceread at metadata-protocol/src/protocol-package-commits.ts:586 and package-unmanaged-install.ts:507-540; reserved{base, system, sys}refused (:529-534, PLATFORM_RESERVED_NAMESPACES package-namespace-rename.ts:103).sourceNamespaceemitted only when renamed (protocol-package-commits.ts:728-729), matching its describe. specminor,Clause-②: yes (widening),Metadata-protocol: added.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30956 · OK
Evidence: new export
CLOUD_BINDING_SERVICEis live: cloud-connection-plugin.ts:153 (registrar), service-push transports/relay.ts:10 and push-plugin.ts:128 (readers); barrel contracts/index.ts:93. BlankcontrolPlaneUrl→''per cloud-binding.ts:64, matching the widened JSDoc (this also closes PR #30749's JSDoc nit). specpatch,Clause-②: yes (widening),Metadata-protocol: none.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30709 · OK
Evidence: describe-only plus removal of the
[PLANNED]pin.namesis served bymetaListNames(rest/src/meta-item-read-gate.ts:2752-2757, empty → 400) and thepackagelist refuses it (:2723-2730), as the new describe states. specpatch,Metadata-protocol: none.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30780 · OK
Evidence:
sys_recycle_binregistry row backed by platform-objects/src/system/sys-recycle-bin.object.ts (registered, plugin.ts:68), so the rewritten comment in recycle-bin.zod.ts is true. Additive row in the platform-objects section. specminor,Clause-②: yes (widening),Metadata-protocol: added.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30809 · OK
Evidence: describe-only on
metadata.endpoints.maintenance. The route is mounted at rest/src/rest-server-registrar-files.ts:133 and returns early whenmetadata.endpoints.maintenance === false(:143), so the describe is true; route-ledger row rest-route-ledger.ts:229. specpatch,Metadata-protocol: none.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31083 · OK
Evidence:
sys_seed_landed_keyregistry row backed by platform-objects/src/system/sys-seed-landed-key.object.ts (plugin.ts:74), consumed by metadata-protocol/src/seed-loader.ts and runtime/src/app-plugin.ts. Additive row in the platform-objects section. specminor,Clause-②: yes (widening),Metadata-protocol: semantic.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30954 · OK
Evidence: test-only hunk: the absence-walk's
NEW_READERSnames metadata-protocol/src/protocol-write-gates-tables.ts, which exists on main and holds theOVERLAY_ALLOWED_TYPESinitializer (:25-26). No spec contract touched; metadata-protocolpatch,Clause-②: no, correctly no spec entry.Tier B · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31358 · OK
Evidence: describe/JSDoc only; the three examples now carry the
!= nullguard the publish-time null-guard rule demands, and main still carries them (packages/spec/src/data/validation.zod.ts). #31367's later FlowSchema edit (PR #31416) is a different file. specpatch,Clause-②: no,Metadata-protocol: none. (Routing miss is triage's, recorded on #31424.)Tier C · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31377 · OK
Evidence: comment-only.
resolveServedCapabilitiesskips the slate underminimal(core/src/capability-composition.ts:115,130);CAPABILITY_PROVIDERSkeyspackage-registryandmarketplaceat one PackageServicePlugin (core/src/capability-providers.ts:159-174);PLATFORM_CAPABILITY_PROVIDERSmaps it to@objectstack/service-package(platform-capabilities.ts:216). No spec changeset needed for a comment.Tier C · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #30995 · OK
Evidence: description/TSDoc only. Matches the enforcer: metadata-core/src/extension-field-patch-targets.ts:112-123 refuses an option patch on a
picklist-bound field (reason: 'picklist-option'). The example holds against HotCRM (crm_account.typedeclares its own options incl.customer;industryis picklist-bound, src/sales/objects/account.object.ts:300-317). specpatch,Clause-②: no.Tier C · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Reviewed: PR #31322 · OK
Evidence:
HookSchema.condition@exampleand.describe()only; guard added, main still carries both (packages/spec/src/data/hook.zod.ts). No accept set moves. specpatch,Clause-②: no,Metadata-protocol: none.Tier C · read on
origin/main3c38025 by an independent Fable reader, checked by the seat.objectstack-fleet commentedon Nov 8, 2026
domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ
Done · post-hoc spec review of 29 PRs · 2026-11-08T11:02Z
Every PR on this card has one
Reviewed: PR #N · …line above (29 of 29). Tier A (spec contract changes) was read by Fable reviewers againstmainat3c380253e; Tier B and C were read by the seat.Result: 26 OK, 3 with an issue, each filed as its own card.
requiredon the solemaster_detailmeans required throughcreate()but optional through raw parse /defineStack, so plugin-security opens the owner arm on the second door. Should-fix; seat suggests p1.cloud-3656-spec-delete-package-tool-name.mddeclaresClause-②: no/ patch for a widening of the platform tool-name set. Must-fix before the next release.origin; the console sends one that fails the pattern, so registration answers 400.One consumer gap found while reading #31220 (the PR itself is OK): the client's
subscribeDataomitsdata.record.restored→ #31473.Accepted nits (recorded on each PR's line, not filed): #31351, #31068 (a stale "six-limb" JSDoc), #30749 (already fixed on
mainby #30956).Triage owns the levels of #31470–#31473. Closing
completed;pm:dispatchedremoved.