Record complete corpus provenance distribution and G6 evidence

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a070b5-4994-7271-bd8b-7c3dbcedec4b
This commit is contained in:
tegwick 2026-09-06 00:44:57 +02:00
parent 3005a28b0a
commit 1d02c83051
6 changed files with 3665 additions and 5 deletions

View file

@ -15,8 +15,8 @@
| task | CFED-WP-0001-T04 | done | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T05 | done | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T06 | done | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T07 | todo | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T08 | wait | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T07 | done | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T08 | todo | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T09 | wait | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T10 | wait | — | workplans/CFED-WP-0001-foundation.md |
| task | CFED-WP-0001-T11 | done | — | workplans/CFED-WP-0001-foundation.md |

View file

@ -0,0 +1,52 @@
# Corpus distribution — 2026-09-06
CFED-WP-0001-T07 is implemented by INFO-WP-0024 and COMMERCE-WP-0003.
The 45-file research/terminology/scenario corpus is pinned at CommerceCanon
commit `8a07292dd78d094151f165d3ac1dfc7512114308`. Original files remain unchanged.
Destination assimilation workspaces contain 69 byte-identical snapshots:
45 in InfoTechCanon (technical concepts and imported technical context from the
commercial research) and 24 in CommerceCanon (commercial research, shared B2B
provisioning context, indexes, terminology and scenarios). Per-model reading
indexes identify the destination interest. Shared terminology rows, conflict
sections and scenarios are partitioned into 153 exact fragments with line ranges
and hashes. Full source context is retained beside the views.
The machine-readable [distribution ledger](../../ledger/corpus-distribution.json)
records every source, digest, model interest, destination path and fragment.
Each native workspace has its scoped manifest, schema-valid assimilation record,
source summary, reused concept extraction/mappings, comparison matrix, proposed
changes (none), open-question status and decision rationale. Disposition is
observe: this distributes completed research under accepted ADR-006 and the
user-authorized T07, without adopting new domain definitions. No source content
was silently revised, re-researched or claimed current.
Historical Family-as-collective, source/assertion conflations, product terminology
and obsolete review queues remain visible but are explicitly superseded by the
accepted ownership and current draft models. Old scenario satisfiability claims
are not current conformance results. T08/T09/T10 retain live interface, fleet and
residual work; no speculative Family model work is created.
Reproduce (Python 3, PyYAML and jsonschema):
```bash
python3 tools/validate_corpus.py --commerce-repo ../commerce-canon --info-tech-repo ../info-tech-canon
python3 tools/validate_ownership.py --source-repo ../commerce-canon
```
G6 check: 45 sources, 69 snapshots, 153 exact fragments, 479 workspace links;
zero unrouted sources or changed originals. InfoTechCanon adds one observed
assimilation retrieval artifact and remains at 14 models; its metadata patch
release includes a change record. Final checks and publication receipts follow.
Final verification: InfoTechCanon **46 tests pass**, generated consistency, canon
and small-saas profile checks pass. Published InfoTechCanon commit `372f671`;
CommerceCanon implementation `8a89a68`, published/reconciled commit
`bc67e1f25b140ecb60d1439de984f8361acabc32` (primary/railiance01, matching
expected/derived commits, no refusals or retirements).
Native workplan UUIDs: INFO-WP-0024 `3bea30f6-8640-5c16-b782-8258babdba35`,
COMMERCE-WP-0003 `3010a646-4e26-56bb-9fd2-327bb59ebea5`. Decision
`5afcdb1c-10a9-4a84-b769-92fa025c91b8` records the observe/routing rationale.
Required synchronization passed, with existing classification/prefix advisories.
Progress logged to both native workplans and the project. Project: 10/13 done.

View file

@ -66,3 +66,8 @@ These are implementation requirements in the existing live workplan, not
untracked residuals. The ledger check supplies G2 validation evidence; accepted
project completion and proof of zero duplicate published definitions remain
separate review gates.
The [corpus distribution ledger](corpus-distribution.json) records T07's frozen
research destinations and exact shared fragments. Reproduce G6 with
`python3 tools/validate_corpus.py --commerce-repo ../commerce-canon --info-tech-repo ../info-tech-canon`
from the project root. Historical source assertions are not current definitions.

File diff suppressed because it is too large Load diff

75
tools/validate_corpus.py Normal file
View file

@ -0,0 +1,75 @@
"""Verify G6 source coverage, frozen snapshots, and exact destination fragments."""
import argparse
import hashlib
import json
from pathlib import Path
import re
import subprocess
import jsonschema
import yaml
def validate(project, commerce, info):
manifest = json.loads((project / 'ledger/corpus-distribution.json').read_text())
roots = {'commerce-canon': commerce, 'info-tech-canon': info}
base = 'infospace/assimilation/canon-federation'
commit = manifest['source_commit']
paths = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', commit, '--', 'research', 'terminology', 'scenarios'], cwd=commerce, text=True).splitlines()
listed = [row['source_path'] for row in manifest['files']]
assert set(paths) == set(listed) and len(paths) == len(listed), 'Incomplete or duplicate corpus coverage'
original = {}
copies = 0
for row in manifest['files']:
path = row['source_path']
data = subprocess.check_output(['git', 'show', commit + ':' + path], cwd=commerce)
original[path] = data
assert hashlib.sha256(data).hexdigest() == row['sha256'], 'Invalid source digest: ' + path
assert (commerce / path).read_bytes() == data, 'Original changed: ' + path
assert row['destinations'], 'Unrouted source: ' + path
assert row['applicable_models'], 'Missing destination interest: ' + path
for target in row['destinations']:
assert target['path'] == base + '/source/' + path, target
assert (roots[target['repo']] / target['path']).read_bytes() == data, target
copies += 1
schema = yaml.safe_load((info / 'infospace/schemas/assimilation.schema.yaml').read_text())
links = 0
for name, repo in roots.items():
workspace = repo / base
local = json.loads((workspace / 'distribution.json').read_text())
expected = [row for row in manifest['files'] if any(d['repo'] == name for d in row['destinations'])]
assert local['files'] == expected and local['source_commit'] == commit
expected_views = [row for row in manifest['views'] if any(d['repo'] == name for d in row['destinations'])]
assert local['views'] == expected_views
actual_paths = {str(p.relative_to(workspace / 'source')) for p in (workspace / 'source').rglob('*') if p.is_file()}
assert actual_paths == {row['source_path'] for row in expected}, name
record = yaml.safe_load((workspace / 'assimilation.yaml').read_text())
jsonschema.validate(record, schema)
assert record['disposition'] == 'observe' and record['status'] == 'closed'
assert set(record['source_files']) == {'source/' + row['source_path'] for row in expected}
for path in workspace.rglob('*.md'):
if 'source' in path.relative_to(workspace).parts: continue
for link in re.findall(r'\]\(([^)]+)\)', path.read_text()):
if '://' in link or link.startswith('#'): continue
assert (path.parent / link.split('#')[0]).exists(), (path, link)
links += 1
for row in manifest['views']:
source = original[row['source_path']].decode().splitlines(keepends=True)
assert 1 <= row['start_line'] <= row['end_line'] <= len(source), row
body = ''.join(source[row['start_line'] - 1:row['end_line']])
assert hashlib.sha256(body.encode()).hexdigest() == row['sha256'], row
for destination in row['destinations']:
for model in destination['models']:
view = (roots[destination['repo']] / base / 'views' / (model + '.md')).read_text()
assert body in view and row['sha256'] in view, (row['title'], model)
return {'source_files': len(paths), 'snapshot_copies': copies, 'exact_fragments': len(manifest['views']),
'local_links': links, 'source_commit': commit, 'unrouted_sources': 0,
'changed_originals': 0, 'status': 'pass'}
if __name__ == '__main__':
p = argparse.ArgumentParser()
p.add_argument('--commerce-repo', type=Path, required=True)
p.add_argument('--info-tech-repo', type=Path, required=True)
args = p.parse_args()
print(json.dumps(validate(Path(__file__).resolve().parents[1], args.commerce_repo.resolve(), args.info_tech_repo.resolve()), indent=2))

View file

@ -8,7 +8,7 @@ status: active
owner: codex
topic_slug: canon-federation
created: "2026-08-16"
updated: "2026-09-05"
updated: "2026-09-06"
state_hub_workstream_id: "1c5615fc-03b7-5648-ba58-e828b8c0cb0f"
---
@ -273,7 +273,7 @@ to establish social-collective destinations before corpus distribution.
```task
id: CFED-WP-0001-T07
status: todo
status: done
priority: medium
state_hub_task_id: "26a96020-49bb-5a5e-97d1-c478b83bffd0"
```
@ -286,11 +286,20 @@ concepts each supports. Split where a corpus area serves both.
Preserve provenance — this is research that already ran; it is not re-derived.
Record the disposition so gate **G6** is checkable.
**Result (2026-09-06):** [INFO-WP-0024](../../info-tech-canon/workplans/INFO-WP-0024-corpus-provenance.md)
and [COMMERCE-WP-0003](../../commerce-canon/workplans/COMMERCE-WP-0003-corpus-provenance.md)
distribute 45 source files into 69 frozen snapshots, with per-model reading
indexes and 153 exact shared fragments. [Distribution ledger](../ledger/corpus-distribution.json)
and [G6 evidence](../docs/evidence/2026-09-06-corpus-distribution.md) verify complete
coverage, hashes and 479 links. Originals remain unchanged; disposition observe
does not promote historical assertions. G6 passes; T08 is now todo.
## Publish cross-canon interface cards
```task
id: CFED-WP-0001-T08
status: wait
status: todo
priority: medium
state_hub_task_id: "e0558c32-415f-5563-bca2-438b35fa6b53"
```