@henols/c64-re-tools 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +1 -1
  2. package/THIRD-PARTY-NOTICES.md +26 -0
  3. package/bin/cli.mjs +18 -7
  4. package/package.json +6 -4
  5. package/skills/acme-build/SKILL.md +83 -33
  6. package/skills/acme-build/scripts/acme.mjs +159 -64
  7. package/skills/acme-build/template.a +1 -1
  8. package/skills/c64-disk-access/SKILL.md +156 -0
  9. package/skills/c64-disk-access/scripts/c1541.mjs +569 -0
  10. package/skills/c64-memory-mapping/SKILL.md +419 -23
  11. package/skills/c64-memory-mapping/scripts/driver.mjs +1 -1
  12. package/skills/c64-petcat/SKILL.md +87 -0
  13. package/skills/c64-petcat/scripts/petcat.mjs +221 -0
  14. package/skills/c64-program-recon/SKILL.md +497 -92
  15. package/skills/c64-program-recon/references/control-flow.md +12 -15
  16. package/skills/c64-program-recon/references/graphics.md +1 -1
  17. package/skills/c64-program-recon/references/observation-hazards.md +18 -16
  18. package/skills/c64-program-recon/references/reconstruction.md +11 -6
  19. package/skills/c64-program-recon/references/sound-and-input.md +6 -8
  20. package/skills/c64-program-recon/references/tool-selection.md +37 -18
  21. package/skills/c64-program-recon/scripts/packer-finding.mjs +709 -0
  22. package/skills/c64-program-recon/templates/memory-map.template.md +27 -13
  23. package/skills/c64-provenance-diff/SKILL.md +43 -8
  24. package/skills/c64-provenance-diff/scripts/diff-images.mjs +9 -6
  25. package/skills/c64-provenance-diff/scripts/recovery-schema.mjs +20 -8
  26. package/skills/c64-ram-capture/RELEASES.json.example +17 -0
  27. package/skills/c64-ram-capture/SKILL.md +147 -46
  28. package/skills/c64-ram-capture/scripts/compare.mjs +2 -2
  29. package/skills/c64-ram-capture/scripts/derive-transients.mjs +575 -0
  30. package/skills/c64-ram-capture/scripts/dump-artifacts.mjs +3 -3
  31. package/skills/c64-ram-capture/scripts/mcp-module.mjs +174 -0
  32. package/skills/c64-ram-capture/scripts/project-paths.mjs +1 -1
  33. package/skills/c64-ram-capture/scripts/releases.mjs +1 -1
  34. package/skills/c64-ram-capture/scripts/vsf-slice.mjs +147 -0
  35. package/skills/c64-ram-capture/scripts/watch-loads.mjs +19 -13
  36. package/skills/c64-ram-capture/templates/capture-record.template.md +44 -4
  37. package/skills/c64-ram-capture/transients/README.md +136 -0
  38. package/skills/routine-queue-walker/SKILL.md +365 -0
  39. package/skills/routine-queue-walker/scripts/completeness-report.mjs +463 -0
  40. package/skills/vice-wedge-triage/SKILL.md +104 -97
  41. package/skills/c64-provenance-diff/scripts/diff-images.test.mjs +0 -665
  42. package/skills/c64-ram-capture/scripts/d64-parse.mjs +0 -243
  43. package/skills/c64-ram-capture/scripts/d64-parse.test.mjs +0 -243
  44. package/skills/c64-ram-capture/scripts/dump-artifacts.test.mjs +0 -133
  45. package/skills/c64-ram-capture/scripts/test-corpus.mjs +0 -75
  46. package/skills/c64-ram-capture/scripts/watch-loads.test.mjs +0 -339
@@ -1,7 +1,6 @@
1
1
  # Control flow: entry point → vectors → IRQ source → main loop → structure
2
2
 
3
- Source: `.planning/RE-FINDINGS.md` § Control-flow discovery method (2026-08-01, **MEDIUM**,
4
- doc-derived) except where a line says otherwise. The vector-table step was confirmed against
3
+ Graded 2026-08-01, **MEDIUM**, doc-derived, except where a line says otherwise. The vector-table step was confirmed against
5
4
  this project's own captures on 2026-08-04 — see the bottom of this file.
6
5
 
7
6
  ## 1. Entry point — three routes, and post-depack is a different question
@@ -31,7 +30,7 @@ it prints the IRQ/BRK/NMI and hardware blocks by default and takes `--all` for t
31
30
  | Hardware vectors | `$FFFA-$FFFF` | NMI, RESET, IRQ/BRK. Live when the KERNAL is banked out |
32
31
 
33
32
  **The hardware pairs are only live when the ROMs are banked out via `$01`.** The deciding bit is
34
- HIRAM, `$01` bit 1 (RE-FINDINGS 2026-08-02). HIRAM = 1 ⇒ KERNAL ROM is in and `$0314/$0315` is
33
+ HIRAM, `$01` bit 1 (observed 2026-08-02). HIRAM = 1 ⇒ KERNAL ROM is in and `$0314/$0315` is
35
34
  live. HIRAM = 0 ⇒ RAM at `$E000-$FFFF` and `$FFFE/$FFFF` is live.
36
35
 
37
36
  Why LOAD and STOP earn their own callout on this project: both releases use custom raw-sector
@@ -82,15 +81,13 @@ Run over all six committed captures of one title (two releases, runs 1-3 each):
82
81
 
83
82
  NMI and RESET sharing one entry is the shape of an anti-tamper trap: RESTORE and reset are the two
84
83
  ways a user perturbs a running game, and both land in the same place. `$1116` is therefore the
85
- address to checkpoint when the emulator is next available press RESTORE with
86
- `mcp__plugin_c64-re-tools_vice__vice_keyboard_restore` (it is *not* in the keyboard matrix, and NMI will not retrigger
87
- until the line is released, so it is a press→release **edge**), then `vice_machine_reset` soft and
88
- hard, and record where the PC actually lands.
89
-
90
- **`vice_keyboard_restore` requires the fork backend.** The RESTORE key pulses the NMI line
91
- directly and is not part of the keyboard matrix, so stock's `KEYBOARD_FEED` (which only injects
92
- PETSCII text into the buffer) cannot produce it. Calling it on the stock backend returns an error
93
- naming the reason and the fork backend, rather than pulsing RESTORE.
84
+ address to checkpoint when the emulator is next available. Testing the RESTORE half of that
85
+ experiment is not currently possible: **`vice_keyboard_restore` is permanently unavailable.** The
86
+ RESTORE key pulses the NMI line directly and is not part of the keyboard matrix, so `KEYBOARD_FEED`
87
+ (which only injects PETSCII text into the buffer) cannot produce it; calling the tool returns an
88
+ error naming the reason, rather than pulsing RESTORE. No client-side substitute exists — see
89
+ `docs/stock-hard-losses.md`. The reset half of the experiment remains testable: arm the checkpoint,
90
+ call `vice_machine_reset` soft and hard, and record where the PC actually lands.
94
91
 
95
92
  **Evidence:** derived mechanically from six three-run-verified captures; every value identical
96
93
  across all three runs of its release, so none of it is drift.
@@ -161,9 +158,9 @@ at a title screen and again in gameplay, diff the two captures, and look for a s
161
158
  changed in zero page or low RAM. `vice_memory_compare` narrows this; `c64-ram-capture` § Compare
162
159
  two captures gives the volatility rules that stop you chasing drift.
163
160
 
164
- On stock, only `mode: 'ranges'` is served — capture the two states at different points in time and
161
+ Only `mode: 'ranges'` is served — capture the two states at different points in time and
165
162
  compare two live ranges. `mode: 'snapshot'` is refused with an explanatory message; there is no
166
- memory-only snapshot producer on either backend.
163
+ memory-only snapshot producer at all.
167
164
 
168
165
  ## Verified against this project — 2026-08-04
169
166
 
@@ -173,7 +170,7 @@ holding **`$1103`**, while `$0314/$0315` holds `$0101` — nothing meaningful, e
173
170
  dormant-block rule predicts.
174
171
 
175
172
  `$1103` is the same IRQ-handler entry that phase-01 live work independently established, with the
176
- raster-split chain `$1103 → $1574 → $152C` (RE-FINDINGS 2026-08-02, checkpoint-trap entry). The
173
+ raster-split chain `$1103 → $1574 → $152C` (observed 2026-08-02, on a checkpoint trap). The
177
174
  method reproduces a known-good result from a static image with no emulator running. The widened
178
175
  sweep's own results, including two facts this table never surfaced, are in §2 above.
179
176
 
@@ -1,6 +1,6 @@
1
1
  # VIC-II: locating every displayed byte
2
2
 
3
- Source: `.planning/RE-FINDINGS.md` § VIC-II discovery (2026-08-01, **MEDIUM**, doc-derived).
3
+ Graded 2026-08-01, **MEDIUM**, doc-derived.
4
4
 
5
5
  **Graphics data is computed, not searched.** Every pointer the VIC follows derives from two
6
6
  registers plus a bank. Read the bank, read `$D018`, read the mode bits, read `$D015` and the
@@ -5,7 +5,8 @@ this project at real cost. A wrong answer from a register table is cheap; a wron
5
5
  machine that changed *because you looked at it* discredits a whole session without announcing
6
6
  itself.
7
7
 
8
- Full provenance in `.planning/RE-FINDINGS.md`. Log new hazards there at the moment you hit one.
8
+ Log a new hazard in your own project notes at the moment you hit one — the cost of rediscovering
9
+ one is a whole discredited session.
9
10
 
10
11
  ## 1. Agent think-time runs the emulator at full speed
11
12
 
@@ -59,8 +60,7 @@ bracket, and comes back `wedged`. **The response to `wedged` is recycle, and rec
59
60
  instance is the exact loss both the tool and this hazard exist to prevent.** So when a `wedged`
60
61
  verdict arrives with any checkpoint still armed, do the two reads by hand before recycling:
61
62
  `vice_checkpoint_list`, then resolve the live handler (`$0314/$0315`, or `$FFFE/$FFFF` when `$01`
62
- has the ROMs banked out). Filed as
63
- `.planning/todos/pending/2026-08-04-vice-diagnose-checkpoint-trap-shapes-miss-mid-handler-arming.md`.
63
+ has the ROMs banked out). Observed 2026-08-04, and still open.
64
64
 
65
65
  **Counter-evidence, and why this is MEDIUM:** in one incident, deleting the checkpoint did *not*
66
66
  unfreeze the machine, and neither did a soft reset, a hard reset, nor a single step. A checkpoint
@@ -80,19 +80,20 @@ Prefer the whole-chip reads — `vice_vicii_get_state`, `vice_cia_get_state`, `v
80
80
  — over raw register reads. Whether the VICE monitor's own read path is side-effect-free is
81
81
  **unverified**: treat it as verify-don't-assume rather than taking it on faith.
82
82
 
83
- On the stock backend, `vice_vicii_get_state`/`vice_cia_get_state` reads are `sidefx: false` with
83
+ `vice_vicii_get_state`/`vice_cia_get_state` reads are `sidefx: false` with
84
84
  no argument able to override it — **VERIFIED**, asserted on the wire body by a regression test.
85
85
  Whether the emulator's own `MEM_GET` read path actually honours that flag for
86
86
  `$D01E`/`$D01F`/`$DC0D`/`$DD0D` — i.e. whether it truly cannot clear them — is **ASSUMED**, with
87
- no probe recorded in this repo; treat it as no worse than the fork's own unverified path, not as
88
- a proven guarantee. `vice_sid_get_state` is **fork-only**, since SID `$D400-$D418` is write-only
89
- in hardware and the binary monitor has no SID command. Also: on stock, an internal field the
90
- register map cannot expose is marked `{ available: false, reason }` in the answer, never a bare
91
- `0` do not record a stock `0` from one of these fields as a measurement; check `available`
92
- first. A stock chip-state or sprite answer also **names the memory view it read** (`bank`, or
87
+ no probe recorded in this repo; treat it as unverified, not as a proven guarantee.
88
+ `vice_sid_get_state` read-back is **permanently unavailable**: SID `$D400-$D418` is write-only
89
+ in hardware and the binary monitor has no SID command, so there is no route to recover it.
90
+ Writes to those addresses still work fine. See `docs/stock-hard-losses.md`. Also: an internal
91
+ field the register map cannot expose is marked `{ available: false, reason }` in the answer, never
92
+ a bare `0` do not record a `0` from one of these fields as a measurement; check `available`
93
+ first. A chip-state or sprite answer also **names the memory view it read** (`bank`, or
93
94
  `registerBank`/`dataBank`), read through the emulator's own `io`/`ram` banks, so it stays valid
94
95
  even while the program has I/O banked out ($01 driving the RAM/ROM/I-O switch). An answer with
95
- **no** bank field — an older transcript, or the fork backend — is suspect whenever `$01` may not
96
+ **no** bank field — an older transcript — is suspect whenever `$01` may not
96
97
  have been `$37`: those bytes may be the RAM underneath the I/O area, not registers.
97
98
 
98
99
  ## 4. The keyboard buffer is not how games read keys
@@ -103,13 +104,14 @@ Games and cracks poll the `$DC00`/`$DC01` matrix directly, bypassing the KERNAL
103
104
  `vice_keyboard_type` is invisible to them. Use `vice_keyboard_matrix`, and hold a key across a
104
105
  gate by releasing it at the trigger checkpoint, never earlier.
105
106
 
106
- **`vice_keyboard_matrix` requires the fork backend.** The binary monitor's `KEYBOARD_FEED` (0x72)
107
+ **`vice_keyboard_matrix` is permanently unavailable.** The binary monitor's `KEYBOARD_FEED` (0x72)
107
108
  only injects PETSCII text into the KERNAL keyboard buffer; the emulator recomputes CIA port B from
108
109
  its own keyboard array on every read, so there is no wire command that can drive the raw matrix —
109
- this is unrecoverable on stock, not merely unbuilt. On stock, use `vice_keyboard_type` /
110
- `vice_keyboard_petscii` when the gate reads the KERNAL buffer, or `vice_joystick_set` when it polls
111
- the matrix directly instead; either way, buffer injection is invisible to a program polling
112
- `$DC00`/`$DC01` itself, so a matrix-polling gate must be driven by the joystick or not at all.
110
+ this is unrecoverable, not merely unbuilt. See `docs/stock-hard-losses.md`. Use
111
+ `vice_keyboard_type` / `vice_keyboard_petscii` when the gate reads the KERNAL buffer, or
112
+ `vice_joystick_set` when it polls the matrix directly instead; either way, buffer injection is
113
+ invisible to a program polling `$DC00`/`$DC01` itself, so a matrix-polling gate must be driven by
114
+ the joystick or not at all.
113
115
 
114
116
  ## 5. Most state reads pause the emulator and do not resume it
115
117
 
@@ -43,8 +43,7 @@ at a checkpoint is not verified** — the constraint's own conclusion, and the r
43
43
  design is part of the reconstruction work rather than something to bolt on afterwards.
44
44
 
45
45
  **That bar is what buys you the freedom to rename routines, reorganise files, replace constants
46
- with symbols and add macros** (`.planning/REQUIREMENTS.md` § Out of Scope makes the same
47
- argument). **But** reorganising changes addresses, which breaks self-modifying code and
46
+ with symbols and add macros**. **But** reorganising changes addresses, which breaks self-modifying code and
48
47
  timing-sensitive raster routines. Replay through the checkpoint set after EACH reorganisation, not
49
48
  at the end of several: one changed address per failing replay is a short diagnosis, ten is a
50
49
  bisect.
@@ -122,7 +121,13 @@ stream across full gameplay coverage is data, whatever the tracer guessed.
122
121
 
123
122
  ## Labels round-trip through VICE
124
123
 
125
- ACME's `--vicelabels` output and regenerator2000's exported label files share one format, which
126
- `vice_symbols_load` / `vice_symbols_lookup` consume. Labels therefore flow
127
- disassembler → source → build → debugger without translation. `acme-build` emits the `.vs` file on
128
- every build; load it after each one and your checkpoints carry real names.
124
+ ACME's `--vicelabels` output is the `al C:xxxx .Name` format `vice_symbols_load` /
125
+ `vice_symbols_lookup` consume, so labels flow source → build → debugger without translation.
126
+ `acme-build` emits the `.vs` file on every build; load it after each one and your checkpoints carry
127
+ real names.
128
+
129
+ **The other direction — exporting the annotation store into that same format — is withdrawn as of
130
+ 2026-08-29, and no phase currently owns its return** (an earlier forecast naming a numbered phase
131
+ for it is superseded: that phase covered the ACME export oracle only). So a name discovered live
132
+ goes into the store with `anno_set_label_name` first (the store is the merge point) and reaches the
133
+ emulator only through a `.lbl` you produce yourself.
@@ -1,7 +1,6 @@
1
1
  # SID and CIA: music, effects, the RNG, input, timing
2
2
 
3
- Source: `.planning/RE-FINDINGS.md` § SID discovery and § CIA 6526 discovery (2026-08-01,
4
- **MEDIUM**, doc-derived) except where marked. Per-register bit detail lives in
3
+ Graded 2026-08-01, **MEDIUM**, doc-derived, except where marked. Per-register bit detail lives in
5
4
  `c64-memory-mapping`; this file carries the idioms and the order.
6
5
 
7
6
  ## SID — separating the player from the game logic
@@ -61,12 +60,11 @@ One that programs `$DC04-$DC07` and enables timer A runs its own timebase.
61
60
  - **Direct `$DC00`/`$DC01` polling is the norm, and it defeats `vice_keyboard_type`.**
62
61
  **Evidence: live, established on this project during recovery work. Confidence: HIGH. Cost: an
63
62
  afternoon.** Games and cracks bypass the KERNAL keyboard buffer and read the matrix directly.
64
- Assume it until shown otherwise, and drive input with `vice_keyboard_matrix` or the joystick
65
- tools instead. **`vice_keyboard_matrix` requires the fork backend** the binary monitor's
66
- `KEYBOARD_FEED` only injects PETSCII buffer text and cannot drive the raw matrix. On stock, use
67
- `vice_keyboard_type` / `vice_keyboard_petscii` when the gate reads the KERNAL buffer, or
68
- `vice_joystick_set` when it polls the matrix directly; buffer injection stays invisible to a
69
- program polling `$DC00`/`$DC01` itself.
63
+ Assume it until shown otherwise. **`vice_keyboard_matrix` is permanently unavailable** the
64
+ binary monitor's `KEYBOARD_FEED` only injects PETSCII buffer text and cannot drive the raw
65
+ matrix; see `docs/stock-hard-losses.md`. Use `vice_keyboard_type` / `vice_keyboard_petscii` when
66
+ the gate reads the KERNAL buffer, or `vice_joystick_set` when it polls the matrix directly;
67
+ buffer injection stays invisible to a program polling `$DC00`/`$DC01` itself.
70
68
 
71
69
  ## Finding input handling from the observable side
72
70
 
@@ -4,8 +4,7 @@
4
4
  call; read parameters off those. What the schemas cannot tell you is *which call to reach for
5
5
  first*, and that ordering is the whole value here.
6
6
 
7
- Curated from `.planning/RE-FINDINGS.md`'s tool-to-question entry (2026-08-01, doc-derived,
8
- **Confidence: MEDIUM** — the mapping is reasoned from the tool surface and this project's own
7
+ Curated 2026-08-01, doc-derived, **Confidence: MEDIUM** — the mapping is reasoned from the tool surface and this project's own
9
8
  usage, not measured). Individual rows that have since been exercised live are marked.
10
9
 
11
10
  | Question | Call |
@@ -14,13 +13,13 @@ usage, not measured). Individual rows that have since been exercised live are ma
14
13
  | What does the handler at this vector do? | `vice_disassemble` — the emulator's own decoder, not a dead listing |
15
14
  | Is this really the main loop? | `vice_checkpoint_add` + `vice_run_until` + `vice_registers_get` — fires once per frame ⇒ proven |
16
15
  | What code writes this? | `vice_watch_add` — finds **writers**. Best targets: `$D018`, VM+`$03F8`, `$D404` |
17
- | Whole-chip VIC-II/CIA state without the read hazards | `vice_vicii_get_state` / `vice_cia_get_state` (**both backends**) — prefer these over raw register reads |
18
- | Whole-chip SID state without the read hazards | `vice_sid_get_state` (**requires the fork** SID `$D400-$D418` is write-only in hardware and the binary monitor has no SID command; unrecoverable on stock) |
19
- | Decode sprite data | `vice_sprite_get` / `vice_sprite_inspect` (**both backends**) |
20
- | Find a known byte pattern | `vice_memory_search` (**both backends**) |
21
- | Carry labels across sessions | `vice_symbols_load` / `vice_symbols_lookup` (**both backends**) — ACME `--vicelabels` and regenerator2000 output share this channel |
22
- | Is the machine wedged, or did it stop itself? | `vice_diagnose` — five-state verdict with its evidence (the two backends' verdict sets differ by one; see `docs/stock-vice-parity.md` D-03). **Reachable and proxy-intercepted as of 2026-08-04** (verified live). Triage tree: `vice-wedge-triage` |
23
- | Replace a wedged instance | `vice_recycle` — destructive, requires a `reason`, and that reason is written into `.planning/incidents/` **before** anything is killed. The reason *is* the evidence record |
16
+ | Whole-chip VIC-II/CIA state without the read hazards | `vice_vicii_get_state` / `vice_cia_get_state` — prefer these over raw register reads |
17
+ | Whole-chip SID state without the read hazards | `vice_sid_get_state` **permanently unavailable**: SID `$D400-$D418` is write-only in hardware and the binary monitor has no SID command, so read-back cannot be recovered. Writes to those addresses still work fine over the memory-set primitive. See `docs/stock-hard-losses.md` |
18
+ | Decode sprite data | `vice_sprite_get` / `vice_sprite_inspect` |
19
+ | Find a known byte pattern | `vice_memory_search` |
20
+ | Carry labels across sessions | `vice_symbols_load` / `vice_symbols_lookup` — ACME `--vicelabels` emits the format they consume. The annotation store's own export into that format is **withdrawn as of 2026-08-29, and no phase currently owns its return** — an earlier forecast naming a numbered phase for it is superseded |
21
+ | Is the machine wedged, or did it stop itself? | `vice_diagnose` — five-state verdict with its evidence (one state is `monitor_held_elsewhere`, because this monitor serves exactly one client at a time). **Reachable and proxy-intercepted as of 2026-08-04** (verified live). Triage tree: `vice-wedge-triage` |
22
+ | Replace a wedged instance | `vice_recycle` — destructive, requires a `reason`, and that reason is written into `.c64-re-tools/incidents/` **before** anything is killed. The reason *is* the evidence record |
24
23
  | Read the restart epoch | **No tool does.** The proxy compares it around every forwarded call and raises drift itself; a value comes from that error or from `vice_diagnose` |
25
24
 
26
25
  ## Delegate rather than restate
@@ -30,18 +29,38 @@ usage, not measured). Individual rows that have since been exercised live are ma
30
29
  | What does address X mean? | the `c64-memory-mapping` skill — `node … lookup '$D018'`. **Do not restate its tables.** |
31
30
  | Is this byte original or cracker-changed? | the `c64-provenance-diff` skill |
32
31
  | A verified 64K image, or comparing two captures | the `c64-ram-capture` skill |
33
- | Traced disassembly with code/data separation | regenerator2000, via `vice-mcp r2000 export-asm`a recursive-descent disassembler with an auto-analyzer; verified live: its `--verify` run reassembled byte-identically through a real ACME for both a `.prg` and a flat 64K image (`.planning/phases/10-adoption-boundaries-automated-bootstrap-and-the-removal/evidence/10-verify-transcript.txt`) |
32
+ | Whole-program static disassembly with code/data separation | **`anno export-asm`**withdrawn 2026-08-29, returned 2026-08-31, settled by assembling the output with a real ACME and diffing the bytes against the input. That oracle is test-only, so the verb itself writes source and runs no assembler. For a single routine, read one explicit range at a time with `anno_read_region` / `anno_disassemble` (4096-byte cap per call, refused rather than truncated above it) and record what you verified with `anno_set_data_type` |
33
+
34
+ ## Runtime evidence versus the byte-derived guess
35
+
36
+ | Question | Call |
37
+ |---|---|
38
+ | Where the store's byte-derived block table (`anno_set_data_type`'s own ranges) disagrees with what the emulator was actually observed executing | **`anno evid-disagreements`** (also `anno_evid_disagreements`) — joins the typed ranges against the runtime-observed rows an `anno_evid_ingest` call already wrote, reporting disagreements first, agreement as a count only, and a never-observed count that is explicitly NOT evidence the address holds data |
39
+ | What evidence a store already holds, without re-running the program | `anno_evid_runs` — every run identity's observation count beside its denominator |
40
+ | Reset one run identity's evidence for a fresh re-measurement | `anno_evid_reset` — clears only that run identity's rows; pair it with `vice_memmap_zap` on the emulator side |
41
+
42
+ ## What blocks this program's code from being moved
43
+
44
+ | Question | Call |
45
+ |---|---|
46
+ | Which constructions block relocating, rebasing or stripping part of this program | **`anno hazard-report`** (also `anno_hazard_report`) — enumerates movement-hazard findings derived from decoded bytes alone (for example, a store or read-modify-write instruction whose literal target lands on another instruction's opcode or operand byte, changing what runs or what value is read on a later pass). Each finding carries its own detection mechanism and a detection-strength token. Reports and changes NOTHING: it never relocates, strips or rebases anything, and it never emits a flag a caller could act on as an automatic relocation |
47
+
48
+ **A region this report does not flag is undecided or unflagged, never certified safe to move.** Every checked
49
+ region reports one of exactly three outcomes, and only one of them means a construction was actually found
50
+ there — the other two both mean "nothing this report knows how to look for fired here," which is a fact about
51
+ the detectors, not a guarantee about the bytes. A store through a runtime-computed pointer into the code range
52
+ is a known, named miss: this report cannot see it, and its absence from the findings is not evidence that no
53
+ such construction exists. Use this alongside, never instead of, the runtime-evidence and provenance-diff
54
+ routes above and in the sibling skills — a region with no finding still needs a human decision before it is
55
+ moved.
34
56
 
35
57
  ## Three traps in this table
36
58
 
37
- **`vice_run_until`'s timeout is backend-qualified it has none on the fork, but stock bounds it
38
- (Phase 7, D-02).** On the fork, `cycles` is documented as *"not yet implemented"* and there is no
39
- `timeout_ms` either, so a run to an address the program never reaches has nothing to bound it and
40
- looks exactly like a wedged emulator; prefer `vice_checkpoint_add` + a bounded poll when the
41
- address is a hypothesis rather than a certainty. **Confidence: MEDIUM on the fork** — read off the
42
- schema, not reproduced. On stock, `timeout_ms` (default 30000, ceiling 600000) bounds the wait, and
43
- a timed-out answer says the machine is left halted rather than looking like a wedge — see
44
- `vice-wedge-triage` for the full triage judgement and its live evidence; do not restate it here.
59
+ **`vice_run_until`'s `timeout_ms` bounds the wait.** `timeout_ms` (default 30000, ceiling 600000)
60
+ bounds a run to an address the program never reaches, and a timed-out answer says the machine is
61
+ left halted rather than looking like a wedged emulator; prefer `vice_checkpoint_add` + a bounded
62
+ poll when the address is a hypothesis rather than a certainty see `vice-wedge-triage` for the
63
+ full triage judgement and its live evidence; do not restate it here.
45
64
 
46
65
  **`vice_diagnose` leaves the machine paused.** When it measures a cycle bracket it resumes the
47
66
  machine once or twice and then leaves it **paused** — resuming is your own next call. And a