toolroll 0.9.92 → 0.9.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/assignment-status.d.ts +1 -1
  3. package/dist/assignment-ui.js +2 -2
  4. package/dist/assignment.js +11 -3
  5. package/dist/browser/workspace.css +1 -1
  6. package/dist/browser/workspace.js +30 -30
  7. package/dist/browser-crew.js +2 -2
  8. package/dist/browser-workspace.d.ts +3 -5
  9. package/dist/builder.js +21 -2
  10. package/dist/check-facts.d.ts +124 -0
  11. package/dist/check-facts.js +272 -0
  12. package/dist/check-report.d.ts +5 -0
  13. package/dist/check-report.js +4 -3
  14. package/dist/cli.js +5 -0
  15. package/dist/contracts/console-api.d.ts +2 -2
  16. package/dist/contracts/console-api.js +2 -2
  17. package/dist/contracts/release-check.d.ts +25 -1
  18. package/dist/contracts/release-check.js +19 -0
  19. package/dist/desktop-update.d.ts +2 -2
  20. package/dist/desktop-update.js +13 -9
  21. package/dist/eval-hooks.d.ts +55 -0
  22. package/dist/eval-hooks.js +227 -4
  23. package/dist/flaky.d.ts +17 -0
  24. package/dist/flaky.js +9 -0
  25. package/dist/needs-you.d.ts +7 -7
  26. package/dist/needs-you.js +12 -10
  27. package/dist/operate.js +138 -18
  28. package/dist/project-delete.js +5 -1
  29. package/dist/project-knowledge.d.ts +6 -6
  30. package/dist/push.d.ts +10 -3
  31. package/dist/push.js +22 -6
  32. package/dist/release-adapters.js +11 -1
  33. package/dist/release-approval.d.ts +191 -0
  34. package/dist/release-approval.js +382 -0
  35. package/dist/release-auto.js +13 -4
  36. package/dist/release-card.d.ts +73 -4
  37. package/dist/release-card.js +168 -23
  38. package/dist/release-cli.js +9 -1
  39. package/dist/release.d.ts +30 -0
  40. package/dist/release.js +42 -3
  41. package/dist/result-acts.d.ts +3 -3
  42. package/dist/result-acts.js +1 -1
  43. package/dist/server/guards.js +1 -0
  44. package/dist/server/pages-assets.js +1 -1
  45. package/dist/server/render-release.d.ts +17 -0
  46. package/dist/server/render-release.js +84 -0
  47. package/dist/server/render-results.d.ts +0 -2
  48. package/dist/server/render-results.js +4 -6
  49. package/dist/server/render-tasks.js +3 -3
  50. package/dist/server/route-table.d.ts +1 -1
  51. package/dist/server/route-table.js +7 -1
  52. package/dist/server/tasks.d.ts +15 -0
  53. package/dist/server/tasks.js +102 -20
  54. package/dist/setup-guide.d.ts +2 -2
  55. package/dist/stop-proof.d.ts +67 -0
  56. package/dist/stop-proof.js +293 -0
  57. package/dist/store.d.ts +70 -31
  58. package/dist/store.js +335 -95
  59. package/dist/surface.js +1 -1
  60. package/dist/task-outcome-cli.js +19 -0
  61. package/dist/toolroll-update-ui.js +2 -2
  62. package/dist/toolroll-update.js +1 -0
  63. package/dist/work-index.js +7 -9
  64. package/dist/work-summary.d.ts +2 -2
  65. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.93 — 2026-11-06
4
+
5
+ - **Approve a release with one tap.** When a release is ready for your yes,
6
+ your phone gets one notification ("A release is ready for your approval")
7
+ that opens a single screen: what changed since the last release, the
8
+ GitHub checks, the full terms, and one **Approve release** button. Approve
9
+ and walk away: it deploys only after everything passes, and you hear back
10
+ only if something fails. In the terminal, `toolroll release approve` finds
11
+ the release itself — no task names or codes to copy.
12
+ - **No more "Confirm it stopped".** When a finished build's process record
13
+ is incomplete, Toolroll now checks the computer itself, stops anything left
14
+ over that it can prove is that build's, and carries on. The task says
15
+ "Making sure build #N stopped. This clears on its own." Releases wait
16
+ through it instead of stopping.
17
+ - **Checks record what they saw.** Each finished check now keeps an advisory
18
+ record of the exact code, conditions and failures, groundwork for a list
19
+ of flaky tests and for lessons from fixed failures. It never changes a
20
+ check's result.
21
+
3
22
  ## 0.9.92 — 2026-11-05
4
23
 
5
24
  - **Toolroll learns which cheaper models do the job.** Every task now gets a
@@ -23,7 +23,7 @@ export declare function assignmentStatusBrief(assignment: AssignmentSnapshot): {
23
23
  } | null;
24
24
  runId: number | null;
25
25
  primaryAction: {
26
- code: "answer-agent" | "confirm-stopped" | "inspect-decisions" | "inspect-run" | "inspect-stop" | "inspect-task" | "open-pr" | "reconcile-run" | "sign-in" | import("./dispatch.js").DispatchAction;
26
+ code: "answer-agent" | "inspect-decisions" | "inspect-run" | "inspect-stop" | "inspect-task" | "open-pr" | "recheck-stopped" | "reconcile-run" | "sign-in" | import("./dispatch.js").DispatchAction;
27
27
  label: string;
28
28
  target: import("./work-summary.js").WorkTarget;
29
29
  } | null;
@@ -31,8 +31,8 @@ export function assignmentActionHref(assignment) {
31
31
  if (action.code === 'sign-in')
32
32
  return '/settings/agents#providers';
33
33
  // The confirmation sits on the task page, behind the password.
34
- if (action.code === 'confirm-stopped')
35
- return `/t/${encodeURIComponent(assignment.rootId)}#confirm-stopped`;
34
+ if (action.code === 'recheck-stopped')
35
+ return `/t/${encodeURIComponent(assignment.rootId)}#recheck-stopped`;
36
36
  if (action.code === 'open-pr' && /^https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/pull\/\d+$/.test(assignment.publication?.prUrl ?? ''))
37
37
  return assignment.publication.prUrl;
38
38
  if (runId !== null && (action.code === 'open-result' || action.code === 'open-pr' || action.code === 'retry-review')) {
@@ -252,13 +252,14 @@ export function assignmentOf(store, taskId, now, access, root, memo) {
252
252
  : { code: "inspect-task", label: `Open ${successor}`, target: { taskId: successor, runId: null, decisionId: null }, access: "read", retry: "read-again" };
253
253
  }
254
254
  else if (!live && processFact !== null && result !== null) {
255
- // Toolroll can't confirm the build stopped. A person confirms it when
256
- // nothing of it may still run; otherwise the work waits, needing no one.
255
+ // Toolroll hasn't yet proven the build stopped. It proves that itself
256
+ // (stop-proof.ts), so the work waits, needing no one; only when this
257
+ // computer can't look is it held, offering Check again — never a vouch.
257
258
  const process = processNeedOf(processFact);
258
259
  if ("need" in process) {
259
260
  state = "needs-decision";
260
261
  detail = NEEDS[process.need].sentence({ build: process.build });
261
- primaryAction = { code: "confirm-stopped", label: NEEDS[process.need].action.label, target: { taskId: current.id, runId: process.build, decisionId: null },
262
+ primaryAction = { code: "recheck-stopped", label: NEEDS[process.need].action.label, target: { taskId: current.id, runId: process.build, decisionId: null },
262
263
  access: access.principal === "operator" ? "operator-control" : "operator-handoff", retry: "refresh-before-acting" };
263
264
  need = { key: process.need, build: process.build };
264
265
  }
@@ -480,6 +481,11 @@ function acknowledgeCurrent(store, current, receiptDigest, actor, now, root, acc
480
481
  // The nightly check of main is a check only (release-once.md, part 3): nobody completes it.
481
482
  if (store.handle.prepare("SELECT 1 AS hit FROM nightly_check WHERE task = ?").get(current.receipt.taskId) !== undefined)
482
483
  return { ok: false, reason: "check-only", message: "The nightly check of main is only a check; it isn't completed." };
484
+ // Toolroll is still proving its build stopped (stop-proof.ts): a wait that clears on its own, said as one, so a
485
+ // release waits for it instead of stopping.
486
+ if (current.state !== "ready-to-check" && current.state !== "complete" && current.need != null && "wait" in current.need && STOP_WAITS.has(current.need.wait)) {
487
+ return { ok: false, reason: "stopping", message: `Toolroll is still making sure ${current.need.build === null ? "the build" : `build #${current.need.build}`} stopped. This clears on its own.` };
488
+ }
483
489
  if (current.state !== "ready-to-check" && current.state !== "complete")
484
490
  return { ok: false, reason: "not-ready", message: "This assignment still has unresolved execution, scope or decisions." };
485
491
  // A release task completes only while its release approval stands for it (release-once.md, liveReleaseOf).
@@ -674,3 +680,5 @@ export function assignmentUpdates(store, now, access, query, root) {
674
680
  });
675
681
  return { events, nextCursor: page.length === 0 ? after : Number(page.at(-1)["id"]), hasMore: rows.length > limit };
676
682
  }
683
+ /** The waits of a build Toolroll is still proving stopped by itself (needs-you.ts processNeedOf). */
684
+ const STOP_WAITS = new Set(["build-finishing", "build-checking", "build-stopping"]);