OSS Knowledge Base · Docs

Process & cost

The project is built by one person directing AI agents. Trust does not come from reading more AI output; it comes from specifications with numbered acceptance items, tests that were seen failing first, an independent AI verifier, machine gates in CI, and runtime checks. The same discipline keeps the cloud bill inside the platform's included allowances.

Spec-driven development

Every feature starts as a spec in docs/specs: intent, a worked example on real data, a simplification review, and numbered acceptance items. There are 26 specs; 17 are marked Traceability: enforced. The workflow is written down in docs/process/workflow.md.

  1. Intent (human): an observable outcome.
  2. Assertions: numbered items such as D34 or DOC4, each with precondition, action, observable result and evidence. A spec must cover the happy path, failure and retry (at least as many items), budget (with a measured value and a committed command) and observability.
  3. Decision: an ADR when a choice crosses features (docs/architecture/decisions).
  4. Slice: the smallest end-to-end change, tests first.
  5. Gates: local checks, then CI, then Dev, then Prod.
  6. Runtime: health fields and freshness are the final judge.

The simplification review comes before any design is accepted, in order: question every requirement, delete, simplify, shorten the verification cycle, automate last.

Traceability

Acceptance IDs are the join key from spec to test to pull request to runtime check. bun run check:traceability fails when an item in an enforced spec has no test whose name contains its ID (check-spec-traceability.ts). Test-plan tables in the specs are generated from the same case files the tests iterate, and bun run check:test-plan fails when they drift (render-test-plan.ts), so the table a human reviews is the data the tests run.

Evidence rules

CI/CD and releases

.github/workflows/ci.yml runs typecheck, the traceability and test-plan gates, the build, unit, integration and end-to-end tests on every pull request.

EventResult
Pull requestCI only; nothing is deployed
Push to mainafter every job passes: Dev Pages and the Dev publisher, then end-to-end tests against the deployed Dev site
Tag vX.Y.Z reachable from mainProd Pages and the Prod publisher, from the exact verified build

Tags are never moved or reused; a rollback redeploys an earlier tag (docs/operations/release.md). v0.3.0 failed CI and deployed nothing; v0.3.1 (2026-10-19) is the first Prod release with live daily data. A generated status board of every spec is published on every push (Spec 020).

The R2 Class A incident

R2 bills two request classes: Class A (writes and lists, $4.50 per million after 1 million a month) and Class B (reads, $0.36 per million after 10 million). A conditional write that fails its precondition is still Class A (Spec 008).

Budgets

The account is on the Workers Paid plan; the design keeps each meter inside the plan's included amount, and every job charges a ledger before it spends (runbook).

MeterIncludedBudgeted use
Workers AI neurons10,000 a daydigest 5,000 + embedding job 2,500 + search queries 1,000 = 8,500, leaving 1,500
R2 Class A1 million a monthabout 19 thousand a month for Dev and Prod together
R2 Class B10 million a monthabout 0.26 million a month
R2 storage10 GBalready exceeded on Dev (13.3 GB, 2026-10-19), tracked in docs/gardening.md
Vectorize10 million stored dimensionsabout 10.0 million as of 2026-10-20 (9,764 chunks embedded × 1,024), close to the included amount

Committed measure:* commands reproduce these numbers offline (see the root package.json); for example bun run measure:daily-volume checks that a day's volume fits the per-run source caps.

Observability