Preserve extension names in module preflight

This commit is contained in:
2026-07-26 18:06:43 +03:00
parent ad4bd3ec72
commit 00040e5ce4
7 changed files with 440 additions and 17 deletions
+12 -8
View File
@@ -777,14 +777,18 @@ which save-layer table is used by the copy plan and saved-state write smokes.
Add `-RequireSelectorChainWritePlanComposition` when the selected base/object
must have a saved-state stream that lets the selector-chain smoke compose a
concrete read-only `metadata.write.plan`. The same strict mode also requires
the write-preflight smoke to discover an extension form by public
`extension/ref/form/member` names, compose an allowed plan, and prove that the
repository and support gates use the same resolved `extension:<GUID>` layer.
It then submits the same public selector with a deliberately different GUID
and requires a read-only `blocked / extension_selector_conflict` result, so a
legacy permissive repository profile cannot authorize a mismatched layer.
Run that check directly with
`scripts/smoke_1c_write_preflight.py --require-name-first-extension-form`.
the write-preflight smoke to discover both an extension form and an extension
module by public names (`extension/ref/form/member` and
`extension/ref/form/module/stream_ordinal`), compose allowed plans, and prove
that the repository and support gates use the same resolved
`extension:<GUID>` layer. Module search restores the public extension name from
`ConfigCASSave`; it never returns the storage GUID as the caller-facing
selector. The smoke then submits each public selector with a deliberately
different GUID and requires a read-only
`blocked / extension_selector_conflict` result, so a legacy permissive
repository profile cannot authorize a mismatched layer. Run both checks
directly with
`scripts/smoke_1c_write_preflight.py --require-name-first-extension-form --require-name-first-extension-module`.
To exercise the MCP proxy itself, switch transport and URL: