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:
parent
3005a28b0a
commit
1d02c83051
6 changed files with 3665 additions and 5 deletions
|
|
@ -15,8 +15,8 @@
|
||||||
| task | CFED-WP-0001-T04 | done | — | workplans/CFED-WP-0001-foundation.md |
|
| 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-T05 | done | — | workplans/CFED-WP-0001-foundation.md |
|
||||||
| task | CFED-WP-0001-T06 | 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-T07 | done | — | workplans/CFED-WP-0001-foundation.md |
|
||||||
| task | CFED-WP-0001-T08 | wait | — | 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-T09 | wait | — | workplans/CFED-WP-0001-foundation.md |
|
||||||
| task | CFED-WP-0001-T10 | 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 |
|
| task | CFED-WP-0001-T11 | done | — | workplans/CFED-WP-0001-foundation.md |
|
||||||
|
|
|
||||||
52
docs/evidence/2026-09-06-corpus-distribution.md
Normal file
52
docs/evidence/2026-09-06-corpus-distribution.md
Normal 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.
|
||||||
|
|
@ -66,3 +66,8 @@ These are implementation requirements in the existing live workplan, not
|
||||||
untracked residuals. The ledger check supplies G2 validation evidence; accepted
|
untracked residuals. The ledger check supplies G2 validation evidence; accepted
|
||||||
project completion and proof of zero duplicate published definitions remain
|
project completion and proof of zero duplicate published definitions remain
|
||||||
separate review gates.
|
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.
|
||||||
|
|
|
||||||
3519
ledger/corpus-distribution.json
Normal file
3519
ledger/corpus-distribution.json
Normal file
File diff suppressed because it is too large
Load diff
75
tools/validate_corpus.py
Normal file
75
tools/validate_corpus.py
Normal 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))
|
||||||
|
|
@ -8,7 +8,7 @@ status: active
|
||||||
owner: codex
|
owner: codex
|
||||||
topic_slug: canon-federation
|
topic_slug: canon-federation
|
||||||
created: "2026-08-16"
|
created: "2026-08-16"
|
||||||
updated: "2026-09-05"
|
updated: "2026-09-06"
|
||||||
state_hub_workstream_id: "1c5615fc-03b7-5648-ba58-e828b8c0cb0f"
|
state_hub_workstream_id: "1c5615fc-03b7-5648-ba58-e828b8c0cb0f"
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -273,7 +273,7 @@ to establish social-collective destinations before corpus distribution.
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: CFED-WP-0001-T07
|
id: CFED-WP-0001-T07
|
||||||
status: todo
|
status: done
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "26a96020-49bb-5a5e-97d1-c478b83bffd0"
|
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.
|
Preserve provenance — this is research that already ran; it is not re-derived.
|
||||||
Record the disposition so gate **G6** is checkable.
|
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
|
## Publish cross-canon interface cards
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: CFED-WP-0001-T08
|
id: CFED-WP-0001-T08
|
||||||
status: wait
|
status: todo
|
||||||
priority: medium
|
priority: medium
|
||||||
state_hub_task_id: "e0558c32-415f-5563-bca2-438b35fa6b53"
|
state_hub_task_id: "e0558c32-415f-5563-bca2-438b35fa6b53"
|
||||||
```
|
```
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue