feat(orchestrator): S5 Tasks with choices, Gantt, estimates and burn charts

Requirement 001 phase 6, S5:

- Tasks tab: every pending ask, rule request, operator row and choice
  card shows under "waits on Operator"; a choice request goes out on a
  fixed channel button, post and call with an agent multi-select, and a
  click on an option sends a passkey-signed answer the agent checks with
  operator_message. The unsigned /api/decisions/<id>/choose route is
  gone, and a decision, choice answer or choice recipient whose name
  holds "*" is refused, so a signed answer never reaches every agent.
- Gantt view: one bar per task from start to end (running to now), one
  arrow per explicit, branch-base and queue-order edge, hatched forecast
  bars (always, points only, real only) from the median duration or
  points times median hours per point.
- rasci.py set --after/--drop-after stores task dependencies and refuses
  unknown tasks and cycles.
- Estimation toggle (No estimate default, Story points) is stored in the
  hub settings; burndown and burnup per whole register, list filter or
  one agent or line, counting tasks or summing complexity with the
  unestimated tasks as their own line.
- New skill kvb-org-queue-estimate: "Request estimates" (story points
  mode, passkey-signed board action) or the skill sends exactly one
  newsletter listing every unestimated task with its RASCI parties; a
  party name that is no plain name shows as "unnamed party".
- Business value per task or in bulk is stored only with a verified
  passkey assertion over the exact ids and values; WSJF uses it instead
  of the median. The task list sorts by every decision-50 mode both ways.
- e2e: the walk's pending ask lives an hour instead of 60 s, and the
  CDP and BiDi drivers retry removing the browser profile while the
  browser exits (ENOTEMPTY).

Evidence: make test 709 OK, ruff and markdownlint clean
(/tmp/s5-make-test-fix-2.log); e2e 26 OK in Chromium and Firefox
(/tmp/s5-e2e-fix-2.log); MEDUSA 50 files, an independent skeptic
rejected four holes (unsigned choose route, unsigned estimates request,
free-text party names, "*" recipients incl. normalizer bypasses), all
fixed and re-verified, the 8 remaining pattern hits accepted, rescan 0
open.

🎯 Fix: 92 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: –
🛡️ Security: 100 %
🏆 Score: 88
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kevin Veen-BirkenbachandClaude Opus 5.5 committed 2026-11-09 06:53:55 +00:00
1 parent 5c8b69d53d
commit d9eb121d12
49 files changed
+2162 -148

No files matched your search

+13 -13
View File
@@ -619,11 +619,11 @@ flowchart TD
### Phase 6: Tasks with asks and choices (S5)
- [ ] Every pending ask, rule request, operator row and choice card shows in
- [x] Every pending ask, rule request, operator row and choice card shows in
the Tasks tab under "waits on Operator"; no Choices column exists.
- [ ] Each channel button sends the fixed choice request with no text field;
- [x] Each channel button sends the fixed choice request with no text field;
`post` and `call` take a multi-select of agents.
- [ ] A click on a choice option sends a passkey-signed answer the agent can
- [x] A click on a choice option sends a passkey-signed answer the agent can
check with `operator_message`.
### Phase 6: Firewall (S6)
@@ -656,31 +656,31 @@ flowchart TD
### Phase 6: Gantt, estimates, burndown and burnup (S5)
- [ ] `rasci.py set <task> --after <other>` stores the dependency and
- [x] `rasci.py set <task> --after <other>` stores the dependency and
`--drop-after <other>` removes it; an unknown task and a cycle are
refused.
- [ ] The Gantt view draws one bar per task from start to end, a running
- [x] The Gantt view draws one bar per task from start to end, a running
task to now, and one arrow per explicit, branch-base and queue-order
edge of a fixture register and queue.
- [ ] The forecast selector offers `always` (default), `points only` and
- [x] The forecast selector offers `always` (default), `points only` and
`real only`; a hatched bar is as long as the median duration of done
tasks (no estimate) or points times median hours per point (story
points).
- [ ] The estimation toggle defaults to `No estimate`, is stored in the hub
- [x] The estimation toggle defaults to `No estimate`, is stored in the hub
settings and survives a reload.
- [ ] Burndown and burnup offer the scopes whole register (default), list
- [x] Burndown and burnup offer the scopes whole register (default), list
filter within the time window, and one agent or line; with no estimate
they count tasks, with story points they sum complexity and draw the
unestimated tasks as a line of their own.
- [ ] "Request estimates" shows only in story points mode; a click or
- [x] "Request estimates" shows only in story points mode; a click or
`/kvb-org-queue-estimate` sends exactly one newsletter to all agents
that lists every unestimated task with every party holding a RASCI
role in it; a state build or a mode switch sends none.
- [ ] A per-task or bulk business value change is stored only with a
- [x] A per-task or bulk business value change is stored only with a
verified passkey assertion over the exact task ids and values; a
forged, replayed or altered batch changes nothing, and WSJF uses the
operator value instead of the median.
- [ ] The task list sorts by each mode of decision 50 in both directions.
- [x] The task list sorts by each mode of decision 50 in both directions.
### Tests
@@ -700,7 +700,7 @@ flowchart TD
rename-once timeline, squelch scheduler, face generator, settings
writer (forged, replayed, unlisted file), token sums, German text
scan.
- [ ] S5 Gantt and estimates: dependency edges and cycle refusal, forecast lengths, burn
- [x] S5 Gantt and estimates: dependency edges and cycle refusal, forecast lengths, burn
sums per mode and scope, newsletter body and its single send, bulk
business value signature (forged, replayed, altered), sort orders.
- **Integration**
@@ -725,6 +725,6 @@ flowchart TD
- [ ] Phase 6: no page scrollbar on any view, agent and node popups,
choice request and signed answer, Firewall settings diff and
signature, Resources charts, each at 1920, 1366 and 390 px.
- [ ] S5: Gantt with arrows, burndown and burnup, the estimation toggle,
- [x] S5: Gantt with arrows, burndown and burnup, the estimation toggle,
"Request estimates" and a signed bulk business value change, each at
1920, 1366 and 390 px.