Ticket graphs

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.

← all ticket-graphs

REQUESTED#270 forge-refactor

Rewrite artifact_tree_gen:add.py as behavior-preserving, installable, control-config'd Python [forge-rw:e42d2d08fe5ef45b]

goal

Rewrite ONE unique forge module as entirely new, behavior-preserving, installable, control-config'd Python, per the FORGE-wide refactor standard #200 (#std). This ticket covers ONE module — the one identified below — and nothing else. It was filed against the module's DEDUPLICATED identity, so if that module was copy-pasted across the forge, every copy is covered by this single ticket. MODULE KEY : forge-rw:e42d2d08fe5ef45b (the ticketer's idempotency marker — it lives in this ticket's TITLE. Do not edit the title, or the module will be re-filed as a duplicate.) IDENTITY : AST-NORMALIZED — codebean's `_ast_norm` (#183), i.e. ast.dump(ast.parse(ast.unparse(ast.parse(src)))). Copies of this module that differ only in comments, blank lines, quoting or spacing carry the SAME module-sha and are covered by THIS ticket. A differing docstring is real content, so a module whose docstring differs is a DIFFERENT module with its own ticket. SIZE : 102 bytes EXTENSION : .py CANONICAL SOURCE (the location this ticket is named for): repo : artifact_tree_gen path : add.py ref : HEAD (HEAD) blob : 2e9c233321e95e891a858c203986d1810134aa24 (git blob sha1) read it, from anywhere: git --git-dir=/Users/stevenpeterson/code/installed/jazz-project/config/forge/remotes/artifact_tree_gen.git cat-file blob 2e9c233321e95e891a858c203986d1810134aa24 THE SAME MODULE ALSO LIVES AT THESE FORGE TIPS: none — this module is unique to artifact_tree_gen among the repos scanned so far. HISTORICAL OCCURRENCES of this exact blob — every DISTINCT {repo, path} the omni-git index (`occ`, joined on the git blob sha1) records this byte-identical file at, with the index's own `ts` for the first row of each. Context for the rewrite, not extra work: test_project__new_repo__packages__codebean_mcp__prototype__artifact_tree_gen:add.py [occ.ts 20260702T181421Z] test_project__new_repo__packages__codebean_mcp__prototype__solved:add.py [occ.ts 20260702T181421Z] test_project__new_repo__packages__codebean_mcp__prototype__solved:jazz/test_project/new_repo/packages/codebean_mcp/prototype/pilot_pure/add.py [occ.ts 20260702T210241Z] test_project__new_repo__packages__codebean_mcp__prototype__solved:test_project/new_repo/packages/codebean_mcp/prototype/pilot_pure/add.py [occ.ts 20260702T210241Z] test_project__new_repo__packages__codebean_mcp__prototype__solved:test_project/new_repo/packages/codebean_mcp/prototype/solved/add/add.py [occ.ts 20260702T210241Z] THE CALLABLE SURFACE — every callable in the original, lowered with codebean's `lower_node` (#183). The rewrite must present THIS surface (same names, same parameters, same defaults) so callers of the original keep working: add(a, b) CAPTURED BEHAVIORAL EXEMPLARS — real (input, output) pairs mined from THIS module with criteria_miner (#200's "verified, not asserted"), running the ORIGINAL as the oracle. THE REWRITE MUST REPRODUCE EVERY PAIR BELOW, exactly: add(a, b) — 30 exemplar(s) captured: add(0, 0) == 0 add(0, 1) == 1 add(0, -1) == -1 add(0, 1.5) == 1.5 add(0, True) == 1 add(1, 0) == 1 ... 24 more exemplar(s) for this function — re-mine them with criteria_miner.mine() on the source above HONEST LIMIT (criteria_miner's own): these cover the SAMPLED inputs, probed around the function's own branch constants. They are a strong refactor-drift net, NOT a proof of total equivalence — so treat them as the FLOOR of this ticket's equivalence evidence and add the edge cases they miss (see ACCEPTANCE). THE STANDARD — #200's four requirements, which this ticket exists to enforce. All four are the standard's own words; none is optional: 1. BEHAVIOR-PRESERVING, VERIFIED NOT ASSERTED — the deliverable is ENTIRELY NEW source code (rewritten, not copied). It must reproduce the ORIGINAL's behavior, and the proof is the exemplars above (captured via codebean lower_* #183 + criteria_miner IO-exemplars, exactly as #200 specifies). 2. A PYTHON MODULE — regardless of the source language. This module's source is `.py`; the rewrite is Python either way. 3. INSTALLABLE — a proper package: pyproject.toml, `pip install -e .` works, console entry points where applicable. 4. CONTROL-CONFIG'D — NO hardcoded paths or params. A JSON/registry config object drives it (the install.json / registry.json idiom of this repo), and per note-for-claude a tool that cannot see its config THROWS rather than guessing a default. ACCEPTANCE (#200's, per rewrite ticket) — this ticket settles when ALL of: a. the new source reproduces every captured exemplar above, plus the edge cases you add for what sampling cannot reach (paste the runs as evidence); b. it presents the callable surface above, so existing callers keep working; c. `pip install -e .` installs it clean from its own pyproject.toml; d. it runs off a config object with ZERO hardcoded settings, and throws without one. Kind is `build` (a pair: coder + adversarial tester). This ticket hangs off #200 by a `spawned` edge, so a stop ticket aimed at #200 brakes every rewrite in this programme. Filed mechanically by checkouts/current/congruency/tools/forge_refactor_ticketer.py under ticket #201, from the forge bare repos at /Users/stevenpeterson/code/installed/jazz-project/config/forge/remotes.

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

source (forge tree)

browse congruency source (forge-parked tree)

children

not yet recorded — lands with the ticket-class build