Repository navigation
Description
Found working the #3909 G8 checklist on main @ a1a855a28 (the rc.3 train tip).
#4509 closed the door on runtime-created jobs by setting registry flags:
// packages/spec/src/kernel/metadata-plugin.zod.ts:658
{ type: 'job', label: 'Background Job', …, supportsOverlay: false,
allowOrgOverride: false, allowRuntimeCreate: false, … }and its changeset states the intent unambiguously:
allowRuntimeCreate: false— no "create job" in Studio or viaPUT /meta.allowOrgOverride: false— no per-org job fork…
PUT /meta still creates one.
PUT /api/v1/meta/job/rc3_runtime_job
{"name":"rc3_runtime_job","label":"J",
"schedule":{"type":"cron","expression":"0 0 * * *"},"handler":"nope"}
→ 200 {"success":true,"message":"Saved customization overlay (env-wide) — type=job, name=rc3_runtime_job"}
GET /api/v1/meta/job
→ listed, with handler "nope"
handler: "nope" names no function in any compiled bundle — precisely the record #4509 argues can never be scheduled, saved and reported as success.
Not job-specific — the gate looks unenforced generally
agent is the only other type carrying allowRuntimeCreate: false. It behaves the same:
PUT /api/v1/meta/agent/rc3_agent_probe {"name":…,"label":"A","role":"assistant","instructions":"be helpful"}
→ 200 {"success":true,"message":"Saved customization overlay (env-wide) — type=agent, …}
So both flagged types accept a runtime create. A minimal-payload PUT to object / flow / job all return 422, which is schema validation firing first — that is what makes this easy to miss: the gate never runs, and only a payload that passes the schema reveals it.
supportsOverlay: false appears equally unenforced — the success message calls the row a "customization overlay" for a type declared not to support them.
Why it matters
This is the failure mode ADR-0049 exists to prevent, one level up: the enforcement flag itself is the silently-inert declaration. A reader of the registry (or of the #4509 changeset, or of the release notes) concludes Studio and PUT /meta refuse these types. Studio presumably reads allowRuntimeCreate to decide whether to show "create", so the UI honours it while the API underneath does not — the "UI-hidden but server-open" shape ADR-0066 D4 calls out for actions.
Expected
The metadata write path consults the registry's allowRuntimeCreate (and supportsOverlay / allowOrgOverride) before persisting, and refuses with a catalogued code naming the type and why it is code-only — the same shape the retired-key refusals in this same wave produce. A regression test per flagged type would pin it, since the flags are data and new types will keep arriving.
Found during the #3909 rc.3 verification (G8).
Activity
baozhoutao commentedon Aug 4, 2026
Found during the v17 verification tracked in #3909 (section G8).
baozhoutao commentedon Aug 4, 2026
Rolled up in #5145 (the rc.2/rc.3 verification rollup — supersedes the closed #4482).
os-zhuang commentedon Aug 4, 2026
认领:PM 循环第 4 轮(串行解除:#4754→PR #5252 已合入,runtime/protocol 面空闲)
会话:
session_01Pbu27iNUfQCHeuS551Rqo7分支:
claude/issue-5086-allow-runtime-create-enforcedWorktree:
objectstack-issue-5086域:
domain:engine文件面:元数据写路径的注册表咨询门(预计
packages/metadata-protocol/src/protocol.ts的 saveMetaItem/overlay 写入路径,或packages/runtime/src/domains/meta.ts—— 以代码证据定落点)、按类型的回归测试、changeset(越界即停,报告说明)约束:⛔
packages/spec/**零改动 —— 注册表标志(allowRuntimeCreate/supportsOverlay/allowOrgOverride)是读取对象,不改声明;⛔ 不碰seed-loader.ts;⛔ 不碰 #5079 的枚举失效面(同 protocol 区域,下一单串行)。拒绝须带 catalogued 错误码点名类型与原因(同波退役键拒绝的形状)。在飞不相交已核:#5038、#5170(core)、#5208-sync(spec/lint)与本面不交。Generated by Claude Code
os-zhuang commentedon Aug 4, 2026
验收:ACCEPT —— PR #5263(转 ready + auto-merge;报告称远端 CI 已 22 项绿)
会话:
session_01Pbu27iNUfQCHeuS551Rqo7(PM 循环第 4 轮)根因修正了 issue 的预判:不是「没有门」,是 ADR-0005 两级授权块整体挂在
if (this.environmentId !== undefined)里 —— 而environmentId是行作用域键、不是授权信号;showcase 的 host-config 拓扑无 environmentId 启动,门于是全程关闭,job/agent落到唯一无仓库门的 legacy raw-engine 分支。修法把 code-only 判定(allowRuntimeCreate: false且allowOrgOverride: false)提出该条件,持久化前拒绝,cataloguedNOT_CREATABLE/NOT_OVERRIDABLE403 点名类型、标志、filePatterns处方与OS_METADATA_WRITABLE逃生口。supportsOverlay刻意不强制,证据成立:spec 自己的 TSDoc 把写门指派给allowOrgOverride、把supportsOverlay标为 loader 能力,且object/flow/action/seed/hook全部声明supportsOverlay: false却是设计上可写的 —— 强制它等于全部误拒。按「不造假门」指令正确处理,其措辞侧问题(成功回执把新建也叫 overlay)另立 #5265。实况核验:22 例数据驱动测试(挂在
DEFAULT_METADATA_TYPE_REGISTRY上,未来新增旗标类型无探针即红)、去修复后 10 例红 ✓ / 真实 showcase boot 用 issue 原始载荷实测:job/agent PUT → 403 NOT_CREATABLE,对照 view PUT → 200,GET 只剩 artifact 项 ✓ / metadata-protocol 370 + objectql 1840 + rest 608 + runtime 1313 绿 ✓ / spec 零改动、deleteMetaItem与单内核 carve-out 未动且理由在 PR ✓。顺带发现:#5264(门落地后 legacy 分支不可达但注释仍称必要 —— 误导形状)、#5265(回执措辞)均
finding留分诊轮。Generated by Claude Code
fix(metadata-protocol): enforce allowRuntimeCreate on every kernel — …
feat(spec): `api` 补进 DEFAULT_METADATA_TYPE_REGISTRY 与 BUILTIN_METADAT…
refactor(metadata-protocol): remove the unreachable legacy raw-engine…
fix(spec,rest): OVERLAY_PERSISTENCE_FAILED leaves the error-code ledg…
fix(metadata-protocol): the destructive gate's reachable type set is …
docs(permissions): add a page for DECLARING capabilities (objectstack…
fix(metadata-protocol): the destructive gate's reachable type set is …
fix(metadata-protocol,metadata): every runtime write door refuses a b…
fix(metadata-protocol)!: the save door refuses every hook with no `bo…
fix(metadata-protocol)!: the ADR-0010 _lock gate refuses on a host-co…
test(spec): kernel test titles state each cited decision in words ins…
fix(metadata-protocol)!: the metadata door refuses an edit of a code-…