Cross-project dependencies — toesnail × .mw × collAIb
Cross-project dependencies — toesnail × .mw × collAIb
How the three projects’ progress depends on each other, and how strongly. This is the tracking artifact
for the parked collAIb × toesnail × .mw scoping session (TODO id:921b). Canonical copy lives here in
toesnail (the hub of the relationship); review and update it at that session.
The three nodes
- toesnail (this repo) — the theoretical-physics content / research. The use-case.
.mw(mathematical-writing) — a future literate format/VS-Code tool keeping prose + computation + machine-checked proofs mutually consistent.- collAIb (
~/src/collaib) — a PWA where a local LLM watches the document and offers brief, non-intrusive side-panel observations (“calm co-author over your shoulder”).
Dependency edges
A → B = “A’s progress needs / leans on B”. Strength: none / weak / medium / strong. Blocking? = does
B being absent stop A today?
| From → To | Strength | Blocking? | Nature of the dependency |
|---|---|---|---|
toesnail → .mw |
weak | no | By design (decision D2): toesnail is authored now in plain markdown with verify: markers; .mw would make the verification workflow ergonomic, but toesnail progresses fully without it. Deliberately decoupled. |
.mw → toesnail |
strong | no (it’s a requirements dep, not a build dep) | toesnail is .mw’s north-star / acceptance corpus: it drives what .mw must support (tiered SymPy/Lean verification of real derivations, the handle model, staleness across prose↔proof). .mw’s design is validated against toesnail content. |
| toesnail → collAIb | weak | no | collAIb could provide a live in-editor UI surfacing verify: rigor-debt while authoring — a nice-to-have. toesnail works with grep -rn 'verify:' today. |
| collAIb → toesnail | none | n/a | collAIb is a general writing tool; toesnail is just one possible document it could observe. |
.mw ↔ collAIb (content layer) |
weak — RESOLVED (siblings) | no | Resolved at the scoping session (2026-06-15, id:921b). They do not integrate directly; both are independent consumers of toesnail’s plain-text marker/handle/tier schema (toesnail owns it, in CONVENTIONS.md). Share data, not UI — a shared UI component across the PWA/VS-Code platform line was rejected. |
.mw ↔ collAIb (runtime layer) |
PARKED — not decided | no | Three couplings flagged as questions to the owners, not decisions toesnail imposes (see “Parked runtime questions” below). Only one coherent direction emerged: .mw owns a headless protocol-driven verification core; collAIb’s PWA could be an alternate selectable front-end. Parked ≠ chosen — none is committed; revisit on the tripwire below. |
Picture
requirements / north-star (STRONG)
.mw ◀─────────────────────────────────── toesnail
│ ▲
│ overlapping authoring-surface │ live verify: assist UI
│ (MEDIUM, UNRESOLVED) ◀───┐ │ (WEAK, optional)
▼ │ │
collAIb ─────────────────────┘────────────────┘
- toesnail is the source of requirements but is operationally independent of both tools (weak outgoing edges) — it can keep progressing in plain markdown regardless of either tool’s state.
.mwand collAIb are tools that serve the toesnail use-case.- The
.mw↔ collAIb edge is resolved at the content layer (siblings) and parked at the runtime layer (see below) — settled at the 2026-06-15 scoping session (docs/meeting-notes/2026-06-15-1351-mw-collaib-frontend-scoping.md).
Parked runtime questions (routed to the tool owners — questions, not decisions)
The scoping session found only one coherent integration direction and parked it as three orthogonal questions, each routed to the owner repo (toesnail does not decide these):
- collAIb PWA as an alternate front-end to
.mw. Precondition.mwshould want anyway: a front-end-agnostic, protocol-driven verification core (generalize the persistent-Lean-server dispatch into a front-end⇄core protocol). Tension:.mwexplicitly names “web-hosted runtime” a non-goal — relaxing it is.mw’s owner’s call. - collAIb’s LLM observer as an optional tier-0 plugin inside
.mw— advisoryverify:-marker suggestions only, never a machine-checked badge (so it can’t pollute the SymPy/CrossHair/Lean tiers). - Sibling contract (= the resolved content-layer edge): always true regardless of 1 & 2.
Tripwire to revisit 1 & 2: when liveness becomes a real need (collAIb flagging a marker stale on edit,
pre-save) OR when .mw ships a headless front-end⇄core protocol seam.
Witnessed instances (real evidence for the parked scoping, id:921b)
- 2026-06-15 —
/relay humanResogram triage exercised the.mw → toesnailSTRONG edge live. Owner ratified three SymPy-located discrepancies; applying them produced exactly the two things.mw/collAIb exist to automate:- Prose↔computation staleness. Adopting the exact
cvalform changed a claim and orphaned the surrounding prose still citing the now-removed constantc— a human had to hand-detect it and open a REVIEW_ME box. This is verbatim.mw’s id:dae5 differentiator (shipped the same day): editing a definition marks the claim AND the prose citation that desugars from it STALE, unrelated prose untouched. Thecvalcase is a ready-made acceptance witness for that DAG — now realized in.mwasexamples/resogram_cval.mw+tests/test_resogram_cval_staleness.py(.mwid:b7b1): the differentiator passes on this real content, and an xfail(strict) RED-specs a gap the episode exposed —stale_after_editcatches a changed definition ($e$citation + downstream average go stale) but NOT a dangling citation (the removed constantcorphans its$c$prose citation). Authoring that witness also surfaced a second, unrelated.mwfix (id:d80d): the eval/DAG namespace treated every SymPy-callable name as a function, so the physics variablebetaresolved to SymPy’s Beta function (int * FunctionClass). Fixed by a call-position rule (a name is a function only where applied,name(…)), sobeta/gamma/zetaare usable symbols. → real dogfooding moves the tool, not just validates it. - verify→verified re-pin cascade. Correcting the
edot/cvalsource left the verify instruments + pinnedtest_verify.shverdicts + attestations stale; re-deriving them was deferred to “next review” by hand..mw’s eval-core + staleness would re-run the verification fragment and flip the badge automatically (toesnail’s ownid:04bbstaleness-checker is the plain-markdown stopgap for this). - collAIb tripwire HIT. The parked runtime Q2 (collAIb LLM observer as an optional tier-0 advisory
plugin) and the “live verify: assist UI” edge both describe precisely what would have surfaced (1)
at edit time, pre-save — “this paragraph still references
c, which your edit removed.” This is a concrete instance of the revisit-tripwire (“liveness becomes a real need”).
- Prose↔computation staleness. Adopting the exact
Current tool-capability map & the two-tier detection proposal (2026-06-15)
Grounded snapshot of what each sibling can do for toesnail today (read from the repos 2026-06-15, after the Resogram energy-chain episode), and the proposal that fell out of it. Meeting task queued for next session — see TODO id:d8bf. This is design analysis, not a committed plan.
.mw today (v0.3.0) — the HARD / deterministic tier
- Usable now, headless library: parser + SymPy evaluator + content-addressed cache + a dependency-DAG
with 3-state staleness (PENDING/PROVEN/STALE).
stale_after_edit(old, new)returns the stale fragment set. - Proven on this content:
examples/resogram_cval.mw+tests/test_resogram_cval_staleness.pypass — the differentiator works on the real Resogram episode (editesol→ its inline$e$citation + the downstreamēaverage flag stale; unrelatedyuntouched). - Caveats: (1) No Markdown importer → can’t lift
physics/Resogram.mdlosslessly; using it means a hand-maintained.mwmirror (double-entry — the D2 decoupling tax; cheap for one section, not repo-wide). (2) No preview / no Lean / no dispatcher (all deferred HARD). (3) Dangling-symbol gapxfail id:b7b1: it keys on changed definitions, not removed symbols — so it would NOT have caught thec-removal orphan (the origin of this episode). Owner design call pending in.mw, blocking a merge there.
collAIb today (v0.2.0) — the SOFT / advisory tier
- Runnable PWA, observer loop live: local-LLM (Ollama/OpenAI-compatible) streams brief observations on a 2s-idle debounce. Works now.
- But: watches only its in-browser Tiptap buffer — no filesystem access, no verify-marker
awareness, no diff-aware “you removed
c” check wired. So it cannot watchResogram.mdtoday; the only current path is copy-paste a section for generic prose feedback (low value for physics-specific needs). - The 80%-built valuable use:
change-tracker.js(detects deleted spans) +observation.js(typed, confidence-thresholded, exact-substring-anchored observations) already exist and are tested but unwired. The tripwire use-case (“flag the dangling-cat edit time, pre-save”) needs file-I/O + a prompt tweak + wiring those two — a ~2–3 day feature build (the parked runtime Q; tripwire HIT this episode, see above).
The synthesis: two complementary detection tiers on the same commit-diff
The episode’s manual hunt split cleanly into what each sibling automates:
| HARD tier (deterministic) | SOFT tier (advisory) | |
|---|---|---|
| tool | .mw DAG (stale_after_edit) |
collAIb’s observer brain (prompt + local LLM) |
| catches | changed-definition staleness (esol→ē) |
dangling refs (c), exposition, “asserted-not-shown” |
| usable today as | headless library (needs a .mw mirror) |
headless script (needs prompt + Ollama) |
| output | machine-checked stale-set | advisory notes (never a badge) |
Proposal — a relay-aware commit-hook (NOT yet decided; meeting topic id:d8bf)
Both tiers fire on the commit diff, emit findings into REVIEW_ME / inline 🚧 callouts, and the owner
responds with the **re** (status:) vocabulary — the full detect → respond loop, automating most of this
session’s manual hunt. Key realization: you don’t need either sibling’s heavy shell — not .mw’s importer
nor collAIb’s PWA file-I/O. You need .mw’s DAG as a library (= toesnail’s deferred id:04bb staleness
checker) and collAIb’s brain as a headless diff-observer script. toesnail’s git-commit workflow (not
live-typing) makes the commit-hook the right trigger, not an editor.
“Relay-aware” = the hook must NOT fire/interfere during relay executor or pool worktree commits (they
commit in worktrees outside the repo tree; the hook would either double-run or fight the integrator). Gate it
on: not inside a relay worktree, no live lease held, or an explicit skip env flag. Open design questions for
the meeting: pre-commit vs post-commit vs post-merge; the .mw-mirror double-entry cost vs waiting for an
importer; soft-tier noise control / confidence threshold; and whether id:b7b1 (dangling-symbol detection)
should be routed to this soft tier rather than .mw’s deterministic core (this episode argues yes). Weigh
against the observe-before-preventing heuristic — this episode is N=1; the hook is partly its own logger.
What to watch
- Keep toesnail’s outgoing edges weak on purpose — if toesnail ever requires
.mwto make progress, the decoupling decision (prior D2) has been violated; revisit deliberately, don’t drift into it. The commit-hook proposal (id:d8bf) must preserve this:.mw/collAIb stay optional assists, never a gate. - If this map proves useful, mirror a one-line pointer to it from
.mw’s and collAIb’sCLAUDE.md(not yet done — observe-first; do it when the relationship is confirmed stable).
2026-07-02 Fable consulting cross-dive: a full CODE/TODO/PROSE classification of every triad + satellite edge (chidiai, zkm, collAIb spikes, leAIrn2learn, Diplomarbeit), a meeting-order plan, and a proposal (P6) to extend THIS map + resolve the hub ambiguity lives at
mathematical-writing/docs/meeting-notes/2026-07-02-1000-fable-consulting-grand-truth-triad.md. It also found one live twin-drift instance (collaib id:f68b’s gate id:47d4 shipped 2026-06-25, unannotated).