How We Work¶
From idea to production.
The Team¶
Work Management¶
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e2e8f0", "primaryTextColor": "#1e293b", "primaryBorderColor": "#64748b", "lineColor": "#94a3b8", "secondaryColor": "#e2e8f0", "tertiaryColor": "#cbd5e1", "background": "#0f172a", "mainBkg": "#e2e8f0", "nodeBorder": "#64748b", "clusterBkg": "#1e293b", "clusterBorder": "#475569", "titleColor": "#e2e8f0", "edgeLabelBackground": "#1e293b", "nodeTextColor": "#1e293b"}}}%%
graph TD
D["👤 Daniel / PM"]
DEV["👤 CTO / Developer"]
SLACK["Slack"]
D -->|"creates"| F
DEV -->|"discusses and refines"| F
DEV -->|"plans and creates"| CLI
D <-->|"communicates"| SLACK
DEV <-->|"communicates"| SLACK
subgraph Product ["Asana/ClickUp"]
F["Features + User Stories"]
QUEUE["Prioritized queue"]
OTHER["UX/UI · Business · Operations"]
F -->|"ready to build"| QUEUE
end
CLI["Claude Code CLI"]
CLI -->|"reads priorities"| QUEUE
CLI -->|"creates milestones + tasks"| GH
subgraph Rig ["Automated Engineering Rig"]
GH[GitHub Issues]
AGENTS["Agents · Build · Test · Review · Human Gate · Deploy"]
PROD[Production]
GH --> AGENTS
AGENTS --> PROD
end
PROD -->|"updates status"| F
PROD -->|"usage data"| F
AGENTS <-->|"communicates"| SLACK
style D fill:#f59e0b,color:#000
style DEV fill:#38bdf8,color:#000
style SLACK fill:#e9a820,color:#000
style F fill:#fbbf24,color:#000
style QUEUE fill:#fbbf24,color:#000
style OTHER fill:#fbbf24,color:#000
style CLI fill:#60a5fa,color:#000
style GH fill:#60a5fa,color:#000
style AGENTS fill:#a78bfa,color:#000
style PROD fill:#34d399,color:#000
Product work lives in Asana/ClickUp. Daniel creates features and user stories. When ready to build, they enter a prioritized queue.
The CTO discusses and refines features with Daniel, then uses Claude Code CLI to break them into GitHub milestones and issues with dependencies.
The rig picks up approved issues, builds, tests, reviews, and deploys them. Status flows back to Asana/ClickUp automatically.
Everyone communicates through Slack including the agents.
The Conductor¶
An automated coordinator that assigns work to dev agents in the right order.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e2e8f0", "primaryTextColor": "#1e293b", "primaryBorderColor": "#64748b", "lineColor": "#94a3b8", "secondaryColor": "#e2e8f0", "tertiaryColor": "#cbd5e1", "background": "#0f172a", "mainBkg": "#e2e8f0", "nodeBorder": "#64748b", "clusterBkg": "#1e293b", "clusterBorder": "#475569", "titleColor": "#e2e8f0", "edgeLabelBackground": "#1e293b", "nodeTextColor": "#1e293b"}}}%%
graph TD
MILE{"Milestones complete?"} -->|yes| NOTIFY["Notify Slack + Asana/ClickUp"]
MILE -->|no| FIND
NOTIFY --> FIND
FIND["Find approved + not blocked issues"] --> ASSIGN["Assign to dev agent"]
ASSIGN --> AGENT["Dev agent takes it all the way to production"]
AGENT --> MILE
style MILE fill:#fbbf24,color:#000
style NOTIFY fill:#e9a820,color:#000
style FIND fill:#34d399,color:#000
style ASSIGN fill:#34d399,color:#000
style AGENT fill:#a78bfa,color:#000
The dev agent owns the full journey of each issue: implement, build, test, review, deploy, verify. The Conductor just picks what's next.
If an agent gets stuck, the Conductor reassigns to another agent. If that fails too, it escalates to the CTO. Two strikes then human.
Example: AI Chat Widget¶
Four issues in one milestone. Two can start in parallel, two are blocked until the first ones are done.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e2e8f0", "primaryTextColor": "#1e293b", "primaryBorderColor": "#64748b", "lineColor": "#94a3b8", "secondaryColor": "#e2e8f0", "tertiaryColor": "#cbd5e1", "background": "#0f172a", "mainBkg": "#e2e8f0", "nodeBorder": "#64748b", "clusterBkg": "#1e293b", "clusterBorder": "#475569", "titleColor": "#e2e8f0", "edgeLabelBackground": "#1e293b", "nodeTextColor": "#1e293b"}}}%%
graph LR
A["#1 LLM tool API"] --> C["#3 Connect UI to API"]
B["#2 Chat UI component"] --> C
C --> D["#4 Analytics tracking"]
style A fill:#34d399,color:#000
style B fill:#34d399,color:#000
style C fill:#f87171,color:#000
style D fill:#f87171,color:#000
Green = ready to start. Red = blocked, waiting on dependencies.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e2e8f0", "primaryTextColor": "#1e293b", "primaryBorderColor": "#64748b", "lineColor": "#94a3b8", "secondaryColor": "#e2e8f0", "tertiaryColor": "#cbd5e1", "background": "#0f172a", "mainBkg": "#e2e8f0", "nodeBorder": "#64748b", "clusterBkg": "#1e293b", "clusterBorder": "#475569", "titleColor": "#e2e8f0", "edgeLabelBackground": "#1e293b", "nodeTextColor": "#1e293b"}}}%%
graph TD
subgraph Round1 ["Round 1: parallel"]
A1["#1 LLM tool API → Agent 1"]
A2["#2 Chat UI → Agent 2"]
end
subgraph Round2 ["Round 2"]
A3["#3 Connect UI to API → Agent 1"]
end
subgraph Round3 ["Round 3"]
A4["#4 Analytics → Agent 1"]
end
CTO["CTO approves all 4 issues"] --> Round1
Round1 -->|"#1 and #2 done"| Round2
Round2 -->|"#3 done"| Round3
Round3 -->|"#4 done"| DONE["Milestone complete → Slack + Asana/ClickUp"]
style CTO fill:#38bdf8,color:#000
style A1 fill:#a78bfa,color:#000
style A2 fill:#a78bfa,color:#000
style A3 fill:#a78bfa,color:#000
style A4 fill:#a78bfa,color:#000
style DONE fill:#e9a820,color:#000
Each issue deploys independently. Backend goes first so the API is live before the frontend uses it. No feature flags, no coordinated releases.
Priority¶
When multiple issues are ready, the Conductor picks the most important one first.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e2e8f0", "primaryTextColor": "#1e293b", "primaryBorderColor": "#64748b", "lineColor": "#94a3b8", "secondaryColor": "#e2e8f0", "tertiaryColor": "#cbd5e1", "background": "#0f172a", "mainBkg": "#e2e8f0", "nodeBorder": "#64748b", "clusterBkg": "#1e293b", "clusterBorder": "#475569", "titleColor": "#e2e8f0", "edgeLabelBackground": "#1e293b", "nodeTextColor": "#1e293b"}}}%%
graph LR
P1["1. Critical (production bug)"] --> P2["2. High priority"]
P2 --> P3["3. Normal"]
P3 --> TIE["Same? Oldest first"]
style P1 fill:#f87171,color:#000
style P2 fill:#fbbf24,color:#000
style P3 fill:#34d399,color:#000
A production bug jumps the queue. The agent handling the bug finishes it before returning to milestone work. Agents always finish their current work before picking up new work.
When things go wrong¶
Fix forward, not rollback. If something breaks in production, the Conductor assigns a critical fix to the next available agent.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#e2e8f0", "primaryTextColor": "#1e293b", "primaryBorderColor": "#64748b", "lineColor": "#94a3b8", "secondaryColor": "#e2e8f0", "tertiaryColor": "#cbd5e1", "background": "#0f172a", "mainBkg": "#e2e8f0", "nodeBorder": "#64748b", "clusterBkg": "#1e293b", "clusterBorder": "#475569", "titleColor": "#e2e8f0", "edgeLabelBackground": "#1e293b", "nodeTextColor": "#1e293b"}}}%%
graph LR
A["Something breaks"] --> B["Agent 1 tries to fix"]
B --> C{"Fixed?"}
C -->|yes| D["Deploy fix"]
C -->|no| E["Reassign to Agent 2"]
E --> F{"Fixed?"}
F -->|yes| D
F -->|no| G["Escalate to CTO"]
style A fill:#f87171,color:#000
style B fill:#a78bfa,color:#000
style C fill:#fbbf24,color:#000
style D fill:#34d399,color:#000
style E fill:#a78bfa,color:#000
style F fill:#fbbf24,color:#000
style G fill:#f59e0b,color:#000
Two strikes then human. Rollback is never automatic. That's always a CTO decision.
Human gates¶
Some changes always require a human to review before they can ship:
- Authentication or session code
- Payment processing
- Database schema changes
- Data deletion logic
- New third-party dependencies
Everything else goes through automated review. If a human gate is waiting for more than 30 minutes, the Conductor sends a Slack reminder.
For technical details on the engineering rig, see Engineering Rig. For the event store architecture, see Event Store.