🍊😺 obot
Launched
Commitcb16034

changelog v2.16.1 is current with this build

What changed · full log

Roadmap audit

Last run 2026-08-20 04:04 EDT, 9h before this page was built. Every count here describes the roadmap as it stood then; anything filed since is invisible to it.

Activity 92 — every decision, newest first

From decisions.json, the same ledger the audit reads to mute rejected findings. A rejection is recorded but changes nothing on GitHub. This fold is regenerated each deploy, so a decision made a minute ago appears here a minute or two later — the run panel above the table is what reports it live.

2026-07-27 21:52 EDT accept 16 2 failed 8 stale 6 applied by @jwildfire
  • failed obot.roadmap#131 — Open requirement under no goal handed to the bounded agent
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#130 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#129 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#128 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#127 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#123 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • failed obot.roadmap#122 — Open requirement under no goal handed to the bounded agent
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#119 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#117 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale GOALLESS-REQUIREMENT:jwildfire/obot.roadmap#98 — GOALLESS-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • applied obot.roadmap#131 — Tracked issue with no assignee assigned @jwildfire
  • applied open.csr#25 — Board item with no Status board Status set to Backlog
  • applied open.csr#24 — Board item with no Status board Status set to Backlog
  • applied open.csr#23 — Board item with no Status board Status set to Backlog
  • applied open.csr#22 — Board item with no Status board Status set to Backlog
  • applied open.csr#15 — Board item with no Status board Status set to Released
2026-07-27 21:27 EDT accept 10 10 applied by @jwildfire
  • applied obot.roadmap#131 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#130 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#129 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#128 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#127 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#123 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#122 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#119 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#117 — Open requirement under no goal handed to the bounded agent
  • applied obot.roadmap#98 — Open requirement under no goal handed to the bounded agent
2026-07-27 21:26 EDT accept 1 1 applied by @jwildfire
  • applied obot.roadmap#130 — Tracked issue with no assignee assigned @jwildfire
2026-07-27 21:24 EDT accept 9 9 applied by @jwildfire
  • applied obot.roadmap#109 — Closed issue still parked in an active stage board Status set to Released
  • applied obot.roadmap#77 — Closed issue still parked in an active stage board Status set to Released
  • applied obot.roadmap#75 — Closed issue still parked in an active stage board Status set to Released
  • applied obot.roadmap#64 — Closed issue still parked in an active stage board Status set to Released
  • applied safety.viz#48 — Closed issue still parked in an active stage board Status set to Released
  • applied safety.viz#47 — Closed issue still parked in an active stage board Status set to Released
  • applied safety.viz#46 — Closed issue still parked in an active stage board Status set to Released
  • applied obot.roadmap#45 — Closed issue still parked in an active stage board Status set to Released
  • applied safety.viz#45 — Closed issue still parked in an active stage board Status set to Released
2026-07-27 21:21 EDT accept 6 6 applied by @jwildfire
  • applied obot.roadmap#128 — Requirement issue missing from the board added to the board at Backlog
  • applied obot.roadmap#123 — Requirement issue missing from the board added to the board at Backlog
  • applied obot.roadmap#119 — Requirement issue missing from the board added to the board at Backlog
  • applied obot.roadmap#117 — Requirement issue missing from the board added to the board at Backlog
  • applied obot.roadmap#115 — Requirement issue missing from the board added to the board at Released
  • applied obot.roadmap#98 — Requirement issue missing from the board added to the board at Backlog
2026-07-27 21:20 EDT accept 1 1 applied by @jwildfire
  • applied safety.viz#50 — Closed issue still parked in an active stage board Status set to Released
2026-07-27 21:19 EDT accept 9 9 applied by @jwildfire
  • applied obot.roadmap#119 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#88 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#35 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#31 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#29 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#25 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#24 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#10 — Tracked issue with no assignee assigned @jwildfire
  • applied obot.roadmap#9 — Tracked issue with no assignee assigned @jwildfire
2026-07-24 23:55 EDT accept 2 2 stale #106 by @jwildfire
  • stale OFF-BOARD-REQUIREMENT:jwildfire/obot.roadmap#91 — OFF-BOARD-REQUIREMENT the current audit no longer reports this finding — nothing was changed
  • stale OFF-BOARD-REQUIREMENT:jwildfire/obot.roadmap#69 — OFF-BOARD-REQUIREMENT the current audit no longer reports this finding — nothing was changed
2026-07-24 23:50 EDT accept 2 2 applied #103 by @jwildfire
  • applied OFF-BOARD-REQUIREMENT:jwildfire/obot.roadmap#91 — OFF-BOARD-REQUIREMENT added to the board at Backlog
  • applied OFF-BOARD-REQUIREMENT:jwildfire/obot.roadmap#69 — OFF-BOARD-REQUIREMENT added to the board at Backlog
2026-07-24 23:49 EDT accept 28 28 applied #102 by @jwildfire
  • applied UNSTAGED-BOARD-ITEM:jwildfire/obot.roadmap#70 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#55 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#54 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#51 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#50 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#49 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#48 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#47 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#46 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#45 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#44 — UNSTAGED-BOARD-ITEM board Status set to Backlog
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#93 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#92 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#91 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#76 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#68 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#63 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/safety.viz#60 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#40 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/obot.agent#39 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#38 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#37 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#36 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#35 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#34 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#33 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#32 — UNSTAGED-BOARD-ITEM board Status set to Released
  • applied UNSTAGED-BOARD-ITEM:jwildfire/gsm.safety#31 — UNSTAGED-BOARD-ITEM board Status set to Released
2026-07-24 23:42 EDT accept 5 5 applied #100 by @jwildfire
  • applied CLOSED-NOT-RELEASED:jwildfire/safety.viz#98 — CLOSED-NOT-RELEASED board Status set to Released
  • applied CLOSED-NOT-RELEASED:jwildfire/gsm.safety#30 — CLOSED-NOT-RELEASED board Status set to Released
  • applied CLOSED-NOT-RELEASED:jwildfire/gsm.safety#29 — CLOSED-NOT-RELEASED board Status set to Released
  • applied CLOSED-NOT-RELEASED:jwildfire/gsm.safety#28 — CLOSED-NOT-RELEASED board Status set to Released
  • applied CLOSED-NOT-RELEASED:jwildfire/gsm.safety#27 — CLOSED-NOT-RELEASED board Status set to Released
2026-07-24 22:51 EDT reject 1 1 rejected by @session
  • rejected HARD-WRAPPED-BODY:jwildfire/obot.roadmap#22 — HARD-WRAPPED-BODY Rewrap the body to one line per paragraph, changing no wording.
2026-07-24 22:51 EDT accept 1 1 applied by @session
  • applied CLOSED-NOT-RELEASED:jwildfire/obot.roadmap#46 — CLOSED-NOT-RELEASED board Status set to Released
2026-07-24 22:51 EDT accept 1 1 applied by @session
  • applied ASSIGNEE-MISSING:jwildfire/obot.roadmap#2 — ASSIGNEE-MISSING assigned @jwildfire
Rules 24 — 9 firing, 15 quiet

Every convention the audit knows about, and how it fared on the last run. Adding a rule is one object in rules.mjs.

RuleGroupStateWhat it checks, and why
CLOSED-NOT-RELEASED Board integrity 11 firing Closed issue still parked in an active stage
The board Status is what the roadmap page and the `--auto` lane read as the stage of record. A closed issue sitting in Development makes the lane look busier than it is and hides what actually shipped — the exact drift the 2026-07-11 usage audit caught.
Fix: Set the board Status to Released.
OPEN-IN-RELEASED Board integrity quiet Open issue the board calls Released
Released is a terminal stage, and under @jwildfire's one-requirement-one-release rule (2026-08-15) nothing is ever open in it on purpose. An open issue at Released is one of exactly three defects: finished work nobody closed, live work filed in the wrong lane, or a requirement whose scope spans more than one release. There is deliberately no label, marker or comment that silences this rule — an escape hatch would restore the ambiguity the rule exists to remove.
Fix: Close it if the work is done; move the stage back if the work is live; split it if it carries scope beyond the release it delivered.
UNSTAGED-BOARD-ITEM Board integrity 48 firing Board item with no Status
An item with no Status is on the board but outside the lifecycle: it appears in no stage lane, the roadmap page has to call it "Unstaged", and the `--auto` selector cannot reason about it.
Fix: Set the Status the evidence supports — Released if it is closed, otherwise the stage its PRs and design artifacts imply.
OFF-BOARD-REQUIREMENT Board integrity 30 firing Hub issue missing from the board
The obot Roadmap project is the stage tracker for hub work. An issue that never got added is invisible to the stage lanes, to the roadmap page's stage grouping, and to any review that starts from the board — which is how a burst of promoted ideas can vanish the day after it is filed. The population deliberately does not depend on the `requirement` label: #189–#193 were filed with `infrastructure` and `ai`, sat off the board, and a label-gated rule could not have named them even on a fresh run (#201).
Fix: Add it to the project and give it a Status.
BOARD-DUPLICATE Board integrity quiet Same issue on the board twice
Duplicate items double-count a requirement in every stage tally and let two copies hold different Statuses, so the board contradicts itself. One appeared during the #53 goal migration and had to be removed by hand.
Fix: Remove the extra items, keeping the one that carries a Status.
CLOSED-PARENT-OPEN-SUBS Hierarchy quiet Closed parent with open sub-issues
Sub-issues are the canonical task tracker for a requirement, so a closed parent asserts its children are finished. When they are not, the remaining work is orphaned — visible on no requirement, in no stage, and to nobody. (@jwildfire named this one as the founding example of the audit.)
Fix: Close the children that are actually done; move genuine follow-on scope to a follow-up requirement — the #30 → #88 precedent — or reopen the parent.
SUBS-DONE-PARENT-OPEN Hierarchy 15 firing All sub-issues closed, parent still open
When every task under a requirement is closed the requirement is done being built; leaving it open in an earlier stage means the board understates progress and the review queue never surfaces it.
Fix: Move it to Review, or close it if it has already sat in Review.
GOALLESS-REQUIREMENT Hierarchy 31 firing Open requirement under no goal
Since #53 goals are hub issues and membership is the sub-issue link — nothing else. Membership is inherited, so a requirement nested under another requirement still belongs to that requirement’s goal; only an issue with no goal anywhere up its parent chain belongs to no standing direction, never appears on a goal page, and can never be picked up by an autonomous session selecting by goal.
Fix: Link it under the goal it serves, or state why it is deliberately standalone.
UNTRACKED-TASK Hierarchy quiet Hub issue in no structure at all
The hub has exactly three ways an issue is visible: the `requirement` label puts it on the roadmap page, a sub-issue link puts it on a goal page, and a board item puts it in a stage lane. An issue with none of the three is filed and then invisible — it will be found again only by accident.
Fix: Link it under the goal or requirement it belongs to, or promote it to a requirement.
GOAL-NO-MEMBERS Hierarchy quiet Goal with no member requirements
A goal exists to group work and to give an autonomous session something to select from. With no sub-issues it is a statement of intent the machinery cannot act on.
Fix: Link the requirements that serve it, or retire the goal.
GOAL-BOARD-INCONSISTENT Hierarchy quiet Goals inconsistently placed on the board
Goals are permanent and do not move through the requirement stages, so a goal on the delivery board is an item with no stage it can ever reach. @jwildfire settled the convention on 2026-08-15 (audit decision R3-a): goals are not board items. They are surfaced by the goal pages and the hierarchy view, which are the better surfaces for something that never finishes.
Fix: Take the goal off the board. Nothing is deleted — the goal issue and its sub-issue links are untouched.
MERGED-PR-OPEN-TARGET Linkage quiet Merged PR whose closing target is still open
GitHub only auto-closes an issue when the PR is in the same repository. Cross-repo `Closes` lines — the norm here, where implementation PRs live in spoke repos and requirements live in the hub — merge silently without closing anything.
Fix: Close the referenced issue.
OPEN-PR-CLOSED-TARGET Linkage quiet Open PR against an already-closed issue
Either the branch is stale work that should be dropped, or the issue was closed while its implementation was still in review. Both are worth knowing; neither resolves itself.
Fix: Close the PR, or reopen the issue.
PR-NO-REQUIREMENT Linkage quiet Open PR with no requirement link
The Issue–PR Link Convention exists so a merge closes its requirement and the roadmap page can show which requirement a PR is moving. An unlinked PR is invisible to both.
Fix: Add the closing reference to the requirement or task it implements.
REQUIREMENT-LABEL-MISSING Conventions quiet Requirement-titled issue without the `requirement` label
Every generator selects requirements by label. An issue titled "Requirement: …" without the label is absent from the roadmap page, the stage tallies and the goal pages — present on GitHub, missing from the project.
Fix: Add the `requirement` label.
ASSIGNEE-MISSING Conventions 39 firing Tracked issue with no assignee
The Assignee Convention puts @jwildfire on every issue the agent files, so his GitHub views ("assigned to me") are the same working set the roadmap shows. Unassigned issues fall out of that view.
Fix: Assign @jwildfire.
MILESTONE-MISSING Conventions quiet Open requirement with no milestone
Milestones are the delivery slot (`backlog`, `2026q3`, `2026q4`) and drive the release-facing views. A requirement with none is unscheduled by omission rather than by decision.
Fix: Set `backlog` for anything not yet scheduled; pick the quarter for work in flight.
DESIGN-MISSING Conventions 2 firing Requirement past Design with no design
The lifecycle puts Design before Development for a reason: sub-issues are supposed to be decomposed from it. A requirement in Development whose Design section is empty or "TBD" means the decomposition was improvised, and there is nothing for a reviewer or an autonomous session to work from.
Fix: Populate the Design section, or add a design doc under requirements/design/.
APPROVAL-UNRESOLVED Conventions quiet Requirement claims an approval that does not resolve
A requirement written by an agent must not be able to authorise what only @jwildfire can authorise (#215). `Approved by` therefore holds a citation that resolves — a decision id whose artifact records his words, or a native review — and never prose. An unresolvable citation is the exact failure this convention exists to stop: something claims his approval and cannot show it, and the next agent to read it will act on it. On 2026-08-16 one did, and prepared to delete files on the strength of a requirement its own supervisor had written.
Fix: Resolve it or remove it: `node scripts/provenance.mjs resolve <citation>` says why it fails. If he has not decided, the honest value is `EMPTY` — nothing is blocked by writing it.
PROVENANCE-MISSING Conventions 20 firing Requirement filed without saying who wrote it or who approved it
Every requirement filed since 2026-08-18 carries a provenance block: who authored it, and who approved it or `EMPTY` (#215). The empty value is the point — a missing field reads as an oversight and invites the next reader to assume, and an explicit "nobody has approved this" reads as a fact and invites them to check. Requirements filed before that date are out of scope here and counted instead in reports/requirement-provenance/, because rewriting 75 existing bodies to say something different about his own review is not a change an agent makes unattended.
Fix: Add the block at the foot of the body: `node scripts/provenance.mjs stamp <number>` prints it.
AUTO-DRAFT-CONFLICT Conventions quiet Issue labelled both `auto` and `draft`
The two labels are opposites: `auto` means the #18 implementation-ready criteria are met and an autonomous session may take it; `draft` means it needs @jwildfire's steering first. Carrying both means the `--auto` selector may pick up work that was explicitly gated.
Fix: Keep whichever the issue actually satisfies and drop the other.
HARD-WRAPPED-BODY Conventions 1 firing Issue body hard-wrapped mid-paragraph
GitHub renders a single newline as a line break, so a body wrapped at 80 columns arrives as ragged half-lines. @jwildfire's standing instruction is one line per paragraph or bullet in anything posted to GitHub.
Fix: Rewrap the body to one line per paragraph.
PROMOTED-IDEA-OPEN Conventions quiet Promoted idea thread still open
Triage closes a thread as resolved when it becomes an issue; that closure is what keeps the Ideas board an inbox rather than an archive. A promoted thread left open keeps showing up as un-triaged work.
Fix: Close the discussion as resolved.
STALLED-IN-FLIGHT Conventions quiet In-flight requirement that stopped moving
Development and Review are lanes for work happening now. A requirement that has not been touched in two weeks, with no open PR behind it, is parked — and while it sits in an active lane it crowds out the real front line on every view of the roadmap.
Fix: Park it back at Backlog. Dragging it forward on the board is how you say it is live again.
How a decision travels 4 steps

Every finding here is a fact about GitHub state, produced by a deterministic rule rather than a model: the same state yields the same findings.

  1. This deployed page is read-only — it holds no token and has no write path. Deciding happens on the local session hub's copy of this queue, where ✓/✗ hand finding ids to a local Claude Code agent; filing a decision issue naming the ids remains the fallback lane.
  2. The lane runs a fresh audit and re-derives what that id means. A finding the new audit no longer reports is refused as stale, and one whose source could not be read is reported blocked. What runs is never what this page said should run.
  3. A mechanical fix is applied as the operations listed in the rail; a judgment call goes to a bounded agent with the prompt shown there.
  4. changes nothing and mutes the finding for 60 days, or until its evidence changes. Both land in the Activity fold above.

Are you sure?