Documentation Guide
How this repository's documentation and planning content is organised β where to look for existing content, and where to put new content.
Status legend (used throughout the design docs below): β Implemented β exists in code today Β· π§ Planned β designed, not yet built Β· π¬ Research β exploratory / v2.
How planning works
Planning content lives in five places with deliberately non-overlapping jobs:
| Place | Job |
|---|---|
docs/design-philosophy/engineering-hypotheses.md |
Our own falsifiable claims β what we assert the engineering will achieve, the threshold that decides it, and what would falsify it. Not design (that is roadmap/ or architecture/) and not NGED-derived requirement (that is background/): a claim we are on the hook for, and a natural Network Innovation Allowance (NIA) deliverable. One page; append tests, never renumber them. |
| GitHub (issues + the OCF Project board) | The complete, ordered task list β including quick tweaks and non-code tasks β plus all discussion. Fine-grained prioritisation lives only in GitHub. Epics map 1:1 to the roadmap milestones; dependencies are recorded as blocked by issue relationships. |
docs/roadmap/ |
Design depth: What we plan to build and why. The milestone arc and inter-plan dependencies are recorded here; fine-grained task-level ordering is not. |
docs/techniques, background, architecture, ml_experimentation, live_service |
What is already built β design (architecture/) and operational how-to (ml_experimentation/, live_service/) alike. These pages are where content moves to from docs/roadmap/ after implementation. |
studies/ (not published) |
Throwaway code that answered a question once. Kept, and held to a lower standard than the rest of the repository: no maintenance, no backwards compatibility, never run in production. A study whose findings are cited in docs/ has to merge, so a reader who doubts a number can re-run the code that produced it. The machinery a study calls is tested, in packages/studies/; the study's own arms, charts and write-up are not. studies/README.md states the tier in full. |
plans/ (repo root, not published) |
At most one file per branch: the implementation plan for the work in flight on that branch, written before any code is touched and deleted when it merges. One worktree per branch is what keeps it to one file. Usually empty on main. |
Relationship between docs/roadmap/ and GitHub: Every substantial π§ plan in the docs/roadmap/
folder has a GitHub issue, and every dependency stated in docs/roadmap/ exists as a blocked by
link on GitHub β but GitHub freely contains small issues with no counterpart here in the docs. (π¬
research ideas are exempt from GitHub until they are promoted to a milestone.) The litmus test for
needing a design doc in docs/roadmap/: does it take more than a few sentences to explain?
When a piece of work ships, its design content moves out of roadmap/ to its permanent home β
and the roadmap page shrinks; when a page's last π§ item ships, the page is deleted. That permanent
home splits along a why vs. how line: architecture/ holds system design β the decisions and
rationale, written once and rarely re-read step-by-step β while
ml_experimentation/ and live_service/
hold operational how-to β step-by-step recipes for running what's already built, one per area (ML
backtesting vs. the live production service). Each architecture/ design page names its how-to
counterpart (and vice versa) in a "See also" section β e.g. ML Orchestration
Design β ML Experimentation, and
Production Deployment β Design β Setting up the live
service on AWS. A page is a candidate for splitting along this line when it
mixes the two β design rationale followed by a runbook with literal commands. The docs/roadmap/
folder therefore contains only design for work that is not yet implemented, and is never a
mirror of the code. Because roadmap pages are deletable, code must never link into roadmap/ β
instead, code docstrings link to the durable sections (design-philosophy/, techniques/,
architecture/, background/, ml_experimentation/, live_service/) instead. The methods
behind these plans β differentiable physics, learned encoders, the disaggregation-evaluation
protocol β live in Techniques for exactly this reason: they survive the
roadmap items that apply them.
Docstrings, READMEs and docs/ hold three different jobs
The section above covers the pages under docs/. Docstrings and package READMEs are documentation
too β mkdocstrings renders every module listed in docs/api/<package>/index.md onto the published
site β so the same question applies to them β which home an argument belongs in β and the answer
comes from asking what the reader already has in their hand when they arrive. Deciding a home is not
a licence to delete the other copies: the bar for cutting prose out of code is excessive
duplication, not duplication.
A docstring holds everything that dies when the symbol dies: units, preconditions, invariants,
failure modes, and the argument for this particular implementation. The test is whether the prose
would go with the function if the function were deleted. round_to_significand_bits in
delta_store.precision is the model β its Veltkamp-splitting proof and the preconditions that make
the identity hold are meaningless away from that function, and they are exhaustive on it. A reader
arrives here from an editor, a traceback, or the API page, already holding the symbol.
A package README holds what a reader needs in order to decide whether to open the package at
all: what the package owns, what it deliberately does not own and which neighbouring package does,
and one line per module pointing down into the docstrings. The test is whether the sentence would
still be true if every function inside were reimplemented. delta_store's README is the model, both
for drawing the boundary β contracts owns each table's logical shape, delta_store owns its
physical layout β and for deferring rather than repeating.
docs/ holds the arguments that outlive any one symbol, or that span more than one package: the
design principles, the degradation ladder, end-to-end measurements, and the operator how-to. The
test is whether the argument references two or more packages, or would survive a rewrite of the
module it is nearest to.
Links run in one direction, so the three homes cannot loop. Docstrings and READMEs link up
into docs/ for rationale that spans the package. Pages under docs/ link down to the API page
for authoritative signatures and semantics, and do not restate them, because mkdocstrings has
already published them.
A measurement has one home β the place the decision it justifies is made β and that copy is the
one kept up to date. The choice to round power_fcst to a 13-bit significand is made in
delta_store.power_forecasts, so the measured effect of that choice belongs in that module's
docstring. Another page may restate the figure where its own reader needs it, as
Performance does, but should say where the decision lives so a later
change knows what else to update. Restating a measurement is how it goes stale: a fold's row count
appeared in three places, and when the fold gained series every copy became wrong at once. Some
measurements belong on the docs/ page alone, because no single symbol owns them β peak memory
across a cross-validation fold, say.
Which place do I use?
| I want to⦠| Go to |
|---|---|
| Decide what to work on this morning | The GitHub Project board (complete, ordered) |
| Discuss / challenge a plan | GitHub issue comments (fold conclusions back into the roadmap page) |
| Think through a substantial design | A docs/roadmap/ page, reviewed via PR |
| Communicate direction to NGED / leadership | The milestones (published site) |
| Give an AI coding tool context on the broader plan | docs/roadmap/ (plus gh for live task priorities) |
| Understand a method (differentiable physics, encoders, β¦) | docs/techniques/ |
| Understand the principles the whole design answers to | docs/design-philosophy/ β the portable argument, readable without knowing the codebase |
| Understand why an existing system works the way it does | docs/architecture/ β the local rationale, recorded next to each component |
| State β or check β a measurable claim about the engineering | docs/design-philosophy/engineering-hypotheses.md. Add a test with a threshold and a resolution point; never renumber an existing one |
| Record an assessment of work we decided not to do | docs/architecture/, with a Status: banner saying so β e.g. Why Dagster, not Airflow?. Not docs/roadmap/, which implies intent to build and is deleted on ship. |
| Learn how to run or operate an existing system, step by step | docs/ml_experimentation/, docs/live_service/ |
| File a quick tweak or a non-code task | A GitHub issue only β no markdown needed |
| Plan how to implement an issue, before writing code | plans/<branch-name>.md on that issue's branch (one file per branch, deleted on merge) |
| Explain what a function guarantees, what a caller must not assume, or why this implementation | The symbol's docstring β everything that would die with the symbol. Rendered onto the API page by mkdocstrings |
| Explain what a package is for, where its boundary against neighbouring packages falls, or what its modules are | The package README β the contents page for the docstrings rendered beneath it. Never restate a docstring here; both land on one page |
Keep the code behind a number a docs/ page quotes |
studies/ β merged so the measurement stays auditable, under a lower standard than production code |
| Share machinery between two studies, or pin behaviour that fails silently | packages/studies/ β the tested half of that tier |
| Record a measured number | Wherever the decision it justifies is made β that copy is the one kept up to date. Another page may restate the figure where its reader needs it, but should name where the decision lives |