Skip to content

Roadmap: where the work has got to

Updated 2026-09-23, checked against the tracker and the code.

This page carries status only. What each phase is, what it depends on and what "done" means all live in the delivery plan, which is a dated design record and deliberately does not track progress. A spec that changes every week stops being a record of what was decided.

One fact, one home: if a phase's meaning is wrong, fix the plan; if its status is wrong, fix this page.

Key

✅ done
🔨 in flight
◐ partially done, usable
⏳ not started
🚧 blocked, and the blocker is named

Track 0: groundwork

# Task Status Notes
0.1 Register the Discord application ✅ Intents enabled, installed to the test guild
0.2 Dedicated test guild ✅
0.3 Benchmark corpus ◐ 59 questions in two sections, calibration (38) and questions (21). Both harnesses load only calibration, so 21 questions are never exercised. 18 of 59 carry cites:; some of the rest are unanswerable by design and correctly empty. Populating the others is 2c.2, untouched since 2026-08-02. Entries now carry an expect axis naming the outcome the bot should reach, because only one of the four decline shapes should raise a ticket
0.4 Adversarial prompt-injection corpus ✅ 24 entries in test/corpus/adversarial.yaml
0.5 Moderation test corpus ⏳ Blocks Phase 5 only
0.6 Public policy ✅ Provider named (Anthropic, Claude Haiku 4.5), what is and is not sent stated exactly, moderation marked not-yet-active
0.7 Enumerate corpus sources ✅ See corpus validation

Delivery phases

Phase Status Notes
1a-0: Discord library spike ✅ disgo selected
1a: chat-platform + -discord ✅ Upstream, released
1b: Discord ingest ✅ Gateway reads allowlisted channels (since replaced: it reads every public channel, 0024), survives forced disconnect with session resume
2: knowledge index + ask ✅ Exit criteria met against the live group 2026-07-29. Rebuilt on v0.1.0 (2026-08-06): 53 of 103 sources qualify, 2,025 documents, 15,175 chunks, after an estate-wide documentation sweep added ~4,300 chunks and the internal-package exclusion removed 1,127
2b: provider benchmark ◐ Haiku 4.5 selected 2026-07-31 (decision record). £5/month at 50 questions a day. Provisional: citation accuracy (rubric #1) is unmeasured until 2c.2, and injection resistance is unscored
2c: retrieval spikes ◐ Production retrieval is FTS5 only, at answer.DefaultLimit 8. The vector design (0011) withdrew most of its evidence after the benchmark was found scoring the wrong unit, and waits on an evaluation set that needs 2c.2. The inference infrastructure (0012) exists as pkg/embed, but nothing outside its tests calls it. Raising DefaultLimit is no longer blocked: #3 closed 2026-08-06
3: Discord answering 🔨 Running in shadow mode since 2026-09-14. The daemon reads every public channel (0024), carries messages over an in-memory bus (0019), answers addressed questions in one scope per space (0018) and does not post. The exit gate is thirty human-reviewed answers to real questions (0010 D12), and it is now reachable: answers are stored as they would have been posted, and review records a verdict on each (0023). Until !107, serve itself exited at startup in every release, so no real question had reached it by then. A server can now be given posting on its own (post_answers, 0025), which is how the test server shows answers end to end and how graduation will happen.
4a: forge issue capability ✅ Delivered upstream 2026-08. forge v0.9.2 ships Issues (search, get, comments) and IssueFiler (create) as separate optional capabilities, split because read needs a read-only scope and write does not. forge-gitlab v0.6.4 implements both. Exit criteria verified here: a provider lacking them fails forge.As cleanly rather than panicking. Ships more than was asked for: Sanitise by default (R-ESC-9), an idempotency key for at-most-once filing, and search semantics where a FAILED duplicate search is never the same answer as "no duplicates" (R-ESC-3)
4b: GitLab escalation ⏳ Unblocked: 4a is released and #3 closed 2026-08-06. Sequenced after Phase 3's reviews, which are the first evidence of how good the declines are, and escalation files tickets from declines
4c: gap explorer ⏳ Needs 4b
5: moderation 🚧 Needs 0.5
6: feedback loop 🚧 Needs 3

Release and distribution

Item Status Notes
Releases ✅ Through colophon to the release store. The releases page has the latest
Binary runs on a bare machine ✅ v0.5.0 linked libdave.so and could not start without it (#12). Builds now use chat-platform-discord's discord_novoice, and the binary needs only glibc 2.34. A release-smoke job gates every MR and tag on it
Signed releases ⏳ Releases carry a checksum and no signature. For the distribution spec
Container and bundle packaging ⏳ Not started. The distribution spec (0022, not yet drafted) decides which vehicles to commit to

What is actually next

Review thirty answers. The gate is a person reading thirty answers the bot composed for real questions and judging whether they are worth posting, and everything it needs now exists: serve starts, keeps each answer as it would have been posted, and review records the verdicts. What is left is doing it: ask the bot real questions on the test guild and review them, as in review the bot's answers. That needs a person.

4b waits on those reviews, deliberately. Escalation turns a decline into a filed GitLab issue. The reviews are the first evidence of whether declines are sound, and a composer that declines questions it could answer would file tickets for documentation that already exists.

2c.2 still needs a human. Expected citations cannot be derived from what the benchmark models cited: recall@k graded against the retriever's own top 8 reads ~100% however bad retrieval is. test/corpus/citation-shortlist.draft.yaml offers 25 ranked candidates per answerable question to keep or replace. It gates the evaluation set that 0011's vector design is waiting on.

Approved but unscheduled

Spec Why it is waiting
Published-site ingestion Approved 2026-07-29. Delivers the tutorial tier, which no source currently covers, because the blog repository is private and stays that way. Sequencing against 2b and 2c is undecided (its Q-4)

Carried risks and chores

These are not phases and will not surface anywhere else.

Item Status
Rotate DISCORD_PHPBOTSCOUT_TOKEN, exposed in a debug log during 1a ⏳ Unconfirmed as of 2026-09-23
Rotate GITLAB_TOKEN, surfaced by a test assertion during Phase 2 ⏳ Unconfirmed as of 2026-09-23
Least-privilege deployment token (R-OPS-29); development uses a full-access PAT ⏳ Deployment phase
Report the gtb generate defects upstream: three command-scaffold non-compliances, plus the docs generator leaking its preamble above the frontmatter and stamping AI author bylines ⏳ Unconfirmed as of 2026-09-23