@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.
- package/README.md +1 -1
- package/THIRD-PARTY-NOTICES.md +26 -0
- package/bin/cli.mjs +18 -7
- package/package.json +6 -4
- package/skills/acme-build/SKILL.md +83 -33
- package/skills/acme-build/scripts/acme.mjs +159 -64
- package/skills/acme-build/template.a +1 -1
- package/skills/c64-disk-access/SKILL.md +156 -0
- package/skills/c64-disk-access/scripts/c1541.mjs +569 -0
- package/skills/c64-memory-mapping/SKILL.md +419 -23
- package/skills/c64-memory-mapping/scripts/driver.mjs +1 -1
- package/skills/c64-petcat/SKILL.md +87 -0
- package/skills/c64-petcat/scripts/petcat.mjs +221 -0
- package/skills/c64-program-recon/SKILL.md +497 -92
- package/skills/c64-program-recon/references/control-flow.md +12 -15
- package/skills/c64-program-recon/references/graphics.md +1 -1
- package/skills/c64-program-recon/references/observation-hazards.md +18 -16
- package/skills/c64-program-recon/references/reconstruction.md +11 -6
- package/skills/c64-program-recon/references/sound-and-input.md +6 -8
- package/skills/c64-program-recon/references/tool-selection.md +37 -18
- package/skills/c64-program-recon/scripts/packer-finding.mjs +709 -0
- package/skills/c64-program-recon/templates/memory-map.template.md +27 -13
- package/skills/c64-provenance-diff/SKILL.md +43 -8
- package/skills/c64-provenance-diff/scripts/diff-images.mjs +9 -6
- package/skills/c64-provenance-diff/scripts/recovery-schema.mjs +20 -8
- package/skills/c64-ram-capture/RELEASES.json.example +17 -0
- package/skills/c64-ram-capture/SKILL.md +147 -46
- package/skills/c64-ram-capture/scripts/compare.mjs +2 -2
- package/skills/c64-ram-capture/scripts/derive-transients.mjs +575 -0
- package/skills/c64-ram-capture/scripts/dump-artifacts.mjs +3 -3
- package/skills/c64-ram-capture/scripts/mcp-module.mjs +174 -0
- package/skills/c64-ram-capture/scripts/project-paths.mjs +1 -1
- package/skills/c64-ram-capture/scripts/releases.mjs +1 -1
- package/skills/c64-ram-capture/scripts/vsf-slice.mjs +147 -0
- package/skills/c64-ram-capture/scripts/watch-loads.mjs +19 -13
- package/skills/c64-ram-capture/templates/capture-record.template.md +44 -4
- package/skills/c64-ram-capture/transients/README.md +136 -0
- package/skills/routine-queue-walker/SKILL.md +365 -0
- package/skills/routine-queue-walker/scripts/completeness-report.mjs +463 -0
- package/skills/vice-wedge-triage/SKILL.md +104 -97
- package/skills/c64-provenance-diff/scripts/diff-images.test.mjs +0 -665
- package/skills/c64-ram-capture/scripts/d64-parse.mjs +0 -243
- package/skills/c64-ram-capture/scripts/d64-parse.test.mjs +0 -243
- package/skills/c64-ram-capture/scripts/dump-artifacts.test.mjs +0 -133
- package/skills/c64-ram-capture/scripts/test-corpus.mjs +0 -75
- 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
|
-
|
|
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 (
|
|
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
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
|
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` (
|
|
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
|
-
|
|
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
|
-
|
|
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).
|
|
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
|
-
|
|
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
|
|
88
|
-
|
|
89
|
-
in hardware and the binary monitor has no SID command
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
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`
|
|
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
|
|
110
|
-
`vice_keyboard_petscii` when the gate reads the KERNAL buffer, or
|
|
111
|
-
the matrix directly instead; either way, buffer injection is
|
|
112
|
-
`$DC00`/`$DC01` itself, so a matrix-polling gate must be driven by
|
|
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**
|
|
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
|
|
126
|
-
`
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
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
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
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`
|
|
18
|
-
| Whole-chip SID state without the read hazards | `vice_sid_get_state`
|
|
19
|
-
| Decode sprite data | `vice_sprite_get` / `vice_sprite_inspect`
|
|
20
|
-
| Find a known byte pattern | `vice_memory_search`
|
|
21
|
-
| Carry labels across sessions | `vice_symbols_load` / `vice_symbols_lookup`
|
|
22
|
-
| Is the machine wedged, or did it stop itself? | `vice_diagnose` — five-state verdict with its evidence (
|
|
23
|
-
| Replace a wedged instance | `vice_recycle` — destructive, requires a `reason`, and that reason is written into `.
|
|
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
|
-
|
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|