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.
- Landings come before the pair. Task 18's landing rule refuses any repo with both
README.mdanddocs/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 whendocs/index.mdis absent. docs-lint(c) exempts the umbrella's owndocs/1-Using-marolaanddocs/2-Building-marola, which §7'sagents_repos_check.shitself requiresAGENTS.mdto name (task 1'sumbrella_owns_its_numbered_dirs_ok). Rule (d) fails in every repo until its landing, so each repo gates ondocs-lintin its last content row (9, 15, 22, 24, 25, 31, 32).- 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.ymlis 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. - marola-ml adopts the
api-docsworkflow before the pair (task 11). Otherwise its pdoc vanishes from the site after task 18, and the app's4-reference_apilink to it fails Appendix A's broken-link rule. - 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.
- 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.
- Anchors fixed in advance. Task 26 cites
#local-first-integration-pattern, the heading task 27 must keep, so the devkit'sv0.3.1does not wait on the umbrella's rewrite. - 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.
- Cross-repo rows stack per repo.
stack startbases a branch on that repo's previous MIP-0074 branch; thedepends oncolumn is the real graph across repos, and a row whose dependency is in another repo starts once that PR has merged. - 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'tagent-readyuntil the person doing it is assigned.