KB-327D

O10 automation completion bundle — 02-generic-target-source-intake-result

4 min read Revision 1
dieu44iu-cutterv0.6o10generic-intakegap8

O10 Report 02 — Generic target/source intake (BRANCH 1)

  • macro: v0.6-o10-automation-completion-program-bundle
  • date_utc: 2026-05-21 · gate: BRANCH 1 · result: PASS — implemented

1. The gap (O9 Report 04 §3)

Two document front-ends existed and both were hard-wired to the Incomex Constitution:

cutter_agent/dryrun.py:           ICX-CONST snapshot MARK CLI — 5 zone
                                  headers + 15 NGUYEN_TAC + ICX marker
                                  census. Constitution-only grammar.
discover.LiveDryRunDiscoverer:    re-cuts an already-enacted Constitution
                                  as a shadow dry-run; REQUIRES a
                                  LiveConstitutionSurvey — cannot intake
                                  a brand-new document.

O8F's F3 generalised the governance recording (no N=60 in leg-B / verify recorders); it did not generalise the document front-end.

2. Key finding — the orchestrator core was ALREADY generic

Inspection of the orchestrator phases confirmed they carry no ICX-CONST coupling and no N=60 assumption:

phases/source_pin.py:  discoverer.find_source_document / latest_source_version
                       — abstract; any document_id.
phases/mark.py:        MAX_CANDIDATES_PER_DOC = 1000; refuses 0; no N=60.
phases/cutplan.py:     deterministic rebuild + writer_digest; vocab from
                       discoverer.vocab_snapshot(); no fixed cardinality.
discover.InMemoryDiscoverer: a fully generic seed-driven simulator.

The only missing piece was a front-end that turns a new small structured document into the rows the (already-generic) phases consume.

3. What was implemented

New module cutter_agent/orchestrator/generic_intake.py (+1 file):

parse_generic_document():   deterministic, fail-closed, stdlib-only parser
                            (see Report 03).
GenericDocument / GenericUnit: parsed payload — title/body/source-span,
                            content_hash, manifest_digest.
GenericIntakeDiscoverer:    subclass of InMemoryDiscoverer; classmethod
                            from_generic_document() seeds source_documents,
                            versions, mark_rows, grant_matrix, vocab,
                            lifecycle — so source_pin..closeout runs in
                            Mode.DRYRUN with NO production source_document
                            row and NO live DB read.
build_generic_dryrun_runner(): wires runner+store+KB for a dry-run walk.
CLI:                        `parse` + `dryrun` subcommands.

4. ICX-CONST historical path preserved

cutter_agent/dryrun.py:            byte-untouched — still cuts ICX-CONST.
discover.LiveDryRunDiscoverer:      byte-untouched.
test_icx_const_parser_still_present: asserts ZONE_HEADERS == 5 +
                                    GRAMMAR_PROFILE intact.

The generic path is additive — a parallel front-end, not a rewrite.

5. Synthetic / fixture target — no production mutation

GenericIntakeDiscoverer is an in-memory simulator: a synthetic small target needs no source_document_registry row and no DB write. A 3-unit fixture (tests/fixtures/generic-small-target-sample.md) drives the full Mode.DRYRUN E2E. The ICX-CONST-only assumption is removed for the dry-run path — GAP8 precondition P-A is CLOSED.

6. Verdict

branch_1: PASS — generic target/source intake implemented; ICX-CONST
          historical path preserved; synthetic-fixture dry-run needs no
          production source_document row.
Back to Knowledge Hub knowledge/dev/laws/dieu44-trien-khai/v0.6-o10-automation-completion-program-bundle/02-generic-target-source-intake-result.md