Skip to content

MIP-0074 tasks

Ordered delivery of MIP-0074 as stacked PRs (/marola-devkit:mip-tasks, stack). Branch mip-0074/<k>-<slug> in the repo the row lands in; rows of one repo stack on that repo's previous row, and merge bottom-up with stack restack after each squash-merge. Each row's delivers cell starts with the repo its PR lands in (MIP-0070's spelling, read by tasks-to-issues). §n and Appendix letters are the MIP's. Every content row ends with docs-lint on the files it touched (Appendix D's last step), run from the devkit tag that ships it, before that repo gates on it.

# slug delivers tests (must exist before the PR) depends on
1 docs-lint marola-devkit — §7's stale-content check as a docs-lint tool on the flake's PATH: rules (a)–(e) over README.md and docs/**/*.md, prose and fences, inline URLs excepted; recipes resolved against the repo's justfile and .devkit/devkit.just; the checkout marker in prose and as a fence's first line; docs/MIPs/** and SPLIT.md allow-listed; (c)'s two docs/N-…-marola patterns skipped in the umbrella (Decision 2). Not yet called by any quality-other docs-lint --self-test with §7's twelve cases (recipe_defined_ok … escaping_link_fails) plus umbrella_owns_its_numbered_dirs_ok. nix flake check –
2 api-docs-workflow marola-devkit — §5.2's reusable api-docs.yml: on a PR it runs the caller's just api-docs <out> as a check and commits nothing; on a default-branch push it runs it and calls a new api-docs-push tool, which force-pushes one orphan commit (the output, the source sha in its message) to api-docs with GITHUB_TOKEN, contents: write, concurrency: api-docs. docs/workflows.md gains the workflow's row api-docs-push --self-test against a local bare repo: first push creates a one-commit branch naming the sha; a second push replaces it (still one commit). actionlint. One call from a scratch repo: a PR run (no push) and a main run (git ls-remote … api-docs output), links in the PR –
3 redirects-404 marola — the redirect machinery, before any page moves: theme.custom_dir: overrides, mkdocs/overrides/404.html forwarding Appendix B's four prefixes longest first (path, query, hash kept), mkdocs-redirects==1.2.2 in the Dockerfile with the redirects plugin and an empty redirect_maps, validation: anchors: warn. scripts/docs_redirect_check.js (node, flake.nix:47), in the style of marola-site's redirect_check.js docs_redirect_check.js: each 404-forward row of Appendix B, /repos/marola-ml/api/x beats /repos/x, query and hash kept, an unmatched path not forwarded. just docs green with the plugin on mkdocs 1.6.1 (§8's untested claim, settled first) –
4 docs-guard marola — §5.7 step 2: mount_at_root fails unless marola-app has docs/index.md and nothing outside docs/1-Using-marola/ and docs/2-Building-marola/, so today's aggregator refuses the new app layout instead of deploying it prepare-docs.sh --self-test: old_aggregator_rejects_new_app_layout (no docs/index.md → fails; a docs/1-design.md → fails) and today's app tree still passes. just docs green –
5 link-rewrite-core marola — scripts/lib/doc_links.py (stdlib), not yet called: Appendix A's in-repo rows over inline links, reference definitions and HTML href/src, code spans and fences untouched; docs/ prefixes, bare docs/, docs/index.md refused, directory links and the docs/adr/ exception, images, ../README.md from docs/**, Python-Markdown toc slugs for README anchors, root-absolute and ../ escapes refused doc_links.py --self-test: Appendix E's rewrite_docs_and_dot_docs, rewrite_keeps_anchor, bare_docs_link_to_index, docs_index_link_fails, dir_link_to_index, dir_link_without_index_fails, image_md_and_html_rewritten, image_outside_docs_fails, docs_page_parent_readme_to_index, readme_anchor_emoji_slug, root_absolute_fails, parent_escape_fails, reference_definition_and_html_href, code_span_and_fence_untouched. ruff check –
6 link-rewrite-github marola — doc_links.py, the rows that need a repo and a <sha>: exclude_docs paths, files and directories outside docs/ to blob/tree at <sha>, own-repo GitHub links on any branch pinned to <sha>, other URLs untouched, a path missing at <sha> refused, umbrella-only marola-<name>/… to 5-Repos/ site paths or that repo's blob, MIPs/x.md and docs/MIPs/x.md to 6-MIPs/ doc_links.py --self-test adds excluded_path_to_blob_at_sha, code_file_to_blob_at_sha, code_dir_to_tree_at_sha, own_github_main_link_pinned, other_repo_github_link_untouched, absolute_urls_untouched, missing_path_fails, umbrella_submodule_docs_to_site_path, umbrella_submodule_code_to_blob, and mips_link_to_6_mips (§7's one case per Appendix A row). ruff check 5
7 api-docs-branch-fetch marola — scripts/fetch-api-docs.sh learns §5.3's branch fetch (git fetch --depth 1 https://github.com/marola-dev/<repo> api-docs, unpacked under a given dir, a missing branch a notice). The release-asset path stays wired until task 18 fetch-api-docs.sh --self-test against a local bare repo: branch present → unpacked; branch absent → notice, exit 0; the release-asset cases unchanged –
8 site-links-check marola — scripts/site_links_check.py (stdlib, no network): every https://docs.marola.dev/… href in generated-docs resolves; --old-sitemap <file> resolves each <loc> as a page, a redirect stub or a 404-forward prefix read from overrides/404.html. docs.yml saves the live sitemap before the build and runs it after site_links_check.py --self-test (page, stub, forward, a dropped URL fails). Run on today's just docs output against the 2026-10-02 sitemap: green, output in the PR. actionlint 3
9 devkit-landing-release marola-devkit — Appendix D: README becomes the landing, merging docs/index.md (retired) and fixing the stale mkdocs line (README.md:27), the false "the site mounts this" claim and the missing tools (workflow-runners, pr-label-nlp, backfill-pr-labels); docs/workflows.md → docs/4-reference_workflows.md (move + revise: no monorepo wording, MAROLA_CROSS_REPO_PAT); CHANGELOG.md at the root (v0.1.0 → v0.3.0); quality-other runs docs-lint; the AGENTS.md docs paragraph (skeleton, link rules, checkout marker). Tagged v0.3.0 just quality green with docs-lint in it. nix flake check. nix run github:marola-dev/marola-devkit/v0.3.0#docs-lint -- --self-test from outside the repo. Today's prepare-docs.sh green with this tree (output in the PR) 1, 2
10 app-api-docs marola-app — devkit pinned to v0.3.0 (flake input, every workflow @v…/devkit-ref, marketplace ref, together); just api-docs (sbt doc + strip_external_scripts.py, output under scala/); a caller of the devkit api-docs.yml. The release job stays until task 35 §7 "API docs": the PR check runs the generator; a deliberately broken generator on a scratch branch fails it (run link). After merge, git ls-remote https://github.com/marola-dev/marola-app api-docs shows a one-commit tip naming the merge sha 9
11 ml-api-docs marola-ml — the same as task 10 with pdoc under python/ (before the pair, §5.7 step 2) As task 10, against marola-ml 9
12 site-landing marola-site — README becomes the landing to the shared shape (§5.2), merging docs/index.md (retired); the image-bump steps get their one home in a new docs/3-development.md (site.yml, the site-data layout, health checks, i18n bundling, the MIP: trailer), and AGENTS.md links it instead of repeating them docs-lint green on README and docs/. Today's aggregator still green with this tree (prepare-docs.sh output in the PR) 9
13 corpus-landing marola-corpus — README rewritten to the shared shape: status line (sources not yet human-verified), "marola" → marola-app, marola-ml added as a consumer; docs/index.md merged in and retired; docs/3-development.md (the reproducible tarball, release, bumping both consumers, trying a change from an app checkout, with the checkout marker) As task 12, for marola-corpus, including the marked foreign recipes 9
14 ml-landing marola-ml — README merged with docs/index.md (retired) and rewritten to the shared shape; the gate and re-baselining move to docs/3-development_benchmark-gate.md. The api-docs/python/ link waits for task 25 As task 12, for marola-ml 9
15 oods-landing marola-oods — README rewritten: a status line instead of PR-number history, the tree labelled "planned (MIP-0056)"; checks → docs/3-development.md; docs/index.md retired; AGENTS.md docs paragraph; devkit pinned to v0.3.0 and quality-other runs docs-lint (its only row) just quality green with docs-lint. Today's aggregator still green with this tree 9
16 devkit-mount marola — §5.3's devkit source: repos_manifest.sh accepts source: flake-lock (that value only); prepare-docs.sh reads nodes.marola-devkit.locked.rev with python3 and fetches it with git fetch --depth 1 into .tmp/docs-sources/; repos.yml adds marola-devkit; devkit pinned to v0.3.0 (flake, workflow refs, marketplace ref); docs.yml/ci.yml path filters add README.md, flake.lock, scripts/prepare-docs.sh, scripts/lib/repos_manifest.sh. Mounted at today's repos/ spelling until task 18 prepare-docs.sh --self-test: source_flake_lock_accepted, source_other_value_rejected, devkit_fetched_at_locked_rev. just docs green and repos/marola-devkit/index.html in the output 4, 9
17 app-landing marola-app — the app half of §5.7 step 3's pair: README rewritten to the shared shape (MCP and chat server, "no Telegram loop yet", contracts from docs/index.md, the badges arriving from the umbrella); docs/index.md retired; EFFECTS-MAP → docs/1-design_effects.md (drop "see git history"), SCALA3-JDK-REVIEW → docs/2-libraries_scala3-jdk.md, API → docs/4-reference_api.md (no just docs, relative api-docs/scala/…, ml's pdoc by absolute URL); RUN-LOCALLY, TELEGRAM-SETUP, ARCHITECTURE leave the app (task 18 receives them); AGENTS.md:34 and docs paths; .claude/rules/scala.md paths docs-lint green on README and docs/. The umbrella with task 4 and this head fails prepare-docs.sh (the guard working, output in the PR). Task 18's CI green against this head. Merged back to back with task 18 (Decision 3) 10
18 docs-pair marola — the umbrella half of the pair, §5.3's table: prepare-docs.sh mounts every repo at 5-Repos/<name>/ and the umbrella at the root with docs/MIPs/ at 6-MIPs/, the README as root index.md, the landing rule (no README, or README plus docs/index.md, fails), Appendix A through doc_links.py, build.json and the landing's sha line, mount_at_root and mount: deleted; fetch-api-docs.sh called by prepare-docs (branches under <mount>/api-docs/), the release-asset path and its docs.yml step removed; mkdocs.sh's index check on the build dir; not_in_nav (6-MIPs/*.tasks.md, screenshots); every plugin row of Appendix B in redirect_maps. Moves: docs/index.md → docs/MIPs/CANDIDATES.md, 3-Working-on-the-repo/ → 3-Ways-of-working/, GEMINI-CODE-ASSIST and SELF-DOCUMENTING → 4-Research-and-plans/; FABLE_REVIEW and ROADMAP retired. Received from the app as they are, links fixed only: 1-Using-marola/RUN-LOCALLY.md, TELEGRAM-SETUP.md, 2-Building-marola/ARCHITECTURE.md. Links in docs/MIPs/ to moved pages updated. AGENTS.md "Writing a doc is a deploy" and doc paths, .claude/rules/docs.md; MIP-0070 §5.5 gets "superseded for docs by MIP-0074". Gitlinks: every repo at its post-landing main, marola-app at task 17's head, re-pinned to its squash commit before merge prepare-docs.sh --self-test: readme_and_docs_index_fails, missing_readme_fails, mount_key_rejected, umbrella_readme_is_root_index, build_json_records_shas, plus every earlier case. fetch-api-docs.sh --self-test without the release path. just docs green with both api-docs branches fetched. site_links_check.py --old-sitemap green. docs_redirect_check.js. After deploy (§7): each plugin row's old URL names the new one in http-equiv and the new URL is 200; each 404-forward URL forwards; /5-Repos/marola-devkit/ is 200 3, 4, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17
19 adr-index-docs-site marola — prepare-docs.sh generates adr/index.md (number, title, status) and refuses a hand-written one; 3-Ways-of-working/DOCS-SITE.md from DEV-FLOW §8, CI-CD's docs row and prepare-docs' header: mounts, landing rule, link rules, skeleton, ADR template (Appendix C), preview, redirects. CI-CD's docs row becomes a link prepare-docs.sh --self-test: adr_index_generated, handwritten_adr_index_fails. just docs green 18
20 app-reference marola-app — docs/4-reference_cli.md (every flag and mode in Main.scala incl. --benchmark, --site, --areas, --site-out; the four MCP tools; /health, /ask), docs/4-reference_config.md (every MAROLA_* read in AppConfig.scala; the embedder choice and the corpus's embedder table), .env.example rewritten to the app's placeholders; README docs links added docs-lint green. Every --flag in Main.scala and every MAROLA_ name in AppConfig.scala appears in the pages (the grep loop and its empty output in the PR). .env.example names only variables the code reads 17
21 app-development-libraries marola-app — docs/3-development.md: testing from RUN-LOCALLY §7 (golden spec, fixtures and re-recording, parser and oods/ fixtures, E2E, coverage), image tags, compose profiles and native build from §10, observability from §11 (no just mlflow-ui), the ten workflows and release assets from the umbrella's CI-CD, secrets and cost; docs/2-libraries.md from FUTURE-WORK §2, §3, §5, §6 (each library and pinned tool, why, version, alternatives); docs/adr/0001-three-sbt-modules.md from §7.3 docs-lint green, (a) included. Every workflow file named exists. just docs (umbrella, this head) renders 5-Repos/marola-app/adr/ with the generated index 17, 19
22 site-pages marola-site — docs/1-design.md (files, board → markers, CSP and no-third-party rule), docs/1-design_chat-widget.md (from RUN-LOCALLY §5.2's widget half), docs/2-libraries.md (vendored Leaflet, no build step), docs/4-reference.md (areas.json fields, tile policy from ARCH §7, board schema pin); AGENTS.md docs paragraph; devkit pinned to v0.3.0, quality-other runs docs-lint just quality green with docs-lint. Each areas.json field in the reference matches the file (list in the PR) 12, 18
23 using-marola marola — section 1 in one PR: 1-Using-marola/LIMITATIONS.md from ARCH §8–9, wording kept (§6), those sections stubbed; ASK-THE-OCEAN-NOTES.md (RUN-LOCALLY §5.1), CHAT-AND-MCP.md (§5.2: run --serve-chat, expose it, connect an MCP client; the widget → marola-site), DOCKER.md (§10: run the published image); RUN-LOCALLY.md rewritten (§1–4, 4.1, 5, 6, 12) for a reader with an app checkout, MAROLA_LLM_PROVIDER dropped, moved-from note, heading stubs for §5.1–5.2 and §7–11, §8 merged into DEV-FLOW §1; TELEGRAM-SETUP.md moved-from note, "preparation for Phase 1" banner, absolute PHASES link. Flags and variables link the app's 4-reference_* just docs and site_links_check.py green; docs-lint green on 1-Using-marola/. Every old #anchor of RUN-LOCALLY, TELEGRAM-SETUP and ARCH §8–9 resolves (list from the 2026-10-02 pages, in the PR). Every sentence of ARCH §8–9 present in LIMITATIONS (diff in the PR). Each RUN-LOCALLY command run once from an app checkout, outputs in the PR 20, 21, 22
24 app-design marola-app — docs/1-design.md from ARCH §3, §3b (uses 1–2), §5b with a regenerated module tree; docs/1-design_heuristics.md from ARCH §8–9's internals, linking back to LIMITATIONS; docs/1-design_integrations.md from ARCH §5a, §5c–§5g and §5h's retrieval half (paths and statuses revised); docs/4-reference.md from ARCH §7 (data sources); README docs links complete; quality-other runs docs-lint just quality green with docs-lint. The module tree matches find core local cli -name '*.scala' (diff in the PR). Each integration's cited path exists at this head (list in the PR). just docs (umbrella, this head) green 20, 23
25 ml-pages marola-ml — dspy/README.md → docs/3-development_prompt-compile.md (the dead ARCHITECTURE link, core/… paths, just mlflow-up qualified) and finetune/README.md → docs/3-development_finetune.md (just run/e2e/quality-other qualified or removed, resources from the tarball), each leaving a 3-line pointer; docs/1-design.md (three jobs, none on the request path), docs/2-libraries.md, docs/3-development.md (environment, GPU, self-hosted runner, cost and who may run what, publishing with the marola-sea-v1 one-off, pins); README links api-docs/python/; AGENTS.md docs paragraph; quality-other runs docs-lint just quality green with docs-lint, (a) and (b) included on the moved text. just docs (umbrella, this head) resolves 5-Repos/marola-ml/api-docs/python/ 11, 14, 18
26 devkit-pages marola-devkit — docs/1-design.md (layout, how tools find the umbrella), docs/3-development.md (self-test first, devkit-ci, the release rule), docs/4-reference_tools.md (every tool on the flake's PATH, from DEV-FLOW §9, ISSUE-FLOW's command table and each --help), docs/4-reference_config.md (all 14 MAROLA_* variables), docs/4-reference_{hooks,plugin,runners}.md (DEV-FLOW §7's mip-solve-perpetual mechanics, AGENT-SKILLS §1.1, the skills and agents summarised); the mip skill drops the FABLE_REVIEW citation (:21) and cites the system ARCHITECTURE's #local-first-integration-pattern by URL (:28, :66); CHANGELOG.md entry. Tagged v0.3.1 docs-lint green. claude plugin validate .. Every tool flake.nix puts on PATH, every MAROLA_ name in scripts/, and every skill, agent and hook appears in the pages (grep loops, empty output in the PR) 9
27 building-marola marola — section 2 in one PR: 2-Building-marola/REPOS.md (§5.1: the three layers, the routing table's only copy, the producer → consumer diagram and the artifacts-and-pins table, no repo reads another's tree, the invariants; ARCH §5h's cross-repo half); SPLIT.md (why, the decisions and what they beat, what moved where, timeline #521 → #574…#599, what was given up); ARCHITECTURE.md rewritten as the system page (vision, the request pipeline across repos, the local-first integration pattern under that exact heading, the target Telegram architecture, a one-line data-sources summary, cloud options), moved-from note and heading stubs, task 23's stubs kept, §11 retired; AGENTS.md's "The repos" table becomes one link; scripts/agents_repos_check.sh in quality-other agents_repos_check.sh --self-test: table_row_fails, pin_name_fails, link_only_ok. just quality and just docs green. Every old ARCHITECTURE #anchor resolves (list in the PR); #local-first-integration-pattern exists (task 26 cites it). docs-lint skips SPLIT.md as an allow-listed record 18, 24
28 ways-of-working marola — section 3 in one PR: devkit pinned to v0.3.1; WORKING-ACROSS-REPOS.md (§5.1's list) and NEW-REPO.md (the adoption checklist); DEV-FLOW §1–6 revised (umbrella paths, cross-repo PRs → WORKING-ACROSS-REPOS), §7 → the devkit's 4-reference_plugin, §8 → DOCS-SITE, §9 → the devkit's 4-reference_tools; ISSUE-FLOW's "The commands" → the devkit's tools page; CI-CD split (umbrella workflows, org secrets, the self-hosted rule and manual settings stay; :36-72 becomes one line per repo linking its 3-development; :138 fixed to marola-app); AGENT-SKILLS rewritten as "skills across the org" (§1.1 → the devkit's plugin page, §2.2 retired); PHILOSOPHY.md → docs/3-Ways-of-working/PHILOSOPHY.md (app paths as docs.marola.dev links; just context-mip at justfile:145 and repomix-instruction-mip-review.md re-pointed); CONTRIBUTING.md rewritten into docs/3-Ways-of-working/CONTRIBUTING.md, the root file a short pointer until task 34; AGENTS.md's "where a change belongs", "submodule mechanics" and doc paths link the new pages just docs green; site_links_check.py resolves the devkit pages at the new pin and each repo's 3-development link. just context-mip MIP-0074 still packs PHILOSOPHY (output size in the PR). Each NEW-REPO.md step names the file or setting it changes, checked against marola-oods in the PR 12, 13, 15, 19, 21, 25, 26, 27
29 research-and-plans marola — section 4 in one PR: FUTURE-WORK split (§1, §4, §8–§11 stay, revised; §2, §3, §5, §6 removed now that task 21 holds them; §7 retired); GEMINI-CODE-ASSIST rewritten (no private-repo premise, the Besom plan as research); AGENT-FRAMEWORKS-SURVEY, AGENT-STACK-SURVEY, AWESOME-AGENTIC-ENGINEERING and SKILLS link app code absolutely just docs green. docs-lint green on 4-Research-and-plans/ 21
30 landing-and-root marola — the landing and the root pages: README and README.pt-BR.md, split-driven changes only (decision 3: "workspace" → "umbrella", the repo table links each 5-Repos/ page, the lines-of-code, coverage and Scala/JDK/Ollama/MCP badges removed since task 17 carries them); CLAUDE.md "workspace" → "umbrella"; docs/MIPs/CANDIDATES.md rewritten (one row per candidate, absolute links where the page is a repo's, the FUTURE-WORK duplicate dropped); PHASES.md revised (a status line per phase with its MIP, app references absolute); MIPs/README.md:4 → /marola-devkit:mip just docs green; the root index.html is the README and the sidebar reads index · PHASES · 1 … 6; site_links_check.py green; mip_graph.py --check green. git diff --stat shows no README change beyond the split-driven ones 17, 18
31 umbrella-cleanup-lint marola — corpus's .claude/skills/eli5/ moves in (paths through the submodules); TODO_FL.md, docs/superpowers/ and .gemini/styleguide.md retired; quality-other runs docs-lint just quality green with docs-lint over the whole umbrella. The eli5 skill loads in an umbrella checkout and each path it cites exists (list in the PR) 23, 27, 28, 29, 30
32 corpus-pages marola-corpus — docs/1-design.md (format, chunking), docs/4-reference.md (per-document source and verification); knowledge/README.md cut to a format reminder, its embedder table removed (now in the app's config reference); .claude/skills/eli5/ deleted (task 31 holds it); corpus-doc revised (its index and ask steps need an app checkout); AGENTS.md docs paragraph; devkit pinned to v0.3.0, quality-other runs docs-lint just quality green with docs-lint. Every knowledge/*.md has a row in 4-reference.md 13, 20, 31
33 org-dotgithub .github (new) — human: create marola-dev/.github. Then the org-default CONTRIBUTING pointer, SECURITY and CODE_OF_CONDUCT (org URLs, no "one-person project"), profile/README.md gh api repos/marola-dev/marola-ml/community/profile lists the org's CONTRIBUTING, SECURITY and CODE_OF_CONDUCT (output in the PR) 28
34 root-health-retire marola — §5.7 step 6: the root SECURITY.md, CODE_OF_CONDUCT.md and CONTRIBUTING.md pointer deleted; README and README.pt-BR.md health links re-pointed The community profile of marola-dev/marola still lists all three (output in the PR). just docs and just quality green 31, 33
35 app-release-retire marola-app — §5.7 step 5: the api-docs.tar.gz job removed from release.yml; the ml-resources asset stays actionlint. The next tag's release has no api-docs.tar.gz and still has ml-resources (run link) 18, 24
36 ml-release-retire marola-ml — the same for marola-ml's release.yml actionlint. The next tag's release has no api-docs.tar.gz 18, 25
37 mip-implemented marola — MIP-0074 flipped to Implemented with every PR number and the summed Cost: §7 "Done": docs-lint green in all seven repos (one just quality line each in the PR), the landing is the umbrella README, §7's after-deploy checks re-run and pasted. mip_graph.py --check 26, 32, 34, 35, 36

Decisions

Decisions 1–4 were accepted by the maintainer on 2026-10-02 and are written into the MIP's §5.7 and §7.

  1. Landings come before the pair. Task 18's landing rule refuses any repo with both README.md and docs/index.md, and all seven have both today. So the landings of devkit, site, corpus, ml and oods (tasks 9, 12–15) land first; each is safe on today's aggregator, which already copies a README when docs/index.md is absent.
  2. docs-lint (c) exempts the umbrella's own docs/1-Using-marola and docs/2-Building-marola, which §7's agents_repos_check.sh itself requires AGENTS.md to name (task 1's umbrella_owns_its_numbered_dirs_ok). Rule (d) fails in every repo until its landing, so each repo gates on docs-lint in its last content row (9, 15, 22, 24, 25, 31, 32).
  3. The pair is tasks 17 and 18, merged back to back, and it moves URLs only. Task 18's CI builds against task 17's head (PR builds read the gitlinks), then task 17 merges, task 18 re-pins to its squash commit and merges. Between the two merges docs.yml is red and the site stays on its last good deploy. The umbrella receives RUN-LOCALLY, TELEGRAM-SETUP and ARCHITECTURE with links fixed only; every Appendix B URL is served from task 18 on, so the org pages and rewrites (23, 27–30) change content, never URLs. The pair is reviewed on prepare-docs and the config files; moves and deletions are excluded, as in MIP-0070's Decision 5.
  4. marola-ml adopts the api-docs workflow before the pair (task 11). Otherwise its pdoc vanishes from the site after task 18, and the app's 4-reference_api link to it fails Appendix A's broken-link rule.
  5. Umbrella content ships one PR per section (maintainer, 2026-10-02: bigger reviews accepted): 1 Using (23), 2 Building (27), 3 Ways of working (28), 4 Research (29), the landing and root pages (30). The build tasks (3–8, 16, 18, 19) stay small and separate.
  6. Content flows one way, and each file is rewritten once. App material that task 18 receives in the umbrella's copies (ARCH §3, §5, §7, §8–9's internals; RUN-LOCALLY §7, §9–11) is written into app pages first (20, 21, 24), and only then removed from the umbrella page with a stub (23, 27, 29). ARCHITECTURE is touched by 18 (received), 23 (§8–9 stubbed) and 27 (the rest, keeping 23's stubs); DEV-FLOW §1 by 23 (RUN-LOCALLY §8 merged in) and 28 (the rest, keeping §1's merged text). The app's heuristics page (24) links LIMITATIONS, so section 1 (23) precedes it and section 2 (27) follows it.
  7. Anchors fixed in advance. Task 26 cites #local-first-integration-pattern, the heading task 27 must keep, so the devkit's v0.3.1 does not wait on the umbrella's rewrite.
  8. Each repo's README grows with its pages. The landing rows link only pages that exist; each later page row adds its own line, so no row rewrites a README another row just wrote.
  9. Cross-repo rows stack per repo. stack start bases a branch on that repo's previous MIP-0074 branch; the depends on column is the real graph across repos, and a row whose dependency is in another repo starts once that PR has merged.
  10. Human-only steps: creating marola-dev/.github (33), and the after-deploy checks (18, 37), which need the live site. Each is named in its row, so the issue isn't agent-ready until the person doing it is assigned.