User Journeys — Agents + Skills + Tasks
Status: Draft
Last updated: 2026-05-25
Audience: Product, design, engineering — concrete end-to-end stories showing how the three new features fit together with existing surfaces (Missions, Ideas, Works, KB, Plugins).
These aren't acceptance criteria — those are in each feature's
spec.md. These are illustrative narratives so you can spot UX gaps before code is written.
J1 — The Indie Hacker who just wants to ship a blog faster
Persona: Aleksei, solo founder. Has 1 Work today (his SaaS marketing site). No Missions. No prior interest in Agents.
Day 1 — discovers Agents:
- Aleksei opens the platform, sees a new "Agents" sidebar item with a
Newbadge. Clicks. - Empty state explains: "Agents are AI workers you can name and put to work alongside your Works. Try creating a "Content Writer" Agent to draft blog posts on a schedule."
- He clicks
+ New Agent. The dialog mirrors the Work create dialog:- Name:
Content Writer - Title:
Blog content lead - Capabilities:
Write 3 blog posts per week about indie SaaS marketing. Keep voice casual and skeptical. Always link to canonical sources. - Scope:
Work — marketing-site(selected from dropdown of his existing 1 Work) - AI provider:
Use account default(OpenRouter, gpt-5) - Heartbeat:
0 9 * * MON,WED,FRI(Mon/Wed/Fri at 9am UTC) - Budget: $20/month (defaulted; he leaves it)
- Permissions:
Can commit to repo: on, everything else off.
- Name:
- Clicks Create. Lands on
/agents/content-writer. Status isdraft. He clicksStart— status flips toactive, next heartbeat fires Monday 9am. - Monday morning, Aleksei gets an in-app notification: "Content Writer drafted a blog post. Review in PR #42." He visits the PR, suggests two edits, merges.
- Within a week he has 3 posts published. He never opened the Tasks tab. The Skills tab is untouched. Costs: $4.20.
What worked: Default-everything path; tenant-scope-by-default; one CTA.
What we need to verify: Default budget ($20/month) is high enough for 3 posts/week of a competent model; Skills pre-attached behavior (the Content Writer auto-attached seo-meta and internal-link-suggestions from the catalog at create — does Aleksei see why?).
J2 — Founder with a Mission, wants a small specialized team
Persona: Maya, building a Mission "Cats Business Worldwide". Already has 2 Works (a directory of cat products, a blog).
Mission setup (already done before this feature):
- Mission
cats-business-missionwith scheduled tick. - 2 child Works visible in the Mission's "Works" section.
Day 1 — Maya creates her CEO Agent:
- From
/missions/<id>(now with a new tab strip), she clicks the newAgentstab. - Empty. She clicks
+ New Agent. - Name
CEO. Capabilities: "You are the CEO of Cats Business Worldwide. Your job: make sure every Idea and Work ladders up to dominating the worldwide cat industry. Set direction. Delegate." - Scope:
Mission — cats-business-mission. AI provider:Anthropic claude-sonnet-4-6. - Heartbeat:
0 8 * * *(daily 8am). - Permissions:
Can create Agents: ON,Can assign tasks: ON. Everything else default off. - Create. Lands on
/agents/ceo. She editsSOUL.mdfrom the Instructions tab to add: "Be terse. Use bullet points. Never write more than 200 words at a time." - Saves. Commit lands in
<missionRepo>/.works/agents/ceo/SOUL.md.
Day 2 — CEO Agent creates a VP-Engineering:
- CEO Agent's first heartbeat runs at 8am.
- Its response includes a
createSubAgenttool call:{name: 'VP-Engineering', scope: 'mission', capabilities: 'You own technical decisions for cats-business. Review schemas, approve plugin choices, escalate to CEO when blocked.', heartbeatCadence: '0 10 * * MON'}. - Platform validates: CEO has
canCreateAgents = true; scope=mission within CEO's reach — OK. Creates the row, writes files to<missionRepo>/.works/agents/vp-engineering/, statusdraft(humans must explicitly start sub-agents). - In-app notification: "CEO created VP-Engineering. Click to review and activate."
- Maya reviews the auto-generated
AGENTS.md, makes a small edit, clicks Start.
Day 3 — VP-Engineering's first task:
- CEO's next heartbeat creates a Task:
Pick a screenshot plugin for the directory (currently using local; investigate ScreenshotOne vs Urlbox). Assignee: VP-Engineering. Scope: Workcats-directory. Priority p2. - Task transitions to
in_progressimmediately (since VP-Eng is an Agent assignee). VP-Engineering's heartbeat runs sooner (it's listed in the task's wait queue, not the normal 10am Mon slot). - VP-Engineering's run reads the screenshot plugin manifests, queries pricing pages via the existing
searchplugin, posts a chat reply: "ScreenshotOne is $19/mo for 5k shots; Urlbox is $29 but supports our cookie-banner workaround. Recommend ScreenshotOne. Want me to switch the Work's plugin?" - Maya replies in the chat:
@vp-engineering yes, switch it. - VP-Engineering's
agent-chat-replyrun picks up the message, calls thetogglePlugintool (gated bycanCommitToRepo), opens a PR against the Work's data repo, posts back: "PR #43 opened. Will switch on merge."
What worked: Hierarchy clicks for Maya — she sees CEO → VP-Eng → Task → Work flow without code. Tasks chat IS the collaboration medium. What we need to verify: The "sub-agent auto-created in draft" friction is good (not bad) — Maya wants control over what gets activated. Also: when CEO's run cost is debited to CEO's budget but VP-Eng's task work is debited to VP-Eng's budget, is the breakdown clear in the Mission spend tile?
J3 — Engineer using Agents to automate PR reviews across all Works
Persona: Devi, technical lead. Wants every PR opened against any of her Works to get an auto-review.
Setup:
- From
/agents, Devi createsPR-Revieweragent. - Scope:
Tenant — available to all. AI provider: account default. Heartbeat:manual(no cron). - Capabilities: "Review pull requests opened against any of my Works. Post inline comments. Use the pr-review skill for the standard rubric."
- Permissions:
Can call external tools: ON,Can commit to repo: OFF(we don't want auto-fixes). - Devi opens the new
/skillspage, seespr-reviewin the Available section. Clicks Install. Then on/agents/pr-reviewer/skills, attaches the now-installedpr-reviewskill to this Agent. - Status flipped to
activebut no cron — runs only on event.
The event hook (deferred to v2 in the spec):
The spec features/agents/spec.md §6 Out of Scope lists "Run on event" as v2. For now, Devi works around this:
She creates a Task whenever she wants a review:
Review PR #N on cats-directory, assignsPR-Reviewer. Task moves toin_progress→ Agent run dispatches → reviews, posts inline comments on the PR via the GitHub plugin tools, closes the task.
v2 ideal flow (not in v1): a GitHub webhook fires on pull_request.opened; platform consults Agent's runOn: [github.pull_request.opened] config; creates the Task automatically. Same dispatch path.
What worked in v1: Devi can still get value by manually triggering. The Skills hierarchy clicked — install once, attach to one Agent. What we need to verify: Manual-trigger UX is good enough until v2. Is the "Run heartbeat now" button on the Agent detail page discoverable for ad-hoc runs?
J4 — Content team across multiple Works, one shared Skill
Persona: Tomás, content lead. Manages 4 Works (4 different niche directories) for his company.
The workflow:
- He creates
EditorAgent at tenant scope. Scope-membership: explicitly chooses all 4 Works. - From
/skills, he authors a custom skillhouse-stylewith his company's voice guide. Saves at tenant scope. Attaches toEditorAgent. - He also goes to each of the 4 Works'
Skillstabs and toggleshouse-styleto "Inject into Generator". Now both the Editor Agent AND the standard pipeline (for items, comparisons, blog posts) injecthouse-style's description + body excerpt into every AI call. - He notices the SEO skill
seo-metafrom the catalog. Installs it. Attaches to Editor AND injects into all 4 Works' Generators.
Two weeks in:
- Tomás updates
house-style.md(DB-inline since it's tenant scope) to soften "never use semicolons" to "minimize semicolons." His change applies instantly to all 4 Works and the Editor Agent. No re-deploy. - Catalog
seo-metaships v1.1. Tomás's/skillspage shows "Update available" on his installed copy. He clicks Update. His copy gets the new body; his Work bindings keep pointing at his copy.
What worked: One Skill, many surfaces, single source of truth.
What we need to verify: Token budget — Editor runs in a Work that has house-style + seo-meta injected into the generator AND attached to the Agent. We don't want double-injection of the same skill body. Resolver must dedupe by slug.
J5 — Tenant CEO orchestrating multiple Missions
Persona: Akira, runs 3 parallel Missions (cats-business, mountain-gear-directory, dev-tools-newsletter).
Setup:
- From
/agents, createsTenant-CEOagent. Scope:Tenant — all 3 Missions. - Capabilities: "You're the CEO across all my businesses. Look at all three Missions weekly. Flag the one with worst momentum. Suggest one concrete next step per Mission."
- Heartbeat:
0 9 * * MON(weekly Monday 9am). - Permissions:
Can assign tasks: ON, everything else off.
Monday 9am:
- Tenant-CEO heartbeat fires. Run loads:
- The Agent's MD files.
getActivity()tool reads last 7 days of activity across all 3 Missions.getMissionState()tool reads current Ideas/Works counts per Mission.- Tenant-CEO's response: a 3-bullet weekly digest + 3 tasks (one per Mission), each assigned to the existing Mission-scoped CEO Agent in that Mission.
This is the cross-scope task-assignment scenario. Tenant-scoped Agent assigns to Mission-scoped Agents within its membership. Allowed per architecture §3. Each Mission CEO picks up the assigned task on its next heartbeat.
- Akira reads the digest in the activity feed Monday morning over coffee. He doesn't need to action anything; the chain of CEOs is already executing.
What worked: Two-level hierarchy. Tenant CEO sees across; Mission CEOs execute within. Tenant CEO's budget is small (it just reads + assigns); Mission CEOs do the actual work. What we need to verify: Tenant Agent reads across Missions (B2 in QUESTIONS). Default ON or OFF? J5 only works if it's ON.
Cross-journey observations
What recurs across all 5 journeys
- Sidebar discovery is the entry point. All 5 personas start by clicking a new sidebar item. The empty states (Agents, Skills, Tasks) must be self-explanatory.
- "Use account default" is the friction-killer. Everywhere a provider/model picker appears, the default selection is "Use account default" — and that's enough for ~80% of users.
- Tenant scope is the default for the first Agent. Mission/Work scopes feel like "advanced." We should bias UI defaults that direction.
- Cost stays small for J1-J4. Even J5 with 3 Missions stays under $50/month total. The default budget caps (Agent: $20, Work: $50) probably need a "review your defaults" prompt at 50% utilization, not at 80%.
Where the design currently has holes
- J3 needs event-trigger Agents. v1 OOS, but worth documenting that the manual workaround works.
- J5 needs cross-mission visibility (QUESTIONS B2). If we pick "no, per-run scoping" the Tenant CEO use case is harder; needs an explicit context-handoff.
- J2's "sub-agent in draft" friction could be wrong direction — maybe sub-agents auto-activate but with a banner; collect feedback.
- J4's deduplication is a real concern when one skill is injected via two paths (Agent's bindings + Work's Generator). The resolver in Skills spec §3.3 FR-9 dedupes by slug — but we should write a unit test for this exact case.
Where the design holds up well
- Hierarchy of CEOs (J5 → J2 → individual contributors) maps naturally onto Tenant → Mission → Work scopes.
- Tasks as the only Agent ↔ Agent channel (per QUESTIONS B3) gives every cross-Agent interaction an audit trail and a budget owner.
- Skills layered over Works' WorkAdvancedPrompts lets users keep the per-Work-tweak surface AND add reusable Skills. Two complementary tools, not competing ones.