mova-nautilus-work
The groupant beside tools/nautilus/src/work.rs in the Mova repository: what the code computes, what it never does, how to go back from its outputs, its invariants, cost and checks.
Facts
Implementation material. A Mova code model describes this code at one source revision: partial models, finite checks and their stated scope. It is not a reviewed general exposition, and its labels are shown as written, never raised.
Components
| component | label | where |
|---|---|---|
| approximant | partial | Forward approximant |
| ast | partial | syntax.json |
| composition | partial | Composition |
| cost | partial | Cost |
| descriptant | present | Descriptant |
| invariant | partial | Invariant |
| tests | finite evidence | tests |
Obernants
The typed relations around the forward model: the behaviour complement (what the code never does), the reverse reconstruction (every input compatible with an output) and specialised views.
| id | type | label | where |
|---|---|---|---|
behavior_complement | behavior_complement | partial source derived model | behavior_complement |
reverse_reconstruction | reverse_reconstruction | partial source derived model | reverse_reconstruction |
Model text
model
mova-nautilus-work
Descriptant
The bounded standing loop: Job trait (next, native, validate), Loop::step (stop/resume, pick, native or ask, validate into a review-only proposal, journal), pacing, limit stop, run with STOP, resume, summary; DictJob over layer tens. Source: tools/nautilus/src/work.rs.
Forward approximant
step: refuse a state inside frozen paths -> stopped until resumed -> closed keys from journal -> job.next -> native Done -> journal native | Unsure -> pacing -> teacher::submit -> held on error | limit -> stopped | answer -> job.validate -> proposals/<id>.txt + proposed | rejected.
Invariant
Every closed item is journaled once; a stop holds until a later resumed line; admitted stays 0.
Cost
One job.next scan plus at most one question per step.
Composition
Parent: nautilus. Parent: nautilus. Used by mova-turtle with LessonJob. State: work.jsonl, proposals/, work.lock.
behavior_complement
Never writes sources, courses or assessment files; never admits; never reads held-out items (job responsibility); never asks two questions in one step or before min_gap_secs. Evidence status: source-derived model with finite checks, not a proof.
reverse_reconstruction
work.jsonl recovers every item's outcome, reason, question id and answer hash; proposals hold the validated text. No unique inverse is claimed.
Epoch 2026-11-04
First model, written with the source; no prospective prediction is claimed beyond the checks.
Epoch 2026-11-04 (pool)
Loop.ledger (a job's shared ledger.jsonl) and member: seen = journal closes plus ledger closes and reservations (an unreserved line reopens a reservation the terminal never took); a question is reserved in the ledger before it is asked, its hash checked against the ledger (asked by any member: held), a limit holds the item in the ledger at once; Job::open counts open items; Job::describe goes into proposed lines; DictJob takes part of parts. Red control: ledger ignored (the moved job asks again).
Epoch 2026-11-04 (pool)
Loop.ledger (a job's shared ledger.jsonl) and member: seen = journal closes plus ledger closes and reservations (an unreserved line reopens a reservation the terminal never took); a question is reserved in the ledger before it is asked, its hash checked against the ledger (asked by any member: held), a limit holds the item in the ledger at once; Job::open counts open items; Job::describe goes into proposed lines; DictJob takes part of parts. Red control: ledger ignored (the moved job asks again).
Epoch 2026-11-04 (senses)
Job::native_proposal and Job::learn (defaults: none); the loop writes <id>.native.txt, names it in the closing event and lets the job learn (the sense store); an unsent hold (no session) is journaled without closing once and retried when the terminal is ready (ledger: unreserved + unsent), a second closes; seen() treats older holds by their reason. DictJob: items of batch asked words keyed <layer>:<word>+…, numeric keys of earlier tens still close their rows; draft_task/draft_validate with picks, same, new:, restatements and absent lines; summary counts native proposals. Red controls: unsent retry removed; junk length removed.
tests
Checks
Command: cargo test --manifest-path tools/nautilus/Cargo.toml --offline --locked with MOVA_OCTOPUS_TEST_MODEL=$MOVA_DATA/download/0/0.4/en.bin (15 unit + 2 English tests; two identical runs on 2026-11-04).
Negative controls 2026-11-04 (each red, restored): no operator-word check; no terminal-id check; a limit not stopping the loop; stats drafting instead of reading. These are finite fixtures; no teacher or model was called; not a proof.
Pool epoch (2026-11-04): cargo test --release with the 0.4 en.bin, 26 unit + 2 English tests, two identical runs; red controls in the pool, improve and sources tests (each red, restored). Finite fixtures, not a proof.
2026-11-04 (senses): cargo test --release (0.4 en.bin), tools/nautilus 37 unit + 2 English tests, two identical runs; tools/turtle 9 + 2 pass. 2026-11-04 (senses): dictionary_job_plans_natively_and_asks_in_batches, earlier_tens_stay_done, the_store_fixes_a_sense_once_for_every_layer, an_unsent_question_is_retried_once (red control: a crash is held at once). Red: unsent retry removed, junk length removed, restatement gate removed.
This page in Markdown → https://md.groupants.elamur.ai/free/en/mova/tools/nautilus/src/work.rs.groupant/