Skip to content

The plan for this repository, in build order, and what it leaves out #98

Description

@iderex

This board holds a complete plan, and the tree it plans for has caught up with
part of it: 270 tracked paths at origin/main
341368b0bb71b6b984e1c8034f4a2d60032ccb72, against the three this sentence
named when it was written. Derive it rather than trusting the number:
git ls-tree -r --name-only origin/main | wc -l.
This issue is the way in. It says what the order is, why it is that order,
where the decisions everything else hangs off live, and what the plan
deliberately does not cover, so that a gap can be read as a decision rather
than as an oversight.

Do not trust the counts below for long. Derive them:

gh api repos/Flowfin/core/milestones --jq '.[] | "\(.title)\t\(.open_issues) open"'

The order, and why it is that order

Decisions first. Nothing in this repository is expensive to change except the
things everything else is built on, and those are exactly the things that get
decided implicitly by whoever writes the first file that needs them. The boundary
of what the core does, what it trusts and what it is built to survive, the error
vocabulary, the session model, the cache contract, the concurrency model and the
way the speed budget is measured are written down with their reasons before code
depends on any of them.

Then scaffolding and the gate, because a repository with no build and no test
command cannot accept the first contribution, and because two properties are
impossible to add later. Headless testability is one: a suite that grew up
assuming a display or an administrator does not become headless afterwards. The
other is warnings treated as errors, which costs nothing today and becomes a
backlog nobody pays down the moment there is code.

Then the layers in dependency order. Reaching a server and holding a session,
because everything else is a request. Then cache and the two normal absences,
because the published cold-start number is spent before the network answers. Then
artwork, which is where the tile wall is won or lost. Then what the core hands
over to be played, and the playback position that rides on the offline queue
built in the cache milestone.

Then the speed budget, instrumented, once there is something to measure. Then the
data locality position, made checkable rather than asserted. Then the client
contract and the suite that says whether a client met it. Then quality parity
with the gate on the sign-on plugin in this organisation, placed late because
several of its legs need code to exist before they mean anything. Then a first
release an operator can actually run.

Where the questions are

Every one of them was in #1, every one carries an answer written into that
issue, and #1 is closed as completed. So this paragraph sends a reader to a register of
answers rather than to a list of open questions, and no issue on this board is
waiting on one of them today.

The licence was the first entry and it was the reason the rest waited: every
issue that produces a file was downstream of it. It is answered, and the answer
is in the tree rather than only on the tracker - LICENSE-MIT and
LICENSE-APACHE, with
docs/decisions/0303-the-licence-the-core-is-offered-under.md carrying the
reasoning. The language, and what shared means, was the second, and
docs/decisions/0011-the-language-the-toolchain-and-the-binding-layer.md is
where that landed.

An issue that named an entry of #1 as its blocker names the answer it was
waiting for instead. What still blocks such an issue is not always another issue
on this board, and the three that name an entry do not agree. Read on
2026-09-06:

gh issue list --repo Flowfin/core --state open --limit 500 --json number,title,body \
  --jq '.[] | select(.body | test("entr(y|ies) [0-9, and]+of #1")) | "\(.number)\t\(.title)"' \
  | sort -n
78	Decide and publish the interface stability policy
88	Build and test against the oldest server surface the core claims to support
94	Build and publish the release artifacts, reproducibly

#78 waits on #76 and #94 on #87, and both of those are open issues here. #88's
other two named blockers are closed, and what holds it is an act rather than an
issue: its first produce item is a fixture set recorded from real servers, and
this tree carries the procedure for making one and no recording.

git ls-tree --name-only origin/main tests/recorded/
tests/recorded/README.md

So a blocker on this board is an issue, a decision or an act, and which of the
three a particular issue carries is read off that issue rather than off this
paragraph.

What this plan deliberately leaves out

No user interface, no platform packaging and no client. The kickoff put those out
of scope and this plan keeps them there.

No media decoding or rendering. The core hands over something playable and the
platform plays it. Every target has a hardware decoder, and a core that wrapped
them would be a media framework rather than a shared core.

No downloading media for offline viewing. Caching what was fetched is in scope,
because the kickoff names it. Keeping a film on a device is a separate feature
with its own storage, licensing and lifecycle questions, and adding it here would
decide those questions by accident.

No search, no user administration and no server management. Those are surfaces a
client may want and none of them is shared behaviour that drifts.

No support for the endpoints any server plugin adds. The core reaches the
server's own interface. Reaching a plugin's is a later question that should be
asked once there is a client to want it, and answering it now would put a
dependency on a plugin into a core that has no clients.

No answer to any entry in #1. The plan states the options and their costs and
stops there, and a count of the entries is not written here because it moves; #1
is the authority for how many there are.

No dates and no estimates. This board says what has to be true, in what order,
and how each thing is known to be done.

No requirement for a real server except where an issue's own body carries one,
and the set of those is derived rather than promised here. A title does not carry
it: #88's names no server and its first produce item is a fixture set recorded
from real servers, and #97 reaches the requirement through the probe in #92
rather than stating it. Read on 2026-09-06, and do not trust it for long:

gh issue list --repo Flowfin/core --state open --limit 500 --json number,title,body \
  --jq '.[] | select(.body | test("real server|real servers")) | "\(.number)\t\(.title)"' \
  | sort -n
88	Build and test against the oldest server surface the core claims to support
92	Build the probe an operator runs against their own server
98	The plan for this repository, in build order, and what it leaves out
104	Keep the recorded fixtures honest against a real server

Those three sit in M10, M11 and M2 rather than gathered at the end, so a
milestone does not say whether an issue needs one either.

Done when

The first release in M11 exists and an operator has run the probe against their
own server. Until then this issue stays open as the entry point to the board.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationplanning

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions