codeberg4s roadmap

The single source of truth for what is done and what is next. Every commit that completes a line ticks its box here. Endpoint-level coverage is tracked separately, in docs/API_INVENTORY.md.

Gate names match PLAN.md §7.

Phase 0 — Bootstrap · Gate G0

Phase 1 — Recon and foundation · Gate G-R, Gate G1

Phase 2 — Cross-cutting hardening · Gate G2

Phase 3 — Endpoint waves · Gate G3 per wave

Priority order is value-weighted, per PLAN.md §7. Shared models are owned by the first wave that needs them; later waves consume rather than redefine (docs/LEDGER.md).

That is 439 of 439 in-scope operations, 100 % (docs/API_INVENTORY.md §0). Gate G3-final is met. The 67 operations not implemented are the ones PLAN.md §0 puts out of scope for v1 — admin, activitypub and package.

Per-wave definition of done: models from golden fixtures · codec round-trips · both rails · Scaladoc stating the error contract · inventory checkbox flipped · coverage thresholds hold. (CRAP and CPD thresholds are part of this definition on paper only until those tools are proven — docs/CONSTITUTION_MAPPING.md.)

Phase 4 — Release engineering · Gate G4

Distance to 0.1.0

PLAN.md §10 defines done. Measured against it, honestly:

Definition-of-done clause State
All in-scope endpoints on both rails with documented error contracts 439 / 439, 100 % (docs/API_INVENTORY.md §0) — every one on both rails with a Scaladoc error contract
verify.sh green Yes, both modes. Default run: format, lint, zero-warning compile, 3,658 unit tests, boundary check, coverage. --with-slow adds duplication and CRAP and also passes
Coverage per §6.1 (≥ 90 % line / ≥ 85 % branch on domain+core+codec) Enforced and asserted against a fresh report by scripts/coverage-gate.sc: domain 100.00 % / 100.00 %, core 96.59 % / 92.48 %, codec 95.20 % / 91.47 %
Mutation ≥ 80 % Runner proven, no score produced — the figure is unproven — see Phase 4
Zero CRAP > 30 Yes: 2,217 methods measured, worst 28.0. Its complexity input is a documented proxy, so read it as a ranking
CPD clean No — 363 duplication groups at 40 tokens. The gate passes because it fails on an increase over that recorded number, not because the duplication is gone. A real finding about the code; docs/LEDGER.md names most of them
Acceptance features + Gherkin mutation clean Dormant by decision — docs/CONSTITUTION_MAPPING.md
Published to Maven Central Configured and MIMA wired, but nothing published, so there is still no baseline to compare against
README quickstart works against live codeberg.org Samples are checked against the source signatures by hand. CodebergLiveSmokeSuite exercises the same calls against codeberg.org under CODEBERG_IT=1, but nobody has run the README itself
Mapping doc, ADRs, inventory, provenance current Yes, as of this revision

The endpoint surface is done. What is left is evidence, not code. Two clauses are genuinely unmet — the mutation score does not exist, and the codebase carries 363 duplication groups that the gate records rather than forgives — and two more are met only by hand: the README's examples are checked by a person rather than by mdoc, and nothing has been published, so MIMA has nothing to compare 0.1.1 against until the 0.1.0 tag is on Central.

Out of scope for 0.1.0

Per PLAN.md §0: OAuth2 token acquisition flows (pre-obtained tokens only), ActivityPub federation, admin endpoints, attachment streaming above 50 MB, and Scala.js / Native cross-builds. The Gherkin acceptance pipeline is dormant — see docs/CONSTITUTION_MAPPING.md.

The 50 MB line is now enforced rather than merely written down: CodebergConfig.maxDownloadBodyBytes defaults to 50 MiB and a body past it is TransportCause.ResponseTooLarge, non-retryable. Textual responses have their own, smaller bound at maxResponseBodyBytes.