Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
298 commits
Select commit Hold shift + click to select a range
b2ae9f1
feat(web): ticket drill-in with timeline, question inbox, and diff
ccdwyer Jun 7, 2026
8617436
feat(web): new-ticket affordance + sample board file + e2e smoke
ccdwyer Jun 7, 2026
28356ea
Allow workflow-capable clients to receive workflow-scoped environment…
ccdwyer Jun 7, 2026
17e4708
Make workflow boards real-path execution durable
ccdwyer Jun 7, 2026
7079e23
Make workflow recovery honor live provider turn state
ccdwyer Jun 7, 2026
bd1c83c
Expose workflow pipeline orchestration failures
ccdwyer Jun 7, 2026
0a359f3
Document recovery continuation interruption limits
ccdwyer Jun 7, 2026
b8eea0d
Cover live workflow turn projection mapping
ccdwyer Jun 7, 2026
e66578e
docs: add board-creation UX design spec
ccdwyer Jun 7, 2026
5067186
docs: fold GPT-5.5 review into board-creation UX spec
ccdwyer Jun 7, 2026
f7ffbea
docs: add board-creation UX implementation plan
ccdwyer Jun 7, 2026
76d09ca
docs: fold codex review into board-creation UX plan
ccdwyer Jun 7, 2026
6745e4d
docs: add codex build prompt for board-creation UX + prior review art…
ccdwyer Jun 7, 2026
c1deb82
docs: add codex build prompt for board-creation UX
ccdwyer Jun 7, 2026
df22d23
docs: trim codex board-ux prompt under 4000 chars
ccdwyer Jun 7, 2026
ac514ee
docs: board-ux prompt under 4000 chars
ccdwyer Jun 7, 2026
e0d06a9
feat(workflow): default board template
ccdwyer Jun 7, 2026
fba89a0
feat(workflow): board slug helpers
ccdwyer Jun 7, 2026
eb1a032
feat(workflow): board list/create RPC contracts; drop registerBoardFr…
ccdwyer Jun 7, 2026
bdca868
feat(workflow): board unregister + read-model board delete/list
ccdwyer Jun 7, 2026
1844a7c
refactor(workflow): split loader read path from persisted relative path
ccdwyer Jun 7, 2026
06877b9
feat(workflow): project workspace-root resolver
ccdwyer Jun 7, 2026
ce28920
feat(workflow): BoardDiscovery (scan/register/unregister .t3/boards)
ccdwyer Jun 7, 2026
85cea16
feat(workflow): listBoards/createBoard RPC handlers; remove registerB…
ccdwyer Jun 7, 2026
746653d
feat(workflow): provide BoardDiscovery + workspace resolver in runtime
ccdwyer Jun 7, 2026
d54752a
feat(web): client wiring for listBoards/createBoard
ccdwyer Jun 7, 2026
8c92fa7
feat(web): resolveRecentAgent helper
ccdwyer Jun 7, 2026
ec2c588
feat(web): per-project board-list store slice
ccdwyer Jun 7, 2026
4651c0e
feat(web): sidebar board rows + Add board affordance
ccdwyer Jun 7, 2026
fbacc85
feat(web): board route uses real boardId; drop manual registration
ccdwyer Jun 7, 2026
a2c9b4e
docs: add script-steps (v2-A) design spec
ccdwyer Jun 7, 2026
d841d1f
docs: fold GPT-5.5 spec review into script-steps design
ccdwyer Jun 7, 2026
ff4abf1
checkpoint: board-creation polish + script-steps unit-1 (blocked sema…
ccdwyer Jun 7, 2026
36581cc
Allow workflow definitions to describe script steps
ccdwyer Jun 7, 2026
e9f2ae4
Share prepared worktree execution across workflow step kinds
ccdwyer Jun 7, 2026
afed6d6
Run workflow scripts through terminal sessions
ccdwyer Jun 7, 2026
3470955
Execute trusted workflow script steps
ccdwyer Jun 7, 2026
bf00a9d
Persist project trust before script execution
ccdwyer Jun 7, 2026
e357357
Persist script run metadata for workflow detail
ccdwyer Jun 7, 2026
b0579de
Cancel script steps cooperatively through terminal close
ccdwyer Jun 7, 2026
5f10b04
Recover interrupted script runs on startup
ccdwyer Jun 7, 2026
2e19777
Expose script run output without reopening shells
ccdwyer Jun 7, 2026
f0d8151
docs: add smart-routing (v2-B) design spec
ccdwyer Jun 8, 2026
6a21e82
docs: fold GPT-5.5 spec review into smart-routing (v2-B) spec
ccdwyer Jun 8, 2026
e7dce7f
Carry workflow step output through storage
ccdwyer Jun 8, 2026
37c9b7e
Capture structured agent step output
ccdwyer Jun 8, 2026
9ee8736
Add allowlisted predicate evaluation
ccdwyer Jun 8, 2026
305e584
Build routing context from pipeline step runs
ccdwyer Jun 8, 2026
f002414
Add smart routing workflow schemas
ccdwyer Jun 8, 2026
4963c41
Route workflow pipelines from step and predicate decisions
ccdwyer Jun 8, 2026
982fc65
Validate smart routing workflow predicates
ccdwyer Jun 8, 2026
4d1d466
Prove smart-routing survives live and recovered execution
ccdwyer Jun 8, 2026
7b17122
Preserve captured output across provider recovery
ccdwyer Jun 8, 2026
35bc45b
Harden route decision commits against drag races
ccdwyer Jun 8, 2026
88c9343
Preserve interruptible routing and exact captured turns
ccdwyer Jun 8, 2026
eb6b676
Ensure recovered capture steps terminalize on lookup failures
ccdwyer Jun 8, 2026
46e7aa9
Preserve encoded workflow input for board registration
ccdwyer Jun 8, 2026
bcafee1
docs: add WIP enforcement (v2-C) design spec
ccdwyer Jun 8, 2026
eef41a3
docs: fold GPT-5.5 spec review into WIP enforcement (v2-C) spec
ccdwyer Jun 8, 2026
d32516d
docs: add WIP enforcement (v2-C) implementation plan
ccdwyer Jun 8, 2026
69ec323
Prepare workflow tickets for queue projection
ccdwyer Jun 8, 2026
66d50d9
Expose token-authoritative lane queue reads
ccdwyer Jun 8, 2026
5956515
Gate initial lane entry by WIP occupancy
ccdwyer Jun 8, 2026
ff53d37
Route pipeline exits through WIP admission
ccdwyer Jun 8, 2026
2c4961c
Recover WIP queues after restart
ccdwyer Jun 8, 2026
4f5a882
Reject unbounded WIP traps before activation
ccdwyer Jun 8, 2026
fd3eed8
Expose lane queues in the board UI
ccdwyer Jun 8, 2026
5906156
Prove WIP FIFO behavior in runtime integration
ccdwyer Jun 8, 2026
abc2ff9
Prevent WIP lanes from queueing their own admitted ticket
ccdwyer Jun 8, 2026
69e6c03
Commit routed workflow moves atomically with their audit
ccdwyer Jun 8, 2026
b068bca
Start recovered WIP pipelines from one recovery path
ccdwyer Jun 8, 2026
a0afc4c
Prevent duplicate recovery pipeline starts for in-flight tokens
ccdwyer Jun 8, 2026
6398884
docs: add v2-D/D1 (editor foundation + form + save) design spec
ccdwyer Jun 8, 2026
e7ede9b
docs: fold GPT-5.5 spec review into v2-D/D1 spec
ccdwyer Jun 8, 2026
d4844ab
docs: add v2-D/D1 implementation plan
ccdwyer Jun 8, 2026
b80034d
Prepare workflow definitions for editor saves
ccdwyer Jun 8, 2026
f570571
Lint workflow edits before file writes
ccdwyer Jun 8, 2026
b8e0c92
Save workflow boards through the server
ccdwyer Jun 8, 2026
fe16b4a
Model workflow edits in encoded JSON
ccdwyer Jun 8, 2026
010d72d
Give workflow boards a form editor save surface
ccdwyer Jun 8, 2026
2b66fd6
Open workflow editing from the board route
ccdwyer Jun 8, 2026
b6979e0
Keep dirty workflow edits across parent rerenders
ccdwyer Jun 8, 2026
9718426
Preserve workflow drafts during in-flight saves
ccdwyer Jun 8, 2026
dea21fc
Preserve workflow instruction file references
ccdwyer Jun 8, 2026
2e4e0c6
Reject unsafe workflow instruction paths
ccdwyer Jun 8, 2026
6d42d78
Validate workflow editor saves before RPC
ccdwyer Jun 8, 2026
98366ee
Stop parsing transition JSON in editor model
ccdwyer Jun 8, 2026
76ba2f4
Block symlinked workflow instructions from escaping repo
ccdwyer Jun 8, 2026
9247c24
Prevent stale workflow editor saves from overwriting board files
ccdwyer Jun 8, 2026
cb1fed5
Detect hand-edited workflow boards before saving
ccdwyer Jun 8, 2026
e967800
Serialize workflow board saves per board
ccdwyer Jun 8, 2026
c278461
Refuse workspace writes through escaping symlinks
ccdwyer Jun 8, 2026
df654a4
Read canonical workflow instruction files
ccdwyer Jun 8, 2026
7f62153
docs: add v2-D/D2 (canvas view + toggle) design spec
ccdwyer Jun 8, 2026
1559f72
docs: fold GPT-5.5 spec review into v2-D/D2 spec
ccdwyer Jun 8, 2026
d0eca9f
docs: add v2-D/D2 implementation plan
ccdwyer Jun 8, 2026
505ebc3
Share workflow editor selection across inspector surfaces
ccdwyer Jun 8, 2026
55686d5
Render workflow routing on an auto-laid canvas
ccdwyer Jun 8, 2026
28e9b21
Share canvas selection with the workflow inspector
ccdwyer Jun 8, 2026
0e99d38
Connect workflow lanes with draggable route handles
ccdwyer Jun 8, 2026
044cae4
Toggle workflow editing between canvas and form
ccdwyer Jun 8, 2026
6328216
Keep blank route drops from retargeting lanes
ccdwyer Jun 8, 2026
b838e62
Resolve route drops from dnd metadata
ccdwyer Jun 8, 2026
edfc6fa
Invalidate removed transition selections
ccdwyer Jun 8, 2026
e10f5d4
Enable draggable step route handles
ccdwyer Jun 8, 2026
da988ea
Remeasure canvas anchors after layout wraps
ccdwyer Jun 8, 2026
370a6ef
Paint routing edges by visual precedence
ccdwyer Jun 8, 2026
0c4f0d2
Prevent route dnd handle id collisions
ccdwyer Jun 8, 2026
31f8c78
Keep transition selection across earlier removals
ccdwyer Jun 8, 2026
8bc6bfb
Stagger overlapping route edge labels
ccdwyer Jun 8, 2026
9f77bbb
Keep transition selection tied to edit operations
ccdwyer Jun 8, 2026
69bf73a
Make workflow edge identity opaque
ccdwyer Jun 8, 2026
0e5340b
Keep duplicate transition rows distinct
ccdwyer Jun 8, 2026
abb151b
docs: add v2-D/D3 (version history + revert) design spec
ccdwyer Jun 8, 2026
a101462
docs: fold GPT-5.5 spec review into v2-D/D3 spec
ccdwyer Jun 8, 2026
6f9cb76
docs: add v2-D/D3 implementation plan
ccdwyer Jun 8, 2026
53ac7d0
Persist workflow board snapshots with append-only identity
ccdwyer Jun 8, 2026
7fae9f1
Record workflow board versions from writes
ccdwyer Jun 8, 2026
099487c
Expose workflow board version history RPCs
ccdwyer Jun 8, 2026
90062f2
Keep reverts on the normal editor save path
ccdwyer Jun 8, 2026
bf9c42f
Expose board history in the workflow editor
ccdwyer Jun 8, 2026
36e7355
Guard board history imports with the save lock
ccdwyer Jun 8, 2026
d4aa5f7
Keep board history for malformed files still on disk
ccdwyer Jun 8, 2026
3593371
Let version diffs render invalid drafts
ccdwyer Jun 8, 2026
13f2a0e
Prevent version revert while drafts are dirty
ccdwyer Jun 8, 2026
af3d3a3
Prevent stale workflow revert from replacing newer edits
ccdwyer Jun 8, 2026
cb2d430
Keep board history out of discovery cleanup
ccdwyer Jun 8, 2026
2fdcec5
Serialize board creation with history import
ccdwyer Jun 8, 2026
8cb5a78
Prevent stale workflow editor responses crossing boards
ccdwyer Jun 8, 2026
6385f23
Serialize board deletion with saves
ccdwyer Jun 8, 2026
b8af9a9
fix(web): give the workflow editor a wide sheet so the form/canvas is…
ccdwyer Jun 8, 2026
4d02ccd
Prevent deleted workflow boards from being rediscovered
ccdwyer Jun 8, 2026
41a6fc1
Expose workflow board deletion in the sidebar
ccdwyer Jun 8, 2026
b205c68
Preserve board files when delete cannot prove unlink safety
ccdwyer Jun 8, 2026
39136f7
Keep workflow board lists scoped to their environment
ccdwyer Jun 8, 2026
e7fecbc
Serialize board discovery with delete locks
ccdwyer Jun 8, 2026
dd71e98
Delete workflow boards as an owned cascade
ccdwyer Jun 8, 2026
578a7b7
Prevent ticket mutations from surviving board deletion
ccdwyer Jun 8, 2026
31f421d
Remove ticket-scoped workflow state during board deletion
ccdwyer Jun 8, 2026
5ac9e7c
Cancel provider turns before board state deletion
ccdwyer Jun 8, 2026
d5ea17d
Cascade stale board cleanup from discovery and recovery
ccdwyer Jun 8, 2026
d17a410
Make workflow board deletion retryable
ccdwyer Jun 8, 2026
02b3813
Delete in-root symlink entries without following them
ccdwyer Jun 8, 2026
ef35c92
Scope sidebar board identity by environment
ccdwyer Jun 8, 2026
1947e61
Restore workflow deletion typecheck wiring
ccdwyer Jun 8, 2026
4fd6d1e
Prevent orphan workflow events during board deletion
ccdwyer Jun 8, 2026
72e29c9
Stop pending provider sessions during board deletion
ccdwyer Jun 8, 2026
6728395
Allow board deletion after stale provider cleanup
ccdwyer Jun 8, 2026
2558c41
Cascade persisted boards missing from discovery
ccdwyer Jun 8, 2026
6f8d9da
Prevent recovery from resurrecting deleted boards
ccdwyer Jun 8, 2026
c42634a
Restore typecheck after board deletion locks
ccdwyer Jun 8, 2026
35c5fd9
feat(board editor): color routes by outcome (success green, blocked y…
ccdwyer Jun 8, 2026
d36ba79
feat(board editor): drag to rearrange lanes on the canvas
ccdwyer Jun 8, 2026
1eba3b7
feat(board editor): fullscreen workflow editor surface
ccdwyer Jun 8, 2026
33dd69f
docs: ticket collaboration design spec (dialogue + title/description …
ccdwyer Jun 8, 2026
67274c7
Define ticket collaboration contracts
ccdwyer Jun 8, 2026
3172d87
Persist ticket collaboration threads
ccdwyer Jun 8, 2026
239069e
Resume ticket steps through collaboration messages
ccdwyer Jun 8, 2026
220bcf9
Surface ticket collaboration in the board UI
ccdwyer Jun 8, 2026
9b18430
Preserve provider question identity for ticket answers
ccdwyer Jun 8, 2026
56e47bb
Separate ticket approval gates from user-input replies
ccdwyer Jun 8, 2026
c3e7883
Bound ticket reply payload size
ccdwyer Jun 8, 2026
8c065ed
Reject non-image ticket reply attachments
ccdwyer Jun 8, 2026
af5b025
Restrict ticket images to safe raster data URLs
ccdwyer Jun 8, 2026
cd6d7fe
Ensure ticket replies surface RPC failures
ccdwyer Jun 8, 2026
7951a13
Recover provider waits against live restarted turns
ccdwyer Jun 8, 2026
2895c7b
Keep user-input waits off approval resolution
ccdwyer Jun 8, 2026
b82da41
Require question ids for text user input
ccdwyer Jun 8, 2026
63cfbe8
Cap provider prompt ticket messages
ccdwyer Jun 8, 2026
95b6b64
Await ticket approval drawer actions
ccdwyer Jun 8, 2026
1dec41f
Keep ticket collaboration tests type-clean
ccdwyer Jun 8, 2026
7550805
Prevent recovered ticket answers from targeting dead provider waits
ccdwyer Jun 8, 2026
ad74720
docs: format ticket collaboration spec
ccdwyer Jun 8, 2026
323b165
Make workflow tickets show state at a glance
ccdwyer Jun 8, 2026
0cb2161
Allow workflow board names to change without moving files
ccdwyer Jun 8, 2026
e539cc6
Make board rename retries repair partial writes
ccdwyer Jun 8, 2026
8d4109f
Bound workflow board names at RPC boundaries
ccdwyer Jun 8, 2026
3979bc5
Keep failed board renames in edit mode
ccdwyer Jun 8, 2026
25133b1
Refresh active board metadata after rename
ccdwyer Jun 8, 2026
3138441
Allow boards to declare terminal retention windows
ccdwyer Jun 8, 2026
3382035
Delete terminal-retained tickets without touching siblings
ccdwyer Jun 8, 2026
8b395fb
Start retention clocks on terminal lane entry
ccdwyer Jun 8, 2026
2ce3e8b
Prune expired terminal tickets from workflow boards
ccdwyer Jun 9, 2026
488a0c8
Preserve ticket state when retention cascade fails
ccdwyer Jun 9, 2026
24d8cfb
Avoid deleting tickets at retention boundary
ccdwyer Jun 9, 2026
b4201d1
Recheck terminal retention before deleting tickets
ccdwyer Jun 9, 2026
502370f
Bound retention deletes per sweep
ccdwyer Jun 9, 2026
4804ff8
Make terminal_at migration rerunnable
ccdwyer Jun 9, 2026
45e441d
Format retention sweeper changes
ccdwyer Jun 9, 2026
675b6ff
Prevent commitMany from inverting board save locks
ccdwyer Jun 9, 2026
cfd6f15
Keep retention deletes off active tickets
ccdwyer Jun 9, 2026
fb158e1
Round-robin retention sweeps across boards
ccdwyer Jun 9, 2026
348e669
Format commitMany lock-order files
ccdwyer Jun 9, 2026
e2fe96a
Prevent stale batch workflow events from outliving tickets
ccdwyer Jun 9, 2026
3dd6b75
Add agent and effort dropdowns to workflow agent steps
ccdwyer Jun 9, 2026
2f6d44f
Add step retry policies with escalation and ticket instruction templates
ccdwyer Jun 9, 2026
b770b73
Add retry and escalation controls to the workflow editor
ccdwyer Jun 9, 2026
c986be3
Add merge steps, worktree GC, and retry hardening from adversarial re…
ccdwyer Jun 9, 2026
5f344f5
Add merge step editing to the workflow editor
ccdwyer Jun 9, 2026
5f7b3f0
Add step token/duration metrics and second-round review fixes
ccdwyer Jun 9, 2026
9bd1120
Stream live agent activity, notify on waiting/failed tickets, add boa…
ccdwyer Jun 9, 2026
b8471fe
Fence stale dispatch recovery and fix metric/notification gaps from r…
ccdwyer Jun 9, 2026
659c616
Add ticket comments, bounded review loops, and a realistic default board
ccdwyer Jun 9, 2026
3092ed1
Reset loop budgets on human intervention and keep pipeline artifacts …
ccdwyer Jun 9, 2026
3877bf3
Scope default-board scratch files, fail-safe unknown verdicts, lint u…
ccdwyer Jun 9, 2026
a5f6874
Add lane actions: named transition buttons on tickets
ccdwyer Jun 9, 2026
51de62f
Scope workflow scratch files per ticket under .t3/ticket/<id>/
ccdwyer Jun 9, 2026
6ec5db8
Make the canvas readable: topological layout, action edges, usable in…
ccdwyer Jun 9, 2026
852e803
Restore the sample delivery board file
ccdwyer Jun 9, 2026
63b8ca6
Route canvas edges around lane cards instead of through them
ccdwyer Jun 9, 2026
05dfa33
Reserve scroll space for edge corridors and add direction arrows
ccdwyer Jun 9, 2026
9c6979d
Split the default board's Needs Attention into phase-specific issue l…
ccdwyer Jun 9, 2026
5e6c19e
Resolve the setup project by id so worktree steps actually run
ccdwyer Jun 9, 2026
9e04aea
Carry the ticket discussion into agent step instructions
ccdwyer Jun 9, 2026
1ea0d1b
Read the discussion for agent steps without decoding attachments
ccdwyer Jun 9, 2026
db5305c
Explain ticket routing in the drawer
ccdwyer Jun 9, 2026
06bb76f
Bound route history payloads and verdict labels
ccdwyer Jun 9, 2026
6c0f356
Turn braindumps into proposed tickets with an intake agent
ccdwyer Jun 9, 2026
6b56fe8
Create hidden orchestration threads for workflow dispatches
ccdwyer Jun 10, 2026
9823045
Harden intake: stop the session, restrict access, surface failures
ccdwyer Jun 10, 2026
915a29a
Keep the intake agent tool-free
ccdwyer Jun 10, 2026
3d5d0f8
Close hidden-thread gaps: recovery, loud failures, snapshot and relay
ccdwyer Jun 10, 2026
edd09db
Let tickets depend on each other with automatic release
ccdwyer Jun 10, 2026
ffc3df3
Show ticket dependencies on the board
ccdwyer Jun 10, 2026
df71098
Close dependency release and validation gaps
ccdwyer Jun 10, 2026
eaca0c4
Keep dependency badges live and fix stale checkbox events
ccdwyer Jun 10, 2026
09a2ad2
Fix canvas arrows, shared ports, and drag-drop drift
ccdwyer Jun 10, 2026
ae00c0d
Cap ticket spend with per-ticket token budgets
ccdwyer Jun 10, 2026
9b7286b
Fan review steps out to a majority-verdict panel
ccdwyer Jun 10, 2026
79550c3
Make review panels safe across restarts, stalls, and shared trees
ccdwyer Jun 10, 2026
ae3cc17
Delete hidden workflow threads with their tickets
ccdwyer Jun 10, 2026
d4cd04d
Let intake propose ordered tickets with dependency edges
ccdwyer Jun 10, 2026
870ec73
View the agent's full session from any step
ccdwyer Jun 10, 2026
f8f55b2
Show the ticket's case file in the drawer
ccdwyer Jun 10, 2026
c4d2c0e
Let external events drive lane transitions
ccdwyer Jun 10, 2026
70b3cae
Harden external event ingestion after review
ccdwyer Jun 10, 2026
4f4d569
Board digest and ticket aging highlights
ccdwyer Jun 10, 2026
6cba3be
Dim canvas edges unrelated to the selected lane
ccdwyer Jun 10, 2026
1d6659b
Fix digest loading and refresh aging on a timer
ccdwyer Jun 10, 2026
b1f4f9b
Dry-run a board's routing with a simulated ticket
ccdwyer Jun 10, 2026
c666c10
Webhook config dialog and lane external-event editor
ccdwyer Jun 10, 2026
1a4903c
Let the user pick the intake agent
ccdwyer Jun 10, 2026
ea3c29d
Align the dry-run simulator with real engine semantics
ccdwyer Jun 10, 2026
2b39e87
Merge branch 'pingdotgg:main' into ft/hyperion
ccdwyer Jun 10, 2026
14c3884
Merge remote-tracking branch 'upstream/main' into ft/hyperion
ccdwyer Jun 10, 2026
69bb019
Add workflow boards demo screenshots
ccdwyer Jun 10, 2026
87db8cc
Harden verdict capture and fix PR review findings
ccdwyer Jun 10, 2026
63158b4
Merge branch 'main' into ft/hyperion
ccdwyer Jun 10, 2026
ac0c291
Merge branch 'main' into ft/hyperion
ccdwyer Jun 10, 2026
03c09f4
Merge branch 'main' into ft/hyperion
ccdwyer Jun 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,4 @@ node_modules/
*.log
.env*
!.env.example
.superpowers/
73 changes: 73 additions & 0 deletions .t3/boards/delivery.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"name": "Standard delivery",
"settings": {
"maxConcurrentTickets": 3
},
"lanes": [
{
"key": "backlog",
"name": "Backlog",
"entry": "manual"
},
{
"key": "implement",
"name": "Implement",
"entry": "auto",
"pipeline": [
{
"key": "code",
"type": "agent",
"agent": {
"instance": "codex",
"model": "gpt-5.5",
"options": [
{
"id": "reasoningEffort",
"value": "xhigh"
}
]
},
"instruction": "Implement the requested ticket in this worktree. Keep the change focused, run the relevant checks, and report the verification evidence.",
"captureOutput": true
},
{
"key": "review",
"type": "agent",
"agent": {
"instance": "codex",
"model": "gpt-5.5",
"options": [
{
"id": "reasoningEffort",
"value": "medium"
}
]
},
"instruction": "Review the accumulated diff for blocking correctness, reliability, or integration issues. List only issues that must be fixed before the ticket can ship.",
"captureOutput": true
}
],
"on": {
"success": "owner_review",
"failure": "needs_attention",
"blocked": "needs_attention"
}
},
{
"key": "owner_review",
"name": "Owner Review",
"entry": "manual"
},
{
"key": "needs_attention",
"name": "Needs Attention",
"entry": "manual"
},
{
"key": "done",
"name": "Done",
"entry": "manual",
"terminal": true
}
]
}
1 change: 1 addition & 0 deletions apps/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
"@opencode-ai/sdk": "^1.3.15",
"@pierre/diffs": "catalog:",
"effect": "catalog:",
"json-logic-js": "^2.0.5",
"node-pty": "^1.1.0"
},
"devDependencies": {
Expand Down
21 changes: 3 additions & 18 deletions apps/server/src/auth/EnvironmentAuth.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { AuthAdministrativeScopes } from "@t3tools/contracts";
import { AuthAdministrativeScopes, AuthStandardClientScopes } from "@t3tools/contracts";
import { expect, it } from "@effect/vitest";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
Expand Down Expand Up @@ -92,13 +92,7 @@ it.layer(NodeServices.layer)("EnvironmentAuth.layer", (it) => {
);

expect(verified.sessionId.length).toBeGreaterThan(0);
expect(verified.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
]);
expect(verified.scopes).toEqual([...AuthStandardClientScopes]);
expect(verified.subject).toBe("one-time-token");
}).pipe(Effect.provide(makeEnvironmentAuthLayer())),
);
Expand Down Expand Up @@ -173,16 +167,7 @@ it.layer(NodeServices.layer)("EnvironmentAuth.layer", (it) => {
makeCookieRequest(exchanged.sessionToken),
);

expect(verified.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
"access:read",
"access:write",
"relay:write",
]);
expect(verified.scopes).toEqual([...AuthAdministrativeScopes]);
expect(verified.subject).toBe("administrative-bootstrap");
}).pipe(Effect.provide(makeEnvironmentAuthLayer())),
);
Expand Down
23 changes: 3 additions & 20 deletions apps/server/src/auth/EnvironmentAuthAdmin.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { AuthAdministrativeScopes } from "@t3tools/contracts";
import { expect, it } from "@effect/vitest";
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
Expand Down Expand Up @@ -74,29 +75,11 @@ it.layer(NodeServices.layer)("EnvironmentAuth administrative operations", (it) =
const listedAfterRevoke = yield* environmentAuth.listSessions();

expect(issued.method).toBe("bearer-access-token");
expect(issued.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
"access:read",
"access:write",
"relay:write",
]);
expect(issued.scopes).toEqual([...AuthAdministrativeScopes]);
expect(issued.client.deviceType).toBe("bot");
expect(issued.client.label).toBe("deploy-bot");
expect(verified.sessionId).toBe(issued.sessionId);
expect(verified.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
"access:read",
"access:write",
"relay:write",
]);
expect(verified.scopes).toEqual([...AuthAdministrativeScopes]);
expect(verified.method).toBe("bearer-access-token");
expect(listedBeforeRevoke).toHaveLength(1);
expect(listedBeforeRevoke[0]?.sessionId).toBe(issued.sessionId);
Expand Down
20 changes: 3 additions & 17 deletions apps/server/src/auth/PairingGrantStore.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { AuthAdministrativeScopes, AuthStandardClientScopes } from "@t3tools/contracts";
import { expect, it } from "@effect/vitest";
import * as Duration from "effect/Duration";
import * as Effect from "effect/Effect";
Expand Down Expand Up @@ -52,13 +53,7 @@ it.layer(NodeServices.layer)("PairingGrantStore.layer", (it) => {
const second = yield* Effect.flip(bootstrapCredentials.consume(issued.credential));

expect(first.method).toBe("one-time-token");
expect(first.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
]);
expect(first.scopes).toEqual([...AuthStandardClientScopes]);
expect(first.subject).toBe("one-time-token");
expect(first.label).toBe("Julius iPhone");
expect(issued.label).toBe("Julius iPhone");
Expand Down Expand Up @@ -122,16 +117,7 @@ it.layer(NodeServices.layer)("PairingGrantStore.layer", (it) => {
const second = yield* Effect.flip(bootstrapCredentials.consume("desktop-bootstrap-token"));

expect(first.method).toBe("desktop-bootstrap");
expect(first.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
"access:read",
"access:write",
"relay:write",
]);
expect(first.scopes).toEqual([...AuthAdministrativeScopes]);
expect(first.subject).toBe("desktop-bootstrap");
expect(second._tag).toBe("BootstrapCredentialInvalidError");
}).pipe(
Expand Down
9 changes: 2 additions & 7 deletions apps/server/src/auth/SessionStore.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { AuthStandardClientScopes } from "@t3tools/contracts";
import { expect, it } from "@effect/vitest";
import * as Duration from "effect/Duration";
import * as Effect from "effect/Effect";
Expand Down Expand Up @@ -123,13 +124,7 @@ it.layer(NodeServices.layer)("SessionStore.layer", (it) => {

expect(verified.method).toBe("bearer-access-token");
expect(verified.subject).toBe("test-clock");
expect(verified.scopes).toEqual([
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
]);
expect(verified.scopes).toEqual([...AuthStandardClientScopes]);
}).pipe(Effect.provide(Layer.merge(makeSessionStoreLayer(), TestClock.layer()))),
);

Expand Down
4 changes: 4 additions & 0 deletions apps/server/src/auth/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import {
AuthStandardClientScopes,
AuthOrchestrationOperateScope,
AuthOrchestrationReadScope,
AuthWorkflowOperateScope,
AuthWorkflowReadScope,
AuthRelayReadScope,
AuthRelayWriteScope,
AuthReviewWriteScope,
Expand Down Expand Up @@ -249,6 +251,8 @@ export const authHttpApiLayer = HttpApiBuilder.group(
allowedScopes: new Set<AuthEnvironmentScope>([
AuthOrchestrationReadScope,
AuthOrchestrationOperateScope,
AuthWorkflowReadScope,
AuthWorkflowOperateScope,
AuthTerminalOperateScope,
AuthReviewWriteScope,
AuthAccessReadScope,
Expand Down
24 changes: 3 additions & 21 deletions apps/server/src/bin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { join } from "node:path";

import * as NodeHttpServer from "@effect/platform-node/NodeHttpServer";
import * as NodeServices from "@effect/platform-node/NodeServices";
import { EnvironmentOrchestrationHttpApi } from "@t3tools/contracts";
import { AuthAdministrativeScopes, EnvironmentOrchestrationHttpApi } from "@t3tools/contracts";
import * as NetService from "@t3tools/shared/Net";
import { assert, it } from "@effect/vitest";
import * as Effect from "effect/Effect";
Expand Down Expand Up @@ -351,28 +351,10 @@ it.layer(NodeServices.layer)("bin cli parsing", (it) => {

assert.equal(typeof issued.sessionId, "string");
assert.equal(typeof issued.token, "string");
assert.deepEqual(issued.scopes, [
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
"access:read",
"access:write",
"relay:write",
]);
assert.deepEqual(issued.scopes, [...AuthAdministrativeScopes]);
assert.equal(listed.length, 1);
assert.equal(listed[0]?.sessionId, issued.sessionId);
assert.deepEqual(listed[0]?.scopes, [
"orchestration:read",
"orchestration:operate",
"terminal:operate",
"review:write",
"relay:read",
"access:read",
"access:write",
"relay:write",
]);
assert.deepEqual(listed[0]?.scopes, [...AuthAdministrativeScopes]);
assert.equal("token" in (listed[0] ?? {}), false);
}),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ describe("CheckpointDiffQueryLive", () => {
}),
getThreadShellById: () => Effect.succeed(Option.none()),
getThreadDetailById: () => Effect.succeed(Option.none()),
isThreadHidden: () => Effect.succeed(false),
}),
),
);
Expand Down Expand Up @@ -200,6 +201,7 @@ describe("CheckpointDiffQueryLive", () => {
getFullThreadDiffContext: () => Effect.die("unused"),
getThreadShellById: () => Effect.succeed(Option.none()),
getThreadDetailById: () => Effect.succeed(Option.none()),
isThreadHidden: () => Effect.succeed(false),
}),
),
);
Expand Down Expand Up @@ -282,6 +284,7 @@ describe("CheckpointDiffQueryLive", () => {
getFullThreadDiffContext: () => Effect.die("unused"),
getThreadShellById: () => Effect.succeed(Option.none()),
getThreadDetailById: () => Effect.succeed(Option.none()),
isThreadHidden: () => Effect.succeed(false),
}),
),
);
Expand Down Expand Up @@ -349,6 +352,7 @@ describe("CheckpointDiffQueryLive", () => {
getFullThreadDiffContext: () => Effect.die("unused"),
getThreadShellById: () => Effect.succeed(Option.none()),
getThreadDetailById: () => Effect.succeed(Option.none()),
isThreadHidden: () => Effect.succeed(false),
}),
),
);
Expand Down Expand Up @@ -401,6 +405,7 @@ describe("CheckpointDiffQueryLive", () => {
getFullThreadDiffContext: () => Effect.succeed(Option.none()),
getThreadShellById: () => Effect.succeed(Option.none()),
getThreadDetailById: () => Effect.succeed(Option.none()),
isThreadHidden: () => Effect.succeed(false),
}),
),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ describe("OrchestrationEngine", () => {
getFullThreadDiffContext: () => Effect.succeed(Option.none()),
getThreadShellById: () => Effect.succeed(Option.none()),
getThreadDetailById: () => Effect.succeed(Option.none()),
isThreadHidden: () => Effect.succeed(false),
}),
),
Layer.provide(
Expand Down
1 change: 1 addition & 0 deletions apps/server/src/orchestration/Layers/ProjectionPipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,7 @@ const makeOrchestrationProjectionPipeline = Effect.fn("makeOrchestrationProjecti
pendingUserInputCount: 0,
hasActionableProposedPlan: 0,
deletedAt: null,
hidden: event.payload.hidden === true ? 1 : 0,
});
return;

Expand Down
Loading
Loading