Every ticket as the root of its provenance graph — goal, patch, approval, runs and (as the ticket-class build lands) mandate, manifestations, guarantees, journey, artifacts and children. Rendered through the <<<TicketGraphList>>> tag.
FIX forge multi-module package collision: additive packaging so same-package units do not clobber pyproject/__init__
goal
Multi-module forge packages COLLIDE: the decomposer files one rewrite unit per unique MODULE (blob), but modules that share a repo/package share the package scaffolding (pyproject.toml, __init__.py). Each unit currently rewrites the WHOLE package, so two units for the same package (e.g. artifact_tree_gen has add.py #401, fib.py #405, clamp.py #395) produce conflicting pyproject/__init__ — merging the 2nd over the 1st yields an invalid package. PROVEN: #401(add)+#405(fib) landed a valid forge2/artifact_tree_gen package; #395(clamp) then fails to merge cleanly (its package rewrite conflicts). coupler (many modules) will hit this at scale.
FIX (analogous to the tag-registry fix #281 — additive, not whole-rewrite): make forge units in a multi-module package ADDITIVE. Options to design+choose: (a) a unit writes ONLY its module file; the package scaffolding (pyproject listing all modules, __init__ re-exports) is generated/updated by a per-PACKAGE scaffolding step or an idempotent merge that unions modules; OR (b) group a package's modules into one unit; OR (c) an additive pyproject/__init__ updater the pair calls so each module registers itself without clobbering siblings. The harvest must end with a package where `pip install -e .` works and ALL landed modules import. Also add a harvest-time guard: after merging a forge unit, verify pyproject valid AND every .py in the package imports (reject the merge otherwise — this is the forge analogue of the tag harness). Deliverable: the decomposer/ticketer or pair_loop forge-packaging path (checkouts/current/congruency/tools/forge_refactor_ticketer.py or a new forge_package helper) — pick the minimal change. Single-module packages already work and must stay working.
patch
none
approval
unapproved
runs
no runs recorded
mandate (clauses)
not yet recorded — lands with the ticket-class build
manifestations
not yet recorded — lands with the ticket-class build
guarantees
not yet recorded — lands with the ticket-class build
journey (blunders & successes)
not yet recorded — lands with the ticket-class build
artifacts (forge)
not yet recorded — lands with the ticket-class build