core: add portable schema generation - #189
Conversation
Deploying ystack with
|
| Latest commit: |
87daa48
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://0724a1af.fabrica-6yx.pages.dev |
| Branch Preview URL: | https://codex-portable-core-schema.fabrica-6yx.pages.dev |
Codex reviewer (cross-vendor, read-only)Reviewed-head: 2c12633 Posted verbatim by The schema accepts malformed identity and reference strings with trailing newlines, violating its fail-closed contract. The private activation guard can also miss plausibly named public callers. Full review comments:
|
Codex reviewer (cross-vendor, read-only)Reviewed-head: eb93e13 Posted verbatim by The schema implementation is otherwise internally consistent, but its private-activation guard can miss both alternate jq imports and activation surfaces outside its fixed directory list. That undermines a required safety gate for subsequent construction changes. Full review comments:
|
Codex reviewer (cross-vendor, read-only)Reviewed-head: ae877c4 Posted verbatim by The schema accepts numeric encodings that the contract explicitly rejects, and its activation guard misses valid jq loading syntax. Both weaken fail-closed guarantees central to this change. Full review comments:
|
Review response — exact head
|
Codex reviewer (cross-vendor, read-only)Reviewed-head: 350483f Posted verbatim by The schema accepts malformed newline-terminated primitive values despite its exact-format contract. Its import-free CI guard also has a concrete syntax bypass. Full review comments:
|
Review response — exact head
|
Codex reviewer (cross-vendor, read-only)Reviewed-head: 87daa48 Posted verbatim by The schema implementation matches the accepted contract’s primitives, shared references, policy mappings, generation registry, and inactive-generation constraints. The added tests provide focused boundary, routing, registry, and activation-guard coverage without changing live behavior. |
Tracks #155
Concern
Add the first inactive member of the portable core generation: shared schema limits, primitives, references, envelope rules, and the one role/capability/permission/evidence policy table.
Construction mode authorizes this Roadmap unit. It starts from exact base
38a26f5f046897c0455fef24874c5dbb40c20926and produces exact head87daa48d08e6d9ac21a356bd9c4ab0350da91e86.Generation:
g-14b7ad8ce54c3b8c585ff92063d71551ffc7394cc2294d0297bc7d2b8da2c386Design input spec blob:
c6511d96c1a5e6aed27ba2075b5add65c121f782The registry entry records that spec blob and construction authorization commit
38a26f5f046897c0455fef24874c5dbb40c20926in the existingparent_plan_merge_commitfield.Files
modules/schema.jq.ci/required-files.txt.No workflow, trust root, accepted artifact, public wrapper, public generation root, manager/template, install path, live caller, frozen plan, or PR #183 state changes.
Proof on exact head
git diff --check: clean.The diff is larger than the soft line signal because it keeps the 52 frozen migration rows as readable data and provides direct proof for every owned rule and bound. Product code is 377 lines; the remaining lines are literal fixtures, ledger mapping, pinned-tool proof, and restore entries. It remains one implementation concern.
Numeric layer boundary
jq 1.6 discards an integral float's spelling when it parses
1.0, soschema.jqcannot honestly recover that lexeme. The raw canonical-byte gate rejects1.0,1e0, integer fields written as1.0, andschema_version:1.0because jq's canonical bytes differ. Parsed schema rejects non-integral numbers, out-of-domain values, and jq-preserved-0. The tests prove both layers without assigning lexical parsing to the schema module.Inactivity
The generation is incomplete and private. There is no
scripts/core-contract.sh, no generationcontracts.jq, no non-test loader, no live profile or target, and no release, install, deployment, credential, or external action.