12 KiB
StarForth Physics Runtime — TASK_LIST.md
Read this first if you are an AI assistant (Claude, etc.).
0. PRELUDE FOR AI AGENTS (MANDATORY)
You are assisting Captain Bob on the StarForth project.
This codebase implements a physics-driven FORTH-79 VM with non-standard architecture.
Your job is to implement small, isolated tasks from this file — not to redesign the system.
0.1. Codebase Context
Primary files involved in this work include (paths may vary slightly):
src/vm.csrc/main.csrc/physics_runtime.csrc/physics_hotwords_cache.csrc/physics_metadata.csrc/physics_pipelining_metrics.csrc/doe_metrics.c(or equivalent)src/platform_time.c/platform_time.hsrc/log.c/log.hsrc/test_runner/...(test harness)
You must inspect existing behavior before changing anything.
0.2. Hard Rules
-
ONE TASK AT A TIME
- Only work on a single checkbox task from this file per session.
- Do not “helpfully combine” multiple tasks.
-
NO COMMITS WITHOUT APPROVAL
- You are not allowed to commit any changes.
- All changes must be presented as diffs or full files for Captain Bob to review first.
-
INCREMENTAL, TESTED CHANGES
- Every change must:
- Compile cleanly (no new warnings).
- Run existing tests that are relevant to the touched subsystem.
- If tests fail: STOP, report precisely what failed, and do not patch around it.
- Every change must:
-
DO NOT REWRITE ARCHITECTURE
- Do not:
- “Simplify” the design.
- Replace custom physics with generic algorithms.
- Introduce new dependencies.
- Convert C99 code to C++, Rust, Go, etc.
- This architecture is intentionally weird. Respect it.
- Do not:
-
KEEP CHANGES LOCAL
- Don’t refactor unrelated files “for style.”
- Don’t rename functions or structs unless explicitly required by a task.
- Don’t move code between files unless a task says so.
-
NO HIDDEN MAGIC
- All behavior must remain:
- Deterministic.
- Explicit.
- Transparent.
- No background threads, no async I/O, no “smart” runtimes unless explicitly specified.
- All behavior must remain:
-
WHEN IN DOUBT, ASK
- If you are unsure about:
- Semantics.
- Intent.
- Factor definitions for DOE.
- Interpretation of this file.
- Then: STOP and ask Captain Bob for clarification.
- If you are unsure about:
1. Working Rules (For Any Human or AI Helper)
- ALWAYS test each change independently.
- NEVER commit without Captain Bob’s explicit approval.
- NEVER batch multiple tasks into one commit.
- NEVER “refactor” outside the exact task.
- NEVER change VM semantics without written approval.
- If uncertain, STOP and ask.
- All tasks must compile with zero warnings (at existing warning level).
2. Immediate Stability Tasks (Do These First)
These are purely safety / clarity tasks. No behavior changes unless absolutely necessary.
- Add clarifying comments to physics-related code paths (heat, decay, window, prefetch) explaining intent, not implementation detail.
- Audit the word execution path in
vm.cfor:- Null checks on
prev_word,transition_metrics, and dictionary entries. - Safe handling of
word_idrange / bounds.
- Null checks on
- Verify that
rolling_window,pipeline_metrics, andexecution_heatpaths cannot dereference NULL or uninitialized pointers. - Add compile-time guards (
#if ENABLE_*) around physics features so they can be disabled without breaking the build. - Ensure DOE mode (
--doe-experiment) writes only the CSV line tostdoutas its final result (logs can exist but must not break CSV parsing).
3. Unified VM Signal & Wire Identification (Documentation + Light Scaffolding)
Goal: make explicit where the VM could emit signals, without fully implementing the event bus yet.
- In a new doc
PHYSICS_SIGNALS.md, list all potential signal points:- Execution signals:
- before execution
- after execution
- heat increment
- linear decay applied
- rolling window update
- prefetch attempt
- prefetch hit/miss
- transition recorded
- Temporal signals:
- heartbeat tick start/end
- heartbeat rate change
- inference cycle start/end
- window stabilized/unstable
- DOE / metrics signals:
- DOE run start
- DOE run end
- metrics snapshot taken
- Execution signals:
- Cross-reference each signal with its current location in code (file + function name).
- Confirm in the doc which signals are:
- MUST-HAVE
- HIGH-VALUE
- FUTURE / OPTIONAL
(No runtime changes yet; this is design + mapping only.)
4. VM Event Bus Foundation (Minimal, Non-Intrusive)
Goal: introduce a small, efficient event bus API without wiring it into everything at once.
- Add
vm_event_type_tenum in a new headervm_events.h:- Include only a minimal set to start:
VM_EVENT_HEAT_UPDATEDVM_EVENT_DECAY_APPLIEDVM_EVENT_WINDOW_UPDATEDVM_EVENT_PREFETCH_STATSVM_EVENT_INFERENCE_COMPLETEDVM_EVENT_TICK_RATE_CHANGED
- Include only a minimal set to start:
- Add
vm_event_tstruct invm_events.hwith:vm_event_type_t typeuint64_t timestamp_ns- A small tagged union for payloads (keep it conservative).
- Implement
vm_publish_event(VM *vm, const vm_event_t *ev)in a newvm_events.c:- For now: no queues, just a single optional callback hook.
- Add registration API:
void vm_set_event_listener(VM *vm, void (*listener)(VM *, const vm_event_t *));
- Write a simple test listener in the test harness that logs events when enabled.
Important: Do not wire every possible signal yet — just prove out the API.
5. Adaptive Heartbeat: Measurement Foundations
Goal: add pressure metrics without changing tick behavior yet.
- Identify and document in
PHYSICS_RUNTIME.mdthe signals that should contribute to “pressure”:- heat_rate (change in total heat over time)
- window_variance or window stability proxy
- prefetch_error_rate (1 - hit_ratio)
- stale_word_ratio (stale / total)
- Implement a small
physics_pressure_statestruct inphysics_runtime.c(or a new module) to hold:- last_total_heat
- last_tick_ns
- smoothed_pressure (Q48.16 or double)
- Add a function:
Q48_16 physics_compute_pressure(const VM *vm);- For now, just compute a simple weighted linear combination and log it.
- Ensure pressure computation is side-effect-free and can be called safely from
vm_tick().
No adaptive tick rate yet — just measurement.
6. Adaptive Heartbeat: Rate Control (Wired but Disabled by Default)
Goal: implement the math and the hooks, but keep behavior unchanged unless explicitly enabled.
- In the heartbeat/worker code, introduce:
uint64_t base_tick_ns;uint64_t min_tick_ns;uint64_t max_tick_ns;
- Implement a function:
uint64_t vm_compute_tick_interval_ns(const VM *vm);- Use:
- pressure metric
- clamp to
[min_tick_ns, max_tick_ns] - return
base_tick_nsif adaptive mode is disabled.
- Add a config flag (compile-time or runtime) to enable/disable adaptive heartbeat.
- When adaptive mode is enabled, call
vm_compute_tick_interval_ns()in the tick loop. - Emit
VM_EVENT_TICK_RATE_CHANGEDwhen the tick interval changes.
By default, keep adaptive mode OFF so tests remain deterministic until approved.
7. Feedback Loops Standardization (FL1–FL4)
Goal: Make the four core loops explicit and documented:
- FL1: Heat accumulation & decay
- FL2: Hotwords cache promotion
- FL3: Inference → decay slope tuning
- FL4: Inference → rolling window tuning / prefetch ROI
Tasks:
- In
PHYSICS_RUNTIME.md, create a section “Feedback Loops (FL1–FL4)” describing:- Inputs
- Internal state
- Outputs
- Where in code the loop is implemented.
- Add inline comments in the corresponding C functions labeling them:
/* FL1: Heat accumulation & decay *//* FL2: Hotwords cache promotion *//* FL3: Inference → decay slope *//* FL4: Inference → window tuning */
- Ensure FL1–FL4 each have at least one optional
vm_publish_eventcall (behind a compile-time or runtime flag). - Confirm that enabling/disabling physics features does not leave loops partially active.
8. DOE Subsystem Overhaul
Goal: Make DOE runs clean, deterministic, and data-rich.
8.1 CLI and Mode Handling
- Confirm
--doe-experimentflag is handled incli.c/main.c. - Add an option
--doe-headerto print CSV header row once. - Ensure DOE mode:
- Resets all physics metrics
- Does not start the REPL
- Exits with status 0 on success
8.2 Metrics Extraction
- In
doe_metrics.c(or similar), define a clearDoeMetricsstruct with named fields:- workload_duration_ns
- cpu_temp_delta
- cpu_freq_delta
- total_heat
- hot_word_count
- stale_word_count
- effective_window_size
- prefetch_attempts
- prefetch_hits
- prefetch_hit_ratio
- decay_slope_q48
- tick_interval_ns (if adaptive enabled)
- any other core fields currently in the CSV row
- Implement:
DoeMetrics metrics_from_vm(const VM *vm, uint64_t workload_duration_ns, int32_t cpu_temp_delta, int32_t cpu_freq_delta);
- Implement:
void metrics_write_csv_header(FILE *fp);void metrics_write_csv_row(FILE *fp, const DoeMetrics *m);
- Ensure CSV field order is stable and documented in a comment.
9. Metrics & Logging Hygiene
Goal: Make logs and metrics compatible and non-chaotic.
- Standardize log prefixes for physics/inference/DOE messages.
- Ensure DOE CSV is single-line per run, no stray prints.
- Verify logs go to stderr when in DOE mode, and CSV to stdout (or vice versa, but clearly separated).
- Add an option to disable all logs except errors during DOE.
10. Future Pub/Sub & Multi-VM (Design-Only for Now)
Goal: Prepare for pub/sub and multi-VM sync without implementing it fully.
- Create
PUBSUB_DESIGN.mddocumenting:- VM event bus as the internal publisher
- Potential external subscribers:
- MamaForth
- BastardForth
- Monitoring/visualization tools
- Message types for future:
- heat sync
- entropy deltas
- inference parameter sync
- tick-rate harmonization
- Sketch how multiple VMs could register into a global registry and share physics signals.
11. Testing & Validation
- Add unit tests for:
- event dispatch with a dummy listener
- pressure metric computation
- tick interval computation (with mock pressure)
- Add regression tests for:
--doe-experimentmode:- produces exactly one CSV line per run
- no crashes, no leaks
- Add a simple script (documented, not necessarily committed) to:
- run N DOE runs
- append to a CSV file
- verify consistent column count.
12. Documentation
PHYSICS_RUNTIME.md— overview of physics components and feedback loops.PHYSICS_SIGNALS.md— list of signals and where they live in the code.PUBSUB_DESIGN.md— future-facing multi-VM/pub-sub design.- Update any existing high-level docs to mention:
- adaptive heartbeat
- physics runtime
- DOE integration as first-class citizens.
13. Final Integration Checklist
- Adaptive heartbeat compiles and runs with the feature disabled by default.
- Event bus compiles and runs even with no listeners.
- DOE mode works end-to-end and is documented.
- No regressions in existing tests.
- All new behavior is behind flags and does not surprise users.
- Captain Bob has reviewed and approved each major step before any commit.
Remember:
You are not here to make it “normal.”
You are here to help build something no one’s seen before — one tiny, deterministic step at a time.
Sec 1 & 2 done.