Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion code
Submodule code updated 139 files
4 changes: 2 additions & 2 deletions contracts/code-pin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ leg_role: code
source_repository: opensoft/openDox-code
submodule_path: code

commit: "580f61dff7e6c0235ba1f5681432d10cf2e85fa1"
commit: "ce53b489f8007c37f70da19c90c95ba89156feed"
revision_kind: commit

digest_algorithm: sha256
Expand All @@ -36,7 +36,7 @@ digest_algorithm: sha256
# <oid>`, so a leg's own pin moving is drift too.
digest_definition: sorted-ls-tree-r-v1
digests:
tree_sha256: "0200b00eba62958b272b6d3af08ca3be3aff34ab5e95eb5afaef23b4b2d06688"
tree_sha256: "49a0da5b44843fd33da89b88ce9eec4ce077445ff241324aa578830b0fc0f5a4"

verify_pin: scripts/validate-pins.py
resync_runbook: "README.md#the-lockstep-invariant"
66 changes: 44 additions & 22 deletions contracts/manifest.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,39 +13,61 @@ contract_bundle_version: none
entries: []

# ===========================================================================
# CARVE PROVENANCE — the slot, declared before the carve fills it.
# CARVE PROVENANCE — the slot was declared before the carve, and the carve has
# FILLED it: `carved_from:` below is the record.
#
# RULED OQ-I (Brett Heap, `opensoft/openxFactory#656`, 2026-09-09): the
# MACHINE-READ record of the openDox carve lands HERE, in each assembly root's
Comment thread
brettheap marked this conversation as resolved.
# hand-authored `contracts/manifest.yaml` — the object whose single commit
# names both legs — as a top-level `carved_from:` mapping. It is one of three
# records: `carve_commit:` in the pin files is the referent that survives into
# the tree the gate reads, and `docs/opendox-cutover-runbook.md` is the
# procedure. There is deliberately NO bare `CARVE_COMMIT` file: the
# records. Record 2 is `carve_commit:` in the pin files that pin this WHOLE
# carved assembly root from downstream — openXdox's
# `contracts/opendox-pin.yaml` (runbook § 4.2) and openxFactory's
# `contracts/openxdox-pin.yaml` (§ 5.1) — the referent that survives into the
# tree the gate reads. It is NOT in this project's own leg pins: neither
# `contracts/code-pin.yaml` nor `contracts/spec-pin.yaml` defines
# `carve_commit:`, because a leg pin is an ordinary submodule pin that exists
# independent of any carve, and § 6's Phase-3 checklist moves only their
# `commit:` and `digests.tree_sha256:`. Record 3 is
# `docs/opendox-cutover-runbook.md`, the procedure. There is deliberately NO
# bare `CARVE_COMMIT` file: the
# openXwallet carve rejected that by name, and `opensoft/openXwallet`'s own
# `contracts/manifest.yaml` carries `carved_from: {repository, commit}` as the
# precedent this widens. "MACHINE-READ" is that precedent's own word, not a
# truncation of "machine-readable": openXwallet's manifest introduces the key
# as "The machine-read one of THREE provenance records for the carve."
#
# NOTHING IS WRITTEN HERE YET. This file is levelled, not filled: the OQ-O
# scaffold-levelling pass moves no carved byte. The carve PR adds, at the top
# level of this file, a mapping of the shape:
# WRITTEN AT PHASE 3 (runbook § 6), by the one commit that also advanced both
# leg gitlinks and both `contracts/<role>-pin.yaml` files — `code` to the
# merge of `opensoft/openDox-code#6` and `spec` to the merge of
# `opensoft/openDox-spec#4`, the arrivals of the 123 and 56 rows the carve
# manifest declares for this project's two legs. Until that commit this file
# was levelled, not filled: the OQ-O scaffold-levelling pass moved no carved
# byte, and the shape the carve would write was set down here in advance
# rather than invented under time pressure at the carve. The mapping below is
# that shape with its two placeholders resolved.
#
# carved_from:
# repository: opensoft/openxFactory
# commit: <the carve commit>
# carve_tag: opendox-carve-0
# manifest: docs/opendox-carve-manifest.yaml
# legs:
# code: <row count>
# spec: <row count>
# Read `scripts/validate-manifest.py` before assuming something in this
# repository checks it: that validator reads `project.yaml`
# (`kind: project-manifest`), NOT this file, and it is digest-pinned by
# `contracts/shape-pin.yaml`, so it must not be edited to make it. This file
# is hand-authored and validated by nothing in this tree — adding a key costs
# nothing and is checked by nothing here. The one piece of running code that
# reads the record lives in openxFactory, whose
# `scripts/verify-carve-arrival.py` refuses `arrival-carved-from-mismatch`
# unless the VALUES at `carved_from.repository` and `carved_from.commit`
# below equal the carve manifest's own `source_repository` and `carve_commit`
# values; run from an openxFactory checkout:
#
# Read `scripts/validate-manifest.py` before assuming something checks this:
# it validates `project.yaml` (`kind: project-manifest`), NOT this file, and
# it is digest-pinned by `contracts/shape-pin.yaml`, so it must not be edited
# to make it. This file is hand-authored and validated by nothing — adding a
# key costs nothing and is checked by nothing, which is exactly why the shape
# it will take is written down here in advance rather than invented under
# time pressure at the carve.
# python3 scripts/verify-carve-arrival.py --destination opendox_root \
# --dest-root <this checkout> --source-repo . --phase A
# ===========================================================================

carved_from:
repository: opensoft/openxFactory
commit: "b075fd91dc8fced8e1373825ba80220c33536bae"
carve_tag: opendox-carve-0
manifest: docs/opendox-carve-manifest.yaml
legs:
code: 123
spec: 56
4 changes: 2 additions & 2 deletions contracts/spec-pin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ leg_role: spec
source_repository: opensoft/openDox-spec
submodule_path: spec

commit: "60e546c69963f9fe8a5071975f7c657ed95d0832"
commit: "fc67332d5ef203624d5c557f7c53d1f134d6d2ea"
revision_kind: commit

digest_algorithm: sha256
Expand All @@ -36,7 +36,7 @@ digest_algorithm: sha256
# <oid>`, so a leg's own pin moving is drift too.
digest_definition: sorted-ls-tree-r-v1
digests:
tree_sha256: "a1218f8e96868f62be32dd064032ea66eef3689b2a40aa3c9e9f8d882abadec6"
tree_sha256: "93c4ed4287815b67eb12087eed1df912365dc8c6f7b158e139755574453e4c95"

verify_pin: scripts/validate-pins.py
resync_runbook: "README.md#the-lockstep-invariant"
2 changes: 1 addition & 1 deletion spec
Submodule spec updated 61 files
+9 −1 .github/workflows/validate.yml
+8 −0 .gitignore
+16 −0 README.md
+227 −0 contracts/schemas/ideation-workbench.schema.yaml
+414 −0 contracts/schemas/xfactory-workbench-chat-turn.schema.yaml
+230 −0 contracts/schemas/xfactory-workbench-model-catalog.schema.yaml
+19 −0 docs/branch-protection.md
+1,115 −0 docs/ideation-dashboard-session-runbook.md
+29 −0 examples/ideation-dashboard/ideation-workbench-adhoc-human-seen.example.yaml
+41 −0 examples/ideation-dashboard/ideation-workbench-cluster-seeded.example.yaml
+46 −0 examples/ideation-dashboard/negative/duplicate-turn-pair/turn-a.yaml
+46 −0 examples/ideation-dashboard/negative/duplicate-turn-pair/turn-b.yaml
+16 −0 examples/ideation-dashboard/negative/workbench-candidate-in-members.yaml
+59 −0 examples/ideation-dashboard/negative/workbench-chat-turn-unrecognized-kind.negative.yaml
+38 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-empty-reason-on-full.negative.yaml
+31 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-extra-field.negative.yaml
+34 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-null-reason-on-full.negative.yaml
+35 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-reason-leaks-a-credential.negative.yaml
+31 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-reason-on-full.negative.yaml
+32 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-reduced-without-reason.negative.yaml
+32 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-context-unknown-posture.negative.yaml
+46 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-escaping-path.negative.yaml
+45 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-hash-mismatch.negative.yaml
+49 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-identity-subject.negative.yaml
+46 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-over-budget.negative.yaml
+39 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-provider-retry-carries-a-token.yaml
+56 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-reserved-key-path.negative.yaml
+45 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-unbound-buffer.negative.yaml
+45 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-unknown-model.negative.yaml
+33 −0 examples/ideation-dashboard/negative/workbench-chat-turn-v2-untyped-proposal.negative.yaml
+14 −0 examples/ideation-dashboard/negative/workbench-excluded-without-reason.yaml
+16 −0 examples/ideation-dashboard/negative/workbench-model-catalog-exposed-credential.negative.yaml
+21 −0 examples/ideation-dashboard/negative/workbench-model-catalog-modality-empty-set.negative.yaml
+28 −0 examples/ideation-dashboard/negative/workbench-model-catalog-modality-image-only.negative.yaml
+21 −0 examples/ideation-dashboard/negative/workbench-model-catalog-modality-outside-the-vocabulary.negative.yaml
+21 −0 examples/ideation-dashboard/negative/workbench-model-catalog-plain-entry-resolves-elsewhere.negative.yaml
+16 −0 examples/ideation-dashboard/negative/workbench-model-catalog-raw-endpoint.negative.yaml
+40 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-badge-gap.negative.yaml
+31 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-badge-holds-the-separator.negative.yaml
+32 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-badge-incidental-word.negative.yaml
+33 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-badge-inverted-substring.negative.yaml
+30 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-dangling-target.negative.yaml
+43 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-resolved-outside-routes-to.negative.yaml
+43 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-rule-chained.negative.yaml
+32 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-rule-unavailable-resolution.negative.yaml
+47 −0 ...es/ideation-dashboard/negative/workbench-model-catalog-routing-rule-wider-than-its-resolution.negative.yaml
+23 −0 examples/ideation-dashboard/negative/workbench-model-catalog-routing-self-reference.negative.yaml
+14 −0 examples/ideation-dashboard/negative/workbench-override-without-reason.yaml
+15 −0 examples/ideation-dashboard/negative/workbench-pinned-not-checked.yaml
+33 −0 examples/ideation-dashboard/workbench-chat-turn-v2-full-context.example.yaml
+58 −0 examples/ideation-dashboard/workbench-chat-turn-v2-loaded-set.example.yaml
+49 −0 examples/ideation-dashboard/workbench-chat-turn-v2-provider-retry.example.yaml
+33 −0 examples/ideation-dashboard/workbench-chat-turn-v2-reduced-context.example.yaml
+42 −0 examples/ideation-dashboard/workbench-chat-turn-v2-success.example.yaml
+6 −0 examples/ideation-dashboard/workbench-model-catalog-empty.example.yaml
+16 −0 examples/ideation-dashboard/workbench-model-catalog-hosted-zero-retention.example.yaml
+25 −0 examples/ideation-dashboard/workbench-model-catalog-local.example.yaml
+27 −0 examples/ideation-dashboard/workbench-model-catalog-multimodal.example.yaml
+52 −0 examples/ideation-dashboard/workbench-model-catalog-routing-rule-wider-than-a-non-resolved-member.example.yaml
+49 −0 examples/ideation-dashboard/workbench-model-catalog-routing-rule.example.yaml
+21 −0 tests/test_leg_shape.py
Loading