refactor(maps): generate indexes from local story and feature metadata (#16214)

## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Feature recipes and Storybook help contributors find behavior,
examples, and verification steps.
> - Independent feature changes currently update shared catalogs,
indexes, and review hashes.
> - Those shared files cause merge conflicts and repeated bookkeeping
during parallel work.
> - This pull request stores metadata in each feature recipe and story,
then generates the combined views.
> - Contributors can merge independent work without editing a common
index. Git and PR evidence retain change and review history.

## Linked Issues or Issue Description

**What existing behavior does this improve?**

Maintaining the product, agent-access, and Storybook maps while multiple
agents change different features.

**Current behavior**

A story or recipe change can update `catalog.json`, `INDEX.md`, review
hashes, verification tables, and tracked generated navigation. Two
unrelated changes then conflict in the same files.

**Proposed behavior**

Each story declares capability links and classification in
`parameters.paperclip`. Each feature recipe declares its navigation and
optional verification guidance. Startup, build, and UI typechecking
discover these sources and generate ignored indexes and Storybook pages.

**Reason and benefit**

A routine change edits its own source files. Aggregate metadata is
rebuilt from the merged checkout. There is no sidecar registry, shared
review journal, or hash acknowledgment to maintain.

**Breaking changes**

The tracked Storybook catalog and index paths are retired. Consumers use
`ui/storybook/generated/` or `maps/generated/` after generation.
Contributor instructions and the existing feature-gap browser suite use
the new paths. Story and overview IDs remain stable.

## What Changed

- Move the existing annotations into 262 story files. Preserve
classifications, capability associations, exports, and explicit IDs.
- Discover all 35 feature recipes. Store section/order beside each
recipe and move durable verification routes out of the shared table.
- Remove tracked catalogs, inventories, overview pages, and inline
preview ordering. Keep authored preview behavior in `preview-base.tsx`.
- Generate the Storybook guide, feature/access Markdown indexes, gap
report, page-reference inventory, and preview wrapper automatically.
- Update the map contracts and maintenance skills to use Git history and
revision-specific PR/CI evidence.
- Add schema, identity, regeneration, and actual Git merge tests. Run
these through the existing UI Vitest suite. Add focused browser
navigation checks.

This is one coordinated migration. Most of the 367 changed files contain
only moved metadata or deleted generated content. Review the generator
scripts, map contracts, Storybook configuration, and tests first. No
product API or authorization behavior changes.

## Verification

Passed:

- `node scripts/check-maps.mjs`: 35 paired areas and 175 capabilities.
- `node scripts/storybook-catalog.mjs --check`: 262 suites and 2,485
authored stories after incorporating current master.
- `node --test scripts/check-maps.test.mjs
scripts/storybook-catalog.test.mjs
scripts/storybook-feature-index.test.mjs`: 28 tests, including
independent branches merged in both orders with identical generated
output and no tracked changes.
- `pnpm --filter @paperclipai/ui exec vitest run
storybook/map-tooling.test.ts`: the CI entrypoint runs those map tests.
- `pnpm check:token-gates`.
- `pnpm -r typecheck` and `pnpm build` before the final master rebase.
- `pnpm build-storybook`: all 2,517 original story/docs URLs retained.
Current master contributes exactly four additional recovery stories.
- Focused Playwright navigation checks: search and open a feature
without examples; expand verification guidance and check source links;
retain capability order and follow a related Foundations suite.

The final clean Storybook build passed after deleting every ignored map
output. Post-rebase UI typechecking and both browser tests passed. The
working tree stays clean after generation. The concurrent-cleanup
regression fails with `ENOENT` without the fix and passes with it.

All GitHub CI gates passed on `00fc7ec18e`, which also received Greptile
5/5 with no unresolved findings. The final merge commit `1c3c5143a6`
incorporates master and resolves only the two modify/delete conflicts by
retaining removal of the aggregate index and catalog. Master’s new
workspace feature and access guidance is preserved. Map validation,
catalog generation, overview generation, all 28 map tests, and diff
checks pass after conflict resolution. The maintainer explicitly
requested merging without another Greptile review. CI has not been rerun
to completion on this merge commit. The local repository-wide `pnpm
test:run` was stopped before completion after the earlier CI matrix
passed; it is not reported as a local pass. No screenshot baselines or
production acceptance are claimed.

To repeat the browser check against an owned Storybook server:

```sh
PAPERCLIP_GAP_STORYBOOK_URL=http://127.0.0.1:6136 pnpm exec playwright test --config tests/storybook-visual/feature-gap-stories.config.ts map-navigation.spec.ts
```

## Risks

- Existing branches need a one-time rebase to move their catalog changes
into local annotations. The PR incorporates the recovery changes from
current master.
- Changing the same story or capability can still produce a meaningful
conflict. This removes the shared aggregate bottleneck.
- The generator uses Storybook's existing CSF parser. Literal-only
annotations and parser regression tests protect the current contract.
- Generated Markdown is available after running the generator; the
published Storybook provides a browsable guide.
- Shared source changes still require review. Removing hashes removes
mechanical acknowledgments; it does not establish runtime parity.

## Model Used

OpenAI Codex, based on GPT-6, with repository inspection, code
execution, and browser-test tools. The exact deployment model ID and
context window were not exposed in this session.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green on the previously reviewed head
`00fc7ec18e`; final conflict-resolution checks are documented above
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
on `00fc7ec18e`; another review was waived by the maintainer
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip authored and GitHub committed 2026-10-13 15:27:23 -05:00
1 parent c7f4b74111
commit 433d94ee0b
367 files changed
+4032 -11236

No files matched your search

@@ -44,6 +44,11 @@ Paperclip's APIs, admitted tools and existing verification infrastructure. Run
`node scripts/check-maps.mjs` after map changes. Do not create maps inside a skill
directory or generate a second runtime.
For Paperclip, add navigation metadata to each feature recipe as described in the
map contract. Discovery generates the indexes; do not register new features in a
central table or commit generated catalogs. Keep review/run evidence in the PR
or evidence report and use Git for source history.
For other projects, create `.agents/skills/verify-<app>/features/README.md` plus one file per user-facing feature you can identify (aim for the top 3-5 to start, from routes, commands, menus, or docs). Follow the shape in [`references/feature-map-example/`](references/feature-map-example/), with a README index and one file per feature. Each file answers, from the user's point of view: what the feature is, how to reach it, how to drive it with the harness, and what observable end state proves it works. The four H2s are `Sub-features`, `How to get to it (user POV)`, `Driving it with <harness>`, and `Gotchas`. The map is the repo's maintained verification source; a proof that drives one convenient entry point is incomplete when the map lists others.
## 4. Prove the generated skill before handing it over
+25 -27
View File
@@ -62,40 +62,38 @@ built `index.json`; use explicit meta IDs when needed and compare IDs afterward.
Place stories under `ui/storybook/stories/<primary-feature-area>/`. Use the feature
map's section and feature names as their sidebar prefix; keep useful scenario
groupings beneath that prefix. Put shared fixture modules in `ui/storybook/support/`.
Keep the catalog's `stableId` equal to the explicit CSF meta ID even when the title
changes. Unmapped component examples belong under Foundations; the catalog guide
Keep the explicit CSF meta ID stable even when the title changes; the generated
catalog derives `stableId` from it. Unmapped component examples belong under Foundations; the catalog guide
belongs under Overview. The checker verifies these conventions.
Keep the main guide and every feature Overview congruent with the upstream index:
same section/feature names and order, all capabilities in recipe order, related
suite links across primary homes, and explicit missing examples. Regenerate
`ui/storybook/generated/` and the preview config's inline `storySort.order` through
the catalog command; never hand-edit generated pages or ordering
or add generated guides to the authored catalog. Generated guides are not example
coverage. Preserve their `feature-map-<area>--overview` IDs. When an upstream area
is removed or renamed, inspect unexpected generated files and resolve them
explicitly; the generator will not silently delete them.
suite links across primary homes, and explicit missing examples. Run `node scripts/storybook-catalog.mjs` to regenerate ignored indexes, feature
pages, and preview ordering. Storybook startup/build also generates them. Never
hand-edit or commit generated output. Generated guides are not example coverage.
Preserve their `feature-map-<area>--overview` IDs. The generator removes obsolete
pages from its own ignored output directory when areas disappear.
Keep review links and snapshot names working. Prefer classification/index fixes
before bulk directory moves. Record every directly rendered production subject in
the catalog's review sources, including relative imports and primitives when they
are the demonstrated subject. Do not cap the number of source references.
Update review fingerprints only after inspecting the changed source; do not refresh hashes merely
to silence drift checks.
Keep review links and snapshot names working. Prefer classification fixes before
bulk directory moves. Store capability associations, classification, and durable
limits in each story's literal `parameters.paperclip` object. Infer file paths,
exports and stable IDs from CSF; do not maintain a second inventory. Use Git diff
and history to choose changed production subjects, fixtures and shared sources
for review. Record source revision and executed evidence in the PR or CI report;
do not refresh hashes, dates, or a shared review journal.
Update the catalog. Keep [verification routes](../../../maps/storybook-map/VERIFICATION.md)
aligned with the unassociated capability IDs: distinguish missing shipped UI
examples from CLI/operator operations and real browser checks. Record source
revision, concrete reasons, production contracts and existing test starting points;
test presence is not passing evidence. Do not exempt a mixed UI/API capability
wholesale. When associating a new example, update this gap inventory without
discarding its separate production verification obligations.
Verification routes belong in each feature recipe's optional `Storybook
verification` section. Report needed corrections to `maintain-verification-skill`.
Distinguish missing shipped UI examples from CLI/operator operations and real
browser checks. Keep concrete production contracts and existing test starting
points; test presence is not passing evidence. The generated verification report
lists capabilities without current examples. Associating an example must not
discard its separate production verification obligations.
Run `node scripts/storybook-catalog.mjs --write` to refresh
its generated indexes and feature pages, then run the checker without flags and
`node --test scripts/storybook-catalog.test.mjs scripts/storybook-feature-index.test.mjs`.
The script validates
inventory/references/review fingerprints, not semantic parity or runtime health.
Run `node scripts/storybook-catalog.mjs --check` and
`node --test scripts/check-maps.test.mjs scripts/storybook-catalog.test.mjs scripts/storybook-feature-index.test.mjs`.
Checks validate local annotations, discovered inventory and references, not
semantic parity or runtime health.
Use `review-storybook` for affected rendering and interactions. Reuse the existing
Storybook/Playwright tools; add no separate launcher, runtime, or baseline system.
Do not accept new screenshot baselines as part of a catalog cleanup.
@@ -53,7 +53,8 @@ a permission denial is not authorization to widen access.
0. **Locate the target and scope.** Find the project-local verification skill
(usually `.agents/skills/verify-*/`). Several candidates: ask which; none:
point to `/create-verification-skill`. Honor a requested narrower audit.
Record the source commit and the last review for affected map entries.
Use Git diff/history to identify affected sources. Record the source revision
and review evidence in the PR or evidence report, not a shared map ledger.
1. **Check both indexes.** Pair same-named feature and agent files, then match
stable sub-feature IDs. Fix orphan/missing entries and broken references.
@@ -81,7 +82,10 @@ a permission denial is not authorization to widen access.
any existing request/result handoff; an unresolved delegation question stays
visible. Split broad baselines into per-operation records before marking
them operation-reviewed. Add newly discovered capabilities only with concrete
source; add their companion at the same time.
source; add their companion at the same time. Each feature recipe carries its
own navigation metadata. Discovery generates the feature and access indexes;
do not register new areas in shared READMEs or commit generated output. Keep
durable Storybook verification routes in the affected feature recipe.
4. **Live pass.** Required for a verification maintenance pass even if source
looks clean. The coordinator owns serial driving, using the target skill's
@@ -109,7 +113,8 @@ a permission denial is not authorization to widen access.
recipe or mark an access exception to bless a failure. Map evidence states
remain source-only/not-run unless an actual proof supports the named operation
and surface. Keep run artifacts/results in the evidence location or issue;
`maps/feature-map/coverage.json` remains documentation scope.
the generated `maps/generated/coverage.json` is a page-reference inventory,
not passing test evidence.
6. **Review corrections.** Re-read changed files, check paired IDs/references and
run the smallest relevant validation. Report outcome and source/live coverage
+1 -1
View File
@@ -18,7 +18,7 @@ full source review, account for every file; do not describe sampling as full
render or interaction coverage.
When reviewing navigation/index changes, compare the guide and sidebar with the
feature-map README's full ordered index. Open a feature without examples and a
full ordered index generated from feature recipes' navigation metadata. Open a feature without examples and a
feature whose related suite lives elsewhere; check capability order, gap messages,
classifications, recipe links, and actual suite navigation. Compare built entry IDs
before/after so existing links survive. Generated Overview pages do not establish
+2 -2
View File
@@ -186,8 +186,8 @@ incomplete coverage.
For Paperclip-assigned work, attach important proof through
[the artifact workflow](../../../doc/AGENT-ARTIFACTS.md). Keep runtime results in
the evidence directory or issue, not in the map; `coverage.json` describes
documentation coverage rather than live test health.
the evidence directory or issue, not in the map. The generated
`maps/generated/coverage.json` lists page references, not live test health.
## Cleanup
+3
View File
@@ -8,6 +8,9 @@ dist-flow-preview/
server/ui-dist/
packages/paperclip-runner/runner/target/
ui/storybook-static/
ui/storybook/generated/
ui/storybook/.storybook/preview.tsx
maps/generated/
.env
*.tsbuildinfo
drizzle/meta/
+5 -3
View File
@@ -181,9 +181,11 @@ Its structural checks do not prove live behavior or authorization.
Storybook has a downstream [feature catalog](maps/storybook-map/README.md).
Use `maintain-storybook` for story/fixture drift and `review-storybook` for browser
evidence. Keep the feature-map skills independent of this catalog. After story
or declared review-source changes, reconcile affected entries and run
`node scripts/storybook-catalog.mjs`; its checks are not production acceptance.
evidence. Keep the feature-map skills independent of this catalog. After story or recipe changes, update the affected source annotations or
recipe and run `node scripts/storybook-catalog.mjs`. Indexes are generated and
ignored; never commit aggregate catalogs, refresh review fingerprints, or append
a shared review journal. Use Git diffs and keep review evidence in the PR or issue.
Structural checks are not production acceptance.
Default local/agent test path:
+23 -21
View File
@@ -124,28 +124,30 @@ API responses and MCP transports keep their existing compression behavior.
The board UI Storybook keeps stories and Storybook config under `ui/storybook/` so component review files stay out of the app source routes.
Stories are grouped in `ui/storybook/stories/<feature-area>/` and the sidebar follows
the feature map's sections and feature names. Shared fixtures live in
`ui/storybook/support/`. Keep each suite's explicit meta `id` and catalog `stableId`
when changing titles or locations so existing review links remain valid.
Stories are grouped in `ui/storybook/stories/<feature-area>/`. Feature recipe
navigation controls the sidebar. Shared fixtures live in `ui/storybook/support/`.
Keep each suite's explicit meta `id` when changing titles or locations so existing
review links remain valid. Author capability associations, implementation/data
classification and durable limitations in the story's `parameters.paperclip`.
Storybook's Overview mirrors every feature in the feature-map README, including
features without examples. Each feature's generated Overview lists its capabilities
in recipe order, related suites across primary homes, and missing examples.
`ui/storybook/generated/` holds the derived pages; the preview config's inline
`storySort.order` is generated too. Regenerate these outputs
with `node scripts/storybook-catalog.mjs --write`, not manual edits. Storybook
start/build rejects stale generated output. These guide pages are separate from
the authored story inventory and do not count as visual or behavioral coverage.
Storybook start/build generates the catalog, feature Overview pages, and literal
sidebar order from the checked-out sources. `ui/storybook/generated/` and
`ui/storybook/.storybook/preview.tsx` are ignored build outputs. Shared preview
fixtures and decorators live in `preview-base.tsx`; generation never edits it.
UI typechecking also generates the inputs on a fresh checkout.
Start from the downstream [Storybook feature index](../maps/storybook-map/INDEX.md)
to find existing stories by capability. Its [contract](../maps/storybook-map/README.md)
separates production subjects, prototype implementations, simulated data, and
source-review status. Use `maintain-storybook` to reconcile stories/fixtures with
the feature map, and `review-storybook` to exercise them with existing tools.
Run `node scripts/storybook-catalog.mjs` after affected story or review-source
changes; review drift before updating fingerprints, then regenerate with `--write`.
The feature map remains an upstream input and needs no Storybook-specific fields.
Run `node scripts/storybook-catalog.mjs` to assemble the local Markdown indexes,
verification routes and page inventory under `maps/generated/`. Use `--check`
for validation without writes. These outputs are not committed. Use Git diffs to
select affected sources for review; do not maintain review fingerprints or append
a shared review journal. Record executed evidence in the PR, issue, or CI result.
The [Storybook map contract](../maps/storybook-map/README.md) describes annotations
and the [published guide](https://d1p6rlowie26tp.cloudfront.net/storybook/branches/master/?path=/story/overview-storybook-guide--coverage-guide).
Use `maintain-storybook` for source alignment and `review-storybook` for rendering
and interactions. Generated guides, example counts and structural checks do not
establish production behavior. Feature recipes retain optional verification
scope guidance; the feature/access structural check needs no Storybook runtime.
**Chat & Comments → Human identity** covers other-human names and avatars on
left-aligned task messages alongside agents; only the viewer’s own messages are blue/right-aligned. Its review guide explains the data flow; the task journey uses representative
@@ -542,7 +544,7 @@ npx paperclipai allowed-hostname dotta-macbook-pro
The [feature map](../maps/feature-map/README.md) is an optional reference for user
entry points, targeted tests, manual verification recipes, and coverage gaps.
Its page inventory is a source snapshot. The documented journeys have separate
Its generated page inventory lists current source references. The documented journeys have separate
verification steps and do not run automatically from the map.
The sibling [agent access map](../maps/agent-access-map/README.md) describes API
+21 -4
View File
@@ -62,7 +62,7 @@ the agent path, even when a legacy agent can call the REST endpoint directly.
## Companion file format
Each `agent-access-map/<area>.md` has an H1, a relative link to its product file,
review date and source commit, followed by one H2 backticked ID per product
followed by one H2 backticked ID per product
sub-feature. Each capability contains these fields:
- **Review:** `baseline` or `operation-reviewed`.
@@ -106,7 +106,7 @@ context; source presence alone does not qualify this operation.
When a change adds/removes a capability or changes its behavior, API, permission,
tool binding, CLI support, or work mode, update the affected companion and product
recipe as appropriate in the same change. Preserve IDs across renames where the
capability is unchanged; update both indexes and cross-links together. An API-only
capability is unchanged; update the affected cross-links together. Indexes discover recipes automatically. An API-only
change may update the companion without rewriting unchanged user instructions.
[maintain-verification-skill](../.agents/skills/maintain-verification-skill/SKILL.md)
@@ -122,7 +122,7 @@ Run the structural check after map changes:
node scripts/check-maps.mjs
```
It checks paired areas/IDs, indexes, required fields, and local references. It
It checks paired areas/IDs, navigation metadata, required fields, and local references. It
does not certify endpoint authorization, production bindings, operation
completeness, or live behavior. Source audits must check those against the
existing API and tool contracts; avoid a second schema catalog or runtime.
@@ -133,4 +133,21 @@ allowed result and relevant denial (another company/private resource, wrong
owner, missing grant, invalid run, restricted mode or resolver). Mutations also
need persisted state/attribution and retry behavior. Capture evidence using the
[existing artifact workflow](../doc/AGENT-ARTIFACTS.md); keep executed run results
separate from product-map `coverage.json`, which records documentation scope.
separate from generated `maps/generated/coverage.json`, which lists page references.
## Local authorship and generated indexes
Change only the recipes, access contracts and stories whose behavior or intent
changed. Feature recipes own navigation metadata; stories own small
`parameters.paperclip` annotations. Do not register entries or refresh counts in
shared READMEs, inventories, fingerprints or review journals.
`node scripts/storybook-catalog.mjs` validates and generates aggregate navigation,
Storybook data, verification routes and the page inventory. All outputs live in
ignored `maps/generated/`, `ui/storybook/generated/`, and the ignored Storybook
`preview.tsx` wrapper. Start/build and UI typechecking generate their own inputs.
A clean merged checkout therefore assembles both branches' changes automatically.
Git provides history and diffs. PRs, issues and CI artifacts retain review/run
evidence for the named revision. Capability associations do not create whole-file
review dependencies. Keep durable scenario limits in the affected recipe or story.
+9 -43
View File
@@ -4,51 +4,17 @@ This map accompanies the [feature map](../feature-map/README.md). It records API
agent entry points, permission boundaries and verification for the same capability IDs.
The [shared contract](../README.md) defines the format and maintenance rules.
Initial inventory: **35 areas and 171 sub-features**, source-reviewed on 2026-10-12
at `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. All entries are `baseline` and `source-only`; none
claims complete operation enumeration or freshly verified agent access. Existing
API paths, native gaps, actor restrictions and local/operator exceptions are
recorded separately. These statuses do not represent a live pass rate.
## Browse access contracts
## Areas
The same-named feature recipes define navigation and capability IDs. Run
`node scripts/storybook-catalog.mjs` for the generated
`maps/generated/agent-access-map.md` index, or browse the
[published feature guide](https://d1p6rlowie26tp.cloudfront.net/storybook/branches/master/?path=/story/overview-storybook-guide--coverage-guide).
Add or update the affected companion; there is no central registration or count.
| Area | Product map | Capabilities |
| --- | --- | --- |
| [Login, invitations, and access](access.md) | [access](../feature-map/access.md) | 5 |
| [Dashboards, activity, and audit trails](activity.md) | [activity](../feature-map/activity.md) | 5 |
| [Agent conversations and project handoff](agent-chat.md) | [agent-chat](../feature-map/agent-chat.md) | 4 |
| [Hiring, agent configuration, and organization](agents.md) | [agents](../feature-map/agents.md) | 5 |
| [App access, action permissions, and testing](app-permissions.md) | [app-permissions](../feature-map/app-permissions.md) | 5 |
| [Costs, budgets, and spending controls](budgets-costs.md) | [budgets-costs](../feature-map/budgets-costs.md) | 4 |
| [Cases and structured work records](cases.md) | [cases](../feature-map/cases.md) | 4 |
| [External chat and email conversations](chat-channels.md) | [chat-channels](../feature-map/chat-channels.md) | 5 |
| [CLI, API clients, and local worktrees](cli-operations.md) | [cli-operations](../feature-map/cli-operations.md) | 5 |
| [Companies and portability](companies.md) | [companies](../feature-map/companies.md) | 4 |
| [Connection setup](connection-setup.md) | [connection-setup](../feature-map/connection-setup.md) | 8 |
| [Developer previews and diagnostic labs](developer-labs.md) | [developer-labs](../feature-map/developer-labs.md) | 4 |
| [Documents, attachments, and work products](documents-artifacts.md) | [documents-artifacts](../feature-map/documents-artifacts.md) | 5 |
| [Local, SSH, and sandbox environments](execution-environments.md) | [execution-environments](../feature-map/execution-environments.md) | 5 |
| [Tool gateways and access profiles](gateways-profiles.md) | [gateways-profiles](../feature-map/gateways-profiles.md) | 5 |
| [Goals and work alignment](goals.md) | [goals](../feature-map/goals.md) | 3 |
| [Inbox, decisions, and search](inbox-search.md) | [inbox-search](../feature-map/inbox-search.md) | 4 |
| [Installation, configuration, updates, and backups](instance-operations.md) | [instance-operations](../feature-map/instance-operations.md) | 5 |
| [Navigation, profile, and announcements](navigation-preferences.md) | [navigation-preferences](../feature-map/navigation-preferences.md) | 5 |
| [Onboarding and first work](onboarding.md) | [onboarding](../feature-map/onboarding.md) | 5 |
| [Pipelines, review queues, and learnings](pipelines.md) | [pipelines](../feature-map/pipelines.md) | 4 |
| [Plugins and contributed product surfaces](plugins.md) | [plugins](../feature-map/plugins.md) | 4 |
| [Projects and repositories](projects.md) | [projects](../feature-map/projects.md) | 4 |
| [Questions and approvals](questions-and-approvals.md) | [questions-and-approvals](../feature-map/questions-and-approvals.md) | 8 |
| [Recovery](recovery.md) | [recovery](../feature-map/recovery.md) | 8 |
| [Routines, schedules, and triggers](routines.md) | [routines](../feature-map/routines.md) | 5 |
| [Runs, harnesses, and model accounts](runs-adapters.md) | [runs-adapters](../feature-map/runs-adapters.md) | 4 |
| [Secrets, personal credentials, and proposals](secrets.md) | [secrets](../feature-map/secrets.md) | 5 |
| [Skill discovery, authoring, and policy](skills.md) | [skills](../feature-map/skills.md) | 5 |
| [Status cards and refreshed summaries](status-cards.md) | [status-cards](../feature-map/status-cards.md) | 4 |
| [Steering and queued messages](steering.md) | [steering](../feature-map/steering.md) | 7 |
| [Delegation, dependencies, and signoff](task-coordination.md) | [task-coordination](../feature-map/task-coordination.md) | 4 |
| [Task creation and lifecycle](tasks.md) | [tasks](../feature-map/tasks.md) | 5 |
| [Team packages and catalog installation](teams.md) | [teams](../feature-map/teams.md) | 4 |
| [Execution workspaces, services, and files](workspaces.md) | [workspaces](../feature-map/workspaces.md) | 5 |
Existing baseline source references describe the original inspection, not current
verification. Record new executed evidence in the PR, issue, or CI artifact with
its revision and scope. Do not refresh unrelated headers as bookkeeping.
## Using an entry
+36 -106
View File
@@ -9,92 +9,16 @@ The sibling [agent access map](../agent-access-map/README.md) records APIs,
agent entry points and permission boundaries for the same capability IDs.
Follow the [shared map contract](../README.md) when maintaining either map.
## Features
## Browse features
The map is organized by user capability, not by source file. It covers **35 feature
families** across the product, CLI, and operator workflows, checked against source
on 2026-10-12. Experimental and developer-only surfaces are labeled explicitly.
Each recipe includes sub-features, current entry points, automated evidence,
manual verification steps, and gotchas.
Open the [published Storybook guide](https://d1p6rlowie26tp.cloudfront.net/storybook/branches/master/?path=/story/overview-storybook-guide--coverage-guide)
for the assembled feature and capability index. The Markdown recipes in this
directory are the authored source. Each has a same-named agent-access companion.
### Getting started and access
| Feature | What it covers |
| --- | --- |
| [Onboarding and first work](./onboarding.md) | Instance setup, company wizard, first agent and task. |
| [Login, invitations, and access](./access.md) | Sessions, bootstrap, membership, roles, and CLI authorization. |
| [Companies and portability](./companies.md) | Company switching/settings, archival, package import/export. |
### Tasks and conversations
| Feature | What it covers |
| --- | --- |
| [Task creation and lifecycle](./tasks.md) | Creation, assignment, lists, properties, comments, and completion. |
| [Delegation, dependencies, and signoff](./task-coordination.md) | Child work, prerequisites, reviewers, and task-tree controls. |
| [Inbox, decisions, and search](./inbox-search.md) | Personal triage, decision queues, unread/blocked views, search, and personal task toasts. |
| [Agent conversations and project handoff](./agent-chat.md) | Persistent conversations, discovery, handoff, and gated board chat. |
| [Questions and approvals](./questions-and-approvals.md) | Question/plan responses, formal approvals, and app-tool review. |
| [Steering and queued messages](./steering.md) | Follow-ups, queue edits, interruption, and pause/resume. |
| [Documents, attachments, and work products](./documents-artifacts.md) | Versioned documents, annotations, files, outputs, and artifact library. |
### Agents and reusable capabilities
| Feature | What it covers |
| --- | --- |
| [Hiring, configuration, and organization](./agents.md) | Agent identity, instructions, reporting lines, lifecycle, and built-ins. |
| [Runs, harnesses, and model accounts](./runs-adapters.md) | Adapter/model setup, account validation, transcripts, and run history. |
| [Skills and Skill Studio](./skills.md) | Discovery, sources, authoring, revisions, tests, and agent policies. |
| [Team packages and installation](./teams.md) | Catalog preview/install via CLI/API; catalog UI availability called out. |
### Projects and execution
| Feature | What it covers |
| --- | --- |
| [Projects and repositories](./projects.md) | Project lifecycle, task context, repository configuration, and defaults. |
| [Goals and work alignment](./goals.md) | Goal hierarchy, ownership, status, and project/task context. |
| [Workspaces, services, and files](./workspaces.md) | Provisioning, task bindings, services/logs, Git/files, and closure. |
| [Execution environments](./execution-environments.md) | Local, SSH, sandbox providers, target probes, and custom images. |
| [Recovery](./recovery.md) | Stopped work, workspace repair, bounded continuation, and reconnect. |
### Apps, channels, and extensions
| Feature | What it covers |
| --- | --- |
| [Connection setup](./connection-setup.md) | Catalog, MCP links, task requests, authentication, and setup resumption. |
| [App access and action permissions](./app-permissions.md) | Agent grants, off/ask/allowed actions, discovery, tests, and revocation. |
| [External chat and email](./chat-channels.md) | Provider-specific identity, threads, files, delivery, and endpoint upkeep. |
| [Tool gateways and access profiles](./gateways-profiles.md) | Tool exposure, client configuration, tokens, profiles, and activity. |
| [Secrets and proposals](./secrets.md) | Company/user credentials, grants, proposals, and vault import. |
| [Plugins](./plugins.md) | Installation/configuration, contributed pages/tools, and lifecycle. |
### Automation and structured work
| Feature | What it covers |
| --- | --- |
| [Routines, schedules, and triggers](./routines.md) | Definitions, variables, scheduled/webhook/manual runs, and history. |
| [Pipelines, review queues, and learnings](./pipelines.md) | Experimental stages, automation, items, review, and learning records. |
| [Cases](./cases.md) | Experimental structured fields, relationships, revisions, and task links. |
| [Status cards](./status-cards.md) | Experimental summaries, watched work, refresh history, and settings. |
### Oversight and operation
| Feature | What it covers |
| --- | --- |
| [Costs and budgets](./budgets-costs.md) | Spend reports, scoped limits, incidents, hard stops, and resumption. |
| [Dashboards and audit trails](./activity.md) | Company health, live work, activity, runs, routines, and timeline. |
| [Navigation, profile, and announcements](./navigation-preferences.md) | Sidebar state, favorites/recents, personal identity, and dismissals. |
| [Instance operations](./instance-operations.md) | Installation, updates, service health, configuration, and backups. |
| [CLI/API and local worktrees](./cli-operations.md) | Explicit context, resource commands, outputs, runs, and isolated instances. |
### Contributor surfaces
| Feature | What it covers |
| --- | --- |
| [Developer previews and diagnostic labs](./developer-labs.md) | Design examples, interaction fixtures, performance checks; not production acceptance. |
These are verification instructions, not a claim that every journey passed a live
test. A component test proves its component; a scripted provider proves that
fixture integration. Record executed results separately from the map.
Run `node scripts/storybook-catalog.mjs` to generate local navigation in
`maps/generated/feature-map.md`, `maps/generated/agent-access-map.md`, and the
Storybook guide. A new recipe is discovered automatically; do not register it in
this README or maintain counts here.
## Before driving a journey
@@ -142,40 +66,46 @@ For Paperclip-assigned work, attach evidence through the
## Inventory and remaining depth
[The UI coverage inventory](./coverage.json) accounts for every non-test TSX
module under `ui/src/pages`, including supporting panels, legacy variants, and
labs. Every product area now links to concrete recipes. **Partial** means the
area still has the named variant or workflow gaps; **unmapped** is reserved for
an area with no recipe. These statuses describe documentation, not runtime health.
The page inventory is a source snapshot dated 2026-10-05. The map also
includes entry points hosted inside other modules (pipeline Review Queue and
Learnings, task documents, onboarding), CLI-only operations, and operator work.
The team recipe explicitly distinguishes the current CLI/API path from catalog
UI components without a current top-level route. Refer to [route registration](../../ui/src/App.tsx)
and the [CLI registry](../../cli/src/index.ts) when changing reachability.
Remaining depth includes complete provider/auth/attachment matrices, every
harness/model/environment capability combination, third-party plugin features,
and every role/error/mobile/legacy-shell permutation. The recipes name relevant
gaps instead of equating source presence with a working user journey. The index
can include capabilities that do not add a page file.
The generated `maps/generated/coverage.json` lists the current non-test TSX page
modules and the recipes that directly reference each one. An unreferenced module
is a documentation candidate, not proof that its feature is absent or untested.
Remaining workflow limits live in each recipe. Inventory and example associations
describe documentation scope, not runtime health.
## Maintaining the reference
The map documents user journeys. It does not execute them automatically;
`coverage.json` records documentation scope rather than live test health.
generated inventories record documentation scope rather than live test health.
When maintaining a recipe, compare its entry points and expected results with
the current source. Check that linked tests still exercise the stated behavior
and that local references still exist. Refresh the inventory snapshot when it
helps explain the current product. Keep the same-named agent access companion
and that local references still exist. Keep the same-named agent access companion
and stable sub-feature IDs aligned when behavior or access changes. Source-only
access inventory remains distinct from live verification. Run
`node scripts/check-maps.mjs` after map edits for structural/reference checks;
follow the shared contract for the source and behavioral checks it cannot perform.
Each recipe starts with an H1 and a user-visible description, then exactly:
Each recipe starts with a small frontmatter navigation record, then an H1:
```markdown
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":10}
---
```
The H1 supplies the feature title, and the first paragraph supplies its summary.
Orders are local to the section; leave gaps for additions. Equal orders use the
stable filename as a tie-breaker. Keep a section's name/order consistent across
its recipes. A new feature or capability needs only its recipe and companion.
Optional `### Storybook verification` guidance lives inside the recipe's Gotchas
section. Each level-four heading contains a backtick-quoted capability key and
has `Scope` (`ui`, `cli`, or `browser`),
`Storybook`, `Production`, and `Sources` fields. These are verification instructions
and intentional scope limits, not run results or a required story for every API.
The generated gap report combines this guidance with current story associations.
After frontmatter, each recipe starts with an H1 and a user-visible description, then exactly:
1. **Sub-features** — stable backticked IDs and observable behavior/states.
2. **How to get to it (user POV)** — one H3 backticked entry-point ID per surface.
+27
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Getting started and access","sectionOrder":10,"order":20}
---
# Login, invitations, and access
People and agents enter the correct instance and company with the permissions granted to their identity. Login, membership, resource access, and CLI authorization have separate controls.
@@ -62,3 +66,26 @@ logout alone does not establish that server revocation succeeded.
- Settings visibility is not authorization; direct requests still need permission checks.
- An agent bearer key must not gain another company’s access.
- Never put invite tokens, session cookies, or API keys in verification evidence.
### Storybook verification
#### `login`
Scope: ui
Storybook: Sign-in form, pending and invalid credentials, deployment-mode claim gate, expired claim.
Production: Authenticate and reload company deep link; sign out and confirm session enforcement; reject invalid bootstrap claim.
Sources: Source: [Auth.tsx](../../ui/src/pages/Auth.tsx), [BoardClaim.tsx](../../ui/src/pages/BoardClaim.tsx), [board-claim.ts](../../server/src/board-claim.ts). Tests: [Auth.test.tsx](../../ui/src/pages/Auth.test.tsx), [auth-session-route.test.ts](../../server/src/__tests__/auth-session-route.test.ts), [board-claim.test.ts](../../server/src/__tests__/board-claim.test.ts)
#### `membership`
Scope: ui
Storybook: Member and join-request lists; editable versus read-only roles; pending change, rejected request, revoked invite.
Production: Persist role/membership changes; enforce actual actor authority, invite replay/expiry and cross-company denial.
Sources: Source: [CompanyAccess.tsx](../../ui/src/pages/CompanyAccess.tsx), [authz.ts](../../server/src/routes/authz.ts). Tests: [CompanyAccess.test.tsx](../../ui/src/pages/CompanyAccess.test.tsx), [invite-accept-replay.test.ts](../../server/src/__tests__/invite-accept-replay.test.ts), [multi-user-authenticated.spec.ts](../../tests/e2e/multi-user-authenticated.spec.ts)
#### `cli-auth`
Scope: ui
Storybook: CLI authorization approval, pending, expired/denied and already-authorized states.
Production: Authorize intended CLI identity/context, make scoped request, revoke current server token and retry same bearer; logout alone is insufficient.
Sources: Source: [CliAuth.tsx](../../ui/src/pages/CliAuth.tsx). Tests: [cli-auth-routes.test.ts](../../server/src/__tests__/cli-auth-routes.test.ts), [board-auth.test.ts](../../cli/src/__tests__/board-auth.test.ts), [token.test.ts](../../cli/src/__tests__/token.test.ts)
+14 -1
View File
@@ -1,4 +1,8 @@
# Dashboards, activity, and audit trails
---
navigation: {"section":"Oversight and operation","sectionOrder":70,"order":20}
---
# Dashboards and audit trails
People inspect company health, recent activity, run history, and routine activity, then follow evidence back to the task or agent responsible.
@@ -56,3 +60,12 @@ the routine rather than treating that component test as a reachable journey.
- Audit/activity events, run-log rows, first-party Telemetry, and operator OpenTelemetry traces are separate data paths.
- A healthy stream or dashboard counter alone does not prove task success.
- Cost and budget reports have their own [recipe](./budgets-costs.md).
### Storybook verification
#### `runs`
Scope: ui
Storybook: Mount AuditRuns selected status/agent/routine, linked task/agent, empty/loading/error/retry and 200-entry limit. Do not invent pagination.
Production: GET /companies/{id}/heartbeat-runs and /routines/{id}/runs require company/read/privacy checks; real browser follows context links and confirms the referenced execution.
Sources: Source: [AuditRuns.tsx](../../ui/src/pages/audit/AuditRuns.tsx), [heartbeats.ts](../../ui/src/api/heartbeats.ts), [routines.ts](../../ui/src/api/routines.ts). Tests: [AuditRuns.test.tsx](../../ui/src/pages/audit/AuditRuns.test.tsx), [heartbeat-run-privacy-routes.test.ts](../../server/src/__tests__/heartbeat-run-privacy-routes.test.ts), [routines-service.test.ts](../../server/src/__tests__/routines-service.test.ts)
+13
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":40}
---
# Agent conversations and project handoff
A person can hold a persistent conversation with an agent, return to its history, and hand useful work into a project or task. The gated conference-room chat is a separate conversation surface.
@@ -61,3 +65,12 @@ Manual: Check disabled access first, enable in the disposable instance, then sen
- Idle chat is not failed execution.
- See [steering](./steering.md) for in-flight messages and [questions](./questions-and-approvals.md) for interactions.
- An API tool test does not prove that every harness will choose the same handoff tool.
### Storybook verification
#### `conference-room`
Scope: ui
Storybook: Conference-room flag disabled, empty/history/reply, busy and explicit failure states.
Production: Exercise separate BoardChat route gate, local-trusted deployment and authenticated Claude CLI; send/reload real conversation with responding agent attribution.
Sources: Source: [BoardChat.tsx](../../ui/src/pages/BoardChat.tsx), [board-chat.ts](../../server/src/routes/board-chat.ts). Tests: [BoardChat.test.tsx](../../ui/src/pages/BoardChat.test.tsx), [board-chat-route-feature-flag.test.ts](../../server/src/__tests__/board-chat-route-feature-flag.test.ts)
+9 -1
View File
@@ -1,4 +1,8 @@
# Hiring, agent configuration, and organization
---
navigation: {"section":"Agents and reusable capabilities","sectionOrder":30,"order":10}
---
# Hiring, configuration, and organization
Operators hire agents, configure their identity and instructions, assign reporting relationships, and manage their lifecycle. Built-in agents have their own setup and lifecycle constraints.
@@ -82,3 +86,7 @@ over the primary fallback. Opening Chat must not start execution.
- Skill and tool grants are separate: see [skills](./skills.md) and [app permissions](./app-permissions.md).
- A personal primary agent is a per-user/company preference. It does not change
reporting lines, stars, permissions, or another person's primary agent.
### Documentation scope: Agents, organization, and runtime setup
Per-harness/model/account capabilities, every instruction-file error, and complete built-in-agent lifecycle variants remain separate qualification matrices.
+14 -1
View File
@@ -1,4 +1,8 @@
# App access, action permissions, and testing
---
navigation: {"section":"Apps, channels, and extensions","sectionOrder":50,"order":20}
---
# App access and action permissions
After connecting an app, an operator decides which agents may use it and whether each action is off, requires approval, or is allowed. Activity and action tests help verify the resulting access.
@@ -45,3 +49,12 @@ Manual: Run a read-only action with explicit inputs and inspect returned data an
- Connected does not imply an agent has access or an action is allowed.
- Credential-only connections may replace tool-action controls with account-specific controls.
- See [connection setup](./connection-setup.md) for auth and [questions and approvals](./questions-and-approvals.md) for pending action review.
### Storybook verification
#### `catalog-change`
Scope: ui
Storybook: Mount PermissionsPanel/AppDetail with quarantined actions, selection/review, refresh pending, empty and failed discovery states. Existing auto-allowed NewToolsAllowed examples are not quarantine review.
Production: Exercise catalog refresh and new-tool review with permitted/denied actors; unreviewed actions stay quarantined, prior Off/Ask choices survive refresh, and approved review persists.
Sources: Source: [PermissionsPanel.tsx](../../ui/src/pages/apps/app-detail/PermissionsPanel.tsx), [AppDetail.tsx](../../ui/src/pages/apps/AppDetail.tsx), [tool-access.ts](../../server/src/routes/tool-access.ts). Tests: [AppDetail.test.tsx](../../ui/src/pages/apps/AppDetail.test.tsx), [tool-access-service.test.ts](../../server/src/__tests__/tool-access-service.test.ts), [tool-access-policy-service.test.ts](../../server/src/__tests__/tool-access-policy-service.test.ts)
+14 -1
View File
@@ -1,4 +1,8 @@
# Costs, budgets, and spending controls
---
navigation: {"section":"Oversight and operation","sectionOrder":70,"order":10}
---
# Costs and budgets
Operators inspect recorded spend and configure budget controls for the company, projects, and agents. Hard stops pause or prevent eligible work until the governing incident is resolved.
@@ -47,3 +51,12 @@ Manual: Create a small fixture budget, cross its threshold with synthetic record
- Paperclip cost accounting is not a provider invoice or a promise about externally billed spend.
- Company, project, and agent gates can overlap; fixing one may leave another active.
- A successful retry must not bypass an unresolved budget hold.
### Storybook verification
#### `resolution`
Scope: ui
Storybook: Mount BudgetIncidentCard with entered raised limit, invalid limit, keep-paused, applying, authorized/blocked and error states wired through actual host. Existing matrix handlers are no-ops.
Production: POST /companies/{id}/budget-incidents/{id}/resolve must authorize scope-specific raise, persist resolution and resume eligible work while retaining overlapping budget/manual holds.
Sources: Source: [BudgetIncidentCard.tsx](../../ui/src/components/BudgetIncidentCard.tsx), [Costs.tsx](../../ui/src/pages/Costs.tsx), [budgets.ts](../../ui/src/api/budgets.ts), [costs.ts](../../server/src/routes/costs.ts), [budgets.ts](../../server/src/services/budgets.ts). Tests: [budgets-service.test.ts](../../server/src/__tests__/budgets-service.test.ts), [Costs.test.tsx](../../ui/src/pages/Costs.test.tsx)
+35 -1
View File
@@ -1,4 +1,8 @@
# Cases and structured work records
---
navigation: {"section":"Automation and structured work","sectionOrder":60,"order":30}
---
# Cases
The cases experiment exposes structured records with types, fields, parent/child relationships, activity, revisions, and related task work.
@@ -49,3 +53,33 @@ pipeline-owned item from a stand-alone case.
- Feature gating and offered controls determine available actions. The API
accepts a string case type and arbitrary JSON fields; do not infer typed
case-field validation or a field-editing UI from those values.
### Storybook verification
#### `browse`
Scope: ui
Storybook: Mount Cases search/filter/sort/group/tree, matched-child parent context, persisted view choices, keyboard navigation and empty/loading/error.
Production: GET /companies/{id}/cases scope/filter behavior is production evidence; rendered fixtures establish presentation only. Mutation/permission scenarios need real API checks separately.
Sources: Source: [Cases.tsx](../../ui/src/pages/Cases.tsx), [cases.ts](../../server/src/routes/cases.ts). Tests: [Cases.test.tsx](../../ui/src/pages/Cases.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts)
#### `structure`
Scope: ui
Storybook: Mount CaseDetail and CaseFieldsPanel with arbitrary JSON fields and parent/children, matching descendants and unavailable child. Do not invent a general field editor or typed field validation.
Production: GET /cases/{id} and /cases/{id}/children/tree must return permitted company records and correct relationships; changes/persistence require route tests separately.
Sources: Source: [CaseDetail.tsx](../../ui/src/pages/CaseDetail.tsx), [CaseFieldsPanel.tsx](../../ui/src/components/CaseFieldsPanel.tsx), [Cases.tsx](../../ui/src/pages/Cases.tsx), [cases.ts](../../server/src/routes/cases.ts), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [CaseFieldsPanel.test.tsx](../../ui/src/components/CaseFieldsPanel.test.tsx), [Cases.test.tsx](../../ui/src/pages/Cases.test.tsx), [CaseDetail.test.tsx](../../ui/src/pages/CaseDetail.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts)
#### `history`
Scope: ui
Storybook: Mount CaseDetail activity and document revisions as distinct views, empty/loading/errors, attribution and source links.
Production: GET /cases/{id}/events and /cases/{id}/documents/{key}/revisions require company/access filtering; a fixture list does not establish durable revision creation or restoration.
Sources: Source: [CaseDetail.tsx](../../ui/src/pages/CaseDetail.tsx), [cases.ts](../../server/src/routes/cases.ts). Tests: [CaseDetail.test.tsx](../../ui/src/pages/CaseDetail.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts)
#### `task-links`
Scope: ui
Storybook: Mount CaseDetail and IssueCasesPanel related-task/case links in both directions, missing links and unavailable targets.
Production: GET /issues/{id}/cases and /cases/{id}/issue-links must enforce permitted task/case relationships; production browser cold links verify destination and company context.
Sources: Source: [CaseDetail.tsx](../../ui/src/pages/CaseDetail.tsx), [IssueCasesPanel.tsx](../../ui/src/components/IssueCasesPanel.tsx), [cases.ts](../../server/src/routes/cases.ts), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [IssueCasesPanel.test.tsx](../../ui/src/components/IssueCasesPanel.test.tsx), [CaseDetail.test.tsx](../../ui/src/pages/CaseDetail.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts)
+18 -1
View File
@@ -1,4 +1,8 @@
# External chat and email conversations
---
navigation: {"section":"Apps, channels, and extensions","sectionOrder":50,"order":30}
---
# External chat and email
People can talk to an assigned agent through configured external channels, bind their identity, exchange files, and inspect delivery state. Each provider has a different identity, threading, and attachment contract.
@@ -63,3 +67,16 @@ Changing defaults must not move an existing conversation or interrupt its run.
- One provider’s passing fixture does not qualify another provider or live delivery.
- An accepted send request does not prove the recipient received the message or file.
- Use [steering](./steering.md) and [questions](./questions-and-approvals.md) for their channel-specific interaction checks.
### Storybook verification
#### `attachments`
Scope: ui
Storybook: Mount TaskChatBubble attachments and ChatEndpointDetail provider-specific consent/upload/delivery failure and unknown-outcome states. Local email attachment dialog remains a prototype.
Production: Transfer a disposable supported file through each affected provider; verify recipient delivery, read scope, duplicate/replay handling and failure/unknown state without treating notification as file-upload proof.
Sources: Source: [TaskChatBubble.tsx](../../ui/src/components/task-chat/TaskChatBubble.tsx), [ChatEndpointDetail.tsx](../../ui/src/pages/apps/chat/ChatEndpointDetail.tsx), [chatEndpoints.ts](../../ui/src/api/chatEndpoints.ts), [chat-channels.ts](../../server/src/routes/chat-channels.ts). Tests: [TaskChatBubble.test.tsx](../../ui/src/components/task-chat/TaskChatBubble.test.tsx), [task-chat-attachments.test.ts](../../ui/src/components/task-chat/task-chat-attachments.test.ts), [chat-channels.integration.test.ts](../../server/src/__tests__/chat-channels.integration.test.ts), [issue-attachment-routes.test.ts](../../server/src/__tests__/issue-attachment-routes.test.ts)
### Documentation scope: Chat and email channel setup
Shared recipes name provider checks; each provider transport/thread/identity/file-size/type combination needs separate live evidence and deeper instructions.
+42 -1
View File
@@ -1,4 +1,8 @@
# CLI, API clients, and local worktrees
---
navigation: {"section":"Oversight and operation","sectionOrder":70,"order":50}
---
# CLI/API and local worktrees
Operators and agents can work through explicit CLI/API context, manage domain resources, inspect runs, and create isolated local worktree instances for development.
@@ -60,3 +64,40 @@ Manual: Initialize an owned disposable worktree instance, inspect its printed pa
- API success proves its contract, not the equivalent browser creation journey.
- The CLI command registry is broader than the UI page inventory; new command families need a recipe review.
- See [instance operations](./instance-operations.md) for install/update/backup and feature-specific recipes for domain behavior.
### Storybook verification
#### `context`
Scope: cli
Storybook: No authored story required for CLI profile/context selection.
Production: Verify selected API origin, identity and company, JSON output and invalid-token/wrong-company failures. A persona label is not authentication.
Sources: Source: [context.ts](../../cli/src/commands/client/context.ts). Tests: [context.test.ts](../../cli/src/__tests__/context.test.ts), [http.test.ts](../../cli/src/__tests__/http.test.ts)
#### `domain-commands`
Scope: cli
Storybook: No authored story required for command parsing and domain API execution; corresponding product UI keeps its own story needs.
Production: Discover registered help, use a disposable company, assert persisted mutations and denied operations with the actual actor. Command parity is not every endpoint passing live.
Sources: Source: [index.ts](../../cli/src/index.ts), [issue.ts](../../cli/src/commands/client/issue.ts). Tests: [operations-parity.test.ts](../../cli/src/__tests__/operations-parity.test.ts)
#### `outputs`
Scope: cli
Storybook: No authored story required for CLI document/asset/skill IO or machine-readable output.
Production: Assert payload/schema, exit code, written contents, authorization and file integrity. Open the resulting document/asset in the product for cross-surface acceptance.
Sources: Source: [issue.ts](../../cli/src/commands/client/issue.ts), [asset.ts](../../cli/src/commands/client/asset.ts), [skill.ts](../../cli/src/commands/client/skill.ts). Tests: [issue-subresources.test.ts](../../cli/src/__tests__/issue-subresources.test.ts), [admin-asset-skill-parity.test.ts](../../cli/src/__tests__/admin-asset-skill-parity.test.ts)
#### `run-controls`
Scope: cli
Storybook: No authored story required for invoke/list/get/cancel/events/log command execution.
Production: Assert the real run ID, event/log output and resulting state, eligible actor and cancellation denial. Printed success does not prove provider completion.
Sources: Source: [run.ts](../../cli/src/commands/client/run.ts), [heartbeat-run.ts](../../cli/src/commands/heartbeat-run.ts). Tests: [operations-parity.test.ts](../../cli/src/__tests__/operations-parity.test.ts)
#### `worktree-instances`
Scope: cli
Storybook: No authored story required for worktree initialize/seed/repair/cleanup commands.
Production: Use only an owned isolated checkout/instance; verify paths, ports, health, login and seed provenance, then cleanup ownership. Capture evidence before teardown.
Sources: Source: [worktree.ts](../../cli/src/commands/worktree.ts), [test-drive.ts](../../cli/src/commands/test-drive.ts). Tests: [worktree.test.ts](../../cli/src/__tests__/worktree.test.ts), [test-drive.test.ts](../../cli/src/__tests__/test-drive.test.ts)
+31
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Getting started and access","sectionOrder":10,"order":30}
---
# Companies and portability
An operator can switch between companies, change their identity and settings, archive them, and preview an import or export. Each company remains a separate scope for work and agents.
@@ -76,3 +80,30 @@ Use an owned provider fixture for failure states; record any actual provider usa
A fast-response receipt is an acknowledgement, not completed agent work.
History visibility and connection-management authority are separate; task links
in history also require access to the underlying task.
### Storybook verification
#### `selection`
Scope: ui
Storybook: Company list/create/switcher; empty, loading, error, unavailable company and switched navigation.
Production: Switch and reload between companies; verify tasks/agents/cache/routes remain scoped and unauthorized company requests fail.
Sources: Source: [Companies.tsx](../../ui/src/pages/Companies.tsx), [CompanySwitcher.tsx](../../ui/src/components/CompanySwitcher.tsx), [CompanyContext.tsx](../../ui/src/context/CompanyContext.tsx). Tests: [Companies.test.tsx](../../ui/src/pages/Companies.test.tsx), [CompanyContext.test.tsx](../../ui/src/context/CompanyContext.test.tsx), [companies-route-cross-company-authz.test.ts](../../server/src/__tests__/companies-route-cross-company-authz.test.ts)
#### `archive`
Scope: ui
Storybook: Archive confirmation, pending/error and departure navigation; archived list entry and Unarchive action.
Production: Archive eligible agents/runs without deleting history; restoration handles archival-specific pause and navigates to correct company.
Sources: Source: [CompanySettings.tsx](../../ui/src/pages/CompanySettings.tsx), [Companies.tsx](../../ui/src/pages/Companies.tsx), [companies.ts](../../ui/src/api/companies.ts). Tests: [CompanySettingsArchive.test.tsx](../../ui/src/pages/CompanySettingsArchive.test.tsx), [Companies.test.tsx](../../ui/src/pages/Companies.test.tsx), [companies-service.test.ts](../../server/src/__tests__/companies-service.test.ts)
#### `portability`
Scope: ui
Storybook: Import/export preview, conflict choice, warnings, async progress/failure/success and restricted managed deployment.
Production: Apply real small package to disposable target; inspect counts/references/conflicts, source immutability and credential exclusions; imported task requires separate runnable-account proof.
Sources: Source: [CompanyImport.tsx](../../ui/src/pages/CompanyImport.tsx), [CompanyExport.tsx](../../ui/src/pages/CompanyExport.tsx), [companies.ts](../../ui/src/api/companies.ts). Tests: [CompanyImport.test.tsx](../../ui/src/pages/CompanyImport.test.tsx), [CompanyExport.test.tsx](../../ui/src/pages/CompanyExport.test.tsx), [company-portability-routes.test.ts](../../server/src/__tests__/company-portability-routes.test.ts), [company-import-export-e2e.test.ts](../../cli/src/__tests__/company-import-export-e2e.test.ts)
### Documentation scope: Company and instance administration
Core administration/import/export/operator workflows are mapped; cloud/self-hosted differences, migration/restore compatibility, and platform-specific service variants need deeper recipes.
+8
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Apps, channels, and extensions","sectionOrder":50,"order":10}
---
# Connection setup
People connect an app or account, choose who may use it, and recover incomplete
@@ -160,3 +164,7 @@ Slack setup does not qualify Discord, Telegram, GitHub, email, or iMessage.
- Full provider matrix, AI-account selection, gateway/profile administration,
and account revocation lifecycles remain outside this seed recipe.
- For governed actions after setup, use [questions and approvals](./questions-and-approvals.md).
### Documentation scope: App catalog and connection setup
Provider-specific authentication/revocation, credential-only accounts, and aggregator administrative variants still need their own detailed matrices.
-401
View File
@@ -1,401 +0,0 @@
{
"version": 1,
"areas": [
{
"id": "tasks-and-attention",
"title": "Tasks, conversations, and attention",
"status": "partial",
"features": [
"tasks.md",
"task-coordination.md",
"inbox-search.md",
"agent-chat.md",
"questions-and-approvals.md",
"steering.md",
"recovery.md",
"documents-artifacts.md"
],
"gap": "Recipes cover the main task/conversation/attention workflows. Full shell, permission, attachment, long-thread, and concurrency permutations remain to be enumerated.",
"paths": [
"ui/src/pages/AgentChat.tsx",
"ui/src/pages/AgentChats.tsx",
"ui/src/pages/BoardChat.tsx",
"ui/src/pages/DecisionQueuePage.tsx",
"ui/src/pages/Inbox.tsx",
"ui/src/pages/IssueDetail.tsx",
"ui/src/pages/Issues.tsx",
"ui/src/pages/LegacyInbox.tsx",
"ui/src/pages/MyIssues.tsx",
"ui/src/pages/Search.tsx",
"ui/src/pages/WhatNeedsMe.tsx"
]
},
{
"id": "agents",
"title": "Agents, organization, and runtime setup",
"status": "partial",
"features": [
"agents.md",
"runs-adapters.md",
"skills.md",
"app-permissions.md",
"recovery.md",
"execution-environments.md"
],
"gap": "Per-harness/model/account capabilities, every instruction-file error, and complete built-in-agent lifecycle variants remain separate qualification matrices.",
"paths": [
"ui/src/pages/AdapterManager.tsx",
"ui/src/pages/AgentDetail.production.tsx",
"ui/src/pages/AgentDetail.tsx",
"ui/src/pages/AgentToolsTab.tsx",
"ui/src/pages/Agents.production.tsx",
"ui/src/pages/Agents.tsx",
"ui/src/pages/NewAgent.tsx",
"ui/src/pages/Org.tsx",
"ui/src/pages/OrgChart.production.tsx",
"ui/src/pages/OrgChart.tsx"
]
},
{
"id": "apps",
"title": "App catalog and connection setup",
"status": "partial",
"features": [
"connection-setup.md",
"app-permissions.md",
"questions-and-approvals.md"
],
"gap": "Provider-specific authentication/revocation, credential-only accounts, and aggregator administrative variants still need their own detailed matrices.",
"paths": [
"ui/src/pages/apps/AggregatorAppManager.tsx",
"ui/src/pages/apps/AggregatorConnectDialog.tsx",
"ui/src/pages/apps/AppDetail.tsx",
"ui/src/pages/apps/AppLogo.tsx",
"ui/src/pages/apps/AppNotConnected.tsx",
"ui/src/pages/apps/AppsConnect.tsx",
"ui/src/pages/apps/AppsReview.tsx",
"ui/src/pages/apps/ArcadeDiscoverySetup.tsx",
"ui/src/pages/apps/Browse.tsx",
"ui/src/pages/apps/CatalogSourceFilters.tsx",
"ui/src/pages/apps/ComposioAppManager.tsx",
"ui/src/pages/apps/ComposioAppSetup.tsx",
"ui/src/pages/apps/ConnectionProvenanceChip.tsx",
"ui/src/pages/apps/Connections.tsx",
"ui/src/pages/apps/ExecutorManagementSetup.tsx",
"ui/src/pages/apps/PaperclipCloudOAuthHandoff.tsx",
"ui/src/pages/apps/ReviewQueueCard.tsx",
"ui/src/pages/apps/UnverifiedServerBadge.tsx",
"ui/src/pages/apps/app-detail/ActionTestDialog.tsx",
"ui/src/pages/apps/app-detail/ActivityPanel.tsx",
"ui/src/pages/apps/app-detail/AdvancedPanel.tsx",
"ui/src/pages/apps/app-detail/AgentConnectionAccess.tsx",
"ui/src/pages/apps/app-detail/BrowserUseSettingsPanel.tsx",
"ui/src/pages/apps/app-detail/ConnectedAggregatorApps.tsx",
"ui/src/pages/apps/app-detail/IdentitiesSection.tsx",
"ui/src/pages/apps/app-detail/PermissionsPanel.tsx",
"ui/src/pages/apps/app-detail/RailwayAccessPanel.tsx",
"ui/src/pages/apps/app-detail/ReviewPanel.tsx",
"ui/src/pages/apps/app-detail/SetupPanel.tsx",
"ui/src/pages/apps/connection-owner.tsx"
]
},
{
"id": "chat-channels",
"title": "Chat and email channel setup",
"status": "partial",
"features": [
"chat-channels.md",
"connection-setup.md",
"questions-and-approvals.md",
"steering.md"
],
"gap": "Shared recipes name provider checks; each provider transport/thread/identity/file-size/type combination needs separate live evidence and deeper instructions.",
"paths": [
"ui/src/pages/apps/chat/ChatCommunicationInstructions.tsx",
"ui/src/pages/apps/chat/ChatEndpointDetail.tsx",
"ui/src/pages/apps/chat/ChatEndpointSetup.tsx",
"ui/src/pages/apps/chat/ChatIdentityConfirm.tsx",
"ui/src/pages/apps/chat/EmailEndpointSetup.tsx",
"ui/src/pages/apps/chat/GitHubBotConfiguration.tsx",
"ui/src/pages/apps/chat/GitHubBotManagement.tsx",
"ui/src/pages/apps/chat/GitHubChatSetup.tsx",
"ui/src/pages/apps/chat/GitHubSetupPrompt.tsx",
"ui/src/pages/apps/chat/PhotonConnectStep.tsx",
"ui/src/pages/apps/chat/SetupPrompt.tsx",
"ui/src/pages/apps/chat/SlackAvatarStep.tsx",
"ui/src/pages/apps/chat/SlackIdentityStep.tsx",
"ui/src/pages/apps/chat/SlackSetupPrompt.tsx",
"ui/src/pages/apps/chat/SlackToolSettings.tsx"
]
},
{
"id": "skills-and-teams",
"title": "Skills, Skill Studio, and teams",
"status": "partial",
"features": [
"skills.md",
"teams.md",
"questions-and-approvals.md"
],
"gap": "Main library/Studio/source/policy and CLI team-install paths are mapped. Full source-provider conflicts, harness sync, and remote package variants remain; catalog UI is not a current top-level route.",
"paths": [
"ui/src/pages/CompanySkills.production.tsx",
"ui/src/pages/CompanySkills.tsx",
"ui/src/pages/SkillSources.tsx",
"ui/src/pages/SkillStudio.tsx",
"ui/src/pages/TeamCatalog.tsx",
"ui/src/pages/agent-skills/AgentSkillReleasePicker.tsx",
"ui/src/pages/agent-skills/AgentSkillRow.tsx",
"ui/src/pages/agent-skills/AgentSkillsTab.tsx",
"ui/src/pages/skills/ImportSkillsFromProjectDialog.tsx",
"ui/src/pages/skills/SkillImportProgress.tsx",
"ui/src/pages/skills/SkillPackagePreview.tsx",
"ui/src/pages/skills/SkillSourceTree.tsx"
]
},
{
"id": "projects-and-workspaces",
"title": "Projects and execution workspaces",
"status": "partial",
"features": [
"projects.md",
"workspaces.md",
"goals.md",
"execution-environments.md",
"budgets-costs.md",
"recovery.md"
],
"gap": "Provider-specific provisioning, multi-repository/submodule edge cases, Git reconciliation variants, and all service exposure combinations require deeper recipes.",
"paths": [
"ui/src/pages/ExecutionWorkspaceDetail.tsx",
"ui/src/pages/ProjectDetail.tsx",
"ui/src/pages/ProjectWorkspaceDetail.tsx",
"ui/src/pages/Projects.tsx",
"ui/src/pages/Workspaces.tsx"
]
},
{
"id": "formal-approvals",
"title": "Formal governance approvals",
"status": "partial",
"features": [
"questions-and-approvals.md",
"task-coordination.md",
"agents.md"
],
"gap": "Formal board decisions and signoff have recipes; every approval payload/type and actor/host error permutation is not enumerated.",
"paths": [
"ui/src/pages/ApprovalDetail.tsx",
"ui/src/pages/Approvals.tsx"
]
},
{
"id": "auth-and-access",
"title": "Login, invitations, and access",
"status": "partial",
"features": [
"onboarding.md",
"access.md",
"navigation-preferences.md",
"cli-operations.md"
],
"gap": "Deployment modes and core login/invite/member/token paths are mapped; exhaustive identity-provider, expiry, role, and resource-policy combinations remain.",
"paths": [
"ui/src/pages/Auth.tsx",
"ui/src/pages/BoardClaim.tsx",
"ui/src/pages/CliAuth.tsx",
"ui/src/pages/CompanyAccess.tsx",
"ui/src/pages/InstanceAccess.tsx",
"ui/src/pages/InviteLanding.tsx",
"ui/src/pages/JoinRequestQueue.tsx",
"ui/src/pages/UserProfile.tsx"
]
},
{
"id": "company-and-instance",
"title": "Company and instance administration",
"status": "partial",
"features": [
"companies.md",
"onboarding.md",
"instance-operations.md",
"execution-environments.md",
"navigation-preferences.md"
],
"gap": "Core administration/import/export/operator workflows are mapped; cloud/self-hosted differences, migration/restore compatibility, and platform-specific service variants need deeper recipes.",
"paths": [
"ui/src/pages/Companies.tsx",
"ui/src/pages/CompanyEnvironments.tsx",
"ui/src/pages/CompanyExport.tsx",
"ui/src/pages/CompanyImport.tsx",
"ui/src/pages/CompanySettings.tsx",
"ui/src/pages/InstanceExperimentalSettings.tsx",
"ui/src/pages/InstanceGeneralSettings.tsx",
"ui/src/pages/ProfileSettings.tsx"
]
},
{
"id": "goals-costs-and-activity",
"title": "Goals, dashboards, costs, and activity",
"status": "partial",
"features": [
"goals.md",
"budgets-costs.md",
"activity.md",
"runs-adapters.md",
"routines.md"
],
"gap": "Core goal/report/budget/audit journeys are mapped. Every aggregation/filter combination, cost source, and overlapping budget window still needs dedicated cases.",
"paths": [
"ui/src/pages/Costs.production.tsx",
"ui/src/pages/Costs.tsx",
"ui/src/pages/Dashboard.tsx",
"ui/src/pages/DashboardLive.tsx",
"ui/src/pages/GoalDetail.tsx",
"ui/src/pages/Goals.tsx",
"ui/src/pages/Timeline.tsx",
"ui/src/pages/audit/AuditFeed.production.tsx",
"ui/src/pages/audit/AuditFeed.tsx",
"ui/src/pages/audit/AuditHub.tsx",
"ui/src/pages/audit/AuditRuns.tsx",
"ui/src/pages/audit/CompanyActivity.production.tsx",
"ui/src/pages/audit/CompanyActivity.tsx",
"ui/src/pages/audit/RoutineAuditActivity.tsx"
]
},
{
"id": "artifacts",
"title": "Artifacts and work products",
"status": "partial",
"features": [
"documents-artifacts.md"
],
"gap": "Document/attachment/library/work-product journeys are mapped; every media preview type, storage backend, annotation conflict, and runtime-resource lifecycle variant remains separate.",
"paths": [
"ui/src/pages/Artifacts.tsx"
]
},
{
"id": "routines-and-pipelines",
"title": "Routines, pipelines, cases, and status cards",
"status": "partial",
"features": [
"routines.md",
"pipelines.md",
"cases.md",
"status-cards.md"
],
"gap": "All four capabilities have recipes. Trigger/provider/timezone combinations, custom case schemas, stage automation types, and summarizer quality need deeper cases.",
"paths": [
"ui/src/pages/CaseDetail.tsx",
"ui/src/pages/Cases.tsx",
"ui/src/pages/PipelineSettings.tsx",
"ui/src/pages/Pipelines.tsx",
"ui/src/pages/RoutineDetail.production.tsx",
"ui/src/pages/RoutineDetail.tsx",
"ui/src/pages/Routines.production.tsx",
"ui/src/pages/Routines.tsx",
"ui/src/pages/StatusCards/ArchivedStatusCardRow.tsx",
"ui/src/pages/StatusCards/CreateStatusCardDialog.tsx",
"ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx",
"ui/src/pages/StatusCards/StatusCardSettingsForm.tsx",
"ui/src/pages/StatusCards/StatusCardTile.tsx",
"ui/src/pages/StatusCards/SummarizerAgentSelect.tsx",
"ui/src/pages/StatusCards/index.tsx"
]
},
{
"id": "secrets",
"title": "Secrets and secret proposals",
"status": "partial",
"features": [
"secrets.md",
"access.md",
"app-permissions.md"
],
"gap": "Company/user/proposal/vault and runtime-binding paths are mapped; every secret provider, rotation scenario, and delivery context needs separate validation.",
"paths": [
"ui/src/pages/Secrets.tsx",
"ui/src/pages/secrets/ImportFromVaultDialog.tsx",
"ui/src/pages/secrets/MissingUserSecretsBanner.tsx",
"ui/src/pages/secrets/MyUserSecretsTab.tsx",
"ui/src/pages/secrets/ProposalsTab.tsx",
"ui/src/pages/secrets/SecretPathName.tsx",
"ui/src/pages/secrets/SetMyUserSecretDialog.tsx",
"ui/src/pages/secrets/UserSecretDefinitionsTab.tsx",
"ui/src/pages/secrets/proposal-review.tsx",
"ui/src/pages/secrets/user-secret-presentation.tsx"
]
},
{
"id": "plugins-and-tools",
"title": "Plugins, gateways, and tool profiles",
"status": "partial",
"features": [
"plugins.md",
"gateways-profiles.md",
"app-permissions.md",
"execution-environments.md"
],
"gap": "Host plugin/gateway/profile lifecycles are mapped. Third-party plugin behaviors and every client transport/provider combination are outside host-wide coverage.",
"paths": [
"ui/src/pages/CompanySettingsPluginPage.tsx",
"ui/src/pages/PluginManager.tsx",
"ui/src/pages/PluginPage.tsx",
"ui/src/pages/PluginSettings.tsx",
"ui/src/pages/apps/gateways/ConnectClientDialog.tsx",
"ui/src/pages/apps/gateways/CopyableGatewayUrl.tsx",
"ui/src/pages/apps/gateways/EditGatewayDialog.tsx",
"ui/src/pages/apps/gateways/GatewayDetail.tsx",
"ui/src/pages/apps/gateways/GatewaysList.tsx",
"ui/src/pages/apps/gateways/NewGatewayDialog.tsx",
"ui/src/pages/apps/gateways/panels/AppsToolsPanel.tsx",
"ui/src/pages/apps/gateways/panels/GatewayActivityPanel.tsx",
"ui/src/pages/apps/gateways/panels/GatewayAdvancedPanel.tsx",
"ui/src/pages/apps/gateways/panels/OverviewPanel.tsx",
"ui/src/pages/apps/gateways/panels/TokensPanel.tsx",
"ui/src/pages/tools/AdvancedToolsRoute.tsx",
"ui/src/pages/tools/AuditTab.tsx",
"ui/src/pages/tools/GatewaysTab.tsx",
"ui/src/pages/tools/McpConfigHelpDialog.tsx",
"ui/src/pages/tools/PasteConfigTab.tsx",
"ui/src/pages/tools/ProfilesTab.tsx",
"ui/src/pages/tools/SmokeLabTab.tsx",
"ui/src/pages/tools/ToolsAccess.tsx",
"ui/src/pages/tools/connection-dialogs.tsx",
"ui/src/pages/tools/profiles/ProfileActionDialog.tsx",
"ui/src/pages/tools/profiles/ProfileDetail.tsx",
"ui/src/pages/tools/profiles/ProfileDetailRoute.tsx",
"ui/src/pages/tools/profiles/ProfileWizard.tsx",
"ui/src/pages/tools/profiles/ProfileWizardRoute.tsx",
"ui/src/pages/tools/profiles/ProfilesIndex.tsx",
"ui/src/pages/tools/profiles/ToolsAdminGate.tsx",
"ui/src/pages/tools/profiles/WizardToolsStep.tsx",
"ui/src/pages/tools/shared.tsx"
]
},
{
"id": "labs-and-fallbacks",
"title": "Developer labs and fallback pages",
"status": "partial",
"features": [
"developer-labs.md",
"navigation-preferences.md"
],
"gap": "Developer and fallback surfaces are identified. Each synthetic fixture and performance budget is not a production journey and needs its own measurement.",
"paths": [
"ui/src/pages/BootstrapSetupUxLab.tsx",
"ui/src/pages/CrossIssueCollaborationUxLab.tsx",
"ui/src/pages/DesignGuide.tsx",
"ui/src/pages/InviteUxLab.tsx",
"ui/src/pages/IssueChatLongThreadPerf.tsx",
"ui/src/pages/IssueChatUxLab.tsx",
"ui/src/pages/NotFound.tsx",
"ui/src/pages/ResponsibleUserDenialUxLab.tsx",
"ui/src/pages/RunTranscriptUxLab.tsx",
"ui/src/pages/SystemNoticeUxLab.tsx",
"ui/src/pages/TaskChatLab.tsx"
]
}
]
}
+24
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Contributor surfaces","sectionOrder":80,"order":10}
---
# Developer previews and diagnostic labs
Contributors can inspect design examples, interaction labs, and performance fixtures. These are development surfaces and do not count as production feature verification.
@@ -48,3 +52,23 @@ real-task behavior before extrapolating fixture measurements.
- Intended developer use is not a universal runtime gate: Design Guide and
global lab/performance routes are also registered in production builds.
- Screenshots of a lab do not prove live provider behavior, persistence, or authorization.
### Storybook verification
#### `performance`
Scope: browser
Storybook: A screenshot/story is optional context, not the required performance evidence.
Production: Use existing browser performance harnesses. Record build/browser/data size, timing/trace and scrolling. Long-thread fixture has a disabled composer; task-chat HTML harness uses a plain textarea and simulated updates.
Sources: Source: [IssueChatLongThreadPerf.tsx](../../ui/src/pages/IssueChatLongThreadPerf.tsx), [README.md](../../tests/perf/task-chat/README.md), [README.md](../../tests/perf/issue-detail/README.md). Tests: [scrollback.spec.ts](../../tests/perf/task-chat/scrollback.spec.ts), [issue-detail.perf.spec.ts](../../tests/perf/issue-detail/issue-detail.perf.spec.ts)
#### `route-gates`
Scope: browser
Storybook: No isolated story required to prove actual route registration, redirects or gates; isolated gated-control examples remain useful.
Production: Drive real routes under their actual development, experimental, production and fallback settings. Do not assume every lab is dev-only: global long-thread/lab/design routes also exist in production registration.
Sources: Source: [App.tsx](../../ui/src/App.tsx). Tests: No dedicated test asserted; use the feature recipe.
### Documentation scope: Developer labs and fallback pages
Developer and fallback surfaces are identified. Each synthetic fixture and performance budget is not a production journey and needs its own measurement.
+17
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":70}
---
# Documents, attachments, and work products
People read and revise task documents, annotate specific content, open attached files, and inspect the outputs an agent hands back. The artifact library provides another route to the same work.
@@ -64,3 +68,16 @@ Manual: Find the task’s output through search and grouping, open its stack, pa
- A local path is not automatically an uploaded artifact accessible to another user.
- A preview screenshot is not proof that download bytes or revision references are correct.
- Version conflicts and stale annotations must stay visible rather than silently targeting different content.
### Storybook verification
#### `documents`
Scope: ui
Storybook: Writable/read-only document, save pending/failure/conflict, revision history/historical preview and restore confirmation.
Production: Persist edited body and reload; append-only restore creates new revision; reject stale writes and inaccessible company/task.
Sources: Source: [IssueDocumentsSection.tsx](../../ui/src/components/IssueDocumentsSection.tsx), [TaskDocumentPanel.tsx](../../ui/src/components/task-side-panel/TaskDocumentPanel.tsx), [documents.ts](../../server/src/services/documents.ts). Tests: [IssueDocumentsSection.test.tsx](../../ui/src/components/IssueDocumentsSection.test.tsx), [document-revisions.test.ts](../../ui/src/lib/document-revisions.test.ts), [documents-service.test.ts](../../server/src/__tests__/documents-service.test.ts), [issue-document-restore-routes.test.ts](../../server/src/__tests__/issue-document-restore-routes.test.ts)
### Documentation scope: Artifacts and work products
Document/attachment/library/work-product journeys are mapped; every media preview type, storage backend, annotation conflict, and runtime-resource lifecycle variant remains separate.
+35 -1
View File
@@ -1,4 +1,8 @@
# Local, SSH, and sandbox environments
---
navigation: {"section":"Projects and execution","sectionOrder":40,"order":40}
---
# Execution environments
Operators configure where agents execute, probe readiness, select an environment for work, and inspect remote provisioning or custom-image state when the installed provider supports it.
@@ -82,3 +86,33 @@ Manual: Run a bounded command in the intended target, inspect its output and wor
harness; the selected native runtime still needs its own setup and useful-task proof.
- The local option may appear only when editing an existing local environment; availability follows current UI/provider capabilities.
- Workspace service reachability and environment reachability are separate checks.
### Storybook verification
#### `configuration`
Scope: ui
Storybook: Local/SSH/sandbox editors; unavailable providers, missing credentials, save pending/error and restricted operator.
Production: Persist target configuration and enforce instance-admin/local-operator mutation boundary; target catalog is instance-scoped.
Sources: Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environments.ts](../../server/src/routes/environments.ts). Tests: [CompanyEnvironments.test.tsx](../../ui/src/pages/CompanyEnvironments.test.tsx), [environment-service.test.ts](../../server/src/__tests__/environment-service.test.ts)
#### `capabilities`
Scope: ui
Storybook: Supported versus unavailable driver/provider controls and interactive-setup/template-capture limitations.
Production: Verify advertised driver/plugin capabilities match operations; unavailable provider cannot become working target; capability discovery must not allocate sandbox.
Sources: Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environments.ts](../../ui/src/api/environments.ts). Tests: [environment-capability-contract.test.ts](../../server/src/__tests__/environment-capability-contract.test.ts), [environment-execution-target-capabilities.test.ts](../../server/src/__tests__/environment-execution-target-capabilities.test.ts), [plugin-environment-driver-sandbox-capabilities.test.ts](../../server/src/__tests__/plugin-environment-driver-sandbox-capabilities.test.ts)
#### `probe`
Scope: ui
Storybook: Remote Test pending, success, reachability/auth failure and platform qualification absent/invalidated notice.
Production: Probe actual owned target; verify selected saved immutable config/image/company qualification plus lease cleanup; local API probe proves host/cwd only and has no UI Test button.
Sources: Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environment-probe.ts](../../server/src/services/environment-probe.ts). Tests: [CompanyEnvironments.test.tsx](../../ui/src/pages/CompanyEnvironments.test.tsx), [environment-probe.test.ts](../../server/src/__tests__/environment-probe.test.ts), [environment-live-ssh.test.ts](../../server/src/__tests__/environment-live-ssh.test.ts)
#### `images`
Scope: ui
Storybook: Custom-image setup/capture/progress, terminal connect/disconnect/failure, unsupported capability and active-image drift.
Production: Execute owned provider setup/capture/probe/terminal transport with correct saved image identity, authority, cleanup and shutdown; terminal screenshot cannot prove operation.
Sources: Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environment-custom-images.ts](../../server/src/services/environment-custom-images.ts). Tests: [CompanyEnvironments.test.tsx](../../ui/src/pages/CompanyEnvironments.test.tsx), [environment-custom-images-service.test.ts](../../server/src/__tests__/environment-custom-images-service.test.ts)
+13
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Apps, channels, and extensions","sectionOrder":50,"order":40}
---
# Tool gateways and access profiles
Administrators expose selected tools through gateways and reusable access profiles, connect clients, manage tokens, and inspect gateway activity.
@@ -50,3 +54,12 @@ Manual: Create a bounded profile, choose its offered tools and options, save or
- A copied endpoint is not proof of client authentication or tool discovery.
- Gateway access cannot replace underlying connection/action permission checks.
- Advanced tool routes require the appropriate admin gate; legacy tool URLs may redirect.
### Storybook verification
#### `tokens`
Scope: ui
Storybook: Mount current TokensPanel with issue controls, once-only token reveal, expiry/actions, revocation confirmation and failures. Old GatewaysTab fixtures and assistant OAuth revocation are insufficient.
Production: Issue bounded token via POST /tool-gateway/gateways/{id}/tokens; call allowed and excluded tools; revoke via /tool-gateway/gateway-tokens/{id}/revoke and verify denial using same client.
Sources: Source: [TokensPanel.tsx](../../ui/src/pages/apps/gateways/panels/TokensPanel.tsx), [tool-gateway.ts](../../server/src/routes/tool-gateway.ts), [tools.ts](../../ui/src/api/tools.ts). Tests: [TokensPanel.test.tsx](../../ui/src/pages/apps/gateways/panels/TokensPanel.test.tsx), [tool-gateway-service.test.ts](../../server/src/__tests__/tool-gateway-service.test.ts), [tool-gateway.test.ts](../../server/src/__tests__/tool-gateway.test.ts)
+24
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Projects and execution","sectionOrder":40,"order":20}
---
# Goals and work alignment
People define company and lower-level goals and connect projects and tasks to the outcome they serve.
@@ -47,3 +51,23 @@ Manual: Compare a task with an explicit goal to one relying on project context.
- A goal status is not an independently measured proof of business success.
- Do not infer a complete goal browser test from the small properties-toggle suite.
### Storybook verification
#### `alignment`
Scope: ui
Storybook: Project/task goal selection, explicit/inherited context and invalid association error.
Production: Persist same-company valid association, reject invalid/cross-company reference, verify explicit versus inherited server context after reload.
Sources: Source: [ProjectProperties.tsx](../../ui/src/components/ProjectProperties.tsx), [GoalDetail.tsx](../../ui/src/pages/GoalDetail.tsx). Tests: [project-goal-validation.test.ts](../../server/src/__tests__/project-goal-validation.test.ts), [issues-goal-context-routes.test.ts](../../server/src/__tests__/issues-goal-context-routes.test.ts), [issue-goal-fallback.test.ts](../../server/src/__tests__/issue-goal-fallback.test.ts), [project-goal.test.ts](../../cli/src/__tests__/project-goal.test.ts)
#### `navigation`
Scope: ui
Storybook: Parent/child goal and project/task context links, empty/unavailable context and permitted destination.
Production: Follow actual goal/project/task records and compare explicit versus inherited context; ensure reload and inaccessible destination behavior.
Sources: Source: [GoalDetail.tsx](../../ui/src/pages/GoalDetail.tsx), [GoalProperties.tsx](../../ui/src/components/GoalProperties.tsx). Tests: [GoalDetail.test.tsx](../../ui/src/pages/GoalDetail.test.tsx), [issues-goal-context-routes.test.ts](../../server/src/__tests__/issues-goal-context-routes.test.ts), [issue-goal-fallback.test.ts](../../server/src/__tests__/issue-goal-fallback.test.ts)
### Documentation scope: Goals, dashboards, costs, and activity
Core goal/report/budget/audit journeys are mapped. Every aggregation/filter combination, cost source, and overlapping budget window still needs dedicated cases.
+20
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":30}
---
# Inbox, decisions, and search
People find work that needs their attention, distinguish unread activity from required decisions, archive handled items, and search across the company.
@@ -107,3 +111,19 @@ after switching company/account to verify suppression and isolation.
- Personal archival is not task cancellation or completion.
- Legacy Inbox routes can redirect to the combined task view; record which host actually rendered.
- Search service tests do not establish the relevance quality of every query.
### Storybook verification
#### `views`
Scope: ui
Storybook: Mine/Recent/Unread/Blocked and broader task views; combined versus standalone host; loading/empty/error/filter states.
Production: Use persisted personal participation/read data; verify scoped counts and list navigation/reload; automatic read cleanup must not create Mine membership.
Sources: Source: [Inbox.tsx](../../ui/src/pages/Inbox.tsx), [Issues.tsx](../../ui/src/pages/Issues.tsx). Tests: [Inbox.test.tsx](../../ui/src/pages/Inbox.test.tsx), [Issues.test.tsx](../../ui/src/pages/Issues.test.tsx), [issues-service.test.ts](../../server/src/__tests__/issues-service.test.ts)
#### `toasts`
Scope: ui
Storybook: Eligible live task toast, explicit mention, quiet unrelated event, own-action/visible-task suppression, dedupe and company/account switch.
Production: Persisted participation and mentions determine per-viewer socket eligibility; quiet events still refresh caches; reload retains eligibility, unauthorized resources remain denied.
Sources: Source: [ToastViewport.tsx](../../ui/src/components/ToastViewport.tsx), [ToastContext.tsx](../../ui/src/context/ToastContext.tsx), [LiveUpdatesProvider.tsx](../../ui/src/context/LiveUpdatesProvider.tsx), [task-toast-eligibility.ts](../../server/src/realtime/task-toast-eligibility.ts). Tests: [ToastContext.test.tsx](../../ui/src/context/ToastContext.test.tsx), [ToastViewport.test.tsx](../../ui/src/components/ToastViewport.test.tsx), [LiveUpdatesProvider.hook.test.tsx](../../ui/src/context/LiveUpdatesProvider.hook.test.tsx), [task-toast-eligibility.test.ts](../../server/src/__tests__/task-toast-eligibility.test.ts), [live-events-toast.test.ts](../../server/src/__tests__/live-events-toast.test.ts), [multi-user-authenticated.spec.ts](../../tests/e2e/multi-user-authenticated.spec.ts)
+28 -1
View File
@@ -1,4 +1,8 @@
# Installation, configuration, updates, and backups
---
navigation: {"section":"Oversight and operation","sectionOrder":70,"order":40}
---
# Instance operations
An operator can install and run Paperclip, diagnose the instance, configure supported deployment settings, manage its service, and produce a recoverable database backup.
@@ -56,3 +60,26 @@ Manual: Change a harmless experimental setting, reload, and confirm the affected
- A successful backup write does not prove restoration works.
- Settings visibility and mutability differ for cloud-managed and self-hosted instances.
- Keep the three data paths distinct: first-party Telemetry, operator-configured OpenTelemetry, and local run logs.
### Storybook verification
#### `backup`
Scope: ui
Storybook: Mount shipped InstanceGeneralSettings in CompanySettings with daily/weekly/monthly retention presets, selected values, saving/error/loading and cloud-hidden controls. Backup creation and restore remain separate CLI/operator checks.
Production: PATCH /api/instance/settings/general must enforce instance settings authority and managed hidden fields, persist retention and survive reload. Separately inspect a real backup and restore a known record into a second disposable target; a successful write does not prove restoration.
Sources: Source: [InstanceGeneralSettings.tsx](../../ui/src/pages/InstanceGeneralSettings.tsx), [CompanySettings.tsx](../../ui/src/pages/CompanySettings.tsx), [instance-settings.ts](../../server/src/routes/instance-settings.ts), [db-backup.ts](../../cli/src/commands/db-backup.ts). Tests: [InstanceGeneralSettings.test.tsx](../../ui/src/pages/InstanceGeneralSettings.test.tsx), [instance-settings-routes.test.ts](../../server/src/__tests__/instance-settings-routes.test.ts), [instance-settings-managed-overlay.test.ts](../../server/src/__tests__/instance-settings-managed-overlay.test.ts), [instance-database-backups-routes.test.ts](../../server/src/__tests__/instance-database-backups-routes.test.ts)
#### `install-update`
Scope: cli
Storybook: No authored story required for install, channel selection, update or rollback command execution.
Production: Use an owned managed installation: check/dry-run, installed version, retained payload rollback and failure. Source-checkout guidance is a separate case; rollback does not undo database migrations.
Sources: Source: [index.ts](../../cli/src/index.ts), [install.ts](../../cli/src/commands/install.ts), [update.ts](../../cli/src/commands/update.ts). Tests: [install-command.test.ts](../../cli/src/__tests__/install-command.test.ts), [update-command.test.ts](../../cli/src/__tests__/update-command.test.ts)
#### `diagnostics`
Scope: cli
Storybook: No authored story required for doctor/health command results.
Production: Run doctor against an owned data directory; check readiness and nonzero failures. A listening port alone does not prove readiness; repair requires observing the repaired result.
Sources: Source: [doctor.ts](../../cli/src/commands/doctor.ts). Tests: [doctor.test.ts](../../cli/src/__tests__/doctor.test.ts)
@@ -1,3 +1,7 @@
---
navigation: {"section":"Oversight and operation","sectionOrder":70,"order":30}
---
# Navigation, profile, and announcements
People organize their sidebar, move between company resources, maintain their profile, and dismiss product announcements with the correct persistence and identity scope.
@@ -50,3 +54,19 @@ Manual: Change a disposable user’s display details, reload, and inspect an att
- Announcement dismissals are intentionally instance-wide user preferences, unlike company-scoped domain data.
- Legacy/production shells need their own navigation check when affected.
- A route redirect is part of the journey; do not document a removed screen as if it still renders.
### Storybook verification
#### `preferences`
Scope: ui
Storybook: Mount Sidebar using real preference boundary with stars/order/collapse/recents state. Clearly distinguish in-memory section collapse, browser-local recents and server-saved stars/order.
Production: GET/PUT /sidebar-preferences/me and /companies/{id}/sidebar-preferences/me plus stars must retain intended user/company isolation across reload and switch. Section collapse reopens after reload; global collapse is disabled.
Sources: Source: [Sidebar.tsx](../../ui/src/components/Sidebar.tsx), [sidebar-preferences.ts](../../server/src/routes/sidebar-preferences.ts), [sidebar-preferences.ts](../../server/src/services/sidebar-preferences.ts). Tests: [Sidebar.test.tsx](../../ui/src/components/Sidebar.test.tsx), [sidebar-preferences-routes.test.ts](../../server/src/__tests__/sidebar-preferences-routes.test.ts)
#### `fallbacks`
Scope: browser
Storybook: A NotFound rendering story can help polish, but missing-resource/legacy-deep-link capability principally needs real App/router/browser scenarios preserving company and query intent.
Production: Cold-open invalid company/resource and retired URL; verify explicit fallback or correct canonical redirect without silently targeting a different resource/company.
Sources: Source: [NotFound.tsx](../../ui/src/pages/NotFound.tsx), [App.tsx](../../ui/src/App.tsx), [company-routes.ts](../../ui/src/lib/company-routes.ts). Tests: [App.activity-routing.test.tsx](../../ui/src/App.activity-routing.test.tsx), [App.cases-routing.test.tsx](../../ui/src/App.cases-routing.test.tsx), [App.test.tsx](../../ui/src/App.test.tsx), [company-routes.test.ts](../../ui/src/lib/company-routes.test.ts)
+24
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Getting started and access","sectionOrder":10,"order":10}
---
# Onboarding and first work
An operator can start an instance, create a company, configure its first agent, and reach a real first task. Instance setup and company onboarding are separate steps.
@@ -61,3 +65,23 @@ Manual: Run setup in the disposable directory, open the URL it prints, and confi
- An empty company, an empty instance, and an unauthenticated browser are different states.
- Creating an agent does not prove its provider login or first execution succeeded.
- See [access](./access.md) for authenticated deployments and [agents](./agents.md) for later hiring.
### Storybook verification
#### `resume`
Scope: ui
Storybook: Restored incomplete wizard; invalid or unauthorized saved company; temporarily withheld draft; account switch; storage failure.
Production: Reload company-prefixed onboarding without duplicating company; restore only authorized account/company draft and retain input after recoverable loading failure.
Sources: Source: [OnboardingWizard.tsx](../../ui/src/components/OnboardingWizard.tsx), [onboarding-state.ts](../../ui/src/lib/onboarding-state.ts). Tests: [OnboardingWizard.test.tsx](../../ui/src/components/OnboardingWizard.test.tsx), [onboarding-state.test.ts](../../ui/src/lib/onboarding-state.test.ts), [onboarding.spec.ts](../../tests/e2e/onboarding.spec.ts)
#### `instance`
Scope: cli
Storybook: No authored UI story required for host installation and startup.
Production: Configure isolated data directory, start instance, confirm printed URL/identity/health, restart with saved configuration.
Sources: Source: [onboard.ts](../../cli/src/commands/onboard.ts), [onboard-service.ts](../../cli/src/onboard-service.ts). Tests: [onboard.test.ts](../../cli/src/__tests__/onboard.test.ts), [onboard-service.test.ts](../../cli/src/__tests__/onboard-service.test.ts), [test-drive.test.ts](../../cli/src/__tests__/test-drive.test.ts)
### Documentation scope: Login, invitations, and access
Deployment modes and core login/invite/member/token paths are mapped; exhaustive identity-provider, expiry, role, and resource-policy combinations remain.
+34
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Automation and structured work","sectionOrder":60,"order":20}
---
# Pipelines, review queues, and learnings
With the pipeline experiment enabled, people move structured work through configured stages, inspect stage automation, review outputs, and retain learning records.
@@ -48,3 +52,33 @@ Manual: Open a pending review, inspect its source output and revision, accept or
- These routes are experimental and may redirect or deny access when disabled.
- ReviewQueue and Learnings are hosted from the pipeline module; a page-file inventory alone misses them.
- Pipeline items and free-standing [cases](./cases.md) share records but have different navigation contexts.
### Storybook verification
#### `stages`
Scope: ui
Storybook: Mount PipelineSettings ordered stages, automation assignees/env, invalid transitions, unsaved state, saving and failed save.
Production: POST/PATCH stages and PUT /pipelines/{id}/transitions must persist valid order/configuration, enforce ownership and reject invalid transitions; actual automation execution remains separate.
Sources: Source: [PipelineSettings.tsx](../../ui/src/pages/PipelineSettings.tsx), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [PipelineSettings.test.ts](../../ui/src/pages/PipelineSettings.test.ts), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts)
#### `items`
Scope: ui
Storybook: Mount Pipelines/PipelineItemDetailView board grouping, item creation/details, stage/health/work references, empty/loading and failed transition.
Production: GET/POST /pipelines/{id}/cases and POST /cases/{id}/transition must maintain company scope, valid stage changes and linked work; fixture stage state does not prove automation.
Sources: Source: [Pipelines.tsx](../../ui/src/pages/Pipelines.tsx), [PipelineWorkReferences.tsx](../../ui/src/components/PipelineWorkReferences.tsx), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [Pipelines.test.tsx](../../ui/src/pages/Pipelines.test.tsx), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts), [pipelines-tutorial-flow.spec.ts](../../tests/e2e/pipelines-tutorial-flow.spec.ts)
#### `review`
Scope: ui
Storybook: Mount ReviewQueue and item review pending output/revision, accept/reject/request-changes, bulk selection, stale/conflicting submission and errors.
Production: POST /cases/{id}/review and /companies/{id}/review-cases/bulk must authorize reviewer, persist correct outcome/transition and reject stale or invalid input.
Sources: Source: [Pipelines.tsx](../../ui/src/pages/Pipelines.tsx), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [Pipelines.test.tsx](../../ui/src/pages/Pipelines.test.tsx), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts), [pipelines-tutorial-flow.spec.ts](../../tests/e2e/pipelines-tutorial-flow.spec.ts)
#### `learnings`
Scope: ui
Storybook: Mount actual Learnings export with filtered case events, review/forced-move entries, source links, empty/loading/error. This is event history, not a separately authored learning-record system.
Production: GET /companies/{id}/case-events in pipelines routes needs existing company/access contract tests; a rendered event cannot establish learning quality.
Sources: Source: [Pipelines.tsx](../../ui/src/pages/Pipelines.tsx), [pipeline-learnings.ts](../../ui/src/lib/pipeline-learnings.ts), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [Pipelines.test.tsx](../../ui/src/pages/Pipelines.test.tsx), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts)
+39 -1
View File
@@ -1,4 +1,8 @@
# Plugins and contributed product surfaces
---
navigation: {"section":"Apps, channels, and extensions","sectionOrder":50,"order":60}
---
# Plugins
Operators install and configure plugins, inspect their status and errors, and use their contributed pages, tools, and managed resources within the plugin’s granted capabilities.
@@ -49,3 +53,37 @@ Manual: Open the contributed page by navigation and cold deep link, perform a ha
- Installing a plugin does not authorize every host capability or external action.
- Plugin-provided routes are dynamic; this map covers the host lifecycle, not every third-party feature.
- Environment-driver plugins also need the [environment](./execution-environments.md) checks.
### Storybook verification
#### `installation`
Scope: ui
Storybook: Mount PluginManager trusted package and bundled-local choices, pending install, validation/recoverable error and installed status.
Production: POST /plugins/install on a disposable package; enforce instance install authority, trusted path/package validation and correct version. Package and local install are distinct.
Sources: Source: [PluginManager.tsx](../../ui/src/pages/PluginManager.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-install-guard.ts](../../server/src/services/plugin-install-guard.ts). Tests: [plugin-install-route-security.test.ts](../../server/src/__tests__/plugin-install-route-security.test.ts), [plugin-install-autobuild.test.ts](../../server/src/__tests__/plugin-install-autobuild.test.ts), [plugin-routes-authz.test.ts](../../server/src/__tests__/plugin-routes-authz.test.ts)
#### `configuration`
Scope: ui
Storybook: Mount PluginSettings valid/invalid schema inputs, saved configuration, pending/failure and unavailable plugin.
Production: GET/POST /plugins/{id}/config and POST config/test must preserve validation/company scope and deliver saved config to real plugin worker/startup.
Sources: Source: [PluginSettings.tsx](../../ui/src/pages/PluginSettings.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-config-validator.ts](../../server/src/services/plugin-config-validator.ts). Tests: [PluginSettings.test.tsx](../../ui/src/pages/PluginSettings.test.tsx), [plugin-config-startup-delivery.test.ts](../../server/src/__tests__/plugin-config-startup-delivery.test.ts), [plugin-routes-authz.test.ts](../../server/src/__tests__/plugin-routes-authz.test.ts)
#### `contributions`
Scope: ui
Storybook: Mount PluginPage and CompanySettingsPluginPage contributed routes/tabs, loading, missing/unavailable plugin and action failures with a known fixture plugin.
Production: Serve real static plugin UI; enforce bridge data/action host capabilities and company boundaries; exercise a harmless action and cold deep link.
Sources: Source: [PluginPage.tsx](../../ui/src/pages/PluginPage.tsx), [CompanySettingsPluginPage.tsx](../../ui/src/pages/CompanySettingsPluginPage.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-ui-static.ts](../../server/src/routes/plugin-ui-static.ts). Tests: [PluginPage.test.tsx](../../ui/src/pages/PluginPage.test.tsx), [CompanySettingsPluginPage.test.tsx](../../ui/src/pages/CompanySettingsPluginPage.test.tsx), [plugin-ui-static.test.ts](../../server/src/__tests__/plugin-ui-static.test.ts), [plugin-tenant-isolation.test.ts](../../server/src/__tests__/plugin-tenant-isolation.test.ts)
#### `lifecycle`
Scope: ui
Storybook: Mount PluginManager active/disabled/uninstall/upgrade pending and failures; distinguish operator controls from developer watcher reload.
Production: POST enable/disable and DELETE /plugins/{id} must stop worker/tool/managed-resource activity and clean owned resources; verify disposable restart/uninstall and developer watcher separately.
Sources: Source: [PluginManager.tsx](../../ui/src/pages/PluginManager.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-lifecycle.ts](../../server/src/services/plugin-lifecycle.ts), [plugin-dev-watcher.ts](../../server/src/services/plugin-dev-watcher.ts). Tests: [plugin-lifecycle-restart.test.ts](../../server/src/__tests__/plugin-lifecycle-restart.test.ts), [plugin-routes-authz.test.ts](../../server/src/__tests__/plugin-routes-authz.test.ts), [plugin-dev-watcher.test.ts](../../server/src/__tests__/plugin-dev-watcher.test.ts)
### Documentation scope: Plugins, gateways, and tool profiles
Host plugin/gateway/profile lifecycles are mapped. Third-party plugin behaviors and every client transport/provider combination are outside host-wide coverage.
+8
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Projects and execution","sectionOrder":40,"order":10}
---
# Projects and repositories
People group tasks into projects, attach goals and repositories, and configure the context and defaults used by project work.
@@ -51,3 +55,7 @@ Manual: Attach a small repository, save, and create a project task. Inspect the
- Project repository configuration and a provisioned execution workspace are different records.
- See [workspaces](./workspaces.md), [goals](./goals.md), and [budgets](./budgets-costs.md) for those features.
- Do not assume a deleted or archived project should erase its historical task evidence.
### Documentation scope: Projects and execution workspaces
Provider-specific provisioning, multi-repository/submodule edge cases, Git reconciliation variants, and all service exposure combinations require deeper recipes.
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":50}
---
# Questions and approvals
People answer an agent's questions and decide requests without losing the task's
@@ -182,3 +186,7 @@ unless its actual provider journey was driven.
sharing UI. A watchdog cannot acquire board authority by resolving a card.
- An answer to an old question can queue behind a successor run; it does not
automatically steer that run. See [steering](./steering.md).
### Documentation scope: Formal governance approvals
Formal board decisions and signoff have recipes; every approval payload/type and actor/host error permutation is not enumerated.
+27
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Projects and execution","sectionOrder":40,"order":50}
---
# Recovery
People can see why a task stopped, who owns the next action, and whether a safe
@@ -205,3 +209,26 @@ only. Separately inspect the underlying execution if it is still stuck.
restart continuity. Use the appropriate runtime suite for that claim.
- See [execution semantics](../../doc/execution-semantics.md) for the governing
recovery contract and [steering](./steering.md) for saved follow-ups.
### Storybook verification
#### `exhaustion`
Scope: ui
Storybook: Exhausted/overdue attempts, operator retry pending/error, blocked authority/gate and specific escalation.
Production: Inspect durable attempt bounds and actual eligible retry/repair; acknowledgment alone does not prove continued execution.
Sources: Source: [IssueRecoveryActionCard.tsx](../../ui/src/components/IssueRecoveryActionCard.tsx), [DispositionRecoveryNotice.tsx](../../ui/src/components/DispositionRecoveryNotice.tsx), [issue-recovery-actions.ts](../../server/src/services/issue-recovery-actions.ts). Tests: [IssueRecoveryActionCard.test.tsx](../../ui/src/components/IssueRecoveryActionCard.test.tsx), [DispositionRecoveryNotice.test.tsx](../../ui/src/components/DispositionRecoveryNotice.test.tsx), [issue-recovery-actions.test.ts](../../server/src/__tests__/issue-recovery-actions.test.ts), [recovery.spec.ts](../../tests/e2e/execution-recovery/recovery.spec.ts)
#### `unknown-outcome`
Scope: ui
Storybook: Uncertain external outcome, required inspection/evidence and explicit permitted operator decision.
Production: Corroborate provider outcome before authorization; enforce no automatic external side-effect replay and reject stale/unauthorized decisions.
Sources: Source: [IssueRecoveryActionCard.tsx](../../ui/src/components/IssueRecoveryActionCard.tsx), [issue-recovery-actions.ts](../../server/src/services/issue-recovery-actions.ts). Tests: [IssueRecoveryActionCard.test.tsx](../../ui/src/components/IssueRecoveryActionCard.test.tsx), [issue-recovery-actions.test.ts](../../server/src/__tests__/issue-recovery-actions.test.ts), [recovery.spec.ts](../../tests/e2e/execution-recovery/recovery.spec.ts)
#### `user-continuation`
Scope: ui
Storybook: Saved follow-up waiting on stop cleanup, pause/budget gate, one eligible continuation and result/failure.
Production: Confirm previous execution stopped before delivery, preserve message, avoid duplicate wakes and honor actual task/ancestor/budget gate in separate legacy/native paths.
Sources: Source: [TaskChatQueuedMessages.tsx](../../ui/src/components/task-chat/TaskChatQueuedMessages.tsx), [legacy-continuation.ts](../../server/src/services/recovery/legacy-continuation.ts), [native-restart-recovery.ts](../../server/src/services/native-runtime/native-restart-recovery.ts). Tests: [legacy-continuation.test.ts](../../server/src/services/recovery/legacy-continuation.test.ts), [native-restart-recovery.test.ts](../../server/src/services/native-runtime/native-restart-recovery.test.ts), [issue-queued-comments-routes.test.ts](../../server/src/__tests__/issue-queued-comments-routes.test.ts), [legacy-failure-continuation.spec.ts](../../tests/e2e/legacy-failure-continuation.spec.ts)
+17
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Automation and structured work","sectionOrder":60,"order":10}
---
# Routines, schedules, and triggers
Operators define repeatable work, configure its inputs and triggers, run it on demand or automatically, and inspect the execution history and resulting tasks.
@@ -51,3 +55,16 @@ Manual: Set a near-term disposable schedule or authorized test webhook, verify o
- Saving a schedule does not prove the scheduler invoked it.
- Timezone, overlap/concurrency rules, and plugin ownership affect behavior.
- A routine run’s task must still respect pause, access, and budget gates.
### Storybook verification
#### `run-now`
Scope: ui
Storybook: Mount RoutineRunVariablesDialog through actual RoutineDetail with required/default inputs, project/workspace overrides, pending, blocked and failed submission. RunButton-only no-op examples do not supply/run inputs.
Production: POST /routines/{id}/run must validate variables, create one attributed execution/task and obey pause/access/budget gates; inspect actual task outcome separately.
Sources: Source: [RoutineRunVariablesDialog.tsx](../../ui/src/components/RoutineRunVariablesDialog.tsx), [RoutineDetail.tsx](../../ui/src/pages/RoutineDetail.tsx), [routines.ts](../../server/src/routes/routines.ts). Tests: [RoutineRunVariablesDialog.test.tsx](../../ui/src/components/RoutineRunVariablesDialog.test.tsx), [routines-service.test.ts](../../server/src/__tests__/routines-service.test.ts), [routines-e2e.test.ts](../../server/src/__tests__/routines-e2e.test.ts)
### Documentation scope: Routines, pipelines, cases, and status cards
All four capabilities have recipes. Trigger/provider/timezone combinations, custom case schemas, stage automation types, and summarizer quality need deeper cases.
+4
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Agents and reusable capabilities","sectionOrder":30,"order":20}
---
# Runs, harnesses, and model accounts
Operators choose an agent harness and model account, inspect execution history and transcripts, and distinguish a working configuration from a successful task result.
+18 -1
View File
@@ -1,4 +1,8 @@
# Secrets, personal credentials, and proposals
---
navigation: {"section":"Apps, channels, and extensions","sectionOrder":50,"order":50}
---
# Secrets and proposals
Operators manage company secret references, users supply their own credentials where required, and reviewers decide proposed secret changes without exposing secret values in ordinary UI evidence.
@@ -49,3 +53,16 @@ Manual: Review a dummy proposal, reject one and accept another, then inspect the
- A displayed reference name is not proof that the actor can resolve its value at runtime.
- Company secrets and user-specific values have different ownership.
- Redaction needs verification in errors, activity, and run logs as well as the form.
### Storybook verification
#### `proposals`
Scope: ui
Storybook: Mount ProposalsTab pending secret/binding proposals, blocked authority, expired/resolved proposal, approval/rejection pending/error, and redacted metadata.
Production: GET /companies/{id}/secret-proposals and POST approve/reject must enforce company/admin/target authority, durable resolution and redaction; verified run-bound agent proposal creation is separate.
Sources: Source: [ProposalsTab.tsx](../../ui/src/pages/secrets/ProposalsTab.tsx), [secrets.ts](../../server/src/routes/secrets.ts), [secret-proposal-authorization.ts](../../server/src/services/secret-proposal-authorization.ts). Tests: [ProposalsTab.render.test.tsx](../../ui/src/pages/secrets/ProposalsTab.render.test.tsx), [secret-proposals-routes.test.ts](../../server/src/__tests__/secret-proposals-routes.test.ts)
### Documentation scope: Secrets and secret proposals
Company/user/proposal/vault and runtime-binding paths are mapped; every secret provider, rotation scenario, and delivery context needs separate validation.
+18 -1
View File
@@ -1,4 +1,8 @@
# Skill discovery, authoring, and policy
---
navigation: {"section":"Agents and reusable capabilities","sectionOrder":30,"order":30}
---
# Skills and Skill Studio
Operators discover or import skills, author and test them in Skill Studio, manage source versions, and decide which agents may use them.
@@ -61,3 +65,16 @@ Manual: Enable the skill for one test agent and leave another without access. Ru
- Installed does not mean enabled for every agent.
- Read-only GitHub/bundled skills may require a writable copy rather than an in-place edit.
- Studio interaction coverage is in [questions and approvals](./questions-and-approvals.md); a passing mock is not a live harness test.
### Storybook verification
#### `testing`
Scope: ui
Storybook: Studio test inputs/configuration, running, question/approval, result and failed test states.
Production: Run bounded test of actual saved version with correct selected account/environment; inspect persisted test detail and eligible interaction response.
Sources: Source: [SkillStudio.tsx](../../ui/src/pages/SkillStudio.tsx), [companySkills.ts](../../ui/src/api/companySkills.ts). Tests: [SkillStudio.test.tsx](../../ui/src/pages/SkillStudio.test.tsx), [company-skill-test-runs-service.test.ts](../../server/src/__tests__/company-skill-test-runs-service.test.ts)
### Documentation scope: Skills, Skill Studio, and teams
Main library/Studio/source/policy and CLI team-install paths are mapped. Full source-provider conflicts, harness sync, and remote package variants remain; catalog UI is not a current top-level route.
+35 -1
View File
@@ -1,4 +1,8 @@
# Status cards and refreshed summaries
---
navigation: {"section":"Automation and structured work","sectionOrder":60,"order":40}
---
# Status cards
The status-card experiment turns a saved prompt/query into an inspectable summary of watched work, with refresh history, configuration, and archive/restore controls.
@@ -44,3 +48,33 @@ Manual: Change a disposable card’s prompt or summarizer, run the offered rebui
- Summary quality needs comparison against source work, not just a successful task status.
- A saved old summary must not be counted as a successful new refresh.
- Experimental visibility, author permissions, and agent ownership constrain mutation.
### Storybook verification
#### `authoring`
Scope: ui
Storybook: Mount CreateStatusCardDialog and StatusCardSettingsForm prompt, summarizer, refresh options, required/invalid inputs and save errors.
Production: POST /companies/{id}/status-cards and PATCH /status-cards/{id} must enforce gate/author authority, save configuration and start expected compile task when prompt changes.
Sources: Source: [CreateStatusCardDialog.tsx](../../ui/src/pages/StatusCards/CreateStatusCardDialog.tsx), [StatusCardSettingsForm.tsx](../../ui/src/pages/StatusCards/StatusCardSettingsForm.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts). Tests: [StatusCardSettingsForm.test.tsx](../../ui/src/pages/StatusCards/StatusCardSettingsForm.test.tsx), [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts)
#### `generation`
Scope: ui
Storybook: Mount card tile/drawer compiling, refreshing, failed, stale existing summary and successful new-summary states with linked task.
Production: POST /status-cards/{id}/recompile and /refresh plus update/finalization engine must persist actual new output/history; compare saved summary with source tasks, not merely successful task status.
Sources: Source: [StatusCardTile.tsx](../../ui/src/pages/StatusCards/StatusCardTile.tsx), [StatusCardDetailDrawer.tsx](../../ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts), [status-card-update-engine.ts](../../server/src/services/status-card-update-engine.ts). Tests: [StatusCardTile.test.tsx](../../ui/src/pages/StatusCards/StatusCardTile.test.tsx), [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts), [status-card-update-engine.test.ts](../../server/src/__tests__/status-card-update-engine.test.ts)
#### `inspection`
Scope: ui
Storybook: Mount StatusCardDetailDrawer summary, watched work, update/revision history, query debug, empty/loading/error and stale summary disclosure.
Production: GET /status-cards/{id}, /updates, /summary-revisions and /dry-run must filter accessible card/source records; fixtures cannot establish summary truth or query authorization.
Sources: Source: [StatusCardDetailDrawer.tsx](../../ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts). Tests: [StatusCardTile.test.tsx](../../ui/src/pages/StatusCards/StatusCardTile.test.tsx), [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts)
#### `archive`
Scope: ui
Storybook: Mount StatusCards and ArchivedStatusCardRow active/archived list, restore pending/failure and old-summary state. Archive differs from deletion.
Production: PATCH /status-cards/{id} archived true/false must persist and authorize change; restore may enqueue refresh, whose new outcome must be inspected rather than treating old summary as current.
Sources: Source: [index.tsx](../../ui/src/pages/StatusCards/index.tsx), [ArchivedStatusCardRow.tsx](../../ui/src/pages/StatusCards/ArchivedStatusCardRow.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts). Tests: [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts), [status-card-update-engine.test.ts](../../server/src/__tests__/status-card-update-engine.test.ts)
+20
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":60}
---
# Steering and queued messages
People can send follow-ups while an agent works, manage saved messages that have
@@ -135,3 +139,19 @@ gap; do not assume browser queue controls are available in every channel.
- An interrupted run may need verified cleanup before a saved follow-up can
start. Preserve and inspect the wait reason; see [recovery](./recovery.md).
- A healthy idle Agent Chat is waiting for input, not stranded unfinished work.
### Storybook verification
#### `drafts`
Scope: ui
Storybook: Task-keyed restored draft and attachment receipts; task switch/reload, failed send and uncertain-save recovery.
Production: Retain correct task draft across navigation and reload; inspect authoritative saved receipt before claiming delivery; do not clear storage on every harness mount.
Sources: Source: [TaskChatComposer.tsx](../../ui/src/components/task-chat/TaskChatComposer.tsx), [composer-draft.ts](../../ui/src/lib/composer-draft.ts). Tests: [TaskChatComposer.test.tsx](../../ui/src/components/task-chat/TaskChatComposer.test.tsx), [issue-queued-comments-routes.test.ts](../../server/src/__tests__/issue-queued-comments-routes.test.ts)
#### `approval-queue`
Scope: ui
Storybook: Answered question/accepted approval delivery waiting, eligible steer/interrupt, failed delivery and fresh-session-only approval.
Production: Keep response delivery durable and distinct from editable comments; coalesce once, enforce fresh-session restrictions and deduplicate concurrent/retried continuation.
Sources: Source: [TaskChatQueuedMessages.tsx](../../ui/src/components/task-chat/TaskChatQueuedMessages.tsx), [question-response-delivery.ts](../../server/src/services/question-response-delivery.ts). Tests: [TaskChatQueuedMessages.test.tsx](../../ui/src/components/task-chat/TaskChatQueuedMessages.test.tsx), [question-response-delivery.test.ts](../../server/src/__tests__/question-response-delivery.test.ts), [issue-queued-comments-routes.test.ts](../../server/src/__tests__/issue-queued-comments-routes.test.ts)
+4
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":20}
---
# Delegation, dependencies, and signoff
A larger task can coordinate child work, dependencies, reviewers, and execution controls while preserving a clear owner and a traceable completion decision.
+8
View File
@@ -1,3 +1,7 @@
---
navigation: {"section":"Tasks and conversations","sectionOrder":20,"order":10}
---
# Task creation and lifecycle
People create, assign, organize, discuss, and finish tasks. A task retains its owner, project, priority, history, and outputs as it moves through the work lifecycle.
@@ -73,3 +77,7 @@ Manual: Add a comment and edit authorized properties. Reload and verify history,
- A status label alone does not prove that the requested work exists.
- Single-assignee and atomic checkout rules still apply when tasks are created from different hosts.
- Use [coordination](./task-coordination.md), [steering](./steering.md), and [documents](./documents-artifacts.md) for their distinct workflows.
### Documentation scope: Tasks, conversations, and attention
Recipes cover the main task/conversation/attention workflows. Full shell, permission, attachment, long-thread, and concurrency permutations remain to be enumerated.
+5 -1
View File
@@ -1,4 +1,8 @@
# Team packages and catalog installation
---
navigation: {"section":"Agents and reusable capabilities","sectionOrder":30,"order":40}
---
# Team packages and installation
Operators can preview and install a team package with its agents and related resources. Catalog/package installation is available through the CLI/API; the repository also contains catalog UI components that are not a current top-level route.
+14 -1
View File
@@ -1,4 +1,8 @@
# Execution workspaces, services, and files
---
navigation: {"section":"Projects and execution","sectionOrder":40,"order":30}
---
# Workspaces, services, and files
A project or task can use a managed workspace with inspectable files, Git state, services, and runtime controls. Operators can follow its lifecycle through provisioning, use, and closure.
@@ -107,3 +111,12 @@ Manual: Provision a disposable workspace, wait for readiness, start an available
provider home have separate meanings. Private source ownership remains attached
to copied files after source configuration changes or workspace closure.
- Use [recovery](./recovery.md) for divergence/export repair and [CLI operations](./cli-operations.md) for local worktree tooling.
### Storybook verification
#### `closure`
Scope: ui
Storybook: Close-readiness checks, pending changes/active runs, blocked/pending/error close, retry close and eligible reopening.
Production: Confirm owned workspace shutdown, preserved files/Git state and permitted lifecycle transition/reopening; Browser Use session closure is unrelated.
Sources: Source: [ExecutionWorkspaceDetail.tsx](../../ui/src/pages/ExecutionWorkspaceDetail.tsx), [ExecutionWorkspaceCloseDialog.tsx](../../ui/src/components/ExecutionWorkspaceCloseDialog.tsx), [execution-workspaces.ts](../../server/src/routes/execution-workspaces.ts). Tests: [execution-workspaces-routes.test.ts](../../server/src/__tests__/execution-workspaces-routes.test.ts), [execution-workspaces-service.test.ts](../../server/src/__tests__/execution-workspaces-service.test.ts), [execution-workspace-reopen.test.ts](../../server/src/__tests__/execution-workspace-reopen.test.ts)
-791
View File
@@ -1,791 +0,0 @@
# Storybook by feature
<!-- Generated by node scripts/storybook-catalog.mjs --write. Edit catalog.json. -->
[Contract and maintenance](README.md) · [Review findings](REVIEW.md)
262 story files; 2485 indexed stories. Counts describe inventory, not passed tests or complete feature coverage.
Status describes product alignment; implementation describes the rendered subject; boundary describes simulated data. Sources and limitations are in catalog.json. Related capabilities cross-list one canonical story file.
## Getting started and access
### Onboarding and first work
Instance setup, company wizard, first agent and task.
[Feature recipe](../feature-map/onboarding.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Getting started and access/Onboarding and first work/Onboarding/Agent arc](../../ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx) | `onboarding/adapter`, `onboarding/first-task` | unreviewed / production / fixtures | 27 / 11 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Getting started and access/Onboarding and first work/Onboarding/Character](../../ui/storybook/stories/onboarding/onboarding-character.stories.tsx) | `onboarding/company` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Getting started and access/Onboarding and first work/Onboarding/Connect a model](../../ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx) | `onboarding/adapter`, `onboarding/first-task` | historical / prototype / fixtures | 5 / 0 | Older tile/mode preview; onboarding-agent-arc mounts the production wizard. |
| [Getting started and access/Onboarding and first work/Resume a saved draft](../../ui/storybook/stories/onboarding/resume-draft.stories.tsx) | `onboarding/resume` | current / production / fixtures | 4 / 3 | OnboardingWizard restores a seeded draft, malformed/unavailable-company handling and draft retention across a fixture remount. The reopen button belongs to the fixture host; real reload, account switch and storage failure remain separate checks. |
### Login, invitations, and access
Sessions, bootstrap, membership, roles, and CLI authorization.
[Feature recipe](../feature-map/access.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Getting started and access/Login, invitations, and access/CLI authorization](../../ui/storybook/stories/access/cli-authorization.stories.tsx) | `access/cli-auth` | current / production / fixtures | 9 / 5 | Real CliAuth route with pending/expired/unavailable/preflight denial, approval/cancel and write pending/error. Fictional challenge; no CLI identity or real token is authorized. |
| [Getting started and access/Login, invitations, and access/Organization membership](../../ui/storybook/stories/access/membership.stories.tsx) | `access/membership` | current / production / fixtures | 7 / 2 | CompanyAccess member list and role change with loading/empty/failure/403 and failed mutation toast. Backend actor authority, invite lifecycle and durable membership are not verified. |
| [Getting started and access/Login, invitations, and access/Private tasks/00 Review guide](../../ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx) | `access/resources`, `tasks/properties` | unreviewed / guide / static | 1 / 0 | Review guide retained; explanatory content does not establish runtime or production coverage. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Getting started and access/Login, invitations, and access/Private tasks/01 Creation](../../ui/storybook/stories/access/private-tasks/01-creation.stories.tsx) | `access/resources`, `tasks/properties` | unreviewed / production / fixtures | 22 / 14 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation visibility now defaults to hiding automated independent tasks, with a show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Getting started and access/Login, invitations, and access/Private tasks/02 Sharing](../../ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx) | `access/resources`, `tasks/properties` | unreviewed / production / fixtures | 26 / 10 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Getting started and access/Login, invitations, and access/Private tasks/03 Task actions](../../ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx) | `access/resources`, `tasks/properties` | unreviewed / production / fixtures | 11 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Getting started and access/Login, invitations, and access/Private tasks/04 References and blockers](../../ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx) | `access/resources`, `tasks/properties` | unreviewed / production / fixtures | 12 / 5 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Getting started and access/Login, invitations, and access/Private tasks/05 Projects](../../ui/storybook/stories/access/private-tasks/05-projects.stories.tsx) | `access/resources`, `tasks/properties`, `projects/lifecycle` | unreviewed / production / fixtures | 19 / 12 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Getting started and access/Login, invitations, and access/Private tasks/06 Full product pages](../../ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx) | `access/resources`, `tasks/properties`, `projects/lifecycle` | unreviewed / production / fixtures | 21 / 12 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation visibility now defaults to hiding automated independent tasks, with a show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Getting started and access/Login, invitations, and access/Private tasks/07 User stories](../../ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx) | `access/resources`, `tasks/properties` | unreviewed / production / fixtures | 13 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation visibility now defaults to hiding automated independent tasks, with a show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Getting started and access/Login, invitations, and access/Sign in](../../ui/storybook/stories/access/sign-in.stories.tsx) | `access/login` | current / production / fixtures | 6 / 3 | AuthPage email form, session read loading/error, submission pending/failure and navigation to Companies after a fixture session. Real authentication, bootstrap claim and sign-out remain separate. |
### Companies and portability
Company switching/settings, archival, package import/export.
[Feature recipe](../feature-map/companies.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Getting started and access/Companies and portability/Import preview](../../ui/storybook/stories/companies/company-import.stories.tsx) | `companies/portability` | current / production / fixtures | 6 / 5 | Shipped CompanyImport GitHub-source preview, warnings, pending, error and 403. Plan/package replies are fictional; export, final import and real package fidelity remain separate scenarios/contracts. |
| [Getting started and access/Companies and portability/Selection and archived organizations](../../ui/storybook/stories/companies/company-selection.stories.tsx) | `companies/selection`, `companies/archive` | current / production / fixtures | 7 / 2 | Companies list, selection storage and archived-company restoration with loading/empty/error/403. This covers the archive list/restoration side; CompanySettings archive confirmation remains an additional UI scenario. |
| [Getting started and access/Companies and portability/Decision models/01 Settings](../../ui/storybook/stories/companies/decision-models/01-settings.stories.tsx) | `companies/identity`, `budgets-costs/cost-reporting`, `companies/decision-models` | unreviewed / production / fixtures | 11 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related decision-service examples show connection/model configuration, bounded test receipts or invocation history using shipped subjects and simulated data. No paid provider or authorization proof. |
| [Getting started and access/Companies and portability/Decision models/02 History](../../ui/storybook/stories/companies/decision-models/02-history.stories.tsx) | `companies/identity`, `budgets-costs/cost-reporting`, `companies/decision-models` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related decision-service examples show connection/model configuration, bounded test receipts or invocation history using shipped subjects and simulated data. No paid provider or authorization proof. |
| [Getting started and access/Companies and portability/Decision models/03 Journey](../../ui/storybook/stories/companies/decision-models/03-journey.stories.tsx) | `companies/identity`, `budgets-costs/cost-reporting`, `companies/decision-models` | unreviewed / production / fixtures | 3 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related decision-service examples show connection/model configuration, bounded test receipts or invocation history using shipped subjects and simulated data. No paid provider or authorization proof. The upstream budget UI distinguishes soft warnings from hard stops; hard incidents retain raise-and-resume and keep-paused controls. |
| [Getting started and access/Companies and portability/Fast responses/01 Settings](../../ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx) | `companies/identity`, `budgets-costs/cost-reporting`, `companies/fast-responses` | unreviewed / production / fixtures | 9 / 0 | Production settings view with simulated callbacks. Excluded exported fixture helpers and added the onConnectionChange spy required during rendering; full save/API state parity remains unreviewed. Related fast-response examples show configuration/test receipts or invocation history with shipped subjects and simulated data. A receipt is an acknowledgement, not task completion; no paid provider or authorization proof. |
| [Getting started and access/Companies and portability/Fast responses/02 History](../../ui/storybook/stories/companies/fast-responses/02-history.stories.tsx) | `companies/identity`, `budgets-costs/cost-reporting`, `companies/fast-responses` | current / production / fixtures | 4 / 0 | Shared production DecisionHistoryTable receives fastResponse=true, matching FastResponseHistory presentation; API loading/error and feature-gate wrapper are outside this story. Related fast-response examples show configuration/test receipts or invocation history with shipped subjects and simulated data. A receipt is an acknowledgement, not task completion; no paid provider or authorization proof. |
## Tasks and conversations
### Task creation and lifecycle
Creation, assignment, lists, properties, comments, and completion.
[Feature recipe](../feature-map/tasks.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Task creation and lifecycle/Paperclip/Assigned Backlog Safeguards](../../ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx) | `tasks/completion`, `recovery/diagnosis` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Tasks and conversations/Task creation and lifecycle/Product/Chat & Comments](../../ui/storybook/stories/tasks/chat-comments.stories.tsx) | `tasks/discussion`, `runs-adapters/runs` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Tasks/Completed activity preview](../../ui/storybook/stories/tasks/completed-activity.stories.tsx) | `tasks/discussion`, `runs-adapters/runs` | current / production / fixtures | 8 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Composer/Add menu](../../ui/storybook/stories/tasks/composer-add-menu.stories.tsx) | `tasks/create` | unreviewed / production / fixtures | 14 / 14 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Composer/Mobile assignee picker](../../ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx) | `tasks/create`, `runs-adapters/availability` | unreviewed / production / fixtures | 3 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Composer/Model and effort picker](../../ui/storybook/stories/tasks/composer-model-picker.stories.tsx) | `tasks/create`, `runs-adapters/availability` | mixed / mixed / fixtures | 57 / 30 | Most examples use a local picker implementation; live picker examples use ComposerRunSettingsLiveStory. Do not count the whole suite as production parity. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Product/Control Plane Surfaces](../../ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx) | `tasks/organize`, `questions-and-approvals/governance`, `budgets-costs/budgets`, `activity/activity` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Product/Dialogs & Modals](../../ui/storybook/stories/tasks/dialogs-modals.stories.tsx) | `tasks/create`, `agents/hire`, `projects/lifecycle`, `goals/hierarchy` | unreviewed / production / fixtures | 17 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/External Objects](../../ui/storybook/stories/tasks/external-objects.stories.tsx) | `tasks/properties` | unreviewed / production / fixtures | 8 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation visibility now defaults to hiding automated independent tasks, with a show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Product/Issue Management](../../ui/storybook/stories/tasks/issue-management.stories.tsx) | `tasks/properties`, `tasks/organize` | unreviewed / production / fixtures | 11 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation visibility now defaults to hiding automated independent tasks, with a show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. Focused creation-visibility stories mount the production collection with simulated hierarchy reads and assert hidden roots, opt-in inclusion, and the unchecked filter control. Creation visibility examples and fixture setup now live in a support module so the surface matrix stays below 1000 lines; exported story IDs are unchanged. Creation visibility now shares the subscribed preference across modern and legacy controls; hierarchy child reads share a bounded rendering budget. Source alignment inspected; server behavior is tested separately. Hierarchy fetch and rendering budgets are separate; loaded context remains during paging. The large-tree UI regression exercises delayed reads in both list interfaces. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Components/Entity pickers/Mobile](../../ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx) | `tasks/create` | unreviewed / production / fixtures | 3 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Composer/New task](../../ui/storybook/stories/tasks/new-task-composer.stories.tsx) | `tasks/create`, `workspaces/binding` | current / production / fixtures | 40 / 25 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. WorktreePicker, ReuseWorktree, CreateWithReusedWorktree and NewWorktreeAfterReuse exercise workspace selection and submitted fixture request values. Actual admission/binding and execution remain outside this story. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Tasks and conversations/Task creation and lifecycle/Tasks/Runner activity preview](../../ui/storybook/stories/tasks/runner-activity.stories.tsx) | `tasks/discussion`, `runs-adapters/runs` | current / production / fixtures | 14 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Paperclip/Successful Run Handoff](../../ui/storybook/stories/tasks/successful-run-handoff.stories.tsx) | `tasks/completion`, `recovery/diagnosis` | unreviewed / production / fixtures | 7 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Tasks and conversations/Task creation and lifecycle/Tasks/Task chat review fixes](../../ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx) | `tasks/discussion`, `runs-adapters/runs` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Task chat/Mobile streaming follow](../../ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx) | `tasks/discussion` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Product/Task chat/System notice](../../ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx) | `tasks/discussion` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Tasks/Context notices](../../ui/storybook/stories/tasks/task-context-notices.stories.tsx) | `tasks/discussion` | unreviewed / production / fixtures | 1 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/00 Review guide](../../ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx) | `tasks/discussion` | unreviewed / guide / static | 1 / 0 | Review guide retained; explanatory content does not establish runtime or production coverage. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/01 Components](../../ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx) | `tasks/discussion` | unreviewed / production / fixtures | 5 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/02 Mixed-author journey](../../ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx) | `tasks/discussion` | unreviewed / production / fixtures | 5 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
### Delegation, dependencies, and signoff
Child work, prerequisites, reviewers, and task-tree controls.
[Feature recipe](../feature-map/task-coordination.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Delegation, dependencies, and signoff/Product/Decisions/Stalled review actions](../../ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx) | `task-coordination/signoff` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Delegation, dependencies, and signoff/Product/Issue Monitor surfaces](../../ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx) | `task-coordination/tree-control` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Tasks Created From a Task](../../ui/storybook/stories/task-coordination/originating-tasks.stories.tsx) | `task-coordination/delegation`, `projects/task-context` | unreviewed / production / fixtures | 14 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Creation visibility now defaults to hiding automated independent tasks, with a Show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Sub-issues Workflow Checklist](../../ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx) | `task-coordination/dependencies`, `task-coordination/delegation` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Creation visibility now defaults to hiding automated independent tasks, with a Show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. Creation visibility now shares the subscribed preference across modern and legacy controls; hierarchy child reads share a bounded rendering budget. Source alignment inspected; server behavior is tested separately. Hierarchy fetch and rendering budgets are separate; loaded context remains during paging. The large-tree UI regression exercises delayed reads in both list interfaces. |
| [Tasks and conversations/Delegation, dependencies, and signoff/Product/Task Watchdog surfaces](../../ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx) | `task-coordination/tree-control` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
### Inbox, decisions, and search
Personal triage, decision queues, unread/blocked views, search, and personal task toasts.
[Feature recipe](../feature-map/inbox-search.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Inbox, decisions, and search/Product/Inbox/Blocked tab](../../ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx) | `inbox-search/triage`, `recovery/diagnosis` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Creation visibility now defaults to hiding automated independent tasks, with a show agent-created tasks control and inbox participation exceptions. Source alignment reviewed; these fixture stories do not establish live server pagination or authorization. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Tasks and conversations/Inbox, decisions, and search/Decisions/DecisionCard](../../ui/storybook/stories/inbox-search/decision-card.stories.tsx) | `inbox-search/decisions` | unreviewed / production / fixtures | 9 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Inbox, decisions, and search/Pages/Decisions Desk](../../ui/storybook/stories/inbox-search/decisions-desk.stories.tsx) | `inbox-search/decisions` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Inbox, decisions, and search/Personal task views](../../ui/storybook/stories/inbox-search/inbox-views.stories.tsx) | `inbox-search/views` | current / production / fixtures | 8 / 0 | Shipped Inbox host with Mine/Recent/Unread/Blocked under combined-inbox flags and list states. Approvals/join requests/run lists are isolated alongside tasks. Failed/denied list queries currently fall back to Inbox zero; personal participation/read metadata and server counts remain production verification. Mine/recent fixture tasks are human-created; the upstream agent-created-task filter changes are separate visibility scenarios. |
| [Tasks and conversations/Inbox, decisions, and search/Personal task notifications](../../ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx) | `inbox-search/toasts` | current / production / fixtures | 4 / 4 | LiveUpdatesProvider and ToastViewport consume fixture socket eligibility, suppress unrelated/visible-task events and deduplicate replay. Server eligibility metadata is simulated; no persisted multiplayer participation proof. The upstream Inbox recipe adds agent-created-task discovery checks; this LiveUpdatesProvider suite still tests toast eligibility only. |
| [Tasks and conversations/Inbox, decisions, and search/Product/Search & Command K](../../ui/storybook/stories/inbox-search/search.stories.tsx) | `inbox-search/search` | unreviewed / prototype / fixtures | 1 / 0 | Local search-page composition mounts production result components; does not establish parity with the production Search route. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Tasks and conversations/Inbox, decisions, and search/Pages/Decisions](../../ui/storybook/stories/inbox-search/what-needs-me.stories.tsx) | `inbox-search/decisions` | unreviewed / production / fixtures | 13 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
### Agent conversations and project handoff
Persistent conversations, discovery, handoff, and gated board chat.
[Feature recipe](../feature-map/agent-chat.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Pages](../../ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx) | `agent-chat/discovery`, `agent-chat/history` | unreviewed / production / fixtures | 9 / 1 | Wrapper mounts production Layout and AgentChat; conversation selection and sends use in-memory routes. Directory name is not prototype evidence. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat](../../ui/storybook/stories/agent-chat/agent-chat.stories.tsx) | `agent-chat/discovery`, `agent-chat/history`, `agent-chat/handoff` | mixed / mixed / fixtures | 17 / 0 | Production conversation/task routes with a local ChatEntryLanding. Default-agent behavior and fallback API responses remain outside current-product parity. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. ProjectCreated, ExistingProject, MultipleRepositories, ProjectWithoutRepository and ProjectCreationFailed show linked handoff results/navigation through shipped chat/task hosts. Tool execution and persistence are simulated. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Components](../../ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx) | `agent-chat/discovery`, `agent-chat/history` | current / production / fixtures | 10 / 1 | Support module re-exports production AgentConversationSidebar; search/selection use fixture callbacks. |
| [Tasks and conversations/Agent conversations and project handoff/Design explorations/Chat entry](../../ui/storybook/stories/agent-chat/chat-entry.stories.tsx) | `agent-chat/discovery`, `agent-chat/history` | historical / mixed / fixtures | 9 / 3 | Retained first-created-agent sidebar/landing design predates personal primary-agent selection. Shared production conversation components remain useful. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Tasks and conversations/Agent conversations and project handoff/Conference Room](../../ui/storybook/stories/agent-chat/conference-room.stories.tsx) | `agent-chat/conference-room` | current / production / fixtures | 5 / 4 | BoardChat empty, reply, send pending/error/403 through fixture SSE and persisted comment reads. 403 uses the shipped generic unavailable message; route gates and real Claude execution remain separate. |
### Questions and approvals
Question/plan responses, formal approvals, and app-tool review.
[Feature recipe](../feature-map/questions-and-approvals.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Questions and approvals/Chat & Comments/Agent Chat Unanswered Questions](../../ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx) | `questions-and-approvals/dismiss-and-reopen`, `agent-chat/history` | unreviewed / production / fixtures | 9 / 6 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. |
| [Tasks and conversations/Questions and approvals/Composer/Question flow](../../ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx) | `questions-and-approvals/questions` | unreviewed / production / fixtures | 3 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. |
| [Tasks and conversations/Questions and approvals/Chat & Comments/Connection Reviews](../../ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx) | `questions-and-approvals/tool-review`, `connection-setup/task-request` | unreviewed / production / fixtures | 25 / 8 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Tasks and conversations/Questions and approvals/Issue Detail/Plan Decompositions](../../ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx) | `questions-and-approvals/plan-review`, `task-coordination/delegation` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions](../../ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx) | `questions-and-approvals/questions`, `questions-and-approvals/confirmations`, `questions-and-approvals/audience`, `questions-and-approvals/plan-review`, `questions-and-approvals/continuation` | unreviewed / production / fixtures | 53 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Plan approval Pending, Confirmed, ExpiredByTargetChange and ResumeFailed states use shipped interaction cards. The continuation association covers accepted-but-resume-failed presentation only; no successful resumption, retry or duplicate-suppression proof. |
| [Tasks and conversations/Questions and approvals/Chat & Comments/Rich ACP interactions](../../ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx) | `questions-and-approvals/questions`, `questions-and-approvals/confirmations`, `questions-and-approvals/audience` | unreviewed / production / fixtures | 12 / 8 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Questions and approvals/Composer/Interaction above composer](../../ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx) | `questions-and-approvals/questions`, `questions-and-approvals/confirmations`, `questions-and-approvals/audience` | current / production / fixtures | 15 / 5 | Corrected local dismissal/send harness: questions leave no pending badge; confirmations retain reopen. Production cards/composer; persisted dismissal is covered separately by unanswered-question fixtures. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. |
| [Tasks and conversations/Questions and approvals/Chat & Comments/Task Chat Unanswered Questions](../../ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx) | `questions-and-approvals/dismiss-and-reopen`, `tasks/discussion` | unreviewed / production / fixtures | 6 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
### Steering and queued messages
Follow-ups, queue edits, interruption, and pause/resume.
[Feature recipe](../feature-map/steering.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Steering and queued messages/Draft recovery](../../ui/storybook/stories/steering/composer-draft-recovery.stories.tsx) | `steering/drafts` | current / production / fixtures | 6 / 3 | TaskChatComposer uses owned task-keyed browser drafts, uncertain submission fence, switch/restore and failed/accepted send callbacks. API receipt authority and real submission durability remain separate. Storybook-owned draft keys are reset using the matching retained submission ID on setup and cleanup; same-browser uncertain-to-empty/send switching is covered separately. |
| [Tasks and conversations/Steering and queued messages/Composer/Steering and queued messages](../../ui/storybook/stories/steering/composer-queued-messages.stories.tsx) | `steering/queue`, `steering/edit-order-discard`, `steering/steer`, `steering/interrupt` | current / production / fixtures | 6 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. |
| [Tasks and conversations/Steering and queued messages/Accepted response delivery](../../ui/storybook/stories/steering/durable-response-queue.stories.tsx) | `steering/approval-queue`, `recovery/user-continuation` | current / production / fixtures | 7 / 6 | Accepted immutable response, cleanup wait, unavailable admission, empty queue and interrupt delivery states. Local callbacks remove delivered entries; durable queue/coalescing and fresh-session authority need production tests. The expanded native copyback recovery recipe requires harness stop proof; these generic exhaustion/queued-response fixtures do not establish that path. The shipped pending-delivery path removes rows optimistically and shows no separate progress indicator; the Delivering story asserts that actual presentation. Retained legacy files use a separate recovery form with verified stop evidence; these exhaustion and response-queue examples do not establish file repair. |
| [Tasks and conversations/Steering and queued messages/Surfaces/Interrupt Handoff](../../ui/storybook/stories/steering/interrupt-handoff.stories.tsx) | `steering/interrupt` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Steering and queued messages/Composer/Paused task takeover](../../ui/storybook/stories/steering/paused-composer.stories.tsx) | `steering/stop-and-pause` | historical / prototype / fixtures | 8 / 0 | Retained local paused takeover; task-execution-controls exercises the shipped pause/stop controls. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. |
| [Tasks and conversations/Steering and queued messages/Composer/Execution controls](../../ui/storybook/stories/steering/task-execution-controls.stories.tsx) | `steering/stop-and-pause` | current / production / fixtures | 22 / 6 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. |
### Documents, attachments, and work products
Versioned documents, annotations, files, outputs, and artifact library.
[Feature recipe](../feature-map/documents-artifacts.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Commit](../../ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Data](../../ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Document](../../ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/File](../../ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Image](../../ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Link preview](../../ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Pull request](../../ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Video](../../ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Artifact upload/01 Artifacts pane](../../ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx) | `documents-artifacts/attachments` | unreviewed / production / fixtures | 10 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Artifact upload/02 Paused task journey](../../ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx) | `documents-artifacts/attachments` | unreviewed / production / fixtures | 6 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Pages/Artifacts](../../ui/storybook/stories/documents-artifacts/artifacts.stories.tsx) | `documents-artifacts/library`, `documents-artifacts/work-products` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Components/CSV File Tab](../../ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx) | `documents-artifacts/attachments` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Product/Documents/Annotations](../../ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx) | `documents-artifacts/annotations` | unreviewed / production / fixtures | 9 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Product/Document Comments](../../ui/storybook/stories/documents-artifacts/document-comments.stories.tsx) | `documents-artifacts/annotations` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Document revisions](../../ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx) | `documents-artifacts/documents` | current / production / fixtures | 9 / 4 | IssueDocumentsSection renders current/edit/historical preview and append-only restore with mutation error. Read/loading failures retain shipped fallback rendering; no persisted concurrency or authorization proof. |
| [Tasks and conversations/Documents, attachments, and work products/Components/File Viewer Sheet](../../ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx) | `documents-artifacts/attachments` | unreviewed / production / fixtures | 13 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/01 Preview](../../ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx) | `documents-artifacts/attachments`, `workspaces/files-git` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/02 Workspace](../../ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx) | `documents-artifacts/attachments`, `workspaces/files-git` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/03 Task journey](../../ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx) | `documents-artifacts/attachments`, `workspaces/files-git` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Tasks and conversations/Documents, attachments, and work products/Task Chat/Rich Work Product Cards](../../ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx) | `documents-artifacts/work-products` | unreviewed / production / fixtures | 9 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Tasks/Artifact Gallery](../../ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx) | `documents-artifacts/library`, `documents-artifacts/work-products` | unreviewed / production / fixtures | 8 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Tasks and conversations/Documents, attachments, and work products/Tasks/Text file tabs](../../ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx) | `documents-artifacts/attachments` | unreviewed / production / fixtures | 7 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
## Agents and reusable capabilities
### Hiring, configuration, and organization
Agent identity, instructions, reporting lines, lifecycle, and built-ins.
[Feature recipe](../feature-map/agents.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Pages/Agent Detail](../../ui/storybook/stories/agents/agent-detail.stories.tsx) | `agents/lifecycle`, `agents/instructions` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Persistent files](../../ui/storybook/stories/agents/agent-files.stories.tsx) | `agents/instructions` | unreviewed / production / fixtures | 9 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Product/Agent Management](../../ui/storybook/stories/agents/agent-management.stories.tsx) | `agents/lifecycle`, `agents/instructions`, `execution-environments/assignment` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. ForcedKubernetesExecution and ForcedKubernetesMissingEnvironment mount AgentConfigForm with a forced execution target or missing-target warning. Read-only assignment presentation; no saved target or remote execution proof. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas/Full pages](../../ui/storybook/stories/agents/agent-persona-pages.stories.tsx) | `agents/organization`, `navigation-preferences/profile` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas](../../ui/storybook/stories/agents/agent-personas.stories.tsx) | `agents/organization`, `navigation-preferences/profile` | unreviewed / production / fixtures | 19 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Configuration refresh](../../ui/storybook/stories/agents/agent-settings-redesign.stories.tsx) | `agents/lifecycle`, `agents/instructions` | mixed / mixed / fixtures | 15 / 0 | Production configuration panels in a locally composed settings shell; full AgentDetail route parity remains unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Product/Built-in Agents](../../ui/storybook/stories/agents/built-in-agents.stories.tsx) | `agents/built-in` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Components](../../ui/storybook/stories/agents/external-agent-invite/components.stories.tsx) | `agents/hire`, `access/invitations` | unreviewed / production / fixtures | 8 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Journeys](../../ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx) | `agents/hire`, `access/invitations` | unreviewed / production / fixtures | 20 / 4 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/New agent](../../ui/storybook/stories/agents/new-agent-onboarding.stories.tsx) | `agents/hire` | historical / prototype / fixtures | 37 / 1 | Retained local wizard predates production ui/src/components/new-agent flow; shared fields do not make the wizard current. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide](../../ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / guide / static | 1 / 0 | Review guide retained; explanatory content does not establish runtime or production coverage. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components](../../ui/storybook/stories/agents/primary-agent/01-components.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar](../../ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 12 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents](../../ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 14 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task](../../ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 9 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat](../../ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 8 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys](../../ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 11 / 11 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/07 Confirmation](../../ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx) | `agents/primary-agent`, `tasks/create`, `agent-chat/discovery` | unreviewed / production / fixtures | 4 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Primary choice, replacement confirmation, unavailable states and task/chat fallback presentation use local presentation-provider callbacks. Production preference persistence and default-resolution precedence remain unverified by this suite. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. |
| [Agents and reusable capabilities/Hiring, configuration, and organization/Summaries/SummarySlotCard](../../ui/storybook/stories/agents/summary-slot-card.stories.tsx) | `agents/built-in` | unreviewed / production / fixtures | 15 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
### Runs, harnesses, and model accounts
Adapter/model setup, account validation, transcripts, and run history.
[Feature recipe](../feature-map/runs-adapters.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/Onboarding/Saved connections](../../ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx) | `runs-adapters/validation`, `agents/hire` | current / production / fixtures | 7 / 6 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Usage limits](../../ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx) | `runs-adapters/validation` | unreviewed / production / fixtures | 8 / 8 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Review](../../ui/storybook/stories/runs-adapters/ai-connections.stories.tsx) | `runs-adapters/validation` | unreviewed / production / fixtures | 46 / 15 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/Connectors/Pool host](../../ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx) | `runs-adapters/validation`, `connection-setup/catalog` | unreviewed / production / fixtures | 5 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Connection pools](../../ui/storybook/stories/runs-adapters/connection-pools.stories.tsx) | `runs-adapters/validation` | unreviewed / production / fixtures | 16 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/Assistant connections/Dot Runner](../../ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx) | `runs-adapters/validation`, `gateways-profiles/client-connect` | unreviewed / production / fixtures | 4 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/07 Subscription sign-in](../../ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx) | `runs-adapters/validation` | unreviewed / production / fixtures | 4 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/00 Overview](../../ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx) | `runs-adapters/validation` | unreviewed / guide / static | 1 / 0 | Review guide retained; explanatory content does not establish runtime or production coverage. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/01 Onboarding](../../ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx) | `runs-adapters/validation` | mixed / mixed / fixtures | 6 / 3 | Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/02 Connect](../../ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx) | `runs-adapters/validation` | mixed / mixed / fixtures | 14 / 3 | Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/03 Agent](../../ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx) | `runs-adapters/validation` | mixed / mixed / fixtures | 34 / 7 | Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/04 Manage](../../ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx) | `runs-adapters/validation` | mixed / mixed / fixtures | 11 / 5 | Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/05 Recovery](../../ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx) | `runs-adapters/validation` | mixed / mixed / fixtures | 7 / 2 | Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/06 Production components](../../ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx) | `runs-adapters/validation` | unreviewed / production / fixtures | 5 / 5 | Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow. |
| [Agents and reusable capabilities/Runs, harnesses, and model accounts/Composer/Session goals](../../ui/storybook/stories/runs-adapters/session-goals.stories.tsx) | `runs-adapters/session` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
### Skills and Skill Studio
Discovery, sources, authoring, revisions, tests, and agent policies.
[Feature recipe](../feature-map/skills.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Agents and reusable capabilities/Skills and Skill Studio/Agent Skills/AgentSkillRow](../../ui/storybook/stories/skills/agent-skill-row.stories.tsx) | `skills/policy` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/QA / Agent skills edge states](../../ui/storybook/stories/skills/agent-skills-edge.stories.tsx) | `skills/policy` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/AgentsUsingSkill](../../ui/storybook/stories/skills/agents-using-skill.stories.tsx) | `skills/policy` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/EditACopy](../../ui/storybook/stories/skills/fork-skill-flow.stories.tsx) | `skills/authoring` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Product/Skill Studio · FrontmatterPanel](../../ui/storybook/stories/skills/frontmatter-panel.stories.tsx) | `skills/authoring` | unreviewed / production / fixtures | 13 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub sync journey](../../ui/storybook/stories/skills/github-skills-journey.stories.tsx) | `skills/versions`, `skills/discovery`, `skills/policy` | unreviewed / production / fixtures | 14 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. AssignToAgent and AssignedSkill demonstrate library/detail assignment with local policy fixtures. No runtime enforcement or backend persistence proof. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub synced skills](../../ui/storybook/stories/skills/github-synced-skills.stories.tsx) | `skills/versions`, `skills/discovery` | unreviewed / production / fixtures | 21 / 8 | Production Sources page with fixture APIs. Disconnect and legacy removal stories show a required keep-or-delete choice; the real copy, delete, and reimport flows were also tested locally. Other routes remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skills/Repository packages](../../ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx) | `skills/versions`, `skills/discovery` | unreviewed / production / fixtures | 9 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skills/Import progress](../../ui/storybook/stories/skills/skill-import-progress.stories.tsx) | `skills/versions`, `skills/discovery` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Product/Skills/Policy surfaces](../../ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx) | `skills/policy` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Agents and reusable capabilities/Skills and Skill Studio/Test runs](../../ui/storybook/stories/skills/skill-test-runs.stories.tsx) | `skills/testing` | current / production / fixtures | 9 / 1 | SkillStudio test history statuses and result detail with immutable fixture output/version. No agent/provider runs; authoring, harness execution, persisted costs and snapshots require production tests. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Skill detail](../../ui/storybook/stories/skills/skills-store-detail.stories.tsx) | `skills/discovery`, `skills/versions`, `skills/policy` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related examples cover fixture revisions and agent attachment selection. Save and attachment submission callbacks are no-ops; durable authoring, grants and enforcement are not established. |
| [Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Discovery grid](../../ui/storybook/stories/skills/skills-store-discovery.stories.tsx) | `skills/discovery` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
### Team packages and installation
Catalog preview/install via CLI/API; catalog UI availability called out.
[Feature recipe](../feature-map/teams.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog](../../ui/storybook/stories/teams/team-catalog.stories.tsx) | `teams/preview`, `teams/discovery`, `teams/install`, `teams/configuration` | unreviewed / production / fixtures | 12 / 0 | Renders shipped TeamCatalog source, but feature map documents current CLI/API access and no top-level catalog route. InstallApplyProgress, InstallSuccess and InstalledStates show simulated installation results; InstallPreview edits adapter choices in local state. No routed catalog, real package installation, account setup or working-agent proof. |
## Projects and execution
### Projects and repositories
Project lifecycle, task context, repository configuration, and defaults.
[Feature recipe](../feature-map/projects.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Projects and execution/Projects and repositories/Proposals/Project repos/New project](../../ui/storybook/stories/projects/new-project-repos.stories.tsx) | `projects/repositories` | proposed / mixed / fixtures | 18 / 5 | RepositoryEditor is shipped, but NewProjectPrototype composes its own creation flow. Preserve proposal until route parity is checked. |
| [Projects and execution/Projects and repositories/Workspaces/Project runtime provision command](../../ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx) | `projects/defaults`, `workspaces/provisioning` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Projects and repositories/Proposals/Project repos/Configuration](../../ui/storybook/stories/projects/project-repos-configuration.stories.tsx) | `projects/repositories` | proposed / mixed / fixtures | 12 / 0 | Production properties plus local configuration page composition; repository interaction is simulated. |
| [Projects and execution/Projects and repositories/Product/Projects Goals Workspaces](../../ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx) | `projects/lifecycle`, `goals/hierarchy`, `workspaces/binding` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed nullable project references and guarded runtime invalidations. Existing summaries remain project-bound and retain their routes; null-project execution workspace rendering and controls remain a coverage gap. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
### Goals and work alignment
Goal hierarchy, ownership, status, and project/task context.
[Feature recipe](../feature-map/goals.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Projects and execution/Goals and work alignment/Aligned work and navigation](../../ui/storybook/stories/goals/goal-alignment.stories.tsx) | `goals/alignment`, `goals/navigation` | current / production / fixtures | 6 / 2 | GoalDetail child navigation and aligned-project tab with empty/loading/failure/403. Current UI displays relationships but has no project goal-assignment control; no invented assignment UI. |
### Workspaces, services, and files
Provisioning, task bindings, services/logs, Git/files, and closure.
[Feature recipe](../feature-map/workspaces.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Task activity](../../ui/storybook/stories/workspaces/browser-use-activity.stories.tsx) | `workspaces/services`, `tasks/discussion` | unreviewed / production / fixtures | 7 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Footer](../../ui/storybook/stories/workspaces/browser-use-footer.stories.tsx) | `workspaces/services`, `tasks/discussion` | unreviewed / production / fixtures | 21 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Panel](../../ui/storybook/stories/workspaces/browser-use.stories.tsx) | `workspaces/services`, `tasks/discussion` | unreviewed / production / fixtures | 28 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Creation-visibility verification recipes were updated; this story scenario is unchanged and does not prove that journey. The filter uses one lowercase label without helper text. All chat-channel tasks count as bot-created; the focused visibility stories cover human-initiated channel work. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Components/SearchableSelect/Workspace picker](../../ui/storybook/stories/workspaces/searchable-select.stories.tsx) | `workspaces/binding` | unreviewed / production / fixtures | 9 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Close readiness](../../ui/storybook/stories/workspaces/workspace-close.stories.tsx) | `workspaces/closure` | current / production / fixtures | 7 / 7 | Readiness dialog with loading, inspection failure/403, running-task block and pending/accepted archive response. No real workspace cleanup, Git removal or service shutdown is performed. The separate remote-source recipe requires Git isolation and preservation of unpublished task work; these close-readiness fixtures do not exercise repository cloning or reconstruction. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Issue/Workspace File Browser](../../ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx) | `workspaces/files-git` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Workspaces/Runtime provisioning status](../../ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx) | `workspaces/provisioning` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed ExecutionWorkspaceDetail null-project handling. This suite mounts only the unchanged RuntimeProvisionStatusValue inside a local context row; it does not exercise the full detail page or projectless queries. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
| [Projects and execution/Workspaces, services, and files/Workspaces/Service control bar](../../ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx) | `workspaces/services` | unreviewed / production / fixtures | 16 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the expanded workspace recipe; these examples do not establish durable task-folder continuity, repository authorization or sandbox admission. The workspace recipe now requires child boundary, safe reopen and checkpoint ancestry controls; these backend checks are not established by this fixture. The provisioning recipe requires controller script denial for remote selections and copy-only local source choices, including retained denial through metadata changes and reopening; these fixtures do not verify execution placement. Canonical default provisioning follows configured policy, primary, creation time and ID; these fixtures do not run source hooks or establish this backend precedence. The added verification recipe documents remote-source isolation and lifecycle guards; existing fixtures do not establish live provider recovery. The source recipe now excludes literal and task-independent branch templates; these fixtures do not execute that backend admission guard. The remote fallback requires current default provenance; these examples do not prove admission for explicit or inherited checkout bindings. |
### Execution environments
Local, SSH, sandbox providers, target probes, and custom images.
[Feature recipe](../feature-map/execution-environments.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Projects and execution/Execution environments/Custom images](../../ui/storybook/stories/execution-environments/custom-images.stories.tsx) | `execution-environments/images` | current / production / fixtures | 6 / 3 | CompanyEnvironments image metadata: unconfigured, captured, unsupported, failed, loading and 403. No live setup terminal, provider capture, rollback or relink is executed. |
| [Projects and execution/Execution environments/Configuration, capabilities, and probes](../../ui/storybook/stories/execution-environments/environment-states.stories.tsx) | `execution-environments/configuration`, `execution-environments/capabilities`, `execution-environments/probe` | current / production / fixtures | 10 / 4 | CompanyEnvironments configuration/edit, unsupported capabilities and probe pending/failure/success. No provider contacted. List read/loading failures expose shipped fallback behavior, not dedicated error UI. |
### Recovery
Stopped work, workspace repair, bounded continuation, and reconnect.
[Feature recipe](../feature-map/recovery.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Projects and execution/Recovery/App/Connection recovery](../../ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx) | `recovery/reconnect` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Task chat/Recovery notice](../../ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx) | `recovery/diagnosis` | unreviewed / production / fixtures | 5 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Tasks/Execution recovery](../../ui/storybook/stories/recovery/execution-recovery.stories.tsx) | `recovery/diagnosis` | unreviewed / production / fixtures | 18 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Product/Issue/Blocked notice](../../ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx) | `recovery/diagnosis`, `task-coordination/dependencies` | unreviewed / production / fixtures | 7 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Tasks/Model capacity retry](../../ui/storybook/stories/recovery/model-capacity-retry.stories.tsx) | `recovery/bounded-continuation` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Exhaustion and user decisions](../../ui/storybook/stories/recovery/recovery-gap-states.stories.tsx) | `recovery/exhaustion`, `recovery/unknown-outcome` | current / production / fixtures | 7 / 7 | Exhaustion notice, blocked authority, retry pending/failure/accepted and inactive notice; unknown-outcome action card is rendered separately. Retry callbacks and disposition context are simulated; no real continuation proof. The expanded native copyback recovery recipe requires harness stop proof; these generic exhaustion/queued-response fixtures do not establish that path. Retained legacy files use a separate recovery form with verified stop evidence; these exhaustion and response-queue examples do not establish file repair. |
| [Projects and execution/Recovery/Design previews/Recovery notice](../../ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx) | `recovery/diagnosis`, `recovery/source-action` | current / production / fixtures | 9 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Product/Issue Scheduled retry surfaces](../../ui/storybook/stories/recovery/scheduled-retry.stories.tsx) | `recovery/bounded-continuation` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Paperclip/Source Issue Recovery](../../ui/storybook/stories/recovery/source-issue-recovery.stories.tsx) | `recovery/diagnosis`, `recovery/source-action` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Source review confirms ordinary recovery fixtures remain applicable after the native-owner resolution gate; native-owner stop verification has its own suite. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Paperclip/Source-resolved Fold](../../ui/storybook/stories/recovery/source-resolved-fold.stories.tsx) | `recovery/diagnosis`, `recovery/source-action` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Workspace branch recovery/01 Repair card](../../ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx) | `recovery/workspace` | unreviewed / production / fixtures | 8 / 4 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Workspace branch recovery/02 Task journey](../../ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx) | `recovery/workspace` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Workspace finalization recovery/01 Notice](../../ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx) | `recovery/workspace`, `recovery/source-action` | current / production / fixtures | 6 / 2 | Production quiet status; automatic restoration, legacy operator fallback, queued and resolved states. No task repair form, process details or API simulation. Provider proof is verified by separate server and harness tests. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Projects and execution/Recovery/Workspace finalization recovery/02 Task journey](../../ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx) | `recovery/workspace`, `recovery/source-action` | unreviewed / mixed / fixtures | 3 / 0 | Production shell, status, bubbles and composer in a local conversation composition; shows restoration and saved work waiting for confirmation. Fixture messages; not the shipped task page or live provider acceptance. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
## Apps, channels, and extensions
### Connection setup
Catalog, MCP links, task requests, authentication, and setup resumption.
[Feature recipe](../feature-map/connection-setup.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Apps, channels, and extensions/Connection setup/Components/Agent setup prompt](../../ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx) | `connection-setup/channel-setup`, `gateways-profiles/client-connect` | unreviewed / production / fixtures | 11 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Canonical icon registry](../../ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx) | `connection-setup/catalog` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Catalog source selection](../../ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx) | `connection-setup/catalog` | proposed / prototype / fixtures | 12 / 1 | Local catalog composition uses shipped cards and filters; retains design exploration purpose, not acceptance of the Apps route. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connect discoverability (PAP-11091)](../../ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx) | `connection-setup/catalog` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connect name at create time (PAP-11283)](../../ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx) | `connection-setup/identity-and-access` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) | `connection-setup/credentials`, `connection-setup/failure`, `connection-setup/draft-recovery`, `connection-setup/identity-and-access`, `app-permissions/action-policy`, `app-permissions/test-action` | unreviewed / production / fixtures | 26 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. SavedDraftResume, Reconnect, SelectedAgents and ManageToolPermissions demonstrate production setup/permissions/test surfaces with an in-memory wrapper. Reload loses the draft; these examples do not verify persisted recovery. NewToolsAllowed does not demonstrate quarantined-action review. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Connections/Browser Use Cloud/Settings](../../ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx) | `connection-setup/credentials` | current / production / fixtures | 9 / 2 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) | `connection-setup/credentials`, `connection-setup/failure`, `connection-setup/draft-recovery`, `connection-setup/identity-and-access`, `app-permissions/action-policy`, `app-permissions/test-action` | unreviewed / production / fixtures | 27 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. SavedDraftResume, Reconnect, SelectedAgents and ManageToolPermissions demonstrate production setup/permissions/test surfaces with an in-memory wrapper. Reload loses the draft; these examples do not verify persisted recovery. NewToolsAllowed does not demonstrate quarantined-action review. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Design explorations/Connections/Agent instructions](../../ui/storybook/stories/connection-setup/connection-instructions.stories.tsx) | `connection-setup/credentials`, `agents/instructions` | unreviewed / production / fixtures | 20 / 5 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connections/Provider choice](../../ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx) | `connection-setup/identity-and-access` | unreviewed / production / fixtures | 7 / 4 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Enterpret connector](../../ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx) | `connection-setup/credentials`, `connection-setup/failure` | unreviewed / production / fixtures | 9 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) | `connection-setup/credentials`, `connection-setup/failure`, `connection-setup/draft-recovery`, `connection-setup/identity-and-access`, `app-permissions/action-policy`, `app-permissions/test-action` | unreviewed / production / fixtures | 26 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. SavedDraftResume, Reconnect, SelectedAgents and ManageToolPermissions demonstrate production setup/permissions/test surfaces with an in-memory wrapper. Reload loses the draft; these examples do not verify persisted recovery. NewToolsAllowed does not demonstrate quarantined-action review. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/PR reviews/Fireflies and app webhooks](../../ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx) | `connection-setup/credentials`, `routines/triggers` | unreviewed / production / fixtures | 27 / 5 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Connections/In-task connections](../../ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx) | `connection-setup/task-request` | unreviewed / production / fixtures | 78 / 23 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Managed Cloud OAuth handoff](../../ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx) | `connection-setup/handoff` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connections/Memory](../../ui/storybook/stories/connection-setup/memory-connectors.stories.tsx) | `connection-setup/credentials`, `agents/instructions` | unreviewed / production / fixtures | 21 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Notion MCP connect flow (PAP-16650)](../../ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx) | `connection-setup/credentials`, `connection-setup/failure` | unreviewed / production / fixtures | 7 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Reviews/PAP-17835 Personal connection identity](../../ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx) | `connection-setup/identity-and-access` | unreviewed / production / fixtures | 10 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) | `connection-setup/credentials`, `connection-setup/failure`, `connection-setup/draft-recovery`, `connection-setup/identity-and-access`, `app-permissions/action-policy`, `app-permissions/test-action` | unreviewed / production / fixtures | 21 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. SavedDraftResume, Reconnect, SelectedAgents and ManageToolPermissions demonstrate production setup/permissions/test surfaces with an in-memory wrapper. Reload loses the draft; these examples do not verify persisted recovery. NewToolsAllowed does not demonstrate quarantined-action review. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
### App access and action permissions
Agent grants, off/ask/allowed actions, discovery, tests, and revocation.
[Feature recipe](../feature-map/app-permissions.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Apps, channels, and extensions/App access and action permissions/Tools & Access/ActionCard](../../ui/storybook/stories/app-permissions/action-card.stories.tsx) | `app-permissions/test-action`, `app-permissions/action-policy` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/App access and action permissions/Apps/Action permissions test](../../ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx) | `app-permissions/test-action`, `app-permissions/action-policy` | unreviewed / production / fixtures | 7 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/App access and action permissions/Apps/Managed accounts](../../ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx) | `app-permissions/account-maintenance` | current / production / fixture-server | 1 / 0 | Production Browse requires owned tests/aggregator-accounts/test-drive.ts on localhost:4310; providers are simulated. Not an offline story. |
| [Apps, channels, and extensions/App access and action permissions/Review newly discovered actions](../../ui/storybook/stories/app-permissions/catalog-review.stories.tsx) | `app-permissions/catalog-change` | current / production / fixtures | 7 / 2 | Shipped ActionsSection quarantine reviewer with allowed/blocked decisions, empty/refreshing/saving/read-only props. Callbacks simulate catalog persistence; discovery failures belong to AppDetail and backend authority remains separate. |
| [Apps, channels, and extensions/App access and action permissions/Tools/Permitted vs Installed](../../ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx) | `app-permissions/agent-access`, `app-permissions/action-policy` | unreviewed / production / fixtures | 12 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
### External chat and email
Provider-specific identity, threads, files, delivery, and endpoint upkeep.
[Feature recipe](../feature-map/chat-channels.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Apps, channels, and extensions/External chat and email/Connections/AgentMail setup](../../ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx) | `chat-channels/providers`, `connection-setup/channel-setup` | unreviewed / production / fixtures | 19 / 16 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/External chat and email/Connections/AgentMail settings](../../ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx) | `chat-channels/lifecycle` | unreviewed / production / fixtures | 8 / 5 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation: EmailEndpointSettings remains the mounted inbox subsection. The surrounding ChatEndpointDetail connection-default editor and its save/inheritance behavior are not represented here. |
| [Apps, channels, and extensions/External chat and email/Connections/AgentMail tasks](../../ui/storybook/stories/chat-channels/agentmail.stories.tsx) | `chat-channels/conversation` | unreviewed / prototype / fixtures | 9 / 2 | Local EmailTaskExperience combines production composer/bubbles with simulated email lifecycle; compare against IssueDetail before claiming page parity. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. |
| [Apps, channels, and extensions/External chat and email/Task-linked files](../../ui/storybook/stories/chat-channels/channel-attachments.stories.tsx) | `chat-channels/attachments` | current / production / fixtures | 5 / 2 | TaskChatBubble with received/outbound saved attachment receipts, no/multiple files and missing filename. File links are fictional; no download, provider transfer or authorization is proved. |
| [Apps, channels, and extensions/External chat and email/Connections/Chat connection actions](../../ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx) | `chat-channels/providers` | unreviewed / production / fixtures | 1 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. |
| [Apps, channels, and extensions/External chat and email/Connections/Chat management](../../ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx) | `chat-channels/lifecycle`, `chat-channels/identity`, `chat-channels/conversation` | unreviewed / production / fixtures | 15 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation: the mounted endpoint adds connection and destination editors. Local endpoint PATCH/resource PUT preserve defaults; workspace-choice requests now return only active/idle, unclosed fixture workspaces. Browser save/error/reload and new-conversation inheritance remain unverified. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Inspected channel task-default controls, optional API fields, avatar rendering and matching fixture updates; live defaults inheritance and permission checks remain outside these stories. Access, InvitePeople, ConnectAndTest and Conversations render the shipped endpoint detail with simulated identity linking and conversation data. External delivery and identity authorization are not live. |
| [Apps, channels, and extensions/External chat and email/Connectors/GitHub bot management](../../ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx) | `chat-channels/providers`, `chat-channels/conversation` | unreviewed / production / fixtures | 33 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation: mounted repository and endpoint editors use simulated defaults. Endpoint PATCH now persists omitted/null/concrete values across GET and resets on remount; repository PUT already preserves them. Choice caches intentionally contain no projects/workspaces. Browser editor interactions, access denials and new-task inheritance remain unverified. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Inspected channel task-default controls, optional API fields, avatar rendering and matching fixture updates; live defaults inheritance and permission checks remain outside these stories. |
| [Apps, channels, and extensions/External chat and email/Historical/GitHub chat prototypes](../../ui/storybook/stories/chat-channels/github-chat.stories.tsx) | `chat-channels/providers`, `chat-channels/conversation` | historical / prototype / fixtures | 48 / 9 | Historical wizard retained for original setup/access/review design; current GitHub setup is ui/src/pages/apps/chat/GitHubChatSetup.tsx. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. |
| [Apps, channels, and extensions/External chat and email/Connections/GitHub and Code Review Bot](../../ui/storybook/stories/chat-channels/github-connections.stories.tsx) | `chat-channels/providers`, `connection-setup/channel-setup` | unreviewed / production / fixtures | 7 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) | `chat-channels/conversation`, `chat-channels/providers`, `chat-channels/identity`, `chat-channels/lifecycle`, `connection-setup/channel-setup`, `connection-setup/failure` | unreviewed / production / fixtures | 13 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the endpoint editor addition; this suite selects setup/access and locally simulated conversation states. Endpoint PATCH retains fields, but settings workspace-choice requests and default selection are not covered by these scenarios. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Inspected channel task-default controls, optional API fields, avatar rendering and matching fixture updates; live defaults inheritance and permission checks remain outside these stories. Catalog, ChooseAgent, Credentials, Access, Reconnect and ProviderOutageRecovery render shipped setup/detail states with simulated provider data. No live iMessage connection, delivery or recovery claim. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/External chat and email/Connections/Slack/Automatic setup](../../ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx) | `chat-channels/providers`, `connection-setup/channel-setup` | unreviewed / production / fixtures | 18 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/External chat and email/Connections/Slack/Avatar in Settings](../../ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx) | `chat-channels/identity` | current / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. |
| [Apps, channels, and extensions/External chat and email/Connections/Slack/Communication in Settings](../../ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx) | `chat-channels/identity` | current / production / fixtures | 4 / 1 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. |
| [Apps, channels, and extensions/External chat and email/Connections/Slack/Managed setup](../../ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx) | `chat-channels/providers`, `connection-setup/channel-setup` | unreviewed / production / fixtures | 21 / 7 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. The recipe adds bounded Telegram subscription maintenance regressions; this story does not establish real provider startup recovery. |
| [Apps, channels, and extensions/External chat and email/Connections/Slack/Task tools](../../ui/storybook/stories/chat-channels/slack-tools.stories.tsx) | `chat-channels/conversation` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Task-workspace reconciliation reviewed the added connection/destination-default recipe; these unchanged setup, identity or conversation examples do not establish default selection or new-task inheritance. |
### Tool gateways and access profiles
Tool exposure, client configuration, tokens, profiles, and activity.
[Feature recipe](../feature-map/gateways-profiles.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Apps, channels, and extensions/Tool gateways and access profiles/Tools/Access profiles](../../ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx) | `gateways-profiles/profiles` | unreviewed / production / fixtures | 18 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Named gateway tokens](../../ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx) | `gateways-profiles/tokens` | current / production / fixtures | 8 / 5 | Named, empty and expired token history; issuance pending/error/403/success and name-confirmed revocation. Tokens are fictional; real bearer expiry, scope and revocation need API verification. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Tools/Gateways (PAP-11182)](../../ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx) | `gateways-profiles/gateway` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Manage connections](../../ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx) | `gateways-profiles/client-connect` | current / production / fixtures | 9 / 4 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Consent](../../ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx) | `gateways-profiles/client-connect` | current / production / fixtures | 25 / 14 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Device authorization](../../ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx) | `gateways-profiles/client-connect` | current / production / fixtures | 7 / 3 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Start here](../../ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx) | `gateways-profiles/client-connect` | unreviewed / production / fixtures | 14 / 4 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Experimental setting](../../ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx) | `gateways-profiles/client-connect`, `instance-operations/configuration` | unreviewed / production / fixtures | 8 / 5 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. ToggleOnAndOff, ManagedByCloud and SaveFailedRollsBack mount production experimental settings with simulated saves. Only the assistant-connection flag is represented, not every instance setting. The recipe distinguishes process liveness from authenticated database readiness; these examples do not exercise that operator API boundary. |
### Secrets and proposals
Company/user credentials, grants, proposals, and vault import.
[Feature recipe](../feature-map/secrets.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Apps, channels, and extensions/Secrets and proposals/Task credential access/01 Notice](../../ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx) | `secrets/runtime-delivery`, `recovery/diagnosis` | unreviewed / production / fixtures | 5 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Apps, channels, and extensions/Secrets and proposals/Task credential access/02 Task page](../../ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx) | `secrets/runtime-delivery`, `recovery/diagnosis` | unreviewed / production / fixtures | 6 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Master reconciliation inspected assignment-history recipient suggestions and manual-selection retention; existing stories do not establish the new assignment-history behavior. Expanded upstream verification recipes were inspected; the existing fixture scenarios do not prove the added backend handoff, workspace, recovery or authorization contracts. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. Source review covers the retained-file recovery form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery. The added verification recipe documents source-only retained-file repair; existing fixtures do not establish live provider recovery. |
| [Apps, channels, and extensions/Secrets and proposals/Product/Environment Variables Editor](../../ui/storybook/stories/secrets/environment-variables-editor.stories.tsx) | `secrets/runtime-delivery` | unreviewed / production / fixtures | 11 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. |
| [Apps, channels, and extensions/Secrets and proposals/Proposal review](../../ui/storybook/stories/secrets/proposal-review.stories.tsx) | `secrets/proposals` | current / production / fixtures | 7 / 3 | Pending proposal, authority preflight block, list states and rejected proposal/rejection error. ProposalsTab and its dialogs are shipped; secret creation, values and grant authority are not exercised. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. |
| [Apps, channels, and extensions/Secrets and proposals/Product/Secrets](../../ui/storybook/stories/secrets/secrets.stories.tsx) | `secrets/company-secrets`, `secrets/vault-import` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. |
| [Apps, channels, and extensions/Secrets and proposals/Product/User secrets](../../ui/storybook/stories/secrets/user-secrets.stories.tsx) | `secrets/user-secrets` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. |
### Plugins
Installation/configuration, contributed pages/tools, and lifecycle.
[Feature recipe](../feature-map/plugins.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Apps, channels, and extensions/Plugins/Configuration](../../ui/storybook/stories/plugins/plugin-configuration.stories.tsx) | `plugins/configuration` | current / production / fixtures | 6 / 3 | PluginSettings configuration route with hydrated values, read pending/unavailable and saved/error/403 responses. Real config storage and plugin worker validation are not proved. |
| [Apps, channels, and extensions/Plugins/Contributed routes](../../ui/storybook/stories/plugins/plugin-contributions.stories.tsx) | `plugins/contributions` | current / production / fixtures | 4 / 1 | Production PluginPage host with a registered fixture plugin component; pending/missing contribution and discovery failure. Discovery failure currently remains Loading; contribution contents are a fixture, not shipped plugin code. |
| [Apps, channels, and extensions/Plugins/Installation and lifecycle](../../ui/storybook/stories/plugins/plugin-management.stories.tsx) | `plugins/installation`, `plugins/lifecycle` | current / production / fixtures | 10 / 5 | PluginManager list states, install pending/error/success, disable and uninstall receipts. Local record transitions only; package loading and worker lifecycle require production verification. |
## Automation and structured work
### Routines, schedules, and triggers
Definitions, variables, scheduled/webhook/manual runs, and history.
[Feature recipe](../feature-map/routines.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Detail (variation C)](../../ui/storybook/stories/routines/routine-detail-c.stories.tsx) | `routines/definition`, `routines/management`, `activity/routine-audit` | unreviewed / production / fixtures | 8 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Activity mounts the shipped ActivitySection with fixture trigger/run/configuration events. This does not establish live routine execution or audit persistence. |
| [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Secrets tab](../../ui/storybook/stories/routines/routine-secrets.stories.tsx) | `routines/definition`, `secrets/runtime-delivery` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Agent-owned instance secrets remain in trusted server runtime and are excluded from ordinary agent delivery; these UI examples do not verify that lifecycle contract. |
| [Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks UX preview](../../ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx) | `routines/triggers` | unreviewed / production / fixtures | 21 / 5 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks](../../ui/storybook/stories/routines/routine-webhooks.stories.tsx) | `routines/triggers`, `routines/history`, `activity/routine-audit` | unreviewed / production / fixtures | 16 / 14 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Runs and Activity mount RoutineDetail with fixture execution tasks/events and play assertions. Scheduler execution, delivery and audit persistence are not live. |
| [Automation and structured work/Routines, schedules, and triggers/Product/Routines · List (grouped cards)](../../ui/storybook/stories/routines/routines-list-groups.stories.tsx) | `routines/definition`, `routines/management` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Automation and structured work/Routines, schedules, and triggers/Run now](../../ui/storybook/stories/routines/run-now.stories.tsx) | `routines/run-now` | current / production / fixtures | 8 / 4 | RoutineDetail manual-run dialog with required input, captured variables, pending/error/success and read states. Fictional dispatch receipt; real scheduling, coalescing, workspace authority and execution remain separate. |
### Pipelines, review queues, and learnings
Experimental stages, automation, items, review, and learning records.
[Feature recipe](../feature-map/pipelines.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Automation and structured work/Pipelines, review queues, and learnings/Learnings](../../ui/storybook/stories/pipelines/learnings.stories.tsx) | `pipelines/learnings` | current / production / fixtures | 5 / 1 | Production Learnings feed renders a review_decided event plus loading/empty/error/403. Event provenance and durable audit records remain separate; this is not a new learning-record subsystem. |
| [Automation and structured work/Pipelines, review queues, and learnings/Items](../../ui/storybook/stories/pipelines/pipeline-board.stories.tsx) | `pipelines/items` | current / production / fixtures | 5 / 1 | Production Pipelines board with stages/items and loading/empty/error/403. Snapshot rows only; transitions, liveness, guards and automation execution remain separate. |
| [Automation and structured work/Pipelines, review queues, and learnings/Review queue](../../ui/storybook/stories/pipelines/review-queue.stories.tsx) | `pipelines/review` | current / production / fixtures | 7 / 3 | Production ReviewQueue with empty/loading/error/403, approval removal and failure recovery marked Needs attention. Fixture decisions do not prove real review leases, version checks or transitions. |
| [Automation and structured work/Pipelines, review queues, and learnings/Stage settings](../../ui/storybook/stories/pipelines/stage-settings.stories.tsx) | `pipelines/stages` | current / production / fixtures | 5 / 2 | Production PipelineSettings stage editor with filled configuration, no stages, pending/error/403. This pass renders the shipped controls; saved stage/automation changes remain production obligations. |
### Cases
Experimental structured fields, relationships, revisions, and task links.
[Feature recipe](../feature-map/cases.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Automation and structured work/Cases/Browse and hierarchy](../../ui/storybook/stories/cases/case-browse.stories.tsx) | `cases/browse` | current / production / fixtures | 5 / 1 | Cases page with fixture parent/child records and loading/empty/error/403. Failed list queries currently use the shipped empty-case presentation. Responsive duplicate labels are accounted for; server filters and case mutations remain separate. |
| [Automation and structured work/Cases/Structure, history and task links](../../ui/storybook/stories/cases/case-detail.stories.tsx) | `cases/structure`, `cases/history`, `cases/task-links` | current / production / fixtures | 8 / 4 | CaseDetail hierarchy and activity, CaseFieldsPanel arbitrary/empty data and IssueCasesPanel reverse links. Fixture relations/events; document revision history and persisted links remain production obligations. |
### Status cards
Experimental summaries, watched work, refresh history, and settings.
[Feature recipe](../feature-map/status-cards.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Automation and structured work/Status cards/Authoring, updates and archive](../../ui/storybook/stories/status-cards/status-card-states.stories.tsx) | `status-cards/authoring`, `status-cards/generation`, `status-cards/inspection`, `status-cards/archive` | current / production / fixtures | 17 / 10 | StatusCards board/drawer with current/stale/error/live setup, list states, create, refresh, inspection and archive/restoration. Mutable receipts and setup task ID are fixtures; no summarizer execution or revision-history parity is claimed. |
## Oversight and operation
### Costs and budgets
Spend reports, scoped limits, incidents, hard stops, and resumption.
[Feature recipe](../feature-map/budgets-costs.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Oversight and operation/Costs and budgets/Product/Budget & Finance](../../ui/storybook/stories/budgets-costs/budget-finance.stories.tsx) | `budgets-costs/cost-reporting`, `budgets-costs/budgets`, `budgets-costs/incidents` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. FullMatrix renders BudgetIncidentCard in warning, resolved, pending-approval and escalated hard-stop states. Resolution handlers are no-ops; budget relief and resumption remain unverified. The upstream budget UI distinguishes soft warnings from hard stops; hard incidents retain raise-and-resume and keep-paused controls. |
| [Oversight and operation/Costs and budgets/Resolve a budget incident](../../ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx) | `budgets-costs/resolution` | current / production / fixtures | 10 / 6 | Shipped Costs budget tab with empty/read failures, invalid amount, raise-and-resume, keep-paused and write failure/pending. Fixture incident transitions only; real overlapping holds and hard stops remain separate. The upstream budget UI distinguishes soft warnings from hard stops; hard incidents retain raise-and-resume and keep-paused controls. |
| [Oversight and operation/Costs and budgets/Costs/Subscriptions](../../ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx) | `budgets-costs/cost-reporting`, `budgets-costs/budgets` | unreviewed / production / fixtures | 7 / 4 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The upstream budget UI distinguishes soft warnings from hard stops; hard incidents retain raise-and-resume and keep-paused controls. |
### Dashboards and audit trails
Company health, live work, activity, runs, routines, and timeline.
[Feature recipe](../feature-map/activity.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Oversight and operation/Dashboards and audit trails/Tools/Activity (audit feed)](../../ui/storybook/stories/activity/activity-feed.stories.tsx) | `activity/activity`, `gateways-profiles/activity` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Oversight and operation/Dashboards and audit trails/Apps/App detail · Activity (lifecycle)](../../ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx) | `activity/activity`, `gateways-profiles/activity` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Oversight and operation/Dashboards and audit trails/Product/Data Visualization & Misc](../../ui/storybook/stories/activity/data-viz-misc.stories.tsx) | `activity/overview` | unreviewed / production / fixtures | 21 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Oversight and operation/Dashboards and audit trails/Execution history](../../ui/storybook/stories/activity/run-audit.stories.tsx) | `activity/runs` | current / production / fixtures | 6 / 4 | AuditRuns list, completed receipt, empty/loading/failed/denied and no-match filter. Run records are fixture snapshots; no real execution or scoped audit proof. |
| [Oversight and operation/Dashboards and audit trails/Pages/Work Timeline](../../ui/storybook/stories/activity/work-timeline.stories.tsx) | `activity/timeline` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
### Navigation, profile, and announcements
Sidebar state, favorites/recents, personal identity, and dismissals.
[Feature recipe](../feature-map/navigation-preferences.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Oversight and operation/Navigation, profile, and announcements/Announcements/AnnouncementCard](../../ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx) | `navigation-preferences/announcements` | unreviewed / production / fixtures | 11 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Oversight and operation/Navigation, profile, and announcements/Prototypes/Task detail/Mobile tabs](../../ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx) | `navigation-preferences/navigation` | proposed / prototype / fixtures | 4 / 2 | Local composition retained for its original design purpose; full production parity remains unreviewed. |
| [Oversight and operation/Navigation, profile, and announcements/Product/Navigation & Layout](../../ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx) | `navigation-preferences/navigation` | unreviewed / production / fixtures | 2 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
| [Oversight and operation/Navigation, profile, and announcements/Sidebar preferences](../../ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx) | `navigation-preferences/preferences` | current / production / fixtures | 5 / 1 | Production Sidebar inside PluginLauncherProvider with saved-order reads, pending/error/403 fallback and session-only section collapse. Favorites, recents and actual order persistence still need the recipe checks. |
### Instance operations
Installation, updates, service health, configuration, and backups.
[Feature recipe](../feature-map/instance-operations.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Oversight and operation/Instance operations/Backup retention](../../ui/storybook/stories/instance-operations/backup-retention.stories.tsx) | `instance-operations/backup`, `instance-operations/configuration` | current / production / fixtures | 6 / 6 | Retention presets, initial read, loading, error, denial and pending/saved selection in InstanceGeneralSettings. Backup creation/restore and real settings authority remain production obligations. The recipe distinguishes process liveness from authenticated database readiness; these examples do not exercise that operator API boundary. |
| [Oversight and operation/Instance operations/Product/Dev Ops Surfaces](../../ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx) | `instance-operations/server-service` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. The recipe distinguishes process liveness from authenticated database readiness; these examples do not exercise that operator API boundary. |
### CLI/API and local worktrees
Explicit context, resource commands, outputs, runs, and isolated instances.
[Feature recipe](../feature-map/cli-operations.md)
No primary story suite. Check capability lookup below for related examples; this does not imply a missing product feature.
## Contributor surfaces
### Developer previews and diagnostic labs
Design examples, interaction fixtures, performance checks; not production acceptance.
[Feature recipe](../feature-map/developer-labs.md)
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Contributor surfaces/Developer previews and diagnostic labs/UX Labs/Converted Test Pages](../../ui/storybook/stories/developer-labs/ux-labs.stories.tsx) | `developer-labs/interaction-labs` | unreviewed / production / fixtures | 4 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. |
## Foundations
### Shared foundations and guides
Shared components and contributor guidance outside the product feature index.
| Story suite | Capabilities | Product / implementation / data | Stories / play functions | Review note |
| --- | --- | --- | --- | --- |
| [Foundations/Components/Forms & Editors](../../ui/storybook/stories/foundations/forms-editors.stories.tsx) | `developer-labs/design` | unreviewed / production / fixtures | 3 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related design reference: demonstrates shared production controls and visual states in an isolated contributor fixture; retains its Foundations home. No product-journey or baseline comparison claim. |
| [Foundations/Primitive Matrix](../../ui/storybook/stories/foundations/foundations.stories.tsx) | `developer-labs/design` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related design reference: demonstrates shared production controls and visual states in an isolated contributor fixture; retains its Foundations home. No product-journey or baseline comparison claim. |
| [Foundations/Primitive Coverage](../../ui/storybook/stories/foundations/primitives-coverage.stories.tsx) | `developer-labs/design` | unreviewed / production / fixtures | 11 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related design reference: demonstrates shared production controls and visual states in an isolated contributor fixture; retains its Foundations home. No product-journey or baseline comparison claim. |
| [Foundations/Status Language](../../ui/storybook/stories/foundations/status-language.stories.tsx) | `developer-labs/design` | unreviewed / production / fixtures | 1 / 0 | Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed. Related design reference: demonstrates shared production controls and visual states in an isolated contributor fixture; retains its Foundations home. No product-journey or baseline comparison claim. |
| [Overview/Storybook Guide](../../ui/storybook/stories/overview/overview.stories.tsx) | Shared foundations or contributor guide; no single business capability owns this suite. | unreviewed / guide / static | 1 / 0 | Matches the upstream feature index and order, including features with no cataloged examples. Related suite links and classifications do not imply execution coverage. The generated upstream feature index was reconciled; example scope and classifications are retained. Reviewed the regenerated liveness capability description against the feature recipe; the guide remains a static index and does not prove live readiness. |
## Capability lookup
References are navigation links, not proof of parity. An absent link means no cataloged story, not a missing product feature. CLI/operator capabilities may need no Storybook example.
- `onboarding/instance`: No cataloged story.
- `onboarding/company`: [Getting started and access/Onboarding and first work/Onboarding/Character](../../ui/storybook/stories/onboarding/onboarding-character.stories.tsx) (unreviewed)
- `onboarding/adapter`: [Getting started and access/Onboarding and first work/Onboarding/Agent arc](../../ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx) (unreviewed), [Getting started and access/Onboarding and first work/Onboarding/Connect a model](../../ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx) (historical)
- `onboarding/first-task`: [Getting started and access/Onboarding and first work/Onboarding/Agent arc](../../ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx) (unreviewed), [Getting started and access/Onboarding and first work/Onboarding/Connect a model](../../ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx) (historical)
- `onboarding/resume`: [Getting started and access/Onboarding and first work/Resume a saved draft](../../ui/storybook/stories/onboarding/resume-draft.stories.tsx) (current)
- `access/login`: [Getting started and access/Login, invitations, and access/Sign in](../../ui/storybook/stories/access/sign-in.stories.tsx) (current)
- `access/invitations`: [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Components](../../ui/storybook/stories/agents/external-agent-invite/components.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Journeys](../../ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx) (unreviewed)
- `access/membership`: [Getting started and access/Login, invitations, and access/Organization membership](../../ui/storybook/stories/access/membership.stories.tsx) (current)
- `access/resources`: [Getting started and access/Login, invitations, and access/Private tasks/00 Review guide](../../ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/01 Creation](../../ui/storybook/stories/access/private-tasks/01-creation.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/02 Sharing](../../ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/03 Task actions](../../ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/04 References and blockers](../../ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/05 Projects](../../ui/storybook/stories/access/private-tasks/05-projects.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/06 Full product pages](../../ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/07 User stories](../../ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx) (unreviewed)
- `access/cli-auth`: [Getting started and access/Login, invitations, and access/CLI authorization](../../ui/storybook/stories/access/cli-authorization.stories.tsx) (current)
- `companies/selection`: [Getting started and access/Companies and portability/Selection and archived organizations](../../ui/storybook/stories/companies/company-selection.stories.tsx) (current)
- `companies/identity`: [Getting started and access/Companies and portability/Decision models/01 Settings](../../ui/storybook/stories/companies/decision-models/01-settings.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/02 History](../../ui/storybook/stories/companies/decision-models/02-history.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/03 Journey](../../ui/storybook/stories/companies/decision-models/03-journey.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Fast responses/01 Settings](../../ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Fast responses/02 History](../../ui/storybook/stories/companies/fast-responses/02-history.stories.tsx) (current)
- `companies/decision-models`: [Getting started and access/Companies and portability/Decision models/01 Settings](../../ui/storybook/stories/companies/decision-models/01-settings.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/02 History](../../ui/storybook/stories/companies/decision-models/02-history.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/03 Journey](../../ui/storybook/stories/companies/decision-models/03-journey.stories.tsx) (unreviewed)
- `companies/fast-responses`: [Getting started and access/Companies and portability/Fast responses/01 Settings](../../ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Fast responses/02 History](../../ui/storybook/stories/companies/fast-responses/02-history.stories.tsx) (current)
- `companies/archive`: [Getting started and access/Companies and portability/Selection and archived organizations](../../ui/storybook/stories/companies/company-selection.stories.tsx) (current)
- `companies/portability`: [Getting started and access/Companies and portability/Import preview](../../ui/storybook/stories/companies/company-import.stories.tsx) (current)
- `tasks/create`: [Tasks and conversations/Task creation and lifecycle/Composer/Add menu](../../ui/storybook/stories/tasks/composer-add-menu.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Composer/Mobile assignee picker](../../ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Composer/Model and effort picker](../../ui/storybook/stories/tasks/composer-model-picker.stories.tsx) (mixed), [Tasks and conversations/Task creation and lifecycle/Product/Dialogs & Modals](../../ui/storybook/stories/tasks/dialogs-modals.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Components/Entity pickers/Mobile](../../ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Composer/New task](../../ui/storybook/stories/tasks/new-task-composer.stories.tsx) (current), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide](../../ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components](../../ui/storybook/stories/agents/primary-agent/01-components.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar](../../ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents](../../ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task](../../ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat](../../ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys](../../ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/07 Confirmation](../../ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx) (unreviewed)
- `tasks/organize`: [Tasks and conversations/Task creation and lifecycle/Product/Control Plane Surfaces](../../ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Product/Issue Management](../../ui/storybook/stories/tasks/issue-management.stories.tsx) (unreviewed)
- `tasks/properties`: [Tasks and conversations/Task creation and lifecycle/External Objects](../../ui/storybook/stories/tasks/external-objects.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Product/Issue Management](../../ui/storybook/stories/tasks/issue-management.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/00 Review guide](../../ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/01 Creation](../../ui/storybook/stories/access/private-tasks/01-creation.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/02 Sharing](../../ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/03 Task actions](../../ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/04 References and blockers](../../ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/05 Projects](../../ui/storybook/stories/access/private-tasks/05-projects.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/06 Full product pages](../../ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/07 User stories](../../ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx) (unreviewed)
- `tasks/discussion`: [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Task activity](../../ui/storybook/stories/workspaces/browser-use-activity.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Footer](../../ui/storybook/stories/workspaces/browser-use-footer.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Panel](../../ui/storybook/stories/workspaces/browser-use.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Product/Chat & Comments](../../ui/storybook/stories/tasks/chat-comments.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Tasks/Completed activity preview](../../ui/storybook/stories/tasks/completed-activity.stories.tsx) (current), [Tasks and conversations/Task creation and lifecycle/Tasks/Runner activity preview](../../ui/storybook/stories/tasks/runner-activity.stories.tsx) (current), [Tasks and conversations/Task creation and lifecycle/Tasks/Task chat review fixes](../../ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Task chat/Mobile streaming follow](../../ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Product/Task chat/System notice](../../ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Task Chat Unanswered Questions](../../ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Tasks/Context notices](../../ui/storybook/stories/tasks/task-context-notices.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/00 Review guide](../../ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/01 Components](../../ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/02 Mixed-author journey](../../ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx) (unreviewed)
- `tasks/completion`: [Tasks and conversations/Task creation and lifecycle/Paperclip/Assigned Backlog Safeguards](../../ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Paperclip/Successful Run Handoff](../../ui/storybook/stories/tasks/successful-run-handoff.stories.tsx) (unreviewed)
- `task-coordination/delegation`: [Tasks and conversations/Questions and approvals/Issue Detail/Plan Decompositions](../../ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx) (unreviewed), [Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Tasks Created From a Task](../../ui/storybook/stories/task-coordination/originating-tasks.stories.tsx) (unreviewed), [Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Sub-issues Workflow Checklist](../../ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx) (unreviewed)
- `task-coordination/dependencies`: [Projects and execution/Recovery/Product/Issue/Blocked notice](../../ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx) (unreviewed), [Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Sub-issues Workflow Checklist](../../ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx) (unreviewed)
- `task-coordination/signoff`: [Tasks and conversations/Delegation, dependencies, and signoff/Product/Decisions/Stalled review actions](../../ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx) (unreviewed)
- `task-coordination/tree-control`: [Tasks and conversations/Delegation, dependencies, and signoff/Product/Issue Monitor surfaces](../../ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx) (unreviewed), [Tasks and conversations/Delegation, dependencies, and signoff/Product/Task Watchdog surfaces](../../ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx) (unreviewed)
- `inbox-search/views`: [Tasks and conversations/Inbox, decisions, and search/Personal task views](../../ui/storybook/stories/inbox-search/inbox-views.stories.tsx) (current)
- `inbox-search/triage`: [Tasks and conversations/Inbox, decisions, and search/Product/Inbox/Blocked tab](../../ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx) (unreviewed)
- `inbox-search/decisions`: [Tasks and conversations/Inbox, decisions, and search/Decisions/DecisionCard](../../ui/storybook/stories/inbox-search/decision-card.stories.tsx) (unreviewed), [Tasks and conversations/Inbox, decisions, and search/Pages/Decisions Desk](../../ui/storybook/stories/inbox-search/decisions-desk.stories.tsx) (unreviewed), [Tasks and conversations/Inbox, decisions, and search/Pages/Decisions](../../ui/storybook/stories/inbox-search/what-needs-me.stories.tsx) (unreviewed)
- `inbox-search/search`: [Tasks and conversations/Inbox, decisions, and search/Product/Search & Command K](../../ui/storybook/stories/inbox-search/search.stories.tsx) (unreviewed)
- `inbox-search/toasts`: [Tasks and conversations/Inbox, decisions, and search/Personal task notifications](../../ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx) (current)
- `agent-chat/discovery`: [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Pages](../../ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx) (unreviewed), [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat](../../ui/storybook/stories/agent-chat/agent-chat.stories.tsx) (mixed), [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Components](../../ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx) (current), [Tasks and conversations/Agent conversations and project handoff/Design explorations/Chat entry](../../ui/storybook/stories/agent-chat/chat-entry.stories.tsx) (historical), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide](../../ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components](../../ui/storybook/stories/agents/primary-agent/01-components.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar](../../ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents](../../ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task](../../ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat](../../ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys](../../ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/07 Confirmation](../../ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx) (unreviewed)
- `agent-chat/history`: [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Pages](../../ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Agent Chat Unanswered Questions](../../ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx) (unreviewed), [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat](../../ui/storybook/stories/agent-chat/agent-chat.stories.tsx) (mixed), [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Components](../../ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx) (current), [Tasks and conversations/Agent conversations and project handoff/Design explorations/Chat entry](../../ui/storybook/stories/agent-chat/chat-entry.stories.tsx) (historical)
- `agent-chat/handoff`: [Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat](../../ui/storybook/stories/agent-chat/agent-chat.stories.tsx) (mixed)
- `agent-chat/conference-room`: [Tasks and conversations/Agent conversations and project handoff/Conference Room](../../ui/storybook/stories/agent-chat/conference-room.stories.tsx) (current)
- `questions-and-approvals/questions`: [Tasks and conversations/Questions and approvals/Composer/Question flow](../../ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions](../../ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Rich ACP interactions](../../ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Composer/Interaction above composer](../../ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx) (current)
- `questions-and-approvals/dismiss-and-reopen`: [Tasks and conversations/Questions and approvals/Chat & Comments/Agent Chat Unanswered Questions](../../ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Task Chat Unanswered Questions](../../ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx) (unreviewed)
- `questions-and-approvals/confirmations`: [Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions](../../ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Rich ACP interactions](../../ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Composer/Interaction above composer](../../ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx) (current)
- `questions-and-approvals/plan-review`: [Tasks and conversations/Questions and approvals/Issue Detail/Plan Decompositions](../../ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions](../../ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx) (unreviewed)
- `questions-and-approvals/audience`: [Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions](../../ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Chat & Comments/Rich ACP interactions](../../ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx) (unreviewed), [Tasks and conversations/Questions and approvals/Composer/Interaction above composer](../../ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx) (current)
- `questions-and-approvals/governance`: [Tasks and conversations/Task creation and lifecycle/Product/Control Plane Surfaces](../../ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx) (unreviewed)
- `questions-and-approvals/tool-review`: [Tasks and conversations/Questions and approvals/Chat & Comments/Connection Reviews](../../ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx) (unreviewed)
- `questions-and-approvals/continuation`: [Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions](../../ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx) (unreviewed)
- `steering/queue`: [Tasks and conversations/Steering and queued messages/Composer/Steering and queued messages](../../ui/storybook/stories/steering/composer-queued-messages.stories.tsx) (current)
- `steering/edit-order-discard`: [Tasks and conversations/Steering and queued messages/Composer/Steering and queued messages](../../ui/storybook/stories/steering/composer-queued-messages.stories.tsx) (current)
- `steering/steer`: [Tasks and conversations/Steering and queued messages/Composer/Steering and queued messages](../../ui/storybook/stories/steering/composer-queued-messages.stories.tsx) (current)
- `steering/interrupt`: [Tasks and conversations/Steering and queued messages/Composer/Steering and queued messages](../../ui/storybook/stories/steering/composer-queued-messages.stories.tsx) (current), [Tasks and conversations/Steering and queued messages/Surfaces/Interrupt Handoff](../../ui/storybook/stories/steering/interrupt-handoff.stories.tsx) (unreviewed)
- `steering/stop-and-pause`: [Tasks and conversations/Steering and queued messages/Composer/Paused task takeover](../../ui/storybook/stories/steering/paused-composer.stories.tsx) (historical), [Tasks and conversations/Steering and queued messages/Composer/Execution controls](../../ui/storybook/stories/steering/task-execution-controls.stories.tsx) (current)
- `steering/drafts`: [Tasks and conversations/Steering and queued messages/Draft recovery](../../ui/storybook/stories/steering/composer-draft-recovery.stories.tsx) (current)
- `steering/approval-queue`: [Tasks and conversations/Steering and queued messages/Accepted response delivery](../../ui/storybook/stories/steering/durable-response-queue.stories.tsx) (current)
- `documents-artifacts/documents`: [Tasks and conversations/Documents, attachments, and work products/Document revisions](../../ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx) (current)
- `documents-artifacts/annotations`: [Tasks and conversations/Documents, attachments, and work products/Product/Documents/Annotations](../../ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Product/Document Comments](../../ui/storybook/stories/documents-artifacts/document-comments.stories.tsx) (unreviewed)
- `documents-artifacts/attachments`: [Tasks and conversations/Documents, attachments, and work products/Artifact upload/01 Artifacts pane](../../ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Artifact upload/02 Paused task journey](../../ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Components/CSV File Tab](../../ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Components/File Viewer Sheet](../../ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/01 Preview](../../ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/02 Workspace](../../ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/03 Task journey](../../ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Tasks/Text file tabs](../../ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx) (unreviewed)
- `documents-artifacts/work-products`: [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Commit](../../ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Data](../../ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Document](../../ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/File](../../ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Image](../../ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Link preview](../../ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Pull request](../../ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Video](../../ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Pages/Artifacts](../../ui/storybook/stories/documents-artifacts/artifacts.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Task Chat/Rich Work Product Cards](../../ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Tasks/Artifact Gallery](../../ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx) (unreviewed)
- `documents-artifacts/library`: [Tasks and conversations/Documents, attachments, and work products/Pages/Artifacts](../../ui/storybook/stories/documents-artifacts/artifacts.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/Tasks/Artifact Gallery](../../ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx) (unreviewed)
- `agents/hire`: [Agents and reusable capabilities/Runs, harnesses, and model accounts/Onboarding/Saved connections](../../ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx) (current), [Tasks and conversations/Task creation and lifecycle/Product/Dialogs & Modals](../../ui/storybook/stories/tasks/dialogs-modals.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Components](../../ui/storybook/stories/agents/external-agent-invite/components.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Journeys](../../ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/New agent](../../ui/storybook/stories/agents/new-agent-onboarding.stories.tsx) (historical)
- `agents/instructions`: [Agents and reusable capabilities/Hiring, configuration, and organization/Pages/Agent Detail](../../ui/storybook/stories/agents/agent-detail.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Persistent files](../../ui/storybook/stories/agents/agent-files.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Product/Agent Management](../../ui/storybook/stories/agents/agent-management.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Configuration refresh](../../ui/storybook/stories/agents/agent-settings-redesign.stories.tsx) (mixed), [Apps, channels, and extensions/Connection setup/Design explorations/Connections/Agent instructions](../../ui/storybook/stories/connection-setup/connection-instructions.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Memory](../../ui/storybook/stories/connection-setup/memory-connectors.stories.tsx) (unreviewed)
- `agents/organization`: [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas/Full pages](../../ui/storybook/stories/agents/agent-persona-pages.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas](../../ui/storybook/stories/agents/agent-personas.stories.tsx) (unreviewed)
- `agents/primary-agent`: [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide](../../ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components](../../ui/storybook/stories/agents/primary-agent/01-components.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar](../../ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents](../../ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task](../../ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat](../../ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys](../../ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/07 Confirmation](../../ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx) (unreviewed)
- `agents/lifecycle`: [Agents and reusable capabilities/Hiring, configuration, and organization/Pages/Agent Detail](../../ui/storybook/stories/agents/agent-detail.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Product/Agent Management](../../ui/storybook/stories/agents/agent-management.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Configuration refresh](../../ui/storybook/stories/agents/agent-settings-redesign.stories.tsx) (mixed)
- `agents/built-in`: [Agents and reusable capabilities/Hiring, configuration, and organization/Product/Built-in Agents](../../ui/storybook/stories/agents/built-in-agents.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Summaries/SummarySlotCard](../../ui/storybook/stories/agents/summary-slot-card.stories.tsx) (unreviewed)
- `runs-adapters/availability`: [Tasks and conversations/Task creation and lifecycle/Composer/Mobile assignee picker](../../ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Composer/Model and effort picker](../../ui/storybook/stories/tasks/composer-model-picker.stories.tsx) (mixed)
- `runs-adapters/validation`: [Agents and reusable capabilities/Runs, harnesses, and model accounts/Onboarding/Saved connections](../../ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx) (current), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Usage limits](../../ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Review](../../ui/storybook/stories/runs-adapters/ai-connections.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/Connectors/Pool host](../../ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Connection pools](../../ui/storybook/stories/runs-adapters/connection-pools.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/Assistant connections/Dot Runner](../../ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/07 Subscription sign-in](../../ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/00 Overview](../../ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/01 Onboarding](../../ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx) (mixed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/02 Connect](../../ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx) (mixed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/03 Agent](../../ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx) (mixed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/04 Manage](../../ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx) (mixed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/05 Recovery](../../ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx) (mixed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/06 Production components](../../ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx) (unreviewed)
- `runs-adapters/runs`: [Tasks and conversations/Task creation and lifecycle/Product/Chat & Comments](../../ui/storybook/stories/tasks/chat-comments.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Tasks/Completed activity preview](../../ui/storybook/stories/tasks/completed-activity.stories.tsx) (current), [Tasks and conversations/Task creation and lifecycle/Tasks/Runner activity preview](../../ui/storybook/stories/tasks/runner-activity.stories.tsx) (current), [Tasks and conversations/Task creation and lifecycle/Tasks/Task chat review fixes](../../ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx) (unreviewed)
- `runs-adapters/session`: [Agents and reusable capabilities/Runs, harnesses, and model accounts/Composer/Session goals](../../ui/storybook/stories/runs-adapters/session-goals.stories.tsx) (unreviewed)
- `skills/discovery`: [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub sync journey](../../ui/storybook/stories/skills/github-skills-journey.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub synced skills](../../ui/storybook/stories/skills/github-synced-skills.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/Repository packages](../../ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/Import progress](../../ui/storybook/stories/skills/skill-import-progress.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Skill detail](../../ui/storybook/stories/skills/skills-store-detail.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Discovery grid](../../ui/storybook/stories/skills/skills-store-discovery.stories.tsx) (unreviewed)
- `skills/authoring`: [Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/EditACopy](../../ui/storybook/stories/skills/fork-skill-flow.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Product/Skill Studio · FrontmatterPanel](../../ui/storybook/stories/skills/frontmatter-panel.stories.tsx) (unreviewed)
- `skills/versions`: [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub sync journey](../../ui/storybook/stories/skills/github-skills-journey.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub synced skills](../../ui/storybook/stories/skills/github-synced-skills.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/Repository packages](../../ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/Import progress](../../ui/storybook/stories/skills/skill-import-progress.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Skill detail](../../ui/storybook/stories/skills/skills-store-detail.stories.tsx) (unreviewed)
- `skills/policy`: [Agents and reusable capabilities/Skills and Skill Studio/Agent Skills/AgentSkillRow](../../ui/storybook/stories/skills/agent-skill-row.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/QA / Agent skills edge states](../../ui/storybook/stories/skills/agent-skills-edge.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/AgentsUsingSkill](../../ui/storybook/stories/skills/agents-using-skill.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub sync journey](../../ui/storybook/stories/skills/github-skills-journey.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Product/Skills/Policy surfaces](../../ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx) (unreviewed), [Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Skill detail](../../ui/storybook/stories/skills/skills-store-detail.stories.tsx) (unreviewed)
- `skills/testing`: [Agents and reusable capabilities/Skills and Skill Studio/Test runs](../../ui/storybook/stories/skills/skill-test-runs.stories.tsx) (current)
- `teams/discovery`: [Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog](../../ui/storybook/stories/teams/team-catalog.stories.tsx) (unreviewed)
- `teams/preview`: [Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog](../../ui/storybook/stories/teams/team-catalog.stories.tsx) (unreviewed)
- `teams/install`: [Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog](../../ui/storybook/stories/teams/team-catalog.stories.tsx) (unreviewed)
- `teams/configuration`: [Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog](../../ui/storybook/stories/teams/team-catalog.stories.tsx) (unreviewed)
- `projects/lifecycle`: [Tasks and conversations/Task creation and lifecycle/Product/Dialogs & Modals](../../ui/storybook/stories/tasks/dialogs-modals.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/05 Projects](../../ui/storybook/stories/access/private-tasks/05-projects.stories.tsx) (unreviewed), [Getting started and access/Login, invitations, and access/Private tasks/06 Full product pages](../../ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx) (unreviewed), [Projects and execution/Projects and repositories/Product/Projects Goals Workspaces](../../ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx) (unreviewed)
- `projects/task-context`: [Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Tasks Created From a Task](../../ui/storybook/stories/task-coordination/originating-tasks.stories.tsx) (unreviewed)
- `projects/repositories`: [Projects and execution/Projects and repositories/Proposals/Project repos/New project](../../ui/storybook/stories/projects/new-project-repos.stories.tsx) (proposed), [Projects and execution/Projects and repositories/Proposals/Project repos/Configuration](../../ui/storybook/stories/projects/project-repos-configuration.stories.tsx) (proposed)
- `projects/defaults`: [Projects and execution/Projects and repositories/Workspaces/Project runtime provision command](../../ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx) (unreviewed)
- `goals/hierarchy`: [Tasks and conversations/Task creation and lifecycle/Product/Dialogs & Modals](../../ui/storybook/stories/tasks/dialogs-modals.stories.tsx) (unreviewed), [Projects and execution/Projects and repositories/Product/Projects Goals Workspaces](../../ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx) (unreviewed)
- `goals/alignment`: [Projects and execution/Goals and work alignment/Aligned work and navigation](../../ui/storybook/stories/goals/goal-alignment.stories.tsx) (current)
- `goals/navigation`: [Projects and execution/Goals and work alignment/Aligned work and navigation](../../ui/storybook/stories/goals/goal-alignment.stories.tsx) (current)
- `workspaces/binding`: [Tasks and conversations/Task creation and lifecycle/Composer/New task](../../ui/storybook/stories/tasks/new-task-composer.stories.tsx) (current), [Projects and execution/Projects and repositories/Product/Projects Goals Workspaces](../../ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Components/SearchableSelect/Workspace picker](../../ui/storybook/stories/workspaces/searchable-select.stories.tsx) (unreviewed)
- `workspaces/provisioning`: [Projects and execution/Projects and repositories/Workspaces/Project runtime provision command](../../ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Workspaces/Runtime provisioning status](../../ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx) (unreviewed)
- `workspaces/services`: [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Task activity](../../ui/storybook/stories/workspaces/browser-use-activity.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Footer](../../ui/storybook/stories/workspaces/browser-use-footer.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Panel](../../ui/storybook/stories/workspaces/browser-use.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Workspaces/Service control bar](../../ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx) (unreviewed)
- `workspaces/files-git`: [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/01 Preview](../../ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/02 Workspace](../../ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx) (unreviewed), [Tasks and conversations/Documents, attachments, and work products/HTML artifacts/03 Task journey](../../ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx) (unreviewed), [Projects and execution/Workspaces, services, and files/Issue/Workspace File Browser](../../ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx) (unreviewed)
- `workspaces/closure`: [Projects and execution/Workspaces, services, and files/Close readiness](../../ui/storybook/stories/workspaces/workspace-close.stories.tsx) (current)
- `execution-environments/configuration`: [Projects and execution/Execution environments/Configuration, capabilities, and probes](../../ui/storybook/stories/execution-environments/environment-states.stories.tsx) (current)
- `execution-environments/capabilities`: [Projects and execution/Execution environments/Configuration, capabilities, and probes](../../ui/storybook/stories/execution-environments/environment-states.stories.tsx) (current)
- `execution-environments/probe`: [Projects and execution/Execution environments/Configuration, capabilities, and probes](../../ui/storybook/stories/execution-environments/environment-states.stories.tsx) (current)
- `execution-environments/assignment`: [Agents and reusable capabilities/Hiring, configuration, and organization/Product/Agent Management](../../ui/storybook/stories/agents/agent-management.stories.tsx) (unreviewed)
- `execution-environments/images`: [Projects and execution/Execution environments/Custom images](../../ui/storybook/stories/execution-environments/custom-images.stories.tsx) (current)
- `recovery/diagnosis`: [Tasks and conversations/Task creation and lifecycle/Paperclip/Assigned Backlog Safeguards](../../ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx) (unreviewed), [Tasks and conversations/Inbox, decisions, and search/Product/Inbox/Blocked tab](../../ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx) (unreviewed), [Apps, channels, and extensions/Secrets and proposals/Task credential access/01 Notice](../../ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx) (unreviewed), [Apps, channels, and extensions/Secrets and proposals/Task credential access/02 Task page](../../ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx) (unreviewed), [Projects and execution/Recovery/Task chat/Recovery notice](../../ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx) (unreviewed), [Projects and execution/Recovery/Tasks/Execution recovery](../../ui/storybook/stories/recovery/execution-recovery.stories.tsx) (unreviewed), [Projects and execution/Recovery/Product/Issue/Blocked notice](../../ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx) (unreviewed), [Projects and execution/Recovery/Design previews/Recovery notice](../../ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx) (current), [Projects and execution/Recovery/Paperclip/Source Issue Recovery](../../ui/storybook/stories/recovery/source-issue-recovery.stories.tsx) (unreviewed), [Projects and execution/Recovery/Paperclip/Source-resolved Fold](../../ui/storybook/stories/recovery/source-resolved-fold.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Paperclip/Successful Run Handoff](../../ui/storybook/stories/tasks/successful-run-handoff.stories.tsx) (unreviewed)
- `recovery/bounded-continuation`: [Projects and execution/Recovery/Tasks/Model capacity retry](../../ui/storybook/stories/recovery/model-capacity-retry.stories.tsx) (unreviewed), [Projects and execution/Recovery/Product/Issue Scheduled retry surfaces](../../ui/storybook/stories/recovery/scheduled-retry.stories.tsx) (unreviewed)
- `recovery/source-action`: [Projects and execution/Recovery/Design previews/Recovery notice](../../ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx) (current), [Projects and execution/Recovery/Paperclip/Source Issue Recovery](../../ui/storybook/stories/recovery/source-issue-recovery.stories.tsx) (unreviewed), [Projects and execution/Recovery/Paperclip/Source-resolved Fold](../../ui/storybook/stories/recovery/source-resolved-fold.stories.tsx) (unreviewed), [Projects and execution/Recovery/Workspace finalization recovery/01 Notice](../../ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx) (current), [Projects and execution/Recovery/Workspace finalization recovery/02 Task journey](../../ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx) (unreviewed)
- `recovery/exhaustion`: [Projects and execution/Recovery/Exhaustion and user decisions](../../ui/storybook/stories/recovery/recovery-gap-states.stories.tsx) (current)
- `recovery/workspace`: [Projects and execution/Recovery/Workspace branch recovery/01 Repair card](../../ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx) (unreviewed), [Projects and execution/Recovery/Workspace branch recovery/02 Task journey](../../ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx) (unreviewed), [Projects and execution/Recovery/Workspace finalization recovery/01 Notice](../../ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx) (current), [Projects and execution/Recovery/Workspace finalization recovery/02 Task journey](../../ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx) (unreviewed)
- `recovery/unknown-outcome`: [Projects and execution/Recovery/Exhaustion and user decisions](../../ui/storybook/stories/recovery/recovery-gap-states.stories.tsx) (current)
- `recovery/user-continuation`: [Tasks and conversations/Steering and queued messages/Accepted response delivery](../../ui/storybook/stories/steering/durable-response-queue.stories.tsx) (current)
- `recovery/reconnect`: [Projects and execution/Recovery/App/Connection recovery](../../ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx) (unreviewed)
- `connection-setup/catalog`: [Apps, channels, and extensions/Connection setup/Apps/Canonical icon registry](../../ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Catalog source selection](../../ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx) (proposed), [Apps, channels, and extensions/Connection setup/Apps/Connect discoverability (PAP-11091)](../../ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/Connectors/Pool host](../../ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx) (unreviewed)
- `connection-setup/identity-and-access`: [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Provider choice](../../ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connect name at create time (PAP-11283)](../../ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Reviews/PAP-17835 Personal connection identity](../../ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx) (unreviewed)
- `connection-setup/credentials`: [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Connections/Browser Use Cloud/Settings](../../ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx) (current), [Apps, channels, and extensions/Connection setup/Design explorations/Connections/Agent instructions](../../ui/storybook/stories/connection-setup/connection-instructions.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Enterpret connector](../../ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/PR reviews/Fireflies and app webhooks](../../ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Memory](../../ui/storybook/stories/connection-setup/memory-connectors.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Notion MCP connect flow (PAP-16650)](../../ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx) (unreviewed)
- `connection-setup/handoff`: [Apps, channels, and extensions/Connection setup/Apps/Managed Cloud OAuth handoff](../../ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx) (unreviewed)
- `connection-setup/draft-recovery`: [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) (unreviewed)
- `connection-setup/task-request`: [Tasks and conversations/Questions and approvals/Chat & Comments/Connection Reviews](../../ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Connections/In-task connections](../../ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx) (unreviewed)
- `connection-setup/channel-setup`: [Apps, channels, and extensions/Connection setup/Components/Agent setup prompt](../../ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/AgentMail setup](../../ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/GitHub and Code Review Bot](../../ui/storybook/stories/chat-channels/github-connections.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Slack/Automatic setup](../../ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Slack/Managed setup](../../ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx) (unreviewed)
- `connection-setup/failure`: [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Enterpret connector](../../ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Notion MCP connect flow (PAP-16650)](../../ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx) (unreviewed)
- `app-permissions/agent-access`: [Apps, channels, and extensions/App access and action permissions/Tools/Permitted vs Installed](../../ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx) (unreviewed)
- `app-permissions/action-policy`: [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/App access and action permissions/Tools & Access/ActionCard](../../ui/storybook/stories/app-permissions/action-card.stories.tsx) (unreviewed), [Apps, channels, and extensions/App access and action permissions/Apps/Action permissions test](../../ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx) (unreviewed), [Apps, channels, and extensions/App access and action permissions/Tools/Permitted vs Installed](../../ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx) (unreviewed)
- `app-permissions/catalog-change`: [Apps, channels, and extensions/App access and action permissions/Review newly discovered actions](../../ui/storybook/stories/app-permissions/catalog-review.stories.tsx) (current)
- `app-permissions/test-action`: [Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade](../../ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Composio](../../ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Executor](../../ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier](../../ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx) (unreviewed), [Apps, channels, and extensions/App access and action permissions/Tools & Access/ActionCard](../../ui/storybook/stories/app-permissions/action-card.stories.tsx) (unreviewed), [Apps, channels, and extensions/App access and action permissions/Apps/Action permissions test](../../ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx) (unreviewed)
- `app-permissions/account-maintenance`: [Apps, channels, and extensions/App access and action permissions/Apps/Managed accounts](../../ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx) (current)
- `chat-channels/providers`: [Apps, channels, and extensions/External chat and email/Connections/AgentMail setup](../../ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Chat connection actions](../../ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connectors/GitHub bot management](../../ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Historical/GitHub chat prototypes](../../ui/storybook/stories/chat-channels/github-chat.stories.tsx) (historical), [Apps, channels, and extensions/External chat and email/Connections/GitHub and Code Review Bot](../../ui/storybook/stories/chat-channels/github-connections.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Slack/Automatic setup](../../ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Slack/Managed setup](../../ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx) (unreviewed)
- `chat-channels/identity`: [Apps, channels, and extensions/External chat and email/Connections/Chat management](../../ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Slack/Avatar in Settings](../../ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx) (current), [Apps, channels, and extensions/External chat and email/Connections/Slack/Communication in Settings](../../ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx) (current)
- `chat-channels/conversation`: [Apps, channels, and extensions/External chat and email/Connections/AgentMail tasks](../../ui/storybook/stories/chat-channels/agentmail.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Chat management](../../ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connectors/GitHub bot management](../../ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Historical/GitHub chat prototypes](../../ui/storybook/stories/chat-channels/github-chat.stories.tsx) (historical), [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Slack/Task tools](../../ui/storybook/stories/chat-channels/slack-tools.stories.tsx) (unreviewed)
- `chat-channels/attachments`: [Apps, channels, and extensions/External chat and email/Task-linked files](../../ui/storybook/stories/chat-channels/channel-attachments.stories.tsx) (current)
- `chat-channels/lifecycle`: [Apps, channels, and extensions/External chat and email/Connections/AgentMail settings](../../ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/Chat management](../../ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx) (unreviewed), [Apps, channels, and extensions/External chat and email/Connections/iMessage Photon](../../ui/storybook/stories/chat-channels/imessage-photon.stories.tsx) (unreviewed)
- `gateways-profiles/gateway`: [Apps, channels, and extensions/Tool gateways and access profiles/Tools/Gateways (PAP-11182)](../../ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx) (unreviewed)
- `gateways-profiles/profiles`: [Apps, channels, and extensions/Tool gateways and access profiles/Tools/Access profiles](../../ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx) (unreviewed)
- `gateways-profiles/client-connect`: [Apps, channels, and extensions/Connection setup/Components/Agent setup prompt](../../ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx) (unreviewed), [Agents and reusable capabilities/Runs, harnesses, and model accounts/Assistant connections/Dot Runner](../../ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx) (unreviewed), [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Manage connections](../../ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx) (current), [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Consent](../../ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx) (current), [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Device authorization](../../ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx) (current), [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Start here](../../ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx) (unreviewed), [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Experimental setting](../../ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx) (unreviewed)
- `gateways-profiles/tokens`: [Apps, channels, and extensions/Tool gateways and access profiles/Named gateway tokens](../../ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx) (current)
- `gateways-profiles/activity`: [Oversight and operation/Dashboards and audit trails/Tools/Activity (audit feed)](../../ui/storybook/stories/activity/activity-feed.stories.tsx) (unreviewed), [Oversight and operation/Dashboards and audit trails/Apps/App detail · Activity (lifecycle)](../../ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx) (unreviewed)
- `secrets/company-secrets`: [Apps, channels, and extensions/Secrets and proposals/Product/Secrets](../../ui/storybook/stories/secrets/secrets.stories.tsx) (unreviewed)
- `secrets/user-secrets`: [Apps, channels, and extensions/Secrets and proposals/Product/User secrets](../../ui/storybook/stories/secrets/user-secrets.stories.tsx) (unreviewed)
- `secrets/proposals`: [Apps, channels, and extensions/Secrets and proposals/Proposal review](../../ui/storybook/stories/secrets/proposal-review.stories.tsx) (current)
- `secrets/vault-import`: [Apps, channels, and extensions/Secrets and proposals/Product/Secrets](../../ui/storybook/stories/secrets/secrets.stories.tsx) (unreviewed)
- `secrets/runtime-delivery`: [Apps, channels, and extensions/Secrets and proposals/Task credential access/01 Notice](../../ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx) (unreviewed), [Apps, channels, and extensions/Secrets and proposals/Task credential access/02 Task page](../../ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx) (unreviewed), [Apps, channels, and extensions/Secrets and proposals/Product/Environment Variables Editor](../../ui/storybook/stories/secrets/environment-variables-editor.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Secrets tab](../../ui/storybook/stories/routines/routine-secrets.stories.tsx) (unreviewed)
- `plugins/installation`: [Apps, channels, and extensions/Plugins/Installation and lifecycle](../../ui/storybook/stories/plugins/plugin-management.stories.tsx) (current)
- `plugins/configuration`: [Apps, channels, and extensions/Plugins/Configuration](../../ui/storybook/stories/plugins/plugin-configuration.stories.tsx) (current)
- `plugins/contributions`: [Apps, channels, and extensions/Plugins/Contributed routes](../../ui/storybook/stories/plugins/plugin-contributions.stories.tsx) (current)
- `plugins/lifecycle`: [Apps, channels, and extensions/Plugins/Installation and lifecycle](../../ui/storybook/stories/plugins/plugin-management.stories.tsx) (current)
- `routines/definition`: [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Detail (variation C)](../../ui/storybook/stories/routines/routine-detail-c.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Secrets tab](../../ui/storybook/stories/routines/routine-secrets.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines · List (grouped cards)](../../ui/storybook/stories/routines/routines-list-groups.stories.tsx) (unreviewed)
- `routines/triggers`: [Apps, channels, and extensions/Connection setup/PR reviews/Fireflies and app webhooks](../../ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks UX preview](../../ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks](../../ui/storybook/stories/routines/routine-webhooks.stories.tsx) (unreviewed)
- `routines/run-now`: [Automation and structured work/Routines, schedules, and triggers/Run now](../../ui/storybook/stories/routines/run-now.stories.tsx) (current)
- `routines/history`: [Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks](../../ui/storybook/stories/routines/routine-webhooks.stories.tsx) (unreviewed)
- `routines/management`: [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Detail (variation C)](../../ui/storybook/stories/routines/routine-detail-c.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines · List (grouped cards)](../../ui/storybook/stories/routines/routines-list-groups.stories.tsx) (unreviewed)
- `pipelines/stages`: [Automation and structured work/Pipelines, review queues, and learnings/Stage settings](../../ui/storybook/stories/pipelines/stage-settings.stories.tsx) (current)
- `pipelines/items`: [Automation and structured work/Pipelines, review queues, and learnings/Items](../../ui/storybook/stories/pipelines/pipeline-board.stories.tsx) (current)
- `pipelines/review`: [Automation and structured work/Pipelines, review queues, and learnings/Review queue](../../ui/storybook/stories/pipelines/review-queue.stories.tsx) (current)
- `pipelines/learnings`: [Automation and structured work/Pipelines, review queues, and learnings/Learnings](../../ui/storybook/stories/pipelines/learnings.stories.tsx) (current)
- `cases/browse`: [Automation and structured work/Cases/Browse and hierarchy](../../ui/storybook/stories/cases/case-browse.stories.tsx) (current)
- `cases/structure`: [Automation and structured work/Cases/Structure, history and task links](../../ui/storybook/stories/cases/case-detail.stories.tsx) (current)
- `cases/history`: [Automation and structured work/Cases/Structure, history and task links](../../ui/storybook/stories/cases/case-detail.stories.tsx) (current)
- `cases/task-links`: [Automation and structured work/Cases/Structure, history and task links](../../ui/storybook/stories/cases/case-detail.stories.tsx) (current)
- `status-cards/authoring`: [Automation and structured work/Status cards/Authoring, updates and archive](../../ui/storybook/stories/status-cards/status-card-states.stories.tsx) (current)
- `status-cards/generation`: [Automation and structured work/Status cards/Authoring, updates and archive](../../ui/storybook/stories/status-cards/status-card-states.stories.tsx) (current)
- `status-cards/inspection`: [Automation and structured work/Status cards/Authoring, updates and archive](../../ui/storybook/stories/status-cards/status-card-states.stories.tsx) (current)
- `status-cards/archive`: [Automation and structured work/Status cards/Authoring, updates and archive](../../ui/storybook/stories/status-cards/status-card-states.stories.tsx) (current)
- `budgets-costs/cost-reporting`: [Oversight and operation/Costs and budgets/Product/Budget & Finance](../../ui/storybook/stories/budgets-costs/budget-finance.stories.tsx) (unreviewed), [Oversight and operation/Costs and budgets/Costs/Subscriptions](../../ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/01 Settings](../../ui/storybook/stories/companies/decision-models/01-settings.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/02 History](../../ui/storybook/stories/companies/decision-models/02-history.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Decision models/03 Journey](../../ui/storybook/stories/companies/decision-models/03-journey.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Fast responses/01 Settings](../../ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx) (unreviewed), [Getting started and access/Companies and portability/Fast responses/02 History](../../ui/storybook/stories/companies/fast-responses/02-history.stories.tsx) (current)
- `budgets-costs/budgets`: [Oversight and operation/Costs and budgets/Product/Budget & Finance](../../ui/storybook/stories/budgets-costs/budget-finance.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Product/Control Plane Surfaces](../../ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx) (unreviewed), [Oversight and operation/Costs and budgets/Costs/Subscriptions](../../ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx) (unreviewed)
- `budgets-costs/incidents`: [Oversight and operation/Costs and budgets/Product/Budget & Finance](../../ui/storybook/stories/budgets-costs/budget-finance.stories.tsx) (unreviewed)
- `budgets-costs/resolution`: [Oversight and operation/Costs and budgets/Resolve a budget incident](../../ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx) (current)
- `activity/overview`: [Oversight and operation/Dashboards and audit trails/Product/Data Visualization & Misc](../../ui/storybook/stories/activity/data-viz-misc.stories.tsx) (unreviewed)
- `activity/activity`: [Oversight and operation/Dashboards and audit trails/Tools/Activity (audit feed)](../../ui/storybook/stories/activity/activity-feed.stories.tsx) (unreviewed), [Oversight and operation/Dashboards and audit trails/Apps/App detail · Activity (lifecycle)](../../ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx) (unreviewed), [Tasks and conversations/Task creation and lifecycle/Product/Control Plane Surfaces](../../ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx) (unreviewed)
- `activity/runs`: [Oversight and operation/Dashboards and audit trails/Execution history](../../ui/storybook/stories/activity/run-audit.stories.tsx) (current)
- `activity/routine-audit`: [Automation and structured work/Routines, schedules, and triggers/Product/Routines · Detail (variation C)](../../ui/storybook/stories/routines/routine-detail-c.stories.tsx) (unreviewed), [Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks](../../ui/storybook/stories/routines/routine-webhooks.stories.tsx) (unreviewed)
- `activity/timeline`: [Oversight and operation/Dashboards and audit trails/Pages/Work Timeline](../../ui/storybook/stories/activity/work-timeline.stories.tsx) (unreviewed)
- `navigation-preferences/navigation`: [Oversight and operation/Navigation, profile, and announcements/Prototypes/Task detail/Mobile tabs](../../ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx) (proposed), [Oversight and operation/Navigation, profile, and announcements/Product/Navigation & Layout](../../ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx) (unreviewed)
- `navigation-preferences/preferences`: [Oversight and operation/Navigation, profile, and announcements/Sidebar preferences](../../ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx) (current)
- `navigation-preferences/profile`: [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas/Full pages](../../ui/storybook/stories/agents/agent-persona-pages.stories.tsx) (unreviewed), [Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas](../../ui/storybook/stories/agents/agent-personas.stories.tsx) (unreviewed)
- `navigation-preferences/announcements`: [Oversight and operation/Navigation, profile, and announcements/Announcements/AnnouncementCard](../../ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx) (unreviewed)
- `navigation-preferences/fallbacks`: No cataloged story.
- `instance-operations/install-update`: No cataloged story.
- `instance-operations/server-service`: [Oversight and operation/Instance operations/Product/Dev Ops Surfaces](../../ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx) (unreviewed)
- `instance-operations/configuration`: [Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Experimental setting](../../ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx) (unreviewed), [Oversight and operation/Instance operations/Backup retention](../../ui/storybook/stories/instance-operations/backup-retention.stories.tsx) (current)
- `instance-operations/diagnostics`: No cataloged story.
- `instance-operations/backup`: [Oversight and operation/Instance operations/Backup retention](../../ui/storybook/stories/instance-operations/backup-retention.stories.tsx) (current)
- `cli-operations/context`: No cataloged story.
- `cli-operations/domain-commands`: No cataloged story.
- `cli-operations/outputs`: No cataloged story.
- `cli-operations/run-controls`: No cataloged story.
- `cli-operations/worktree-instances`: No cataloged story.
- `developer-labs/design`: [Foundations/Components/Forms & Editors](../../ui/storybook/stories/foundations/forms-editors.stories.tsx) (unreviewed), [Foundations/Primitive Matrix](../../ui/storybook/stories/foundations/foundations.stories.tsx) (unreviewed), [Foundations/Primitive Coverage](../../ui/storybook/stories/foundations/primitives-coverage.stories.tsx) (unreviewed), [Foundations/Status Language](../../ui/storybook/stories/foundations/status-language.stories.tsx) (unreviewed)
- `developer-labs/interaction-labs`: [Contributor surfaces/Developer previews and diagnostic labs/UX Labs/Converted Test Pages](../../ui/storybook/stories/developer-labs/ux-labs.stories.tsx) (unreviewed)
- `developer-labs/performance`: No cataloged story.
- `developer-labs/route-gates`: No cataloged story.
+92 -110
View File
@@ -1,118 +1,100 @@
# Storybook map
The [feature index](INDEX.md) connects the existing Storybook to stable capability
IDs from the upstream [feature map](../feature-map/README.md). Story files remain
in `ui/storybook/`. The feature map and its maintenance skill do not depend on
this catalog. New capabilities or upstream recipe drift are reported to their
maintainer; this catalog does not redefine product behavior or permissions.
Browse the [published feature guide](https://d1p6rlowie26tp.cloudfront.net/storybook/branches/master/?path=/story/overview-storybook-guide--coverage-guide),
or run `pnpm storybook` for the current checkout. The feature and capability IDs
come from the [feature recipes](../feature-map/README.md). Product behavior and
permissions remain governed by the implementation spec and access companions.
## Ownership
## Authored sources
- [maintain-storybook](../../.agents/skills/maintain-storybook/SKILL.md) owns story
alignment, fixture corrections, classification, and this catalog.
- [review-storybook](../../.agents/skills/review-storybook/SKILL.md) consumes it to
select and exercise examples, then reports evidence and drift.
- [DESIGN.md](../../DESIGN.md) governs design. Production verification remains
with the existing product recipes and verification tools.
Each story owns its small `parameters.paperclip` annotation. There is no authored
central catalog, review ledger, date stamp, source list or fingerprint to update.
Storybook's CSF parser supplies filenames, titles, explicit meta IDs, exports,
play-function counts and story IDs without executing story modules.
## Catalog contract
`catalog.json` is the maintained inventory, with one entry per authored story file.
`INDEX.md` is generated from it, the upstream feature map, and the installed Storybook CSF parser. Titles,
export filtering, story counts and IDs come from source, not filename guesses.
All examples are retained, including historical suites. A file's first capability
is its primary home; remaining capabilities are lookup references, not copies.
Shared foundations may declare `home: "foundations"` to retain their folder and
sidebar while linking related capabilities. This override requires an exception
reason; it is not available for arbitrary feature homes.
Foundations/guides and proposals without a mapped capability need an exception
reason. An absent story is not automatically a feature gap.
[Verification routes](VERIFICATION.md) classifies the currently unassociated
capabilities: UI examples to add, CLI/operator operations, and real browser checks.
It records source review and existing test starting points, not executed proof.
Update its rows/counts and source revision when associations or upstream
capabilities change. A capability with a story still needs production verification
for permissions, persistence, execution and provider behavior.
## Folders and sidebar
Story files live in `ui/storybook/stories/<primary-feature-area>/`, using the first
capability's area slug. Related capabilities still point to the same story. Shared
fixture modules and assets live in `ui/storybook/support/`; production wrappers in
`ui/storybook/prototypes/` retain their existing ownership.
The sidebar follows the section and feature names in the feature-map README, then
retains each suite's useful scenario grouping. Foundations contains shared component
examples with no primary product capability. Overview contains the catalog guide.
Every indexed feature has an Overview page, even when it has no cataloged examples.
The main guide and these pages use the same section, feature, and capability order
as the upstream map. Related suite links cross primary homes without copying stories.
Sidebar labels replace `/` with `, ` because Storybook treats slashes as folders;
the index and page heading retain the original feature name.
Missing examples are explicit; historical examples and guides do not imply current
behavioral coverage.
`ui/storybook/generated/` contains the derived index and one CSF Overview per
feature. The inline `storySort.order` in the preview config is also generated:
Storybook's indexer requires a literal there. Regenerate these outputs with the catalog command; do not edit
them or add them to the authored inventory. Their stable IDs use
`feature-map-<area>--overview`. Generated pages are explanatory guides and do not
increase example-suite counts. Storybook start/build checks this output for drift.
The generator fails on unexpected files rather than silently deleting them.
Each suite declares an explicit CSF `id`, recorded as `stableId` in the catalog.
The `sidebarTitle` can change without changing that identity. Existing story and
autodocs URLs and screenshot names remain valid. Do not derive a replacement ID
from a newly organized title. The checker rejects missing or changed explicit IDs,
incorrect feature folders, and sidebar titles outside their primary feature home.
Each entry records purpose, capability references, review sources/date/fingerprint,
notes, and three independent dimensions:
| Dimension | Values |
| --- | --- |
| Product status | `current`: source comparison supports the named subject; `proposed`: intentional alternate design; `historical`: superseded reference retained for its original purpose; `mixed`: suite combines these; `unreviewed`: parity has not been established |
| Implementation | `production`: shipped subject with fixture/layout wrappers; `prototype`: locally implemented subject, even if it uses shared primitives; `mixed`: both subjects; `guide`: explanatory documentation |
| Data boundary | `fixtures`: props, callbacks, caches or API responses are simulated; `fixture-server`: requires a separately owned local API/database fixture with simulated upstream providers; `static`: explanatory/static examples |
`current` is a source-review classification, not a promise that every state renders
or that APIs, gates, persistence and providers passed live tests. `unreviewed`
entries still have an inventory/classification review; notes explain the deeper
parity work outstanding. Mixed files retain a note naming the important split.
Production components can legitimately use mock data. A prototype directory name
does not establish implementation: some wrappers there re-export shipped UI.
Review sources include the story, relevant local support and production subjects.
Include directly rendered subjects regardless of import spelling, and primitives
when the suite demonstrates them. Do not truncate the list to a fixed source count.
Fingerprints make changes to those declared dependencies visible. They do not
follow every transitive production import or infer semantic correctness. Shared
preview/config/fixture changes have a separate fingerprint and require reviewing
affected callers. Update fingerprints only after reviewing the change, and add
missing dependencies when discovered. Date/revision context for the initial pass
and executed evidence belong in [REVIEW.md](REVIEW.md).
## Maintenance commands
After installing workspace dependencies:
```sh
node scripts/storybook-catalog.mjs
node scripts/storybook-catalog.mjs --write
node --test scripts/storybook-catalog.test.mjs scripts/storybook-feature-index.test.mjs
```ts
const meta = {
id: "tasks-create",
title: "Tasks and conversations/Task creation and lifecycle/Create",
parameters: {
paperclip: {
capabilities: ["tasks/create"],
implementation: "production",
boundary: "fixtures",
notes: "Uses the shipped composer; submission is simulated.",
},
},
};
```
The checker rejects unaccounted or deleted stories, invalid capability references,
duplicate entries/IDs, missing review sources, changed fingerprints and a stale
generated indexes and feature pages. `--write` only regenerates these outputs; it never refreshes review
fingerprints or blesses drift. Preserve IDs when changing titles or moving files;
compare the existing built Storybook index before and after such changes.
Feature outputs are regenerated before fingerprints are checked. If those writes
change a review source, the command fails with the affected review entries. Inspect
the generated change before updating those fingerprints and rerunning the command.
`capabilities` is an array of stable `area/capability` IDs. Its first entry is the
primary home; others cross-list the same suite. An empty array requires an
`exception` explaining the intentional scope. Shared foundations may use
`home: "foundations"` with an exception to keep their existing location and links.
The metadata must be literal; place it after any other parameter spreads.
Use the existing [Storybook workflow](../../doc/DEVELOPING.md#storybook) for builds,
browser review, and visual tests. Report source inspection, rendering, `play`
assertions, visual comparisons and production acceptance separately. Do not publish
new visual baselines just to make catalog maintenance pass.
| Field | Values and purpose |
| --- | --- |
| `status` | `current`, `proposed`, `historical`, `mixed`, `unreviewed` (default). Authored product alignment intent, not a live review certificate. |
| `implementation` | `production`, `prototype`, `mixed`, `guide`, `unreviewed` (default). What actually renders. |
| `boundary` | `fixtures`, `fixture-server`, `static`, `unreviewed` (default). What is simulated or requires an owned fixture. |
| `notes` | Optional durable scenario limits and rationale. Do not append a history of unrelated changes. |
| `replacement` | Optional repository-relative path of an existing replacement story. |
A production component can use fixtures. A prototype that imports production
primitives remains a prototype of its outer subject. Use `unreviewed` when intent
or parity is unclear. Preserve useful historical examples and their explanations.
Historical examples, proposals and guides do not remove missing-example gaps.
No annotation or story count proves permissions, persistence, provider behavior,
full recipe coverage or passing tests.
## Navigation and outputs
Stories live in `ui/storybook/stories/<primary-feature-area>/`. Sidebar titles use
the recipe's section and H1 title, followed by the suite name. `/` in feature
labels becomes `, ` in the sidebar. Preserve explicit CSF IDs across title/folder
changes. Compare the built `index.json` when changing navigation.
The generator discovers feature recipes and story annotations. It assembles:
- `ui/storybook/generated/catalog.json` and `feature-index.json`.
- A generated Overview story per feature, retaining `feature-map-<area>--overview`.
- `ui/storybook/.storybook/preview.tsx`, with the literal sidebar order required
by Storybook and the authored decorators/fixtures from `preview-base.tsx`.
- Markdown feature, access, Storybook and verification indexes, plus the current
page inventory, under `maps/generated/`.
All these outputs are ignored. Storybook start/build and UI typechecking generate
from a fresh checkout. The published Storybook includes the guide and each feature's
verification scope. After edits during a dev session, rerun the generator (restart
Storybook after navigation changes). Obsolete generated Overview files are removed.
Never edit generated outputs or commit them to resolve a merge conflict.
## Checks and review
```sh
node scripts/check-maps.mjs
node scripts/storybook-catalog.mjs
node scripts/storybook-catalog.mjs --check
node --test scripts/check-maps.test.mjs scripts/storybook-catalog.test.mjs scripts/storybook-feature-index.test.mjs
```
`--write` is a compatibility alias for the default generation command. `--check`
validates authored inputs without requiring existing outputs or writing files.
Checks reject malformed annotations, unknown capabilities, duplicate IDs, broken
map references, missing companions and invalid navigation. CI runs the map tests
through the UI Vitest suite and validates/generates inputs during UI typechecking.
Use Git diffs to select changed stories, rendered subjects, fixtures, and recipes
for review. A changed source is a review candidate, not an instruction to refresh
metadata on every dependent example. Inspect actual imports and contracts; shared
fixture changes can require broad review without broad acknowledgement edits.
Keep revision-specific findings and executed evidence in the PR, issue or CI
artifact. Move only durable limitations into the affected source annotation or
recipe. Past review history remains available through Git.
`maintain-storybook` owns stories and their annotations; `review-storybook` exercises
them. Product/access maintenance owns the recipes, including optional capability
verification scope. Use the [existing Storybook browser workflow](../../doc/DEVELOPING.md#storybook).
Report source inspection, rendering, play assertions, visual comparison and
production acceptance separately. Do not publish new baselines to pass a map cleanup.
-648
View File
@@ -1,648 +0,0 @@
# Initial Storybook review — 2026-10-12
Source baseline: `f0e12c851971a21f7aadf0835b016bfaf2067314`.
Scope: complete source inventory and initial classification, with targeted source
comparison and browser checks. This is not full state parity, full interaction
coverage, or production acceptance for all stories.
## Inventory and organization
There is one Storybook, already centralized under `ui/storybook/`. At the initial
baseline, its 223 story files were split between 176 files at the stories root and
47 nested files, with 51 top-level sidebar groups. The initial pass recorded
product meaning, provenance, and review status before changing that organization.
The follow-up organization pass below moves the files and sidebar together.
The downstream catalog gives each file a primary feature home and related stable
capability IDs. The generated index includes all 171 upstream capabilities across
35 feature areas. The existing Overview story now provides searchable feature
navigation into the actual built story index. The initial pass kept sidebar titles
stable; the follow-up uses explicit IDs to preserve links while changing titles.
| Dimension | Initial classification |
| --- | --- |
| Product alignment | 18 current subjects, 4 proposals, 5 historical suites, 8 mixed suites, 188 requiring deeper parity review |
| Rendered subject | 199 production, 8 prototype, 11 mixed, 5 guides |
| Data boundary | 217 fixture-based, 1 separate fixture server, 5 static guides |
A production subject can have unreviewed state parity. A current subject can still
have untested loading, error, permission, or backend behavior. The catalog's notes
and source references qualify these labels; none are a substitute for live proof.
## Corrections and retained history
- **Question dismissal and send:** the local interaction-above-composer harness
kept a pending badge for dismissed questions and left the question open after
a normal send. Production `TaskChatThread` excludes questions from
`pendingReminderInputs` and dismisses the selected question on send. The harness
now matches those rules. Added question-dismiss and confirmation-reopen cases;
corrected the send case's stale editor selector. The story still does not prove
persisted dismissal or history behavior.
- **Fast response helpers:** `empty`, `configured`, and `result` were exported
fixtures which Storybook also treated as stories. Their IDs collided with
`Empty`, `Configured`, and `Result`. Explicit exclusion removes the false exports
while retaining the real stories and imported fixtures. Browser review also
exposed a missing explicit `onConnectionChange` spy after the production view
began calling it on mount; added that fixture callback.
- **Chat provenance:** the main chat wrapper combines production conversation/task
pages with a local landing view. The separate first-created-agent chat-entry
design is historical; current primary-agent examples are its replacement.
- **Historical designs retained:** GitHub chat, old agent onboarding, connect-model
tiles, paused composer, and chat-entry remain available with their purpose and
replacement references. Local proposals are labeled rather than deleted.
- **Prototype folder is not a verdict:** some files re-export production subjects;
others implement local compositions. Static import traversal found no obvious
orphan prototype TS/TSX module. This is not proof that each is still useful.
- **Contributor guidance:** replaced the old Overview's manual coverage claims,
corrected the interaction-authoring skill's obsolete story path, and updated the
prototype README's catalog source count to match the shipped five sources.
## Verification
Environment: local macOS, headless Chromium, built Storybook 10.6.0, fixture data.
The following nine `play` cases reached Storybook's `storyFinished: success` event
without a browser page exception. These results establish story interactions only.
| Story ID | Subject / assertion |
| --- | --- |
| `composer-interaction-above-composer--ask-user-questions-and-send` | Production card/composer in local harness; normal send dismisses question without a pending badge |
| `composer-interaction-above-composer--dismiss-question-without-pending-badge` | Production card/composer; dismiss leaves editable composer without pending badge |
| `composer-interaction-above-composer--dismiss-confirmation-keeps-pending-badge` | Production card/composer; dismiss retains confirmation badge and reopening works |
| `composer-new-task--empty` | Production composer wrapper; existing play assertions |
| `design-explorations-agent-chat-sidebar-components--add-and-reopen-chat` | Production sidebar; fixture add/reopen assertions |
| `assistant-connections-consent--choose-organization` | Production consent surface; fixture organization selection assertions |
| `historical-github-chat-prototypes--standard-trust-warning` | Historical prototype; existing trust-warning assertions, not current GitHub acceptance |
| `design-previews-recovery-notice--retry-request-failed` | Production recovery notice; fixture failure-state assertions |
| `composer-mobile-assignee-picker--picker-open` | Production picker; existing open-picker assertions |
Additional manual browser checks passed: search the guide for `steering/queue`,
follow its link to the real queued-message story, dismiss a question, then reload
and verify that the fixture resets to an open question. Screenshots were inspected
locally and are not committed as new regression baselines.
Built-index comparison: all 2,208 prior story IDs remain; only the two new dismissal
regressions were added (2,210 total). Catalog validation, eight checker tests,
feature-map validation, both skill validators, token gates, workspace typecheck,
and workspace build passed. Fast-response settings `empty`, `configured`, and
`result` subsequently reached `storyFinished: success` with no page exceptions
following the explicit callback fix. These three cases are render checks, not save
or backend-persistence tests. The UI Vitest project passed all 8,176 tests in 728
files. The full `pnpm test:run` reported a 15-second timeout in the unchanged backend
case `connects advertised Workspace gmail.read without mutating definitions in
authenticated`. That exact case passed standalone without changing expectations
or timeouts. The remaining broad run was stopped after this failure; a complete
repository suite pass is not established.
Automated review found missing directly rendered subjects in the initial dependency
list. Expanded the catalog across affected suites, including relative production
imports, all direct non-primitive subjects in local wrappers, and the primitives
that foundation stories demonstrate. Explanatory review guides keep their separate
guide classification. This records change detection, not new parity
acceptance. Added a real CSF parser regression for nested discovery, include/exclude
rules, stable explicit IDs, and play counts.
## Feature organization follow-up — 2026-10-12
Source baseline: `75bd3c977cd828d5222823850339e8204f40eb47` (parent PR #16046).
The 223 story files now live under their primary feature area in
`ui/storybook/stories/`. The sidebar uses the feature map's section and feature
labels in map order. Existing scenario groups remain below those labels.
Overview and shared Foundations have dedicated homes. Areas without stories do
not get empty sidebar groups; their gaps remain visible in the catalog.
Nineteen supporting files moved to `ui/storybook/support/`, including fixtures,
shared wrappers, guide READMEs, an HTML fixture, and a fixture test. Relative imports,
active documentation, catalog sources, and replacement references follow the
moves. Classification and review scope did not change. The upstream feature map
and its skill are unchanged.
Every suite now has an explicit meta ID, recorded as `stableId` in the catalog.
The built index comparison preserved all 2,210 story IDs, the single docs ID, and
all entry names. No story was removed or added. Catalog validation checks primary
feature folders, sidebar prefixes, and stable meta IDs; its nine tests passed.
The Storybook build, UI typecheck, all 8,176 UI tests in 728 files, token gates,
map checks, and the maintenance-skill validator passed. A source comparison found
only changed meta titles/IDs, rebased relative references, and updated fixture
path text in story files. The full repository suite was not repeated for these
file moves; the prior full-suite limitation above still applies.
Local Chromium verified the sidebar's section/feature order, rendered the guide,
searched `steering/queue`, and followed its link to the unchanged
`composer-steering-and-queued-messages--queued-while-running` ID. The nine play
cases listed above and `fast-responses-01-settings--empty` all reached
`storyFinished: success` without page exceptions after relocation. This is a
sample of interactions and rendering, not execution of all 2,210 stories.
The fixture-server story and visual-baseline comparisons remain untested for the
reasons below. The owned static preview was left running for the requested test-drive.
## Complete feature index follow-up — 2026-10-12
Source baseline: `88bf4c6c1d222f818faa56257efe79207c892a6c` (merged PR #16049).
Storybook now derives all eight sections, 35 feature families, and 171 capabilities
from the feature map. Each feature has a generated Overview, including the seven
without primary suites. Related example links cross primary homes without copying
stories. Generated guides are separate from the authored catalog and example counts.
The upstream feature map remains unchanged. Deeper authored scenario groups remain
intact; this pass does not establish new production parity.
The built index preserved all 2,210 existing story IDs and the docs ID, adding only
35 feature overviews in map order. Catalog/generator tests (16), token gates, map
checks, both skill validators, workspace typecheck, workspace build, and Storybook
build passed. The UI project passed 8,170 tests in 728 files. The broad local test
run encountered a failure in the unchanged GitHub chat case `authorizes description
edits as the editor, never inheriting the original author's access`; that exact
case passed alone without changing code or expectations. A complete local repository
suite pass is not established. PR #16052 records the final CI result separately.
The local built Storybook passed browser checks for the complete index/sidebar,
capability-ID search, empty search, Goals cross-feature suite links, all five
Execution environments capability gaps, and the existing Questions suite links.
The original `composer-question-flow--editable-initial-text` bookmark still renders.
The CLI feature uses a comma in its sidebar label because Storybook treats `/` as
a folder separator; its guide heading retains the upstream name.
Review fixes retain matching shared foundations during search and validate review
fingerprints after generated files are written. Searching `Primitive Matrix` shows
and opens the existing foundation story. A regression test changes a capability
description and proves regeneration reports the resulting review drift without
updating fingerprints. These checks establish navigation and generation behavior,
not production acceptance or visual-baseline comparison.
## Remaining review work
1. Review the 188 unreviewed suites by capability and production subject. Compare
state transitions, payloads, errors, gates, and reset behavior before promoting
a suite. Start with large route wrappers and shared fixture dependencies.
2. Shared preview mocks can fall through to the original fetch; some route harnesses
return empty arrays for unmatched APIs. These can hide missing fixtures. Audit
affected endpoints per feature rather than treating a render as API coverage.
3. The managed-accounts test-drive story needs the separately owned local API/DB
fixture at port 4310. Its upstream providers are simulated. It was not exercised
against an unknown existing service.
4. Screenshot comparison is blocked: the existing baseline manifest has zero
snapshots and no published archive. Keep using the established Linux baseline
workflow when its baseline is published. Do not bless new baselines as part of
catalog cleanup.
5. Review fingerprints track declared sources, including feature recipes and local
support; they do not traverse every production dependency. Add missing subjects
when a review discovers them. Shared setup changes require reviewing callers.
Use `maintain-storybook` to correct drift and `review-storybook` to record separate
source, render, interaction, visual-comparison, and production evidence. Both skills
consume the feature map; neither changes its upstream contract.
## Native runtime prerequisite: scoped source follow-up — 2026-10-12
Source comparison: `9f59ff36cf2da963709ca19c06ab005510c835a6` against actual
master `4b958ecbd8f33a7782fe6f29ec825f80f636b833`. The reviewed
`maps/feature-map/runs-adapters.md` bytes have SHA-256
`ca5aff86608b7d7987dc0ee814475a7b93e3faff1f99ce090429d2e932b7e16b`.
Twenty-one entries in Runs, harnesses, and model accounts and Task creation and
lifecycle had review-fingerprint drift. Their 117 unique declared sources have
one changed input: the runs-adapters feature recipe. All 21 story files and the
other 116 declared production subjects, wrappers and fixture sources are
unchanged from master. The recipe adds bounded native startup and registration
retirement controls. It separates those provider-free controls from real daemon
and installed-provider proof; it changes no represented UI or fixture contract.
Refreshed only those 21 reviewed fingerprints. No story, fixture, export, stable
ID, title, capability reference or product/implementation/data classification
changed. Existing mixed and unreviewed parity limitations remain. No fixture
correction is needed for this scoped prerequisite; this does not establish full
state parity for the affected suites.
This follow-up is source inspection only. Rendering, play assertions, visual
comparisons and production provider acceptance were not run. Native lifecycle
behavior remains with the linked transport controls and their existing hosted
CI fixtures. Catalog validation proves structure and reviewed dependency hashes,
not that these live journeys passed.
## Task workspace reconciliation — 2026-10-12
Scope: the 26 declared-source entries affected by task-workspace work at
`88b1d3a2`, compared with master `dabb8c5daf`, including subsequent comment-only
cleanup and the fixture corrections below. This is a bounded source review,
not a new review of all Storybook states. Reconciliation onto `b5046ec022`
preserves its new feature folders, sidebar titles and explicit stable IDs, along
with the existing exports, classification and simulation boundaries. Shared GitHub
fixtures now live under `ui/storybook/support/github-bot-management/`.
Twenty-one entries changed only through the expanded chat/workspace recipes.
Their setup, identity, browser, artifact, picker and service examples are retained;
the new recipe requirements do not become covered merely because they reference
the same capability. Five entries also depend on changed production subjects:
| Story file under `ui/storybook/stories/` | Source review and remaining scope |
| --- | --- |
| `chat-channels/chat-management/chat-management.stories.tsx` | Mounted endpoint includes connection/destination defaults. Added the missing selectable-workspace fixture response; existing endpoint PATCH and resource PUT retain defaults. No browser save, error, reload or inheritance proof in this pass. |
| `chat-channels/github-bot-management/management.stories.tsx` | Mounted endpoint/repository editors include defaults. Fixed the endpoint mock to persist PATCH values instead of returning the original endpoint. Resource PUT already distinguishes omitted, null and concrete values. Project/workspace choices are intentionally empty fixtures. |
| `chat-channels/imessage-photon.stories.tsx` | Existing scenarios mount setup/access and simulate task conversations. They do not exercise the newly added settings editor or its workspace-choice request. Kept unreviewed rather than claiming settings coverage. |
| `projects/projects-goals-workspaces.stories.tsx` | Existing project-bound summaries still match the rendered components. New nullable project references and runtime invalidation branches have no projectless story scenario here. |
| `workspaces/workspace-runtime-provisioning.stories.tsx` | The demonstrated status subcomponent is unchanged. Its local context row does not prove the full detail page's new projectless behavior. |
The three endpoint-management entries now declare `ChatExecutionDefaults` and its
API clients as review dependencies. AgentMail settings still demonstrates only
the inbox subsection, not the surrounding endpoint defaults. Historical GitHub
designs remain historical; existing unreviewed entries remain unreviewed. None of
these fixture examples establishes source authorization, retained file privacy,
pending workspace selection, sandbox admission or existing-conversation continuity.
Executed: the GitHub fixture's two Vitest cases passed, including default save,
subsequent GET, omitted-value preservation, explicit null clearing and fresh-mount
reset. After the folder rebase, both fixture tests and all nine catalog checker
tests passed again; token gates passed before the path-only reconciliation. After the final
source freeze, only the 26 reviewed fingerprints were refreshed; catalog validation
passed for all 223 files and all 2,210 source-parsed story IDs were unchanged.
All 223 upstream file paths, explicit stable IDs and sidebar titles were preserved.
Not run in this pass: Storybook build, browser rendering or `play`, screenshot
comparisons, provider calls and live production acceptance. No new visual
baselines were accepted. Fixture tests are boundary simulations, not server
persistence or permission tests.
## Workspace safety recipe follow-up — 2026-10-12
Reviewed the twelve entries that depend on the workspace feature recipe: browser-use activity/footer/page, the three HTML-artifact suites, project execution strategy and project workspace summaries, searchable selection, workspace files, runtime provisioning and service controls. Their production subjects, fixtures, feature folders, sidebar titles and stable IDs are unchanged. The recipe now requires prospective child boundary checks, safe low-trust reopening, and coherent returned checkpoint ancestry. These backend safety contracts are not exercised by those fixtures. Each entry remains unreviewed for full production parity. Only the reviewed recipe fingerprints were refreshed; no browser render, play, screenshot baseline or production acceptance was run for this follow-up.
## Remote provisioning recipe follow-up — 2026-10-13
Reviewed the same twelve workspace-recipe-dependent entries after extending the controller-provisioning boundary to standard-trust sandbox and SSH selections. Their components, fixtures and stable IDs are unchanged. Project strategy stories demonstrate configuration fields with environment selection disabled; runtime provisioning stories demonstrate status values with a no-operation log handler. Browser, artifact, file and service-control fixtures do not execute source scripts or prove admission placement. The new recipe requires controller marker denial independent of source write grants while copying and dispatch remain available, including local copy-only selections, retained deny-only metadata and closed-worktree reopening. Implicit trusted local defaults remain separate positive controls. All twelve entries retain their unreviewed production classification. Refreshed only these recipe fingerprints after this source review; no browser render, play, screenshot, Storybook build or live runtime qualification is claimed.
## Default-source recipe follow-up — 2026-10-13
Reviewed the twelve unchanged workspace recipe subjects and fixtures after correcting implicit default selection. Task creation and controller classification now share configured-policy, primary, creation-time and ID precedence. Explicit choices and retained denial markers still suppress controller hooks. Project strategy fixtures show configuration, while runtime status and file/browser/artifact/service fixtures do not execute source scripts or prove this backend ordering. Refreshed only their reviewed recipe fingerprints and retained all classifications and stable IDs. No browser render, play, screenshot, Storybook build or live runtime acceptance was performed.
## Workspace finalization UI refinement — 2026-10-13
Source base: `f07efa2802`, followed by scoped edits to the production recovery notice and its two story suites. Reviewed `recovery/workspace` and `recovery/source-action`; stable story IDs and administrator admission remain unchanged. The notice leads with saved work, discloses controller metadata, explains evidence/confirmation requirements, and distinguishes queue acknowledgement from completion. A stale controller error preserves the note and clears confirmation so the operator must verify again. The task composition uses viewer identity for human bubbles and omits a routine status badge.
MacOS in-app browser inspection passed for the task journey at desktop and 390px mobile widths: controller disclosure with Enter, evidence without confirmation remaining disabled, explicit confirmation enabling submission, and a simulated queued result in place. The `owner-changed` story's play assertions passed; the friendly error was visible, the note remained, confirmation cleared and the action was disabled. The `long-controller-name` story rendered at 390px without horizontal overflow. The mobile task shell showed its bottom navigation; evidence text computed to 16px and Tab reached the enabled action. No physical mobile keyboard, Linux screenshot baseline, live deployment stop, real API admission or provider copyback acceptance is claimed. Other story states received source review, not a full browser execution pass.
Refreshed the two reviewed catalog entries only. Global catalog validation already reported unrelated source-fingerprint drift before this work; those entries require their own review.
## Automatic workspace recovery revision — 2026-10-13
Supersedes the task shutdown form reviewed above. The production task now renders
only a quiet restoration status or an honest operator-assistance fallback. It
contains no process metadata, evidence field, confirmation checkbox or resume
button. The task thread omits the duplicate technical recovery card. Obsolete
form stories and their simulated API fixture were removed; suite IDs remain
stable. The composed task journey includes a saved state without the notice.
Observed in the macOS in-app browser: automatic status in the production shell,
completed example without the status, retained approval-wait message, and mobile
bottom navigation with equal content and viewport widths (no horizontal overflow).
These are fixture UI observations, not live provider shutdown or task commitment.
The production component test verifies removal on a resolved action update. The
real reconciler's database tests separately preserve accepted-result identity,
monitor and approval waits, and create no new run or wake request.
Only the two reviewed suites have refreshed fingerprints. Global validation has
71 other source-fingerprint errors, including recovery-recipe dependents after
the operator instructions changed. It is not globally green. No unrelated review
fingerprints or visual baselines were accepted.
## Inherited activity, inbox and recovery recipes — 2026-10-12
Source comparison: master `e168512f7bdbb6af6ea01954c6d7ed80b91e903e`
against previous master `f329b24ee12496e710ad17377ec7716e0eee22ef`,
while reconciling the native-runtime prerequisite. All 25 affected catalog
entries are identical to e168 master; their stale fingerprints were inherited.
The 101 unique declared inputs have three changed feature recipes. The remaining 98 inputs, including all 25 story files, are unchanged
between those masters and the merged worktree. They include 92 non-map
story, subject, wrapper and fixture sources and six unchanged map files. The reviewed recipe
bytes have these SHA-256 identities:
- `maps/feature-map/activity.md`: `3867cc392c031cc5ca9ec61bfc4211d685da37e39fb36e9b152497b7cf970caf`.
- `maps/feature-map/inbox-search.md`: `8ff5431ddfe54c0c288eecffb785f864d8bfeb38be50c66615999ffbbfba6863`.
- `maps/feature-map/recovery.md`: `46fee5940f23a6d1483697e0b07817a78d993d4748b51121d2e113dd2a96173b`.
The activity addition names issue-scoped activity authorization and sandbox
bridge controls; company audit/display fixtures do not establish live sandbox
agent access. The inbox recipe excludes automatic historical read cleanup from
user participation while retaining explicit decisions; static inbox/decision
examples do not execute that query or the newly required user/company journey.
The recovery recipe retains native workspace-owner holds across task completion
and repeated reads until exact operator retirement; recovery display fixtures
do not establish ownership, copyback denial, action identity or live operator
recovery. These backend acceptance requirements remain separate gaps.
The proposed maintenance changes only those 25 reviewed dependency fingerprints.
Retain the existing 24 unreviewed and one current classification, simulation
boundaries, story exports, titles and stable IDs. No fixture or story correction
is indicated by this declared-source comparison. This does not promote full
state parity or coverage for the added backend requirements.
Source inspection only: no browser rendering, play, visual baseline, provider
run or live production acceptance was performed for this reconciliation. The
existing catalog checker must run on the actual merged tree after synchronization;
its result verifies structure and declared hashes, not these live journeys.
## 2026-10-13 master merge reconciliation
Reviewed the source delta from `4808adc34e` to merge `63b2e7b8ad`
(master parent `d67e3507b2`). The text conflict in INDEX retained the feature-map
ordering and upstream workspace review notes. Regenerated INDEX after reviewing
61 stale catalog entries against the changed declared sources.
The inspected changes add assignment-history recipient suggestions and preserve
manual selections, expand backend verification recipes, and add channel task
defaults and access avatars with matching fixture changes. Entries record those
limits. The sidebar suite that also mounts IssueDetail is now unreviewed because
its route fixture has not been exercised against the new activity query. Existing
composer examples omit the new optional suggested-assignee prop and retain their
previous scenarios; their classifications do not certify the new behavior.
All 223 authored suites and 2,210 authored story IDs remain. Generated feature
pages still cover 35 areas and 171 capabilities. Catalog/generator tests (16),
catalog validation, map checks and token gates pass. This is source reconciliation,
not a new visual or live production acceptance claim.
## 2026-10-13 capability association reconciliation
Source baseline: `60bc0d5fee9a6e48db08fc016521fee3d9f57d67`.
Reviewed the complete authored inventory and missing-capability lookup, then
inspected the candidate story exports, wrappers, fixture behavior and shipped
subjects. This pass corrects navigation associations; it is not a full parity,
interaction or visual review of all 223 suites.
Added 55 references across 34 suites. Primary-agent suites now use their own
capability instead of organization/reporting. Shared foundations retain their
physical and sidebar home while cross-listing `developer-labs/design` through
an explicit, reasoned Foundations override. No story was moved, renamed or removed.
The parser comparison preserves all 223 files and 2,210 authored story IDs.
The map had three omissions revealed by stories and confirmed in shipped source:
- `agents/primary-agent`: personal choice, confirmation and fallback presentation,
distinct from organization/reporting. The production provider and self-service
API have user/company scope; the story presentation provider simulates changes.
- `companies/decision-models`: connection/model/sponsorship configuration,
bounded testing and history. Settings require board connection management;
history and task-link visibility have separate read policies.
- `companies/fast-responses`: experimental acknowledgement configuration,
tests and history. A receipt does not establish completed agent work.
Added their production recipes and same-ID agent-access companions. Existing
capability IDs remain. Both maps now contain 35 families and 174 capabilities.
New access evidence is source-only; no live provider or agent-access claim.
Confirmed association evidence and limits:
| Existing suites | Added lookup | Demonstrated scope |
| --- | --- | --- |
| Four shared foundation suites | Developer design | Production controls and contributor visual states; no application journey claim. |
| Agent chat | Handoff | Project-created, existing-project, repository and failure results; tool results/navigation simulated. |
| Agent management | Environment assignment | Forced Kubernetes target and missing-target warning; no saved assignment or execution. |
| Team catalog | Installation/configuration | Progress/success results and adapter choices; no real install, account setup or routed catalog. |
| Issue-thread interactions | Plan review/continuation | Approval, stale-revision and accepted-but-resume-failed states; no successful resume or duplicate-suppression proof. |
| New-task composer | Workspace binding | Worktree selection and submitted request values; no execution admission. |
| GitHub skills journey/detail | Policy/versions | Assignment selection and fixture revisions; no runtime enforcement or durable no-op callbacks. |
| Routine webhook/detail | History/audit | Production Runs/Activity with fixture tasks/events; no scheduler or audit-persistence proof. |
| Budget finance | Incidents | Warning/resolved/pending/escalated cards; resolution callbacks are no-ops. |
| Public-MCP setting | Instance configuration | Experimental flag toggles, cloud restrictions and failed-save rollback; no other instance settings. |
| Arcade/Composio/Executor/Zapier setup | Draft recovery, identity, action policy/testing | Production setup/permissions with in-memory drafts; reload loses the draft. |
| Chat management/iMessage Photon | Provider, identity, conversation, lifecycle and setup/failure | Shipped hosts with simulated provider/identity/delivery data. |
| Primary-agent suites and decision/fast-response suites | New map capabilities | Production UI subjects plus simulated preference/provider/result boundaries. |
Eleven previously empty capability lookups now have related examples. With the
three newly mapped capabilities also linked, the absent-example count changes
from 70 of 171 to 59 of 174. This measures catalog links, not complete behavior
coverage. Review classifications were not promoted by this association pass.
Retained gaps and rejected lookalikes:
- Document preview/annotations do not establish version editing/restoration.
- Seeded drafts do not establish task switching, reload or uncertain submission.
- Approval resume failure does not establish durable approval delivery.
- NewToolsAllowed does not establish quarantined-action review.
- Assistant OAuth revocation does not establish gateway token scope/revocation.
- Budget resolution controls with no-op handlers do not establish relief/resumption.
- A closed browser session does not establish workspace closure/reopening.
- Team fixtures and Skill Studio route presence do not establish working installs
or Studio test execution/results.
The gateway-token fixture needs separate review before advertising coverage:
its token data may omit fields read by the production token panel. The missing
lookup remains explicit. Rendering/interaction checks below cover selected
association navigation, not all source-audited suites or production acceptance.
Executed checks: 27 catalog/generator/map tests, catalog and map validation,
token gates, skill validation, repository typecheck/build and Storybook build
passed. The built index has 2,246 entries and loses none of the original 2,211.
In the browser, the developer Design lookup opens the preserved primitive URL;
company-service sections link the existing settings/history/journey suites.
The decision SetupToHistory journey passed its 12 interaction steps and showed
the simulated test receipt in history. Primary-agent ReplacePrimary passed its
four interaction steps and displayed the replacement confirmation. No console
errors were observed in those selected checks. No visual-baseline comparison.
The broad local repository test run was interrupted before completion to merge
new master changes; no full local suite pass is claimed. Fresh CI on the updated
branch supplies repository-wide verification. The merge retains master’s native
REST transport updates alongside the three new capability records; new live
provider and agent-credential verification remains not run.
## Slack DM mention exemption — 2026-10-13
Scoped source review: Slack DMs no longer require an at-mention, while channel
messages and channel thread replies retain the saved mention policy. Top-level
DM replies remain linear. The production `ChatEndpointDetail` settings copy and
the feature-map manual recipe now state this distinction.
The Chat management story mounts that production settings page and merges
endpoint PATCH values in its local fixture. GitHub bot management and Photon
also reference the page, but do not render its Slack-only toggle. No story UI,
fixture behavior, or story identity changed, and no browser proof is claimed.
After rebasing onto master `60bc0d5fee`, the upstream catalog reconciliation
supplies the reviewed baseline for the previously stale entries. Refreshed the
fourteen entries affected by this change: all reference the updated chat recipe,
and three also reference the Slack-only settings copy. Other source bytes and
all classifications, fixture boundaries, story IDs and sidebar titles remain
unchanged from that baseline. Catalog checks validate these references and
fingerprints, not live Slack behavior.
### Current-master reconciliation
Merged master `5e8e992df2`. The newer catalog supplies the baseline associations
and reviews. Compared every declared input against that master: only seven
inputs changed for this feature (recovery recipe, recovery card, task page, quiet
status, two stories and their fixture). Reviewed those changes and the unchanged
subjects/fixtures they affect; refreshed the 26 dependent fingerprints while
retaining their classifications and simulation boundaries. The task-page change
adds the quiet status and suppresses only the owner-unverified duplicate card;
other task variants retain their behavior. The recovery-card change blocks
unsafe generic dismissal. Existing card regressions cover that denial.
Five remaining errors have unchanged source bytes and metadata inherited from
master: shared setup, decision-card, decisions-desk, search and what-needs-me.
These require a separate review; no hashes or visual baselines were accepted for
them. The earlier 71-error count above describes the pre-merge baseline.
### Inherited index metadata follow-up
The current master's personal-toast recipe also left shared setup and four inbox
suites with stale metadata. Reviewed the recipe's added toast capability and
verification limits: decision-card, decisions-desk and search still demonstrate
their existing isolated subjects; what-needs-me's toast fixture does not prove
viewer eligibility. Their subject and fixture bytes are unchanged from master;
retained all unreviewed classifications and fixture boundaries. The generator
adds the missing toast capability and description to the existing inbox feature,
without changing feature order or IDs. Reviewed that generated diff and refreshed
these four entries, the shared setup and Overview fingerprints. No toast behavior,
new browser acceptance or visual baseline is claimed. Global catalog validation
now passes. This supersedes the five inherited-error count above.
### Confirmed recovery status
Reviewed the shipped notice, server evidence contract and both recovery fixtures.
Platform identity alone no longer means work is restoring: the server marks the
exact recovery receipt resuming only after verified stop proof and a successful
owner claim. Missing proof remains operator-required. The new unavailable-proof
story covers a platform-bound receipt without progress; confirmed and queued
stories retain the quiet status. Updated only the two affected fingerprints.
This is component/fixture evidence, not deployed harness acceptance.
### Latest master reconciliation
Retained master’s task-creation visibility scenarios, source-review notes and
unreviewed classifications. Seven overlapping entries differ from master only
in the already reviewed recovery recipe or task-detail recovery notice wiring.
Refreshed those combined-source fingerprints and regenerated the index. No new
creation-visibility acceptance or visual baseline is claimed.
## Verification routes for unassociated capabilities — 2026-10-13
Source classification against merged master `5e8e992df2`: [VERIFICATION.md](VERIFICATION.md)
accounts for all 60 capabilities without non-guide example associations. It
records 49 UI example gaps with separate production contracts, eight CLI/operator
operations and three browser verification boundaries. Existing tests are starting
points; no new live journey, rendering, interaction or visual evidence is claimed.
The targeted association revisit found no further justified links. This does not
complete parity review of the 184 example suites still classified `unreviewed`.
Master includes #16153's personal task-toast capability. Its upstream README and
recipe were inspected; reconstructing the five inbox-suite and shared fingerprints
with the pre-toast recipe bytes matches the stored baseline. No other declared
source changed for those suites. Regeneration adds the capability/description to
the feature index, which also changes the guide fingerprint. Refreshing those
review fingerprints preserves statuses, associations and all 2,212 authored IDs.
Catalog/map checks, 27 catalog/generator/map tests and maintenance-skill validation
passed. The 60-row inventory and all local links were checked against current
source. Repository-wide typecheck/tests/build and Storybook build are not run for
this documentation and generated-data pass; runtime behavior is unchanged.
Review correction: backup retention already has shipped controls in
`InstanceGeneralSettings`, embedded in `CompanySettings`. The backup row therefore
keeps missing retention UI examples alongside separate CLI backup/restore proof;
it is not a wholesale Storybook exemption. No existing story mounts those controls.
## Verification-parent merge reconciliation — 2026-10-13
Reconciled master `da9af67415` while preserving its catalog records and both
review histories. Inspected the intervening recipe changes for Telegram
maintenance, liveness/readiness and trusted instance-secret lifecycle, and the
soft-warning versus hard-stop budget UI. Refreshed only dependent review
fingerprints with notes naming those boundaries; classifications remain unchanged.
The generated feature index reflects the current recipes. No new rendering,
provider journey or whole-suite parity review is claimed. Catalog/map validation
and all 27 catalog/generator/map tests pass with the pinned Storybook parser.
## Production-subject UI gap examples — 2026-10-13
Step 3 adds 37 suites and 257 scenarios associated with the 49 UI capabilities
from [VERIFICATION.md](VERIFICATION.md). Subjects are shipped pages/components;
API replies, sockets, callbacks and storage seeds remain simulated. Source
review uses production snapshot `a9ef9e8ebc1f41bb7047142704655d08b3e47be7`;
the story revision is `36689fc8149c31858d0b4c6f7839ecc663404073` plus the review
corrections in this commit. Catalog fingerprints identify the tested source bytes.
Existing suite classifications and all 2,248 prior built entry IDs are preserved;
the new built index has 2,505 entries. Existing unreviewed suites remain unreviewed.
Executed the focused browser suite against this checkout's static build on macOS
Chromium at 1280 × 900 with reduced motion: **260 checks passed**. Every new story
was exercised: 129 declared play functions passed; the remaining 128 scenarios
have explicit subject-content, skeleton, editable-control or documented fallback
assertions. The only intentionally empty root is the zero-entry durable-response
queue, whose shipped component returns null. Additional checks verified token
fixture reset through sidebar navigation and backup retention at 390 × 844 in
light and dark themes. No browser page errors were observed. The test names
identify each story ID; rerun with the command in VERIFICATION.md. Selected
screenshots are inspection captures, not pinned Linux visual-baseline comparisons.
Review corrections give empty stage settings zero stages and assert its message,
make failed reads return HTTP 500 rather than the service-warmup HTTP 503,
provide Inbox dependencies and actual plugin redirect destinations, use distinct
attachment paths and a valid uncertain-submission UUID, and select Interactions
before play starts so the browser harness does not steal input/menu focus.
Repository typecheck/build, the UI Vitest suite (730 files, 8,208 tests),
four fixture-boundary tests, 27 catalog/generator/map tests, token gates and
Storybook build passed. The full local repository test command could not complete:
embedded PostgreSQL exhausted host shared-memory allocation, and native-runner
tests reported timeouts. No host settings or other jobs were changed.
Production acceptance and pinned Linux visual comparisons were not run. The
scenario inventory retains outstanding recipe variants and real authorization,
persistence and provider contracts. Examples expose existing read-error/loading
fallbacks rather than inventing feedback; those limits are named in VERIFICATION.md.
## Step-3 merge reconciliation — 2026-10-13
Merged current master `da9af67415` through the verification parent. Preserved
upstream story additions, review notes and classifications and all 37 new suites.
Compared changed catalog inputs with the reviewed step-2 snapshot: five feature
recipes, the generated feature index, BudgetIncidentCard/Costs, Inbox and the
recovery notice wiring changed. The two preview-hook lines remain as reviewed.
The new budget fixtures explicitly use hard thresholds; their action labels and
callbacks are retained. Inbox fixtures use human-created tasks; unrelated
automation discovery remains outside their asserted scope. Recovery fixtures use
generic exhaustion/unknown-outcome causes, not the newly gated native-owner path.
Recipe additions concern Telegram maintenance, liveness versus readiness, trusted
instance-secret lifecycle and native copyback verification, which these isolated
UI stories do not establish. Reviewed those differences, refreshed affected
fingerprints with scoped notes, and retained all statuses. No new live acceptance
or rendering evidence is claimed for the merge; the earlier 260-check pass names
its tested revision. Catalog/map validation and 27 targeted tests pass.
## Draft-fixture isolation correction before merge — 2026-10-13
After #16167 merged as `252d9b5077`, retained the step-3 catalog and scenarios
while reconciling its squash-merged verification file. Review found that
`clearDraft` correctly refuses to clear a retained submission without its
matching attempt ID. Story setup/cleanup now passes that ID for the two
Storybook-owned draft keys before reseeding them. Production draft guards are
unchanged. The new same-browser check switches from UncertainSubmission to
Empty, SentClearsDraft and SendFailedKeepsDraft; it asserts the warning disappears
and the expected empty or retained draft is shown, with declared play passing.
All six draft stories plus that switching regression passed (seven browser
checks) on the owned macOS Chromium development preview after cold dependency
optimization. UI typecheck, 16 existing draft-persistence tests and the 27
catalog/generator/map tests passed. No whole-suite browser rerun, production
submission journey or visual-baseline comparison is claimed for this narrow fix.
Static merge verification: Storybook build passed after restoring the checkout's
renderer dependencies. All 2,248 original built IDs remain in the 2,517-entry
index. The 25 budget/inbox/recovery examples affected by upstream source changes,
six draft examples and same-browser reset check passed on the static preview
(32 checks). The reset check uses the sidebar for Empty and reloads send stories
within the same browser/storage context, so it cannot read the prior story's
completed play status while the new play starts. No isolated-context substitute
is used for the retained-submission regression. The unchanged GitHub bot-management
suite also passed locally (34 tests) after its CI assertion failed; a separate
server job reported cancellation. Those CI jobs require a fresh passing run.
## Named play-result assertions — 2026-10-13
Strengthened four review cases: UnavailableCompanyDraft waits for the visible
wizard and an empty agent-name input before rejecting the foreign draft; Probing
asserts a disabled Testing button; FilterNoMatches asserts the filtered empty
message and absence of the seeded run; Delivering asserts the queue's optimistic
removal after clicking a loaded row. The shipped queue returns null while that
delivery remains pending, so this story records the missing visible progress
presentation rather than inventing it. All four browser cases passed on the
owned preview, as did UI typecheck and 27 catalog/generator/map tests.
-172
View File
@@ -1,172 +0,0 @@
# Verification routes for Storybook capabilities
Updated 2026-10-13. Production source is reconciled with master `252d9b5077`; step-3 story and fixture changes are recorded in the catalog fingerprints.
The catalog has 262 authored suites, 2,485 authored story IDs and 175 feature-map capabilities. The 37 new production-subject suites add 257 scenarios and associate all 49 UI capabilities identified in step 2. **11 capabilities remain without authored examples: 8 CLI/operator operations and 3 real-browser concerns.** Generated Overview pages and guides do not count as examples. Existing suites and story IDs are retained. The four retained-file recovery states are preserved alongside the new examples from master `c8efdbfba43`; this inventory update does not claim an additional production verification run.
These associations provide initial isolated UI coverage, not complete parity with every feature recipe. The original scenario inventory below stays as a maintenance checklist; an association does not mark every listed variant complete. In particular, import examples cover preview, organization archival examples cover the list/restoration side, and custom-image examples cover metadata/configuration rather than a real setup terminal. Existing unreviewed suites remain unreviewed.
A story can establish component rendering, fixture shape and asserted interaction. It cannot establish real authentication, permissions, persisted changes, run continuation, provider delivery or installation. **The production journeys listed below have not been run as part of this Storybook pass.** Existing test links identify starting points, not exhaustive or passing production acceptance evidence.
## New example suites
All subjects use shipped components. APIs, socket messages, callbacks and storage seeds are simulated. Review results and source limitations are recorded in the catalog; the focused browser command is:
```sh
pnpm build-storybook
node scripts/serve-storybook-static.mjs --port 6136
# In a second terminal:
pnpm exec playwright test --config tests/storybook-visual/feature-gap-stories.config.ts
```
The static server must be an owned process serving this checkout. Override the browser target with `PAPERCLIP_GAP_STORYBOOK_URL` when using another owned port. The browser suite asserts each non-interactive story's expected content, skeleton or documented fallback and waits for declared play assertions; it also checks reset when switching token and uncertain-draft stories in one browser. This is not the pinned Linux visual-baseline comparison.
| Suite | Capability associations | Scenarios / play functions |
| --- | --- | --- |
| [Getting started and access/Login, invitations, and access/CLI authorization](../../ui/storybook/stories/access/cli-authorization.stories.tsx) | `access/cli-auth` | 9 / 5 |
| [Getting started and access/Login, invitations, and access/Organization membership](../../ui/storybook/stories/access/membership.stories.tsx) | `access/membership` | 7 / 2 |
| [Getting started and access/Login, invitations, and access/Sign in](../../ui/storybook/stories/access/sign-in.stories.tsx) | `access/login` | 6 / 3 |
| [Oversight and operation/Dashboards and audit trails/Execution history](../../ui/storybook/stories/activity/run-audit.stories.tsx) | `activity/runs` | 6 / 4 |
| [Tasks and conversations/Agent conversations and project handoff/Conference Room](../../ui/storybook/stories/agent-chat/conference-room.stories.tsx) | `agent-chat/conference-room` | 5 / 4 |
| [Apps, channels, and extensions/App access and action permissions/Review newly discovered actions](../../ui/storybook/stories/app-permissions/catalog-review.stories.tsx) | `app-permissions/catalog-change` | 7 / 2 |
| [Oversight and operation/Costs and budgets/Resolve a budget incident](../../ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx) | `budgets-costs/resolution` | 10 / 6 |
| [Automation and structured work/Cases/Browse and hierarchy](../../ui/storybook/stories/cases/case-browse.stories.tsx) | `cases/browse` | 5 / 1 |
| [Automation and structured work/Cases/Structure, history and task links](../../ui/storybook/stories/cases/case-detail.stories.tsx) | `cases/structure`, `cases/history`, `cases/task-links` | 8 / 4 |
| [Apps, channels, and extensions/External chat and email/Task-linked files](../../ui/storybook/stories/chat-channels/channel-attachments.stories.tsx) | `chat-channels/attachments` | 5 / 2 |
| [Getting started and access/Companies and portability/Import preview](../../ui/storybook/stories/companies/company-import.stories.tsx) | `companies/portability` | 6 / 5 |
| [Getting started and access/Companies and portability/Selection and archived organizations](../../ui/storybook/stories/companies/company-selection.stories.tsx) | `companies/selection`, `companies/archive` | 7 / 2 |
| [Tasks and conversations/Documents, attachments, and work products/Document revisions](../../ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx) | `documents-artifacts/documents` | 9 / 4 |
| [Projects and execution/Execution environments/Custom images](../../ui/storybook/stories/execution-environments/custom-images.stories.tsx) | `execution-environments/images` | 6 / 3 |
| [Projects and execution/Execution environments/Configuration, capabilities, and probes](../../ui/storybook/stories/execution-environments/environment-states.stories.tsx) | `execution-environments/configuration`, `execution-environments/capabilities`, `execution-environments/probe` | 10 / 4 |
| [Apps, channels, and extensions/Tool gateways and access profiles/Named gateway tokens](../../ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx) | `gateways-profiles/tokens` | 8 / 5 |
| [Projects and execution/Goals and work alignment/Aligned work and navigation](../../ui/storybook/stories/goals/goal-alignment.stories.tsx) | `goals/alignment`, `goals/navigation` | 6 / 2 |
| [Tasks and conversations/Inbox, decisions, and search/Personal task views](../../ui/storybook/stories/inbox-search/inbox-views.stories.tsx) | `inbox-search/views` | 8 / 0 |
| [Tasks and conversations/Inbox, decisions, and search/Personal task notifications](../../ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx) | `inbox-search/toasts` | 4 / 4 |
| [Oversight and operation/Instance operations/Backup retention](../../ui/storybook/stories/instance-operations/backup-retention.stories.tsx) | `instance-operations/backup`, `instance-operations/configuration` | 6 / 6 |
| [Oversight and operation/Navigation, profile, and announcements/Sidebar preferences](../../ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx) | `navigation-preferences/preferences` | 5 / 1 |
| [Getting started and access/Onboarding and first work/Resume a saved draft](../../ui/storybook/stories/onboarding/resume-draft.stories.tsx) | `onboarding/resume` | 4 / 3 |
| [Automation and structured work/Pipelines, review queues, and learnings/Learnings](../../ui/storybook/stories/pipelines/learnings.stories.tsx) | `pipelines/learnings` | 5 / 1 |
| [Automation and structured work/Pipelines, review queues, and learnings/Items](../../ui/storybook/stories/pipelines/pipeline-board.stories.tsx) | `pipelines/items` | 5 / 1 |
| [Automation and structured work/Pipelines, review queues, and learnings/Review queue](../../ui/storybook/stories/pipelines/review-queue.stories.tsx) | `pipelines/review` | 7 / 3 |
| [Automation and structured work/Pipelines, review queues, and learnings/Stage settings](../../ui/storybook/stories/pipelines/stage-settings.stories.tsx) | `pipelines/stages` | 5 / 2 |
| [Apps, channels, and extensions/Plugins/Configuration](../../ui/storybook/stories/plugins/plugin-configuration.stories.tsx) | `plugins/configuration` | 6 / 3 |
| [Apps, channels, and extensions/Plugins/Contributed routes](../../ui/storybook/stories/plugins/plugin-contributions.stories.tsx) | `plugins/contributions` | 4 / 1 |
| [Apps, channels, and extensions/Plugins/Installation and lifecycle](../../ui/storybook/stories/plugins/plugin-management.stories.tsx) | `plugins/installation`, `plugins/lifecycle` | 10 / 5 |
| [Projects and execution/Recovery/Exhaustion and user decisions](../../ui/storybook/stories/recovery/recovery-gap-states.stories.tsx) | `recovery/exhaustion`, `recovery/unknown-outcome` | 7 / 7 |
| [Automation and structured work/Routines, schedules, and triggers/Run now](../../ui/storybook/stories/routines/run-now.stories.tsx) | `routines/run-now` | 8 / 4 |
| [Apps, channels, and extensions/Secrets and proposals/Proposal review](../../ui/storybook/stories/secrets/proposal-review.stories.tsx) | `secrets/proposals` | 7 / 3 |
| [Agents and reusable capabilities/Skills and Skill Studio/Test runs](../../ui/storybook/stories/skills/skill-test-runs.stories.tsx) | `skills/testing` | 9 / 1 |
| [Automation and structured work/Status cards/Authoring, updates and archive](../../ui/storybook/stories/status-cards/status-card-states.stories.tsx) | `status-cards/authoring`, `status-cards/generation`, `status-cards/inspection`, `status-cards/archive` | 17 / 10 |
| [Tasks and conversations/Steering and queued messages/Draft recovery](../../ui/storybook/stories/steering/composer-draft-recovery.stories.tsx) | `steering/drafts` | 6 / 3 |
| [Tasks and conversations/Steering and queued messages/Accepted response delivery](../../ui/storybook/stories/steering/durable-response-queue.stories.tsx) | `steering/approval-queue`, `recovery/user-continuation` | 7 / 6 |
| [Projects and execution/Workspaces, services, and files/Close readiness](../../ui/storybook/stories/workspaces/workspace-close.stories.tsx) | `workspaces/closure` | 7 / 7 |
## Production UI limitations exposed
- Plugin contribution discovery errors remain on “Loading…”. The named DiscoveryFailure story exposes this shipped behavior; it does not claim a useful failure state.
- The document section and execution-environment list lack dedicated read-error/loading presentation. Cases and Inbox also fall back to empty views after list errors. Their stories retain the real fallback behavior. Custom-image metadata has its own loading and error states.
- GoalDetail displays aligned projects and children. The current UI has no project goal-assignment control. The stories do not invent one.
- Accepted queued responses disappear optimistically while delivery is pending; the shipped component has no separate visible progress indicator. The Delivering story asserts this presentation.
- Conference Room maps a denied stream to its generic assistant-unavailable message. Real permission enforcement belongs to the separate route verification.
## UI scenarios and separate production contracts
These 49 capabilities now have initial shipped-component examples. Keep the requested scenarios below as the target for continued maintenance. Loading, empty, failure, permission and successful states are appropriate only when the production subject supports them. The separate production contracts remain required.
| Capability | UI scenarios to maintain | Separate production evidence | Source and existing test starting points |
| --- | --- | --- | --- |
| [`onboarding/resume`](../feature-map/onboarding.md) | Restored incomplete wizard; invalid or unauthorized saved company; temporarily withheld draft; account switch; storage failure. | Reload company-prefixed onboarding without duplicating company; restore only authorized account/company draft and retain input after recoverable loading failure. | Source: [OnboardingWizard.tsx](../../ui/src/components/OnboardingWizard.tsx), [onboarding-state.ts](../../ui/src/lib/onboarding-state.ts). Tests: [OnboardingWizard.test.tsx](../../ui/src/components/OnboardingWizard.test.tsx), [onboarding-state.test.ts](../../ui/src/lib/onboarding-state.test.ts), [onboarding.spec.ts](../../tests/e2e/onboarding.spec.ts) |
| [`access/login`](../feature-map/access.md) | Sign-in form, pending and invalid credentials, deployment-mode claim gate, expired claim. | Authenticate and reload company deep link; sign out and confirm session enforcement; reject invalid bootstrap claim. | Source: [Auth.tsx](../../ui/src/pages/Auth.tsx), [BoardClaim.tsx](../../ui/src/pages/BoardClaim.tsx), [board-claim.ts](../../server/src/board-claim.ts). Tests: [Auth.test.tsx](../../ui/src/pages/Auth.test.tsx), [auth-session-route.test.ts](../../server/src/__tests__/auth-session-route.test.ts), [board-claim.test.ts](../../server/src/__tests__/board-claim.test.ts) |
| [`access/membership`](../feature-map/access.md) | Member and join-request lists; editable versus read-only roles; pending change, rejected request, revoked invite. | Persist role/membership changes; enforce actual actor authority, invite replay/expiry and cross-company denial. | Source: [CompanyAccess.tsx](../../ui/src/pages/CompanyAccess.tsx), [authz.ts](../../server/src/routes/authz.ts). Tests: [CompanyAccess.test.tsx](../../ui/src/pages/CompanyAccess.test.tsx), [invite-accept-replay.test.ts](../../server/src/__tests__/invite-accept-replay.test.ts), [multi-user-authenticated.spec.ts](../../tests/e2e/multi-user-authenticated.spec.ts) |
| [`access/cli-auth`](../feature-map/access.md) | CLI authorization approval, pending, expired/denied and already-authorized states. | Authorize intended CLI identity/context, make scoped request, revoke current server token and retry same bearer; logout alone is insufficient. | Source: [CliAuth.tsx](../../ui/src/pages/CliAuth.tsx). Tests: [cli-auth-routes.test.ts](../../server/src/__tests__/cli-auth-routes.test.ts), [board-auth.test.ts](../../cli/src/__tests__/board-auth.test.ts), [token.test.ts](../../cli/src/__tests__/token.test.ts) |
| [`companies/selection`](../feature-map/companies.md) | Company list/create/switcher; empty, loading, error, unavailable company and switched navigation. | Switch and reload between companies; verify tasks/agents/cache/routes remain scoped and unauthorized company requests fail. | Source: [Companies.tsx](../../ui/src/pages/Companies.tsx), [CompanySwitcher.tsx](../../ui/src/components/CompanySwitcher.tsx), [CompanyContext.tsx](../../ui/src/context/CompanyContext.tsx). Tests: [Companies.test.tsx](../../ui/src/pages/Companies.test.tsx), [CompanyContext.test.tsx](../../ui/src/context/CompanyContext.test.tsx), [companies-route-cross-company-authz.test.ts](../../server/src/__tests__/companies-route-cross-company-authz.test.ts) |
| [`companies/archive`](../feature-map/companies.md) | Archive confirmation, pending/error and departure navigation; archived list entry and Unarchive action. | Archive eligible agents/runs without deleting history; restoration handles archival-specific pause and navigates to correct company. | Source: [CompanySettings.tsx](../../ui/src/pages/CompanySettings.tsx), [Companies.tsx](../../ui/src/pages/Companies.tsx), [companies.ts](../../ui/src/api/companies.ts). Tests: [CompanySettingsArchive.test.tsx](../../ui/src/pages/CompanySettingsArchive.test.tsx), [Companies.test.tsx](../../ui/src/pages/Companies.test.tsx), [companies-service.test.ts](../../server/src/__tests__/companies-service.test.ts) |
| [`companies/portability`](../feature-map/companies.md) | Import/export preview, conflict choice, warnings, async progress/failure/success and restricted managed deployment. | Apply real small package to disposable target; inspect counts/references/conflicts, source immutability and credential exclusions; imported task requires separate runnable-account proof. | Source: [CompanyImport.tsx](../../ui/src/pages/CompanyImport.tsx), [CompanyExport.tsx](../../ui/src/pages/CompanyExport.tsx), [companies.ts](../../ui/src/api/companies.ts). Tests: [CompanyImport.test.tsx](../../ui/src/pages/CompanyImport.test.tsx), [CompanyExport.test.tsx](../../ui/src/pages/CompanyExport.test.tsx), [company-portability-routes.test.ts](../../server/src/__tests__/company-portability-routes.test.ts), [company-import-export-e2e.test.ts](../../cli/src/__tests__/company-import-export-e2e.test.ts) |
| [`inbox-search/views`](../feature-map/inbox-search.md) | Mine/Recent/Unread/Blocked and broader task views; combined versus standalone host; loading/empty/error/filter states. | Use persisted personal participation/read data; verify scoped counts and list navigation/reload; automatic read cleanup must not create Mine membership. | Source: [Inbox.tsx](../../ui/src/pages/Inbox.tsx), [Issues.tsx](../../ui/src/pages/Issues.tsx). Tests: [Inbox.test.tsx](../../ui/src/pages/Inbox.test.tsx), [Issues.test.tsx](../../ui/src/pages/Issues.test.tsx), [issues-service.test.ts](../../server/src/__tests__/issues-service.test.ts) |
| [`inbox-search/toasts`](../feature-map/inbox-search.md) | Eligible live task toast, explicit mention, quiet unrelated event, own-action/visible-task suppression, dedupe and company/account switch. | Persisted participation and mentions determine per-viewer socket eligibility; quiet events still refresh caches; reload retains eligibility, unauthorized resources remain denied. | Source: [ToastViewport.tsx](../../ui/src/components/ToastViewport.tsx), [ToastContext.tsx](../../ui/src/context/ToastContext.tsx), [LiveUpdatesProvider.tsx](../../ui/src/context/LiveUpdatesProvider.tsx), [task-toast-eligibility.ts](../../server/src/realtime/task-toast-eligibility.ts). Tests: [ToastContext.test.tsx](../../ui/src/context/ToastContext.test.tsx), [ToastViewport.test.tsx](../../ui/src/components/ToastViewport.test.tsx), [LiveUpdatesProvider.hook.test.tsx](../../ui/src/context/LiveUpdatesProvider.hook.test.tsx), [task-toast-eligibility.test.ts](../../server/src/__tests__/task-toast-eligibility.test.ts), [live-events-toast.test.ts](../../server/src/__tests__/live-events-toast.test.ts), [multi-user-authenticated.spec.ts](../../tests/e2e/multi-user-authenticated.spec.ts) |
| [`agent-chat/conference-room`](../feature-map/agent-chat.md) | Conference-room flag disabled, empty/history/reply, busy and explicit failure states. | Exercise separate BoardChat route gate, local-trusted deployment and authenticated Claude CLI; send/reload real conversation with responding agent attribution. | Source: [BoardChat.tsx](../../ui/src/pages/BoardChat.tsx), [board-chat.ts](../../server/src/routes/board-chat.ts). Tests: [BoardChat.test.tsx](../../ui/src/pages/BoardChat.test.tsx), [board-chat-route-feature-flag.test.ts](../../server/src/__tests__/board-chat-route-feature-flag.test.ts) |
| [`steering/drafts`](../feature-map/steering.md) | Task-keyed restored draft and attachment receipts; task switch/reload, failed send and uncertain-save recovery. | Retain correct task draft across navigation and reload; inspect authoritative saved receipt before claiming delivery; do not clear storage on every harness mount. | Source: [TaskChatComposer.tsx](../../ui/src/components/task-chat/TaskChatComposer.tsx), [composer-draft.ts](../../ui/src/lib/composer-draft.ts). Tests: [TaskChatComposer.test.tsx](../../ui/src/components/task-chat/TaskChatComposer.test.tsx), [issue-queued-comments-routes.test.ts](../../server/src/__tests__/issue-queued-comments-routes.test.ts) |
| [`steering/approval-queue`](../feature-map/steering.md) | Answered question/accepted approval delivery waiting, eligible steer/interrupt, failed delivery and fresh-session-only approval. | Keep response delivery durable and distinct from editable comments; coalesce once, enforce fresh-session restrictions and deduplicate concurrent/retried continuation. | Source: [TaskChatQueuedMessages.tsx](../../ui/src/components/task-chat/TaskChatQueuedMessages.tsx), [question-response-delivery.ts](../../server/src/services/question-response-delivery.ts). Tests: [TaskChatQueuedMessages.test.tsx](../../ui/src/components/task-chat/TaskChatQueuedMessages.test.tsx), [question-response-delivery.test.ts](../../server/src/__tests__/question-response-delivery.test.ts), [issue-queued-comments-routes.test.ts](../../server/src/__tests__/issue-queued-comments-routes.test.ts) |
| [`documents-artifacts/documents`](../feature-map/documents-artifacts.md) | Writable/read-only document, save pending/failure/conflict, revision history/historical preview and restore confirmation. | Persist edited body and reload; append-only restore creates new revision; reject stale writes and inaccessible company/task. | Source: [IssueDocumentsSection.tsx](../../ui/src/components/IssueDocumentsSection.tsx), [TaskDocumentPanel.tsx](../../ui/src/components/task-side-panel/TaskDocumentPanel.tsx), [documents.ts](../../server/src/services/documents.ts). Tests: [IssueDocumentsSection.test.tsx](../../ui/src/components/IssueDocumentsSection.test.tsx), [document-revisions.test.ts](../../ui/src/lib/document-revisions.test.ts), [documents-service.test.ts](../../server/src/__tests__/documents-service.test.ts), [issue-document-restore-routes.test.ts](../../server/src/__tests__/issue-document-restore-routes.test.ts) |
| [`skills/testing`](../feature-map/skills.md) | Studio test inputs/configuration, running, question/approval, result and failed test states. | Run bounded test of actual saved version with correct selected account/environment; inspect persisted test detail and eligible interaction response. | Source: [SkillStudio.tsx](../../ui/src/pages/SkillStudio.tsx), [companySkills.ts](../../ui/src/api/companySkills.ts). Tests: [SkillStudio.test.tsx](../../ui/src/pages/SkillStudio.test.tsx), [company-skill-test-runs-service.test.ts](../../server/src/__tests__/company-skill-test-runs-service.test.ts) |
| [`goals/alignment`](../feature-map/goals.md) | Project/task goal selection, explicit/inherited context and invalid association error. | Persist same-company valid association, reject invalid/cross-company reference, verify explicit versus inherited server context after reload. | Source: [ProjectProperties.tsx](../../ui/src/components/ProjectProperties.tsx), [GoalDetail.tsx](../../ui/src/pages/GoalDetail.tsx). Tests: [project-goal-validation.test.ts](../../server/src/__tests__/project-goal-validation.test.ts), [issues-goal-context-routes.test.ts](../../server/src/__tests__/issues-goal-context-routes.test.ts), [issue-goal-fallback.test.ts](../../server/src/__tests__/issue-goal-fallback.test.ts), [project-goal.test.ts](../../cli/src/__tests__/project-goal.test.ts) |
| [`goals/navigation`](../feature-map/goals.md) | Parent/child goal and project/task context links, empty/unavailable context and permitted destination. | Follow actual goal/project/task records and compare explicit versus inherited context; ensure reload and inaccessible destination behavior. | Source: [GoalDetail.tsx](../../ui/src/pages/GoalDetail.tsx), [GoalProperties.tsx](../../ui/src/components/GoalProperties.tsx). Tests: [GoalDetail.test.tsx](../../ui/src/pages/GoalDetail.test.tsx), [issues-goal-context-routes.test.ts](../../server/src/__tests__/issues-goal-context-routes.test.ts), [issue-goal-fallback.test.ts](../../server/src/__tests__/issue-goal-fallback.test.ts) |
| [`workspaces/closure`](../feature-map/workspaces.md) | Close-readiness checks, pending changes/active runs, blocked/pending/error close, retry close and eligible reopening. | Confirm owned workspace shutdown, preserved files/Git state and permitted lifecycle transition/reopening; Browser Use session closure is unrelated. | Source: [ExecutionWorkspaceDetail.tsx](../../ui/src/pages/ExecutionWorkspaceDetail.tsx), [ExecutionWorkspaceCloseDialog.tsx](../../ui/src/components/ExecutionWorkspaceCloseDialog.tsx), [execution-workspaces.ts](../../server/src/routes/execution-workspaces.ts). Tests: [execution-workspaces-routes.test.ts](../../server/src/__tests__/execution-workspaces-routes.test.ts), [execution-workspaces-service.test.ts](../../server/src/__tests__/execution-workspaces-service.test.ts), [execution-workspace-reopen.test.ts](../../server/src/__tests__/execution-workspace-reopen.test.ts) |
| [`execution-environments/configuration`](../feature-map/execution-environments.md) | Local/SSH/sandbox editors; unavailable providers, missing credentials, save pending/error and restricted operator. | Persist target configuration and enforce instance-admin/local-operator mutation boundary; target catalog is instance-scoped. | Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environments.ts](../../server/src/routes/environments.ts). Tests: [CompanyEnvironments.test.tsx](../../ui/src/pages/CompanyEnvironments.test.tsx), [environment-service.test.ts](../../server/src/__tests__/environment-service.test.ts) |
| [`execution-environments/capabilities`](../feature-map/execution-environments.md) | Supported versus unavailable driver/provider controls and interactive-setup/template-capture limitations. | Verify advertised driver/plugin capabilities match operations; unavailable provider cannot become working target; capability discovery must not allocate sandbox. | Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environments.ts](../../ui/src/api/environments.ts). Tests: [environment-capability-contract.test.ts](../../server/src/__tests__/environment-capability-contract.test.ts), [environment-execution-target-capabilities.test.ts](../../server/src/__tests__/environment-execution-target-capabilities.test.ts), [plugin-environment-driver-sandbox-capabilities.test.ts](../../server/src/__tests__/plugin-environment-driver-sandbox-capabilities.test.ts) |
| [`execution-environments/probe`](../feature-map/execution-environments.md) | Remote Test pending, success, reachability/auth failure and platform qualification absent/invalidated notice. | Probe actual owned target; verify selected saved immutable config/image/company qualification plus lease cleanup; local API probe proves host/cwd only and has no UI Test button. | Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environment-probe.ts](../../server/src/services/environment-probe.ts). Tests: [CompanyEnvironments.test.tsx](../../ui/src/pages/CompanyEnvironments.test.tsx), [environment-probe.test.ts](../../server/src/__tests__/environment-probe.test.ts), [environment-live-ssh.test.ts](../../server/src/__tests__/environment-live-ssh.test.ts) |
| [`execution-environments/images`](../feature-map/execution-environments.md) | Custom-image setup/capture/progress, terminal connect/disconnect/failure, unsupported capability and active-image drift. | Execute owned provider setup/capture/probe/terminal transport with correct saved image identity, authority, cleanup and shutdown; terminal screenshot cannot prove operation. | Source: [CompanyEnvironments.tsx](../../ui/src/pages/CompanyEnvironments.tsx), [environment-custom-images.ts](../../server/src/services/environment-custom-images.ts). Tests: [CompanyEnvironments.test.tsx](../../ui/src/pages/CompanyEnvironments.test.tsx), [environment-custom-images-service.test.ts](../../server/src/__tests__/environment-custom-images-service.test.ts) |
| [`recovery/exhaustion`](../feature-map/recovery.md) | Exhausted/overdue attempts, operator retry pending/error, blocked authority/gate and specific escalation. | Inspect durable attempt bounds and actual eligible retry/repair; acknowledgment alone does not prove continued execution. | Source: [IssueRecoveryActionCard.tsx](../../ui/src/components/IssueRecoveryActionCard.tsx), [DispositionRecoveryNotice.tsx](../../ui/src/components/DispositionRecoveryNotice.tsx), [issue-recovery-actions.ts](../../server/src/services/issue-recovery-actions.ts). Tests: [IssueRecoveryActionCard.test.tsx](../../ui/src/components/IssueRecoveryActionCard.test.tsx), [DispositionRecoveryNotice.test.tsx](../../ui/src/components/DispositionRecoveryNotice.test.tsx), [issue-recovery-actions.test.ts](../../server/src/__tests__/issue-recovery-actions.test.ts), [recovery.spec.ts](../../tests/e2e/execution-recovery/recovery.spec.ts) |
| [`recovery/unknown-outcome`](../feature-map/recovery.md) | Uncertain external outcome, required inspection/evidence and explicit permitted operator decision. | Corroborate provider outcome before authorization; enforce no automatic external side-effect replay and reject stale/unauthorized decisions. | Source: [IssueRecoveryActionCard.tsx](../../ui/src/components/IssueRecoveryActionCard.tsx), [issue-recovery-actions.ts](../../server/src/services/issue-recovery-actions.ts). Tests: [IssueRecoveryActionCard.test.tsx](../../ui/src/components/IssueRecoveryActionCard.test.tsx), [issue-recovery-actions.test.ts](../../server/src/__tests__/issue-recovery-actions.test.ts), [recovery.spec.ts](../../tests/e2e/execution-recovery/recovery.spec.ts) |
| [`recovery/user-continuation`](../feature-map/recovery.md) | Saved follow-up waiting on stop cleanup, pause/budget gate, one eligible continuation and result/failure. | Confirm previous execution stopped before delivery, preserve message, avoid duplicate wakes and honor actual task/ancestor/budget gate in separate legacy/native paths. | Source: [TaskChatQueuedMessages.tsx](../../ui/src/components/task-chat/TaskChatQueuedMessages.tsx), [legacy-continuation.ts](../../server/src/services/recovery/legacy-continuation.ts), [native-restart-recovery.ts](../../server/src/services/native-runtime/native-restart-recovery.ts). Tests: [legacy-continuation.test.ts](../../server/src/services/recovery/legacy-continuation.test.ts), [native-restart-recovery.test.ts](../../server/src/services/native-runtime/native-restart-recovery.test.ts), [issue-queued-comments-routes.test.ts](../../server/src/__tests__/issue-queued-comments-routes.test.ts), [legacy-failure-continuation.spec.ts](../../tests/e2e/legacy-failure-continuation.spec.ts) |
| [`app-permissions/catalog-change`](../feature-map/app-permissions.md) | Mount PermissionsPanel/AppDetail with quarantined actions, selection/review, refresh pending, empty and failed discovery states. Existing auto-allowed NewToolsAllowed examples are not quarantine review. | Exercise catalog refresh and new-tool review with permitted/denied actors; unreviewed actions stay quarantined, prior Off/Ask choices survive refresh, and approved review persists. | Source: [PermissionsPanel.tsx](../../ui/src/pages/apps/app-detail/PermissionsPanel.tsx), [AppDetail.tsx](../../ui/src/pages/apps/AppDetail.tsx), [tool-access.ts](../../server/src/routes/tool-access.ts). Tests: [AppDetail.test.tsx](../../ui/src/pages/apps/AppDetail.test.tsx), [tool-access-service.test.ts](../../server/src/__tests__/tool-access-service.test.ts), [tool-access-policy-service.test.ts](../../server/src/__tests__/tool-access-policy-service.test.ts) |
| [`chat-channels/attachments`](../feature-map/chat-channels.md) | Mount TaskChatBubble attachments and ChatEndpointDetail provider-specific consent/upload/delivery failure and unknown-outcome states. Local email attachment dialog remains a prototype. | Transfer a disposable supported file through each affected provider; verify recipient delivery, read scope, duplicate/replay handling and failure/unknown state without treating notification as file-upload proof. | Source: [TaskChatBubble.tsx](../../ui/src/components/task-chat/TaskChatBubble.tsx), [ChatEndpointDetail.tsx](../../ui/src/pages/apps/chat/ChatEndpointDetail.tsx), [chatEndpoints.ts](../../ui/src/api/chatEndpoints.ts), [chat-channels.ts](../../server/src/routes/chat-channels.ts). Tests: [TaskChatBubble.test.tsx](../../ui/src/components/task-chat/TaskChatBubble.test.tsx), [task-chat-attachments.test.ts](../../ui/src/components/task-chat/task-chat-attachments.test.ts), [chat-channels.integration.test.ts](../../server/src/__tests__/chat-channels.integration.test.ts), [issue-attachment-routes.test.ts](../../server/src/__tests__/issue-attachment-routes.test.ts) |
| [`gateways-profiles/tokens`](../feature-map/gateways-profiles.md) | Mount current TokensPanel with issue controls, once-only token reveal, expiry/actions, revocation confirmation and failures. Old GatewaysTab fixtures and assistant OAuth revocation are insufficient. | Issue bounded token via POST /tool-gateway/gateways/{id}/tokens; call allowed and excluded tools; revoke via /tool-gateway/gateway-tokens/{id}/revoke and verify denial using same client. | Source: [TokensPanel.tsx](../../ui/src/pages/apps/gateways/panels/TokensPanel.tsx), [tool-gateway.ts](../../server/src/routes/tool-gateway.ts), [tools.ts](../../ui/src/api/tools.ts). Tests: [TokensPanel.test.tsx](../../ui/src/pages/apps/gateways/panels/TokensPanel.test.tsx), [tool-gateway-service.test.ts](../../server/src/__tests__/tool-gateway-service.test.ts), [tool-gateway.test.ts](../../server/src/__tests__/tool-gateway.test.ts) |
| [`secrets/proposals`](../feature-map/secrets.md) | Mount ProposalsTab pending secret/binding proposals, blocked authority, expired/resolved proposal, approval/rejection pending/error, and redacted metadata. | GET /companies/{id}/secret-proposals and POST approve/reject must enforce company/admin/target authority, durable resolution and redaction; verified run-bound agent proposal creation is separate. | Source: [ProposalsTab.tsx](../../ui/src/pages/secrets/ProposalsTab.tsx), [secrets.ts](../../server/src/routes/secrets.ts), [secret-proposal-authorization.ts](../../server/src/services/secret-proposal-authorization.ts). Tests: [ProposalsTab.render.test.tsx](../../ui/src/pages/secrets/ProposalsTab.render.test.tsx), [secret-proposals-routes.test.ts](../../server/src/__tests__/secret-proposals-routes.test.ts) |
| [`plugins/installation`](../feature-map/plugins.md) | Mount PluginManager trusted package and bundled-local choices, pending install, validation/recoverable error and installed status. | POST /plugins/install on a disposable package; enforce instance install authority, trusted path/package validation and correct version. Package and local install are distinct. | Source: [PluginManager.tsx](../../ui/src/pages/PluginManager.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-install-guard.ts](../../server/src/services/plugin-install-guard.ts). Tests: [plugin-install-route-security.test.ts](../../server/src/__tests__/plugin-install-route-security.test.ts), [plugin-install-autobuild.test.ts](../../server/src/__tests__/plugin-install-autobuild.test.ts), [plugin-routes-authz.test.ts](../../server/src/__tests__/plugin-routes-authz.test.ts) |
| [`plugins/configuration`](../feature-map/plugins.md) | Mount PluginSettings valid/invalid schema inputs, saved configuration, pending/failure and unavailable plugin. | GET/POST /plugins/{id}/config and POST config/test must preserve validation/company scope and deliver saved config to real plugin worker/startup. | Source: [PluginSettings.tsx](../../ui/src/pages/PluginSettings.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-config-validator.ts](../../server/src/services/plugin-config-validator.ts). Tests: [PluginSettings.test.tsx](../../ui/src/pages/PluginSettings.test.tsx), [plugin-config-startup-delivery.test.ts](../../server/src/__tests__/plugin-config-startup-delivery.test.ts), [plugin-routes-authz.test.ts](../../server/src/__tests__/plugin-routes-authz.test.ts) |
| [`plugins/contributions`](../feature-map/plugins.md) | Mount PluginPage and CompanySettingsPluginPage contributed routes/tabs, loading, missing/unavailable plugin and action failures with a known fixture plugin. | Serve real static plugin UI; enforce bridge data/action host capabilities and company boundaries; exercise a harmless action and cold deep link. | Source: [PluginPage.tsx](../../ui/src/pages/PluginPage.tsx), [CompanySettingsPluginPage.tsx](../../ui/src/pages/CompanySettingsPluginPage.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-ui-static.ts](../../server/src/routes/plugin-ui-static.ts). Tests: [PluginPage.test.tsx](../../ui/src/pages/PluginPage.test.tsx), [CompanySettingsPluginPage.test.tsx](../../ui/src/pages/CompanySettingsPluginPage.test.tsx), [plugin-ui-static.test.ts](../../server/src/__tests__/plugin-ui-static.test.ts), [plugin-tenant-isolation.test.ts](../../server/src/__tests__/plugin-tenant-isolation.test.ts) |
| [`plugins/lifecycle`](../feature-map/plugins.md) | Mount PluginManager active/disabled/uninstall/upgrade pending and failures; distinguish operator controls from developer watcher reload. | POST enable/disable and DELETE /plugins/{id} must stop worker/tool/managed-resource activity and clean owned resources; verify disposable restart/uninstall and developer watcher separately. | Source: [PluginManager.tsx](../../ui/src/pages/PluginManager.tsx), [plugins.ts](../../server/src/routes/plugins.ts), [plugin-lifecycle.ts](../../server/src/services/plugin-lifecycle.ts), [plugin-dev-watcher.ts](../../server/src/services/plugin-dev-watcher.ts). Tests: [plugin-lifecycle-restart.test.ts](../../server/src/__tests__/plugin-lifecycle-restart.test.ts), [plugin-routes-authz.test.ts](../../server/src/__tests__/plugin-routes-authz.test.ts), [plugin-dev-watcher.test.ts](../../server/src/__tests__/plugin-dev-watcher.test.ts) |
| [`routines/run-now`](../feature-map/routines.md) | Mount RoutineRunVariablesDialog through actual RoutineDetail with required/default inputs, project/workspace overrides, pending, blocked and failed submission. RunButton-only no-op examples do not supply/run inputs. | POST /routines/{id}/run must validate variables, create one attributed execution/task and obey pause/access/budget gates; inspect actual task outcome separately. | Source: [RoutineRunVariablesDialog.tsx](../../ui/src/components/RoutineRunVariablesDialog.tsx), [RoutineDetail.tsx](../../ui/src/pages/RoutineDetail.tsx), [routines.ts](../../server/src/routes/routines.ts). Tests: [RoutineRunVariablesDialog.test.tsx](../../ui/src/components/RoutineRunVariablesDialog.test.tsx), [routines-service.test.ts](../../server/src/__tests__/routines-service.test.ts), [routines-e2e.test.ts](../../server/src/__tests__/routines-e2e.test.ts) |
| [`pipelines/stages`](../feature-map/pipelines.md) | Mount PipelineSettings ordered stages, automation assignees/env, invalid transitions, unsaved state, saving and failed save. | POST/PATCH stages and PUT /pipelines/{id}/transitions must persist valid order/configuration, enforce ownership and reject invalid transitions; actual automation execution remains separate. | Source: [PipelineSettings.tsx](../../ui/src/pages/PipelineSettings.tsx), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [PipelineSettings.test.ts](../../ui/src/pages/PipelineSettings.test.ts), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts) |
| [`pipelines/items`](../feature-map/pipelines.md) | Mount Pipelines/PipelineItemDetailView board grouping, item creation/details, stage/health/work references, empty/loading and failed transition. | GET/POST /pipelines/{id}/cases and POST /cases/{id}/transition must maintain company scope, valid stage changes and linked work; fixture stage state does not prove automation. | Source: [Pipelines.tsx](../../ui/src/pages/Pipelines.tsx), [PipelineWorkReferences.tsx](../../ui/src/components/PipelineWorkReferences.tsx), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [Pipelines.test.tsx](../../ui/src/pages/Pipelines.test.tsx), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts), [pipelines-tutorial-flow.spec.ts](../../tests/e2e/pipelines-tutorial-flow.spec.ts) |
| [`pipelines/review`](../feature-map/pipelines.md) | Mount ReviewQueue and item review pending output/revision, accept/reject/request-changes, bulk selection, stale/conflicting submission and errors. | POST /cases/{id}/review and /companies/{id}/review-cases/bulk must authorize reviewer, persist correct outcome/transition and reject stale or invalid input. | Source: [Pipelines.tsx](../../ui/src/pages/Pipelines.tsx), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [Pipelines.test.tsx](../../ui/src/pages/Pipelines.test.tsx), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts), [pipelines-tutorial-flow.spec.ts](../../tests/e2e/pipelines-tutorial-flow.spec.ts) |
| [`pipelines/learnings`](../feature-map/pipelines.md) | Mount actual Learnings export with filtered case events, review/forced-move entries, source links, empty/loading/error. This is event history, not a separately authored learning-record system. | GET /companies/{id}/case-events in pipelines routes needs existing company/access contract tests; a rendered event cannot establish learning quality. | Source: [Pipelines.tsx](../../ui/src/pages/Pipelines.tsx), [pipeline-learnings.ts](../../ui/src/lib/pipeline-learnings.ts), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [Pipelines.test.tsx](../../ui/src/pages/Pipelines.test.tsx), [pipelines-routes.test.ts](../../server/src/__tests__/pipelines-routes.test.ts), [pipelines-service.test.ts](../../server/src/__tests__/pipelines-service.test.ts) |
| [`cases/browse`](../feature-map/cases.md) | Mount Cases search/filter/sort/group/tree, matched-child parent context, persisted view choices, keyboard navigation and empty/loading/error. | GET /companies/{id}/cases scope/filter behavior is production evidence; rendered fixtures establish presentation only. Mutation/permission scenarios need real API checks separately. | Source: [Cases.tsx](../../ui/src/pages/Cases.tsx), [cases.ts](../../server/src/routes/cases.ts). Tests: [Cases.test.tsx](../../ui/src/pages/Cases.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts) |
| [`cases/structure`](../feature-map/cases.md) | Mount CaseDetail and CaseFieldsPanel with arbitrary JSON fields and parent/children, matching descendants and unavailable child. Do not invent a general field editor or typed field validation. | GET /cases/{id} and /cases/{id}/children/tree must return permitted company records and correct relationships; changes/persistence require route tests separately. | Source: [CaseDetail.tsx](../../ui/src/pages/CaseDetail.tsx), [CaseFieldsPanel.tsx](../../ui/src/components/CaseFieldsPanel.tsx), [Cases.tsx](../../ui/src/pages/Cases.tsx), [cases.ts](../../server/src/routes/cases.ts), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [CaseFieldsPanel.test.tsx](../../ui/src/components/CaseFieldsPanel.test.tsx), [Cases.test.tsx](../../ui/src/pages/Cases.test.tsx), [CaseDetail.test.tsx](../../ui/src/pages/CaseDetail.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts) |
| [`cases/history`](../feature-map/cases.md) | Mount CaseDetail activity and document revisions as distinct views, empty/loading/errors, attribution and source links. | GET /cases/{id}/events and /cases/{id}/documents/{key}/revisions require company/access filtering; a fixture list does not establish durable revision creation or restoration. | Source: [CaseDetail.tsx](../../ui/src/pages/CaseDetail.tsx), [cases.ts](../../server/src/routes/cases.ts). Tests: [CaseDetail.test.tsx](../../ui/src/pages/CaseDetail.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts) |
| [`cases/task-links`](../feature-map/cases.md) | Mount CaseDetail and IssueCasesPanel related-task/case links in both directions, missing links and unavailable targets. | GET /issues/{id}/cases and /cases/{id}/issue-links must enforce permitted task/case relationships; production browser cold links verify destination and company context. | Source: [CaseDetail.tsx](../../ui/src/pages/CaseDetail.tsx), [IssueCasesPanel.tsx](../../ui/src/components/IssueCasesPanel.tsx), [cases.ts](../../server/src/routes/cases.ts), [pipelines.ts](../../server/src/routes/pipelines.ts). Tests: [IssueCasesPanel.test.tsx](../../ui/src/components/IssueCasesPanel.test.tsx), [CaseDetail.test.tsx](../../ui/src/pages/CaseDetail.test.tsx), [cases-routes.test.ts](../../server/src/__tests__/cases-routes.test.ts) |
| [`status-cards/authoring`](../feature-map/status-cards.md) | Mount CreateStatusCardDialog and StatusCardSettingsForm prompt, summarizer, refresh options, required/invalid inputs and save errors. | POST /companies/{id}/status-cards and PATCH /status-cards/{id} must enforce gate/author authority, save configuration and start expected compile task when prompt changes. | Source: [CreateStatusCardDialog.tsx](../../ui/src/pages/StatusCards/CreateStatusCardDialog.tsx), [StatusCardSettingsForm.tsx](../../ui/src/pages/StatusCards/StatusCardSettingsForm.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts). Tests: [StatusCardSettingsForm.test.tsx](../../ui/src/pages/StatusCards/StatusCardSettingsForm.test.tsx), [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts) |
| [`status-cards/generation`](../feature-map/status-cards.md) | Mount card tile/drawer compiling, refreshing, failed, stale existing summary and successful new-summary states with linked task. | POST /status-cards/{id}/recompile and /refresh plus update/finalization engine must persist actual new output/history; compare saved summary with source tasks, not merely successful task status. | Source: [StatusCardTile.tsx](../../ui/src/pages/StatusCards/StatusCardTile.tsx), [StatusCardDetailDrawer.tsx](../../ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts), [status-card-update-engine.ts](../../server/src/services/status-card-update-engine.ts). Tests: [StatusCardTile.test.tsx](../../ui/src/pages/StatusCards/StatusCardTile.test.tsx), [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts), [status-card-update-engine.test.ts](../../server/src/__tests__/status-card-update-engine.test.ts) |
| [`status-cards/inspection`](../feature-map/status-cards.md) | Mount StatusCardDetailDrawer summary, watched work, update/revision history, query debug, empty/loading/error and stale summary disclosure. | GET /status-cards/{id}, /updates, /summary-revisions and /dry-run must filter accessible card/source records; fixtures cannot establish summary truth or query authorization. | Source: [StatusCardDetailDrawer.tsx](../../ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts). Tests: [StatusCardTile.test.tsx](../../ui/src/pages/StatusCards/StatusCardTile.test.tsx), [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts) |
| [`status-cards/archive`](../feature-map/status-cards.md) | Mount StatusCards and ArchivedStatusCardRow active/archived list, restore pending/failure and old-summary state. Archive differs from deletion. | PATCH /status-cards/{id} archived true/false must persist and authorize change; restore may enqueue refresh, whose new outcome must be inspected rather than treating old summary as current. | Source: [index.tsx](../../ui/src/pages/StatusCards/index.tsx), [ArchivedStatusCardRow.tsx](../../ui/src/pages/StatusCards/ArchivedStatusCardRow.tsx), [status-cards.ts](../../server/src/routes/status-cards.ts). Tests: [status-cards.test.ts](../../server/src/__tests__/status-cards.test.ts), [status-card-update-engine.test.ts](../../server/src/__tests__/status-card-update-engine.test.ts) |
| [`budgets-costs/resolution`](../feature-map/budgets-costs.md) | Mount BudgetIncidentCard with entered raised limit, invalid limit, keep-paused, applying, authorized/blocked and error states wired through actual host. Existing matrix handlers are no-ops. | POST /companies/{id}/budget-incidents/{id}/resolve must authorize scope-specific raise, persist resolution and resume eligible work while retaining overlapping budget/manual holds. | Source: [BudgetIncidentCard.tsx](../../ui/src/components/BudgetIncidentCard.tsx), [Costs.tsx](../../ui/src/pages/Costs.tsx), [budgets.ts](../../ui/src/api/budgets.ts), [costs.ts](../../server/src/routes/costs.ts), [budgets.ts](../../server/src/services/budgets.ts). Tests: [budgets-service.test.ts](../../server/src/__tests__/budgets-service.test.ts), [Costs.test.tsx](../../ui/src/pages/Costs.test.tsx) |
| [`activity/runs`](../feature-map/activity.md) | Mount AuditRuns selected status/agent/routine, linked task/agent, empty/loading/error/retry and 200-entry limit. Do not invent pagination. | GET /companies/{id}/heartbeat-runs and /routines/{id}/runs require company/read/privacy checks; real browser follows context links and confirms the referenced execution. | Source: [AuditRuns.tsx](../../ui/src/pages/audit/AuditRuns.tsx), [heartbeats.ts](../../ui/src/api/heartbeats.ts), [routines.ts](../../ui/src/api/routines.ts). Tests: [AuditRuns.test.tsx](../../ui/src/pages/audit/AuditRuns.test.tsx), [heartbeat-run-privacy-routes.test.ts](../../server/src/__tests__/heartbeat-run-privacy-routes.test.ts), [routines-service.test.ts](../../server/src/__tests__/routines-service.test.ts) |
| [`navigation-preferences/preferences`](../feature-map/navigation-preferences.md) | Mount Sidebar using real preference boundary with stars/order/collapse/recents state. Clearly distinguish in-memory section collapse, browser-local recents and server-saved stars/order. | GET/PUT /sidebar-preferences/me and /companies/{id}/sidebar-preferences/me plus stars must retain intended user/company isolation across reload and switch. Section collapse reopens after reload; global collapse is disabled. | Source: [Sidebar.tsx](../../ui/src/components/Sidebar.tsx), [sidebar-preferences.ts](../../server/src/routes/sidebar-preferences.ts), [sidebar-preferences.ts](../../server/src/services/sidebar-preferences.ts). Tests: [Sidebar.test.tsx](../../ui/src/components/Sidebar.test.tsx), [sidebar-preferences-routes.test.ts](../../server/src/__tests__/sidebar-preferences-routes.test.ts) |
| [`instance-operations/backup`](../feature-map/instance-operations.md) | Mount shipped InstanceGeneralSettings in CompanySettings with daily/weekly/monthly retention presets, selected values, saving/error/loading and cloud-hidden controls. Backup creation and restore remain separate CLI/operator checks. | PATCH /api/instance/settings/general must enforce instance settings authority and managed hidden fields, persist retention and survive reload. Separately inspect a real backup and restore a known record into a second disposable target; a successful write does not prove restoration. | Source: [InstanceGeneralSettings.tsx](../../ui/src/pages/InstanceGeneralSettings.tsx), [CompanySettings.tsx](../../ui/src/pages/CompanySettings.tsx), [instance-settings.ts](../../server/src/routes/instance-settings.ts), [db-backup.ts](../../cli/src/commands/db-backup.ts). Tests: [InstanceGeneralSettings.test.tsx](../../ui/src/pages/InstanceGeneralSettings.test.tsx), [instance-settings-routes.test.ts](../../server/src/__tests__/instance-settings-routes.test.ts), [instance-settings-managed-overlay.test.ts](../../server/src/__tests__/instance-settings-managed-overlay.test.ts), [instance-database-backups-routes.test.ts](../../server/src/__tests__/instance-database-backups-routes.test.ts) |
## CLI and operator capabilities
These eight capabilities do not need an authored Storybook example for their core operation. Keep them in the feature index: their lack of a story is intentional verification scope, not evidence that the product lacks the feature. UI portions of related capabilities remain in the section above.
| Capability | Storybook scope | Required CLI/API/operator evidence | Source and existing test starting points |
| --- | --- | --- | --- |
| [`onboarding/instance`](../feature-map/onboarding.md) | No authored UI story required for host installation and startup. | Configure isolated data directory, start instance, confirm printed URL/identity/health, restart with saved configuration. | Source: [onboard.ts](../../cli/src/commands/onboard.ts), [onboard-service.ts](../../cli/src/onboard-service.ts). Tests: [onboard.test.ts](../../cli/src/__tests__/onboard.test.ts), [onboard-service.test.ts](../../cli/src/__tests__/onboard-service.test.ts), [test-drive.test.ts](../../cli/src/__tests__/test-drive.test.ts) |
| [`instance-operations/install-update`](../feature-map/instance-operations.md) | No authored story required for install, channel selection, update or rollback command execution. | Use an owned managed installation: check/dry-run, installed version, retained payload rollback and failure. Source-checkout guidance is a separate case; rollback does not undo database migrations. | Source: [index.ts](../../cli/src/index.ts), [install.ts](../../cli/src/commands/install.ts), [update.ts](../../cli/src/commands/update.ts). Tests: [install-command.test.ts](../../cli/src/__tests__/install-command.test.ts), [update-command.test.ts](../../cli/src/__tests__/update-command.test.ts) |
| [`instance-operations/diagnostics`](../feature-map/instance-operations.md) | No authored story required for doctor/health command results. | Run doctor against an owned data directory; check readiness and nonzero failures. A listening port alone does not prove readiness; repair requires observing the repaired result. | Source: [doctor.ts](../../cli/src/commands/doctor.ts). Tests: [doctor.test.ts](../../cli/src/__tests__/doctor.test.ts) |
| [`cli-operations/context`](../feature-map/cli-operations.md) | No authored story required for CLI profile/context selection. | Verify selected API origin, identity and company, JSON output and invalid-token/wrong-company failures. A persona label is not authentication. | Source: [context.ts](../../cli/src/commands/client/context.ts). Tests: [context.test.ts](../../cli/src/__tests__/context.test.ts), [http.test.ts](../../cli/src/__tests__/http.test.ts) |
| [`cli-operations/domain-commands`](../feature-map/cli-operations.md) | No authored story required for command parsing and domain API execution; corresponding product UI keeps its own story needs. | Discover registered help, use a disposable company, assert persisted mutations and denied operations with the actual actor. Command parity is not every endpoint passing live. | Source: [index.ts](../../cli/src/index.ts), [issue.ts](../../cli/src/commands/client/issue.ts). Tests: [operations-parity.test.ts](../../cli/src/__tests__/operations-parity.test.ts) |
| [`cli-operations/outputs`](../feature-map/cli-operations.md) | No authored story required for CLI document/asset/skill IO or machine-readable output. | Assert payload/schema, exit code, written contents, authorization and file integrity. Open the resulting document/asset in the product for cross-surface acceptance. | Source: [issue.ts](../../cli/src/commands/client/issue.ts), [asset.ts](../../cli/src/commands/client/asset.ts), [skill.ts](../../cli/src/commands/client/skill.ts). Tests: [issue-subresources.test.ts](../../cli/src/__tests__/issue-subresources.test.ts), [admin-asset-skill-parity.test.ts](../../cli/src/__tests__/admin-asset-skill-parity.test.ts) |
| [`cli-operations/run-controls`](../feature-map/cli-operations.md) | No authored story required for invoke/list/get/cancel/events/log command execution. | Assert the real run ID, event/log output and resulting state, eligible actor and cancellation denial. Printed success does not prove provider completion. | Source: [run.ts](../../cli/src/commands/client/run.ts), [heartbeat-run.ts](../../cli/src/commands/heartbeat-run.ts). Tests: [operations-parity.test.ts](../../cli/src/__tests__/operations-parity.test.ts) |
| [`cli-operations/worktree-instances`](../feature-map/cli-operations.md) | No authored story required for worktree initialize/seed/repair/cleanup commands. | Use only an owned isolated checkout/instance; verify paths, ports, health, login and seed provenance, then cleanup ownership. Capture evidence before teardown. | Source: [worktree.ts](../../cli/src/commands/worktree.ts), [test-drive.ts](../../cli/src/commands/test-drive.ts). Tests: [worktree.test.ts](../../cli/src/__tests__/worktree.test.ts), [test-drive.test.ts](../../cli/src/__tests__/test-drive.test.ts) |
## Browser verification boundaries
These three capabilities principally require the real browser, router or measurement harness. An isolated story can provide visual context, but does not prove routing, runtime gates or a performance budget. Navigation fallback presentation remains eligible for a small optional story.
| Capability | Storybook scope | Required browser evidence | Source and existing test starting points |
| --- | --- | --- | --- |
| [`navigation-preferences/fallbacks`](../feature-map/navigation-preferences.md) | A NotFound rendering story can help polish, but missing-resource/legacy-deep-link capability principally needs real App/router/browser scenarios preserving company and query intent. | Cold-open invalid company/resource and retired URL; verify explicit fallback or correct canonical redirect without silently targeting a different resource/company. | Source: [NotFound.tsx](../../ui/src/pages/NotFound.tsx), [App.tsx](../../ui/src/App.tsx), [company-routes.ts](../../ui/src/lib/company-routes.ts). Tests: [App.activity-routing.test.tsx](../../ui/src/App.activity-routing.test.tsx), [App.cases-routing.test.tsx](../../ui/src/App.cases-routing.test.tsx), [App.test.tsx](../../ui/src/App.test.tsx), [company-routes.test.ts](../../ui/src/lib/company-routes.test.ts) |
| [`developer-labs/performance`](../feature-map/developer-labs.md) | A screenshot/story is optional context, not the required performance evidence. | Use existing browser performance harnesses. Record build/browser/data size, timing/trace and scrolling. Long-thread fixture has a disabled composer; task-chat HTML harness uses a plain textarea and simulated updates. | Source: [IssueChatLongThreadPerf.tsx](../../ui/src/pages/IssueChatLongThreadPerf.tsx), [README.md](../../tests/perf/task-chat/README.md), [README.md](../../tests/perf/issue-detail/README.md). Tests: [scrollback.spec.ts](../../tests/perf/task-chat/scrollback.spec.ts), [issue-detail.perf.spec.ts](../../tests/perf/issue-detail/issue-detail.perf.spec.ts) |
| [`developer-labs/route-gates`](../feature-map/developer-labs.md) | No isolated story required to prove actual route registration, redirects or gates; isolated gated-control examples remain useful. | Drive real routes under their actual development, experimental, production and fallback settings. Do not assume every lab is dev-only: global long-thread/lab/design routes also exist in production registration. | Source: [App.tsx](../../ui/src/App.tsx). Tests: No dedicated test asserted; use the feature recipe. |
## Association revisit and retained gaps
No further justified associations were found in this revisit of the 60 gaps. Existing lookalikes remain unlinked for concrete reasons:
- `inbox-search/toasts`: `DismissUndoToast` is a dismissal receipt; `StopWithoutToasts` is local visible-task suppression. Neither demonstrates persisted personal participation/mention eligibility. The upstream notification capability is newly mapped by #16153, not an overlooked notification suite.
- `gateways-profiles/tokens`: assistant OAuth revocation is a different credential. Existing Gateway-tab token fixtures omit current fields such as `allowedActions`; inspect and repair their drift before advertising token coverage.
- `app-permissions/catalog-change`: automatically allowing new actions with an empty quarantine does not demonstrate review/quarantine.
- `documents-artifacts/documents`: the annotation edit mock increments a revision while returning unchanged body; it does not demonstrate saved edits or restoration.
- `steering/drafts`: mounting after clearing and seeding storage does not demonstrate draft recovery across task switching or reload.
- `routines/run-now` and `budgets-costs/resolution`: supplied dialogs/cards and no-op callbacks are useful presentation references, but do not yet provide the action/result scenarios for these capability links.
These are retained examples and explicit limits, not reasons to delete suites. The prior association corrections remain intact. No suite classifications are promoted by this inventory.
## Keeping this record current
This downstream record is maintained with [maintain-storybook](../../.agents/skills/maintain-storybook/SKILL.md). When a feature is added or an example is associated, recompute the unassociated IDs from the feature map and non-guide catalog entries; update the rows/counts and source revision. Preserve the CLI/operator and browser reasons while no story exists. A new story removes a capability from this gap inventory only when its actual subject/actions justify the catalog association; it does not remove the production verification obligation.
Use the [feature recipes](../feature-map/README.md) and [agent access companions](../agent-access-map/README.md) for authoritative journeys, actor restrictions and allowed/denied assertions. This record does not create a new API schema, alter access policy or redefine those maps. Record executed evidence separately in [REVIEW.md](REVIEW.md).
For this pass, regenerate the downstream feature index for `inbox-search/toasts` and inspect its diff. The five inbox-suite fingerprints changed only through the inspected upstream recipe; the guide/shared fingerprints also follow the regenerated index and upstream README. Those inventory refreshes retain story IDs and `unreviewed` statuses.
File diff suppressed because it is too large. Load diff
+3 -7
View File
@@ -2,6 +2,7 @@
import { existsSync, readFileSync, readdirSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { featureIndex } from "./feature-map.mjs";
const scriptPath = fileURLToPath(import.meta.url);
const defaultRoot = path.resolve(path.dirname(scriptPath), "..");
@@ -83,7 +84,8 @@ export function checkMaps(repoRoot = defaultRoot) {
const productFiles = files(featureRoot);
const agentFiles = files(agentRoot);
const indexes = [read(path.join(featureRoot, "README.md")), read(path.join(agentRoot, "README.md"))];
try { featureIndex(repoRoot); }
catch (error) { errors.push(error.message); }
let capabilities = 0;
for (const name of new Set([...productFiles, ...agentFiles])) {
const productFile = path.join(featureRoot, name);
@@ -109,12 +111,6 @@ export function checkMaps(repoRoot = defaultRoot) {
}
if (!agent.includes(`](../feature-map/${name})`)) fail(agentFile, "missing matching product link");
if (!product.includes(`](../agent-access-map/${name})`)) fail(productFile, "missing matching companion link");
for (const [index, text] of indexes.entries()) {
if (!new RegExp(`\\]\\((?:\\./)?${name.replaceAll(".", "\\.")}\\)`).test(text)) {
fail(path.join(index === 0 ? featureRoot : agentRoot, "README.md"), `missing area: ${name}`);
}
}
if (!/^Review date: \d{4}-\d{2}-\d{2}\. Source commit: `[a-f\d]{40}`\./m.test(agent)) fail(agentFile, "missing review date/source commit");
links(productFile, product);
links(agentFile, agent);
capabilities += ids.length;
+1 -1
View File
@@ -21,7 +21,7 @@ function fixture(t) {
const agent = path.join(root, "maps/agent-access-map/example.md");
writeFileSync(path.join(root, "maps/README.md"), "# Contract\n");
for (const dir of ["feature-map", "agent-access-map"]) writeFileSync(path.join(root, "maps", dir, "README.md"), "[Example](example.md)\n");
writeFileSync(product, "# Example\n\n[Agent access](../agent-access-map/example.md)\n\n## Sub-features\n\n- `create`: create a record.\n\n## How to get to it (user POV)\n");
writeFileSync(product, '---\nnavigation: {"section":"Work","sectionOrder":10,"order":10}\n---\n# Example\n\nExample workflows.\n\n[Agent access](../agent-access-map/example.md)\n\n## Sub-features\n\n- `create`: create a record.\n\n## How to get to it (user POV)\n');
writeFileSync(agent, `# Agent access\n\nProduct map: [Example](../feature-map/example.md).\n\nReview date: 2026-10-12. Source commit: \`${"a".repeat(40)}\`.\n\n## \`create\`\n\nReview: \`baseline\`.\n\n${record}`);
return { root, product, agent };
}
+98
View File
@@ -0,0 +1,98 @@
import { existsSync, readFileSync, readdirSync } from "node:fs";
import path from "node:path";
export const sidebarLabel = title => title.replaceAll("/", ", ");
export function featureIndex(root) {
const directory = path.join(root, "maps/feature-map");
const sections = new Map();
for (const file of readdirSync(directory).filter(file => file.endsWith(".md") && file !== "README.md").sort()) {
const id = file.slice(0, -3);
const source = readFileSync(path.join(directory, file), "utf8");
const frontmatter = source.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n/);
const navigationLine = frontmatter?.[1].match(/^navigation: (.+)$/m)?.[1];
if (!navigationLine) throw new Error(`${file}: missing navigation metadata`);
const navigation = JSON.parse(navigationLine);
if (typeof navigation.section !== "string" || !navigation.section.trim()
|| !Number.isFinite(navigation.sectionOrder) || !Number.isFinite(navigation.order)) {
throw new Error(`${file}: invalid navigation metadata`);
}
const text = source.slice(frontmatter[0].length);
const title = text.match(/^# (.+)$/m)?.[1];
const description = text.split(/^# .+\r?\n/m)[1]?.trim().split(/\r?\n\s*\r?\n/)[0].replaceAll(/\r?\n/g, " ");
if (!title || !description) throw new Error(`${file}: missing title or description`);
const body = text.split(/^## Sub-features\s*$/m)[1]?.split(/^## /m)[0];
if (!body) throw new Error(`${file}: missing sub-features`);
const capabilities = [];
for (const row of body.trim().split(/\r?\n/)) {
const match = row.match(/^- `([^`]+)`:\s*(.*)$/);
if (match) {
const [, key, description] = match;
capabilities.push({ id: `${id}/${key}`, label: key.replaceAll("-", " ").replace(/^./, letter => letter.toUpperCase()), description });
} else if (row.trim() && capabilities.length) capabilities.at(-1).description += ` ${row.trim()}`;
}
if (!capabilities.length || capabilities.some(capability => !/^[a-z0-9-]+\/[a-z0-9-]+$/.test(capability.id))
|| new Set(capabilities.map(capability => capability.id)).size !== capabilities.length) {
throw new Error(`${file}: invalid or duplicate capability IDs`);
}
const verification = text.split(/^### Storybook verification\s*$/m)[1]?.split(/^### /m)[0] ?? "";
const seen = new Set();
for (const entry of verification.split(/^#### /m).slice(1)) {
const key = entry.match(/^`([^`]+)`/)?.[1];
const capability = capabilities.find(capability => capability.id === `${id}/${key}`);
if (!capability || seen.has(key)) throw new Error(`${file}: unknown or duplicate verification capability ${key}`);
seen.add(key);
const fields = Object.fromEntries(["Scope", "Storybook", "Production", "Sources"].map(field => [field.toLowerCase(), entry.match(new RegExp(`^${field}: (.+)$`, "m"))?.[1]]));
if (!["ui", "cli", "browser"].includes(fields.scope) || Object.values(fields).some(value => !value?.trim())) {
throw new Error(`${file}: incomplete verification route for ${key}`);
}
capability.verification = fields;
}
let section = sections.get(navigation.section);
if (!section) {
section = { title: navigation.section, order: navigation.sectionOrder, features: [] };
sections.set(section.title, section);
}
if (section.order !== navigation.sectionOrder) throw new Error(`${file}: inconsistent section order for ${section.title}`);
section.features.push({ id, title, description, capabilities, order: navigation.order });
}
if (!sections.size) throw new Error("Feature map has no feature families");
const ordered = [...sections.values()].sort((a, b) => a.order - b.order || a.title.localeCompare(b.title));
return { sections: ordered.map(({ title, features }) => ({ title, features: features.sort((a, b) => a.order - b.order || a.id.localeCompare(b.id)).map(({ order, ...feature }) => feature) })) };
}
export function mapIndexes(index) {
const features = ["# Product features", "", "Generated from the feature recipes. Edit the affected recipe, not this index.", ""];
const access = ["# Agent access by feature", "", "Generated from the feature recipes and their access companions. Counts are documentation scope, not passing tests.", ""];
for (const section of index.sections) {
for (const lines of [features, access]) lines.push(`## ${section.title}`, "");
for (const feature of section.features) {
features.push(`- [${feature.title}](../feature-map/${feature.id}.md): ${feature.description}`);
access.push(`- [${feature.title}](../agent-access-map/${feature.id}.md) · [Product recipe](../feature-map/${feature.id}.md) · ${feature.capabilities.length} capabilities`);
}
for (const lines of [features, access]) lines.push("");
}
return new Map([["maps/generated/feature-map.md", features.join("\n")], ["maps/generated/agent-access-map.md", access.join("\n")]]);
}
export function pageInventory(root, index) {
const references = new Map();
for (const feature of index.sections.flatMap(section => section.features)) {
const recipe = `maps/feature-map/${feature.id}.md`;
for (const match of readFileSync(path.join(root, recipe), "utf8").matchAll(/\]\(([^)\n]+)\)/g)) {
const target = path.resolve(root, path.dirname(recipe), match[1].split("#")[0]);
if (!references.has(target)) references.set(target, new Set());
references.get(target).add(feature.id);
}
}
function pages(directory) {
if (!existsSync(directory)) return [];
return readdirSync(directory, { withFileTypes: true }).flatMap(entry => {
const file = path.join(directory, entry.name);
if (entry.isDirectory()) return pages(file);
if (!entry.name.endsWith(".tsx") || /\.(test|spec|stories)\.tsx$/.test(entry.name)) return [];
return [{ file: path.relative(root, file).split(path.sep).join("/"), features: [...(references.get(file) ?? [])].sort() }];
});
}
return { pages: pages(path.join(root, "ui/src/pages")).sort((a, b) => a.file.localeCompare(b.file)) };
}
+34
View File
@@ -0,0 +1,34 @@
import { mkdtempSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
import os from "node:os";
import path from "node:path";
import { fileURLToPath } from "node:url";
export function mapFixture(t) {
const root = mkdtempSync(path.join(os.tmpdir(), "paperclip-map-test-"));
t.after(() => rmSync(root, { recursive: true, force: true }));
function write(file, content) {
mkdirSync(path.dirname(path.join(root, file)), { recursive: true });
writeFileSync(path.join(root, file), content);
}
write("ui/package.json", '{"type":"module"}\n');
symlinkSync(fileURLToPath(new URL("../ui/node_modules", import.meta.url)), path.join(root, "ui/node_modules"), "junction");
write(".gitignore", "node_modules/\nmaps/generated/\nui/storybook/generated/\nui/storybook/.storybook/preview.tsx\n");
write("maps/README.md", "# Maps\n");
write("maps/feature-map/README.md", "# Feature recipes\n");
write("maps/agent-access-map/README.md", "# Access contracts\n");
write("ui/storybook/.storybook/preview-base.tsx", "export default { parameters: { layout: 'fullscreen' } };\n");
function feature(id, title, capabilities = ["create"], options = {}) {
const { section = "Work", sectionOrder = 10, order = 10 } = options;
write(`maps/feature-map/${id}.md`, `---\nnavigation: ${JSON.stringify({ section, sectionOrder, order })}\n---\n\n# ${title}\n\n${title} workflows.\n\n[Agent access](../agent-access-map/${id}.md)\n\n## Sub-features\n\n${capabilities.map(key => `- \`${key}\`: ${key} work.`).join("\n")}\n\n## Gotchas\n`);
write(`maps/agent-access-map/${id}.md`, `# ${title} access\n\n[Product map](../feature-map/${id}.md)\n\n${capabilities.map(key => `## \`${key}\`\n\nReview: \`baseline\`.\n\nAPI: \`present\` — POST /api/${id}.\nAgent access: \`available\` — REST.\nPolicy: same company.\nEvidence: \`source-only\` — inspect implementation.\nVerification: \`not-run\` — assert access and denial.\nGaps: remaining variants.\n`).join("\n")}`);
}
function story(name = "task", metadata = { capabilities: ["tasks/create"], implementation: "production", boundary: "fixtures" }, options = {}) {
const { area = "tasks", title = `Work/Tasks/${name}`, id = `stable-${name}`, exports = "export const Empty = {};", parameters = "" } = options;
const file = `ui/storybook/stories/${area}/${name}.stories.tsx`;
write(file, `import type { Meta } from '@storybook/react-vite';\nconst meta = { id: ${JSON.stringify(id)}, title: ${JSON.stringify(title)}, parameters: { ${parameters} paperclip: ${JSON.stringify(metadata)} } } satisfies Meta;\nexport default meta;\n${exports}\n`);
return file;
}
feature("tasks", "Tasks", ["create", "discussion"]);
const file = story();
return { root, write, feature, story, file };
}
+6
View File
@@ -0,0 +1,6 @@
export type StorySource = { file: string; title: string; metaId: string; ids: string[]; plays: number };
export function generateStorybook(root?: string, options?: { write?: boolean }): {
catalog: { version: number; entries: Array<{ file: string; stableId: string }> };
stories: StorySource[];
};
export function scanStories(root?: string): StorySource[];
+103 -75
View File
@@ -1,19 +1,19 @@
#!/usr/bin/env node
import { createHash } from "node:crypto";
import { existsSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
import { readFileSync, readdirSync } from "node:fs";
import { createRequire } from "node:module";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { featureIndex, reconcileFeatureArtifacts, sidebarLabel } from "./storybook-feature-index.mjs";
import { featureIndex, sidebarLabel } from "./feature-map.mjs";
import { generateFeatureArtifacts, generatedRoot, writeArtifacts } from "./storybook-feature-index.mjs";
import { checkMaps } from "./check-maps.mjs";
const scriptPath = fileURLToPath(import.meta.url);
const defaultRoot = path.resolve(path.dirname(scriptPath), "..");
const storyRoot = "ui/storybook/stories";
const catalogPath = "maps/storybook-map/catalog.json";
const indexPath = "maps/storybook-map/INDEX.md";
const statuses = ["current", "proposed", "historical", "mixed", "unreviewed"];
const implementations = ["production", "prototype", "mixed", "guide"];
const boundaries = ["fixtures", "fixture-server", "static"];
const implementations = ["production", "prototype", "mixed", "guide", "unreviewed"];
const boundaries = ["fixtures", "fixture-server", "static", "unreviewed"];
const annotationFields = new Set(["capabilities", "status", "implementation", "boundary", "notes", "home", "exception", "replacement"]);
function files(root, dir) {
return readdirSync(path.join(root, dir), { withFileTypes: true }).flatMap(entry => {
@@ -22,27 +22,39 @@ function files(root, dir) {
}).sort();
}
export function fingerprint(root, sources) {
const hash = createHash("sha256");
for (const file of [...new Set(sources)].sort()) {
hash.update(file).update("\0").update(readFileSync(path.join(root, file))).update("\0");
function literal(node, label) {
if (!node) throw new Error(`${label}: expected literal metadata`);
if (["TSAsExpression", "TSSatisfiesExpression"].includes(node.type)) return literal(node.expression, label);
if (["StringLiteral", "BooleanLiteral", "NumericLiteral"].includes(node.type)) return node.value;
if (node.type === "ArrayExpression") return node.elements.map(element => literal(element, label));
if (node.type === "ObjectExpression") {
const result = {};
for (const property of node.properties) {
const key = property.key?.name ?? property.key?.value;
if (property.type !== "ObjectProperty" || property.computed || typeof key !== "string" || Object.hasOwn(result, key) || key === "__proto__") {
throw new Error(`${label}: metadata must use unique literal properties`);
}
result[key] = literal(property.value, label);
}
return result;
}
return hash.digest("hex");
throw new Error(`${label}: metadata must be literal; expressions are not executed`);
}
export function capabilities(root) {
const result = new Map();
for (const file of files(root, "maps/feature-map").filter(file => file.endsWith(".md") && !file.endsWith("README.md"))) {
const text = readFileSync(path.join(root, file), "utf8");
const area = path.basename(file, ".md");
const section = text.split(/^## Sub-features\s*$/m)[1]?.split(/^## /m)[0] ?? "";
for (const match of section.matchAll(/^- `([^`]+)`:/gm)) result.set(`${area}/${match[1]}`, file);
function annotation(csf, file) {
const parameters = csf._metaAnnotations.parameters;
if (parameters?.type !== "ObjectExpression") throw new Error(`${file}: declare parameters.paperclip as literal metadata`);
const matches = parameters.properties.filter(property => (property.key?.name ?? property.key?.value) === "paperclip");
if (matches.length !== 1) throw new Error(`${file}: expected one parameters.paperclip annotation`);
const property = matches[0];
if (property.type !== "ObjectProperty" || property.computed) throw new Error(`${file}: paperclip must be a literal property`);
if (parameters.properties.slice(parameters.properties.indexOf(property) + 1).some(property => property.type === "SpreadElement" || property.computed)) {
throw new Error(`${file}: paperclip metadata must follow parameter spreads and computed properties`);
}
return result;
}
export function featureNavigation(root) {
return new Map(featureIndex(root).sections.flatMap(section => section.features.map(feature => [feature.id, `${sidebarLabel(section.title)}/${sidebarLabel(feature.title)}`])));
const value = literal(property.value, file);
if (!value || Array.isArray(value) || typeof value !== "object") throw new Error(`${file}: paperclip metadata must be an object`);
for (const key of Object.keys(value)) if (!annotationFields.has(key)) throw new Error(`${file}: unknown paperclip field ${key}`);
return value;
}
export function scanStories(root = defaultRoot) {
@@ -50,60 +62,53 @@ export function scanStories(root = defaultRoot) {
const { loadCsf } = require("storybook/internal/csf-tools");
return files(root, storyRoot).filter(file => /\.stories\.(ts|tsx|mdx)$/.test(file)).map(file => {
const csf = loadCsf(readFileSync(path.join(root, file), "utf8"), { fileName: file, makeTitle: title => title }).parse();
return { file, title: csf.meta.title, metaId: csf.meta.id, ids: csf.stories.map(story => story.id), plays: csf.stories.filter(story => story.__stats?.play).length };
return { file, title: csf.meta.title, metaId: csf.meta.id, ids: csf.stories.map(story => story.id), plays: csf.stories.filter(story => story.__stats?.play).length, annotation: annotation(csf, file) };
});
}
function storyHome(entry) {
return entry.home ?? entry.capabilities[0]?.split("/")[0] ?? (entry.implementation === "guide" ? "overview" : "foundations");
export function storyHome(entry) {
return entry.home ?? (typeof entry.capabilities?.[0] === "string" ? entry.capabilities[0].split("/")[0] : undefined) ?? (entry.implementation === "guide" ? "overview" : "foundations");
}
export function validateCatalog(root, catalog, stories) {
export function catalogFromStories(stories, index) {
const navigation = new Map(index.sections.flatMap(section => section.features.map(feature => [feature.id, `${sidebarLabel(section.title)}/${sidebarLabel(feature.title)}`])));
return { version: 2, entries: stories.map(story => {
const entry = { status: "unreviewed", implementation: "unreviewed", boundary: "unreviewed", notes: "", ...story.annotation, file: story.file, stableId: story.metaId, sidebarTitle: story.title };
const prefix = navigation.get(storyHome(entry)) ?? ({ overview: "Overview", foundations: "Foundations" })[storyHome(entry)];
return { ...entry, purpose: story.title?.startsWith(`${prefix}/`) ? story.title.slice(prefix.length + 1) : story.title };
}) };
}
export function validateCatalog(catalog, stories, index) {
const errors = [];
const refs = capabilities(root);
const navigation = featureNavigation(root);
const refs = new Set(index.sections.flatMap(section => section.features.flatMap(feature => feature.capabilities.map(capability => capability.id))));
const navigation = new Map(index.sections.flatMap(section => section.features.map(feature => [feature.id, `${sidebarLabel(section.title)}/${sidebarLabel(feature.title)}`])));
const byFile = new Map(stories.map(story => [story.file, story]));
const seen = new Set();
const local = file => typeof file === "string" && !path.isAbsolute(file) && !file.split("/").includes("..") && existsSync(path.join(root, file));
if (catalog.version !== 1 || !Array.isArray(catalog.entries)) return ["Unsupported catalog version or missing entries"];
function review(label, sources, hash) {
if (!Array.isArray(sources) || !sources.length || sources.some(file => !local(file))) {
errors.push(`${label}: missing/invalid review sources`);
} else if (fingerprint(root, sources) !== hash) errors.push(`${label}: source changed; review before updating its fingerprint`);
}
review("Shared Storybook setup", catalog.sharedReview?.sources, catalog.sharedReview?.fingerprint);
for (const entry of catalog.entries) {
const label = entry.file;
if (seen.has(label)) errors.push(`${label}: duplicate catalog entry`);
seen.add(label);
if (!byFile.has(label)) errors.push(`${label}: missing story file`);
if (!statuses.includes(entry.status)) errors.push(`${label}: invalid product status`);
if (!implementations.includes(entry.implementation)) errors.push(`${label}: invalid implementation`);
if (!boundaries.includes(entry.boundary)) errors.push(`${label}: invalid data boundary`);
if (!entry.purpose?.trim() || !entry.notes?.trim()) errors.push(`${label}: purpose and review notes are required`);
if (!/^\d{4}-\d{2}-\d{2}$/.test(entry.reviewedAt ?? "")) errors.push(`${label}: missing review date`);
if (!Array.isArray(entry.capabilities)) { errors.push(`${label}: missing capabilities`); continue; }
if (typeof entry.notes !== "string") errors.push(`${label}: notes must be text`);
if (!Array.isArray(entry.capabilities) || entry.capabilities.some(ref => typeof ref !== "string")) { errors.push(`${label}: capabilities must be an array of IDs`); continue; }
if (entry.home !== undefined && entry.home !== "foundations") errors.push(`${label}: only shared foundations may override the capability home`);
if (entry.home === "foundations" && !entry.exception?.trim()) errors.push(`${label}: foundation home needs an explicit reason`);
if (entry.exception !== undefined && (typeof entry.exception !== "string" || !entry.exception.trim())) errors.push(`${label}: exception must be nonempty text`);
if (entry.home === "foundations" && !entry.exception) errors.push(`${label}: foundation home needs an explicit reason`);
for (const ref of entry.capabilities) if (!refs.has(ref)) errors.push(`${label}: unknown feature capability ${ref}`);
if (!entry.capabilities.length && !entry.exception?.trim()) errors.push(`${label}: unmapped story needs an explicit reason`);
if (!entry.capabilities.length && !entry.exception) errors.push(`${label}: unmapped story needs an explicit reason`);
if (entry.capabilities.length !== new Set(entry.capabilities).size) errors.push(`${label}: duplicate capability references`);
const area = storyHome(entry);
const prefix = navigation.get(area) ?? ({ overview: "Overview", foundations: "Foundations" })[area];
const story = byFile.get(label);
if (!label.startsWith(`${storyRoot}/${area}/`)) errors.push(`${label}: story must live in its primary feature folder ${area}`);
if (!prefix || !entry.sidebarTitle?.startsWith(`${prefix}/`) || story?.title !== entry.sidebarTitle) errors.push(`${label}: sidebar title must match its feature-map home`);
if (!entry.stableId || story?.metaId !== entry.stableId) errors.push(`${label}: explicit meta ID must preserve the catalog stableId`);
if (entry.replacement && !byFile.has(entry.replacement)) errors.push(`${label}: replacement story is missing`);
if (!entry.sources?.includes(label)) errors.push(`${label}: review must include its story source`);
review(label, entry.sources, entry.fingerprint);
if (!prefix || typeof entry.sidebarTitle !== "string" || !entry.sidebarTitle.startsWith(`${prefix}/`)) errors.push(`${label}: sidebar title must match its feature-map home`);
if (typeof entry.stableId !== "string" || !entry.stableId.trim()) errors.push(`${label}: explicit meta ID is required`);
if (entry.replacement !== undefined && !byFile.has(entry.replacement)) errors.push(`${label}: replacement story is missing`);
}
for (const story of stories) if (!seen.has(story.file)) errors.push(`${story.file}: story missing from catalog`);
const ids = [...stories.flatMap(story => story.ids), ...featureIndex(root).sections.flatMap(section => section.features.map(feature => `feature-map-${feature.id}--overview`))];
if (ids.length !== new Set(ids).size) errors.push("Duplicate story IDs");
const metaIds = stories.map(story => story.metaId);
const ids = [...stories.flatMap(story => story.ids), ...index.sections.flatMap(section => section.features.map(feature => `feature-map-${feature.id}--overview`))];
if (metaIds.length !== new Set(metaIds).size || ids.length !== new Set(ids).size) errors.push("Duplicate story IDs");
return errors;
}
function cell(value) { return String(value).replaceAll("|", "\\|").replaceAll("\n", " "); }
export function renderIndex(catalog, stories, index) {
@@ -115,10 +120,10 @@ export function renderIndex(catalog, stories, index) {
if (!groups.has(area)) groups.set(area, []);
groups.get(area).push(entry);
}
const lines = ["# Storybook by feature", "", "<!-- Generated by node scripts/storybook-catalog.mjs --write. Edit catalog.json. -->", "",
"[Contract and maintenance](README.md) · [Review findings](REVIEW.md)", "",
const lines = ["# Storybook by feature", "", "Generated from story annotations and feature recipes. Do not edit this file.", "",
"[Contract and maintenance](../storybook-map/README.md) · [Verification routes](verification.md)", "",
`${stories.length} story files; ${stories.reduce((n, story) => n + story.ids.length, 0)} indexed stories. Counts describe inventory, not passed tests or complete feature coverage.`, "",
"Status describes product alignment; implementation describes the rendered subject; boundary describes simulated data. Sources and limitations are in catalog.json. Related capabilities cross-list one canonical story file.", ""];
"Status describes product alignment; implementation describes the rendered subject; boundary describes simulated data. Limitations are authored alongside each story. Classification is not executed evidence. Related capabilities cross-list one canonical story file.", ""];
const homes = index.sections.flatMap(section => section.features.map(feature => ({ ...feature, section: section.title })));
homes.push({ id: "foundations-and-guides", title: "Shared foundations and guides", section: "Foundations", description: "Shared components and contributor guidance outside the product feature index." });
let currentSection;
@@ -148,24 +153,47 @@ export function renderIndex(catalog, stories, index) {
return lines.join("\n") + "\n";
}
export function reconcileCatalog(root, catalog, stories, write = false) {
const index = featureIndex(root);
const errors = reconcileFeatureArtifacts(root, index, write);
errors.push(...validateCatalog(root, catalog, stories));
if (!errors.length) {
const generated = renderIndex(catalog, stories, index);
if (write) writeFileSync(path.join(root, indexPath), generated);
else if (!existsSync(path.join(root, indexPath)) || readFileSync(path.join(root, indexPath), "utf8") !== generated) errors.push("Generated INDEX.md is stale; run with --write after reviewing catalog changes");
export function renderVerification(catalog, index) {
const examples = catalog.entries.filter(entry => entry.implementation !== "guide" && !["historical", "proposed"].includes(entry.status));
const capabilities = index.sections.flatMap(section => section.features.flatMap(feature => feature.capabilities));
const missing = capabilities.filter(capability => !examples.some(entry => entry.capabilities.includes(capability.id)));
const lines = ["# Storybook verification routes", "", "Generated from story annotations and feature recipes. Associations are navigation, not proof of passing tests.", "",
`${capabilities.length} capabilities; ${missing.length} without a current, mixed or unreviewed example. Historical examples, proposals and guides do not remove gaps.`, "",
"## Capabilities without examples", ""];
for (const capability of missing) {
const area = capability.id.split("/")[0];
lines.push(`- [${capability.id}](../feature-map/${area}.md): ${capability.verification?.storybook ?? "No example associated. Inspect the feature recipe to select verification."}`);
}
return errors;
lines.push("", "## Authored verification guidance", "");
for (const capability of capabilities.filter(capability => capability.verification)) {
const route = capability.verification;
lines.push(`### ${capability.id}`, "", `Scope: ${route.scope}`, "", `Storybook: ${route.storybook}`, "", `Production: ${route.production}`, "", `Sources: ${route.sources}`, "");
}
return lines.join("\n");
}
export function generateStorybook(root = defaultRoot, { write = true } = {}) {
const mapErrors = checkMaps(root).errors;
if (mapErrors.length) throw new Error(mapErrors.join("\n"));
const index = featureIndex(root);
const stories = scanStories(root);
const catalog = catalogFromStories(stories, index);
const errors = validateCatalog(catalog, stories, index);
if (errors.length) throw new Error(errors.join("\n"));
if (write) {
generateFeatureArtifacts(root, index);
writeArtifacts(root, new Map([
[`${generatedRoot}/catalog.json`, JSON.stringify(catalog, null, 2) + "\n"],
["maps/generated/storybook.md", renderIndex(catalog, stories, index)],
["maps/generated/verification.md", renderVerification(catalog, index)],
]));
}
return { catalog, stories, index };
}
if (process.argv[1] && path.resolve(process.argv[1]) === scriptPath) {
const args = process.argv.slice(2);
if (args.some(arg => arg !== "--write")) throw new Error("Usage: node scripts/storybook-catalog.mjs [--write]");
const catalog = JSON.parse(readFileSync(path.join(defaultRoot, catalogPath), "utf8"));
const stories = scanStories();
const errors = reconcileCatalog(defaultRoot, catalog, stories, args.includes("--write"));
if (errors.length) { errors.forEach(error => console.error(error)); process.exitCode = 1; }
else console.log(`Storybook catalog aligned: ${stories.length} files, ${stories.reduce((n, story) => n + story.ids.length, 0)} stories. Structure and review fingerprints only; no runtime proof.`);
if (args.some(arg => !["--write", "--check"].includes(arg)) || args.length > 1) throw new Error("Usage: node scripts/storybook-catalog.mjs [--write | --check]");
const { stories } = generateStorybook(defaultRoot, { write: !args.includes("--check") });
console.log(`Storybook map: ${stories.length} files, ${stories.reduce((n, story) => n + story.ids.length, 0)} stories. Structure only; no runtime proof.`);
}
+134 -179
View File
@@ -1,208 +1,163 @@
import assert from "node:assert/strict";
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, symlinkSync } from "node:fs";
import os from "node:os";
import { execFileSync } from "node:child_process";
import { existsSync, readFileSync, rmSync } from "node:fs";
import path from "node:path";
import { test } from "node:test";
import { fileURLToPath } from "node:url";
import { fingerprint, reconcileCatalog, renderIndex, scanStories, validateCatalog } from "./storybook-catalog.mjs";
import { featureIndex, reconcileFeatureArtifacts } from "./storybook-feature-index.mjs";
import { catalogFromStories, generateStorybook, renderVerification, scanStories, validateCatalog } from "./storybook-catalog.mjs";
import { featureIndex } from "./feature-map.mjs";
import { mapFixture } from "./map-test-fixture.mjs";
function fixture(t) {
const root = mkdtempSync(path.join(os.tmpdir(), "storybook-catalog-"));
t.after(() => rmSync(root, { recursive: true, force: true }));
function write(file, text) {
mkdirSync(path.dirname(path.join(root, file)), { recursive: true });
writeFileSync(path.join(root, file), text);
}
write("maps/feature-map/README.md", "# Features\n\n### Tasks and conversations\n\n| [Tasks](./tasks.md) | Tasks |\n");
write("maps/feature-map/tasks.md", "# Tasks\n\n## Sub-features\n\n- `create`: create\n- `discussion`: discuss\n\n## How to get to it\n");
write("ui/storybook/.storybook/preview.tsx", "// shared fixtures\n");
const file = "ui/storybook/stories/tasks/task.stories.tsx";
write(file, "// a story\n");
write("ui/src/Task.tsx", "// production subject\n");
const sharedSources = ["ui/storybook/.storybook/preview.tsx"];
const sources = [file, "ui/src/Task.tsx"];
const catalog = {
version: 1, sharedReview: { sources: sharedSources, fingerprint: fingerprint(root, sharedSources) },
entries: [{ file, stableId: "tasks-create", sidebarTitle: "Tasks and conversations/Tasks/Create", capabilities: ["tasks/create", "tasks/discussion"], purpose: "Create a task", status: "current",
implementation: "production", boundary: "fixtures", notes: "Production subject; callbacks simulated.",
reviewedAt: "2026-10-12", sources, fingerprint: fingerprint(root, sources) }],
};
const stories = [{ file, title: "Tasks and conversations/Tasks/Create", metaId: "tasks-create", ids: ["tasks-create--empty"], plays: 0 }];
return { root, write, file, catalog, stories };
function inspect(f) {
const index = featureIndex(f.root);
const stories = scanStories(f.root);
const catalog = catalogFromStories(stories, index);
return { catalog, stories, index, errors: validateCatalog(catalog, stories, index) };
}
test("complete inventory accepts production subjects with simulated data", t => {
const f = fixture(t);
assert.deepEqual(validateCatalog(f.root, f.catalog, f.stories), []);
test("source annotations assemble an inventory without a registry or review stamps", t => {
const f = mapFixture(t);
const result = inspect(f);
assert.deepEqual(result.errors, []);
assert.equal(result.catalog.entries[0].purpose, "task");
assert.equal(result.catalog.entries[0].status, "unreviewed");
assert.equal(result.catalog.entries[0].stableId, "stable-task");
assert.equal(Object.hasOwn(result.catalog.entries[0], "fingerprint"), false);
assert.equal(Object.hasOwn(result.catalog.entries[0], "reviewedAt"), false);
f.story("new");
assert.equal(inspect(f).catalog.entries.length, 2);
rmSync(path.join(f.root, f.file));
assert.equal(inspect(f).catalog.entries.length, 1);
});
test("adding, removing or duplicating story files requires reconciliation", t => {
const f = fixture(t);
assert.match(validateCatalog(f.root, { ...f.catalog, entries: [] }, f.stories).join("\n"), /missing from catalog/);
assert.match(validateCatalog(f.root, f.catalog, []).join("\n"), /missing story file/);
f.catalog.entries.push(f.catalog.entries[0]);
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /duplicate catalog entry/);
test("unknown capabilities, invalid annotations and inappropriate homes fail", t => {
const f = mapFixture(t);
f.story("task", { capabilities: ["tasks/missing"] });
assert.match(inspect(f).errors.join("\n"), /unknown feature capability/);
f.story("task", { capabilities: [], status: "passed" });
assert.match(inspect(f).errors.join("\n"), /invalid product status/);
assert.match(inspect(f).errors.join("\n"), /explicit reason/);
f.story("task", { capabilities: "tasks/create" });
assert.match(inspect(f).errors.join("\n"), /array of IDs/);
f.story("task", { capabilities: ["tasks/create"] }, { title: "Other/Task" });
assert.match(inspect(f).errors.join("\n"), /sidebar title/);
});
test("capability renames and unjustified unmapped stories fail", t => {
const f = fixture(t);
f.catalog.entries[0].capabilities = ["tasks/old-name"];
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /unknown feature capability/);
f.catalog.entries[0].capabilities = [];
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /explicit reason/);
f.catalog.entries[0].exception = "Shared foundation";
const file = "ui/storybook/stories/foundations/task.stories.tsx";
f.write(file, "export default {};");
const entry = f.catalog.entries[0];
entry.file = file;
entry.sources = [file, "ui/src/Task.tsx"];
entry.fingerprint = fingerprint(f.root, entry.sources);
entry.sidebarTitle = "Foundations/Task";
f.stories[0].file = file;
f.stories[0].title = entry.sidebarTitle;
assert.deepEqual(validateCatalog(f.root, f.catalog, f.stories), []);
test("metadata is parsed without executing code or accepting obsolete bookkeeping fields", t => {
const f = mapFixture(t);
f.write(f.file, `export default { id: 'task', title: 'Work/Tasks/Test', parameters: { paperclip: (() => { throw new Error('executed'); })() } }; export const Empty = {};`);
assert.throws(() => scanStories(f.root), /expressions are not executed/);
f.story("task", { capabilities: ["tasks/create"], fingerprint: "old" });
assert.throws(() => scanStories(f.root), /unknown paperclip field fingerprint/);
f.write(f.file, "export default { id: 'task', title: 'Work/Tasks/Test', parameters: { paperclip: { capabilities: [], capabilities: [] } } }; export const Empty = {};");
assert.throws(() => scanStories(f.root), /unique literal properties/);
});
test("feature organization rejects wrong folders, sidebar homes and unstable meta IDs", t => {
const f = fixture(t);
f.catalog.entries[0].capabilities = ["tasks/discussion"];
assert.deepEqual(validateCatalog(f.root, f.catalog, f.stories), []);
f.stories[0].metaId = "renamed-task";
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /explicit meta ID/);
f.stories[0].metaId = "tasks-create";
f.stories[0].title = "Unrelated/Task";
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /sidebar title/);
f.stories[0].title = f.catalog.entries[0].sidebarTitle;
const originalFile = f.catalog.entries[0].file;
f.catalog.entries[0].file = "ui/storybook/stories/foundations/task.stories.tsx";
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /primary feature folder tasks/);
f.catalog.entries[0].file = originalFile;
f.write("maps/feature-map/README.md", "### Conversations\n| [Tasks](./tasks.md) | Tasks |\n");
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /sidebar title/);
test("parameter spreads cannot silently overwrite a source annotation", t => {
const f = mapFixture(t);
f.write(f.file, "export default { id: 'task', title: 'Work/Tasks/Test', parameters: { paperclip: { capabilities: [] }, ...other } }; export const Empty = {};");
assert.throws(() => scanStories(f.root), /must follow parameter spreads/);
f.write(f.file, "export default { id: 'task', title: 'Work/Tasks/Test', parameters: { paperclip: { capabilities: [] }, [key]: other } }; export const Empty = {};");
assert.throws(() => scanStories(f.root), /must follow parameter spreads/);
f.write(f.file, "export default { id: 'task', title: 'Work/Tasks/Test', parameters: { ['paperclip']: { capabilities: [] } } }; export const Empty = {};");
assert.throws(() => scanStories(f.root), /must be a literal property/);
});
test("shared foundations cross-list capabilities without moving their canonical home or IDs", t => {
const f = fixture(t);
const entry = f.catalog.entries[0];
const file = "ui/storybook/stories/foundations/task.stories.tsx";
f.write(file, "// shared control example\n");
entry.file = file;
entry.home = "foundations";
entry.exception = "Shared control with related product examples.";
entry.sidebarTitle = "Foundations/Task";
entry.sources = [file, "ui/src/Task.tsx"];
entry.fingerprint = fingerprint(f.root, entry.sources);
f.stories[0] = { ...f.stories[0], file, title: entry.sidebarTitle };
assert.deepEqual(validateCatalog(f.root, f.catalog, f.stories), []);
const index = renderIndex(f.catalog, f.stories, featureIndex(f.root));
assert.match(index, /### Tasks[\s\S]*?No primary story suite/);
assert.match(index, /### Shared foundations and guides[\s\S]*?\[Foundations\/Task\]/);
assert.match(index, /`tasks\/create`: \[Foundations\/Task\]/);
assert.deepEqual(f.stories[0].ids, ["tasks-create--empty"]);
entry.home = "tasks";
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /only shared foundations/);
entry.home = "foundations";
delete entry.exception;
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /foundation home needs an explicit reason/);
test("foundations preserve home and cross-capability references", t => {
const f = mapFixture(t);
f.story("control", { capabilities: ["tasks/create"], home: "foundations", exception: "Shared control", implementation: "production" }, { area: "foundations", title: "Foundations/Control" });
const { catalog, errors } = inspect(f);
assert.deepEqual(errors, []);
assert.equal(catalog.entries.find(entry => entry.stableId === "stable-control").home, "foundations");
f.story("control", { capabilities: ["tasks/create"], home: "foundations" }, { area: "foundations", title: "Foundations/Control" });
assert.match(inspect(f).errors.join("\n"), /foundation home needs an explicit reason/);
});
test("production and shared fixture drift invalidate review fingerprints", t => {
const f = fixture(t);
f.write("ui/src/Task.tsx", "// changed contract\n");
f.write("ui/storybook/.storybook/preview.tsx", "// changed shared mocks\n");
const errors = validateCatalog(f.root, f.catalog, f.stories);
assert.equal(errors.filter(error => error.includes("source changed")).length, 2);
assert.equal(f.catalog.entries[0].fingerprint.length, 64);
test("duplicate IDs, missing replacement references and collisions with generated guides fail", t => {
const f = mapFixture(t);
f.story("other", { capabilities: ["tasks/create"] }, { id: "stable-task" });
assert.match(inspect(f).errors.join("\n"), /Duplicate story IDs/);
f.story("other", { capabilities: ["tasks/create"] }, { id: "feature-map-tasks", exports: "export const Overview = {};" });
assert.match(inspect(f).errors.join("\n"), /Duplicate story IDs/);
f.story("other", { capabilities: ["tasks/create"], replacement: "missing.stories.tsx" });
assert.match(inspect(f).errors.join("\n"), /replacement story is missing/);
});
test("missing and escaping source references cannot certify a review", t => {
const f = fixture(t);
f.catalog.entries[0].sources.push("../outside.ts");
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /invalid review sources/);
test("recipe, component and shared fixture edits need no fingerprint acknowledgements", t => {
const f = mapFixture(t);
const before = inspect(f).catalog;
f.write("ui/src/Task.tsx", "export const Task = () => null;");
f.write("ui/storybook/.storybook/preview-base.tsx", "export default { parameters: { changed: true } };");
const file = "maps/feature-map/tasks.md";
f.write(file, readFileSync(path.join(f.root, file), "utf8").replace("discussion work.", "Discuss revised behavior."));
assert.deepEqual(inspect(f).catalog, before);
assert.deepEqual(inspect(f).errors, []);
});
test("cross-capability lookup retains one canonical file and honest status", t => {
const f = fixture(t);
f.catalog.entries[0].status = "historical";
const index = renderIndex(f.catalog, f.stories, featureIndex(f.root));
assert.match(index, /tasks\/create.*\(historical\)/);
assert.match(index, /tasks\/discussion.*\(historical\)/);
assert.match(index, /1 story files; 1 indexed stories/);
assert.match(index, /historical \/ production \/ fixtures/);
test("check mode needs no generated outputs and generation leaves authored files intact", t => {
const f = mapFixture(t);
const before = readFileSync(path.join(f.root, f.file), "utf8");
generateStorybook(f.root, { write: false });
assert.equal(existsSync(path.join(f.root, "ui/storybook/generated")), false);
generateStorybook(f.root);
assert.ok(existsSync(path.join(f.root, "ui/storybook/generated/catalog.json")));
assert.ok(existsSync(path.join(f.root, "maps/generated/verification.md")));
assert.equal(readFileSync(path.join(f.root, f.file), "utf8"), before);
const first = readFileSync(path.join(f.root, "maps/generated/storybook.md"), "utf8");
generateStorybook(f.root);
assert.equal(readFileSync(path.join(f.root, "maps/generated/storybook.md"), "utf8"), first);
});
test("duplicate story IDs cannot silently collapse distinct examples", t => {
const f = fixture(t);
f.stories[0].ids.push(f.stories[0].ids[0]);
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /Duplicate story IDs/);
test("gap reports combine associations with local verification scope and retain historical gaps", t => {
const f = mapFixture(t);
f.story("task", { capabilities: ["tasks/create"], status: "historical" });
const file = "maps/feature-map/tasks.md";
f.write(file, readFileSync(path.join(f.root, file), "utf8") + "\n### Storybook verification\n\n#### `create`\n\nScope: cli\nStorybook: No story required for the command.\nProduction: Run the command.\nSources: Inspect the CLI.\n");
const { catalog, index } = inspect(f);
const report = renderVerification(catalog, index);
assert.match(report, /2 without a current, mixed or unreviewed example/);
assert.match(report, /No story required for the command/);
assert.match(report, /Production: Run the command/);
});
test("feature index keeps empty homes and cross-feature references in map order", t => {
const f = fixture(t);
f.write("maps/feature-map/README.md", "### Work\n| [Goals](./goals.md) | Align work. |\n| [Tasks](./tasks.md) | Create work. |\n");
f.write("maps/feature-map/goals.md", "## Sub-features\n- `hierarchy`: Link goals.\n## Gotchas\n");
f.catalog.entries[0].capabilities.push("goals/hierarchy");
const index = renderIndex(f.catalog, f.stories, featureIndex(f.root));
assert.ok(index.indexOf("### Goals") < index.indexOf("### Tasks"));
assert.match(index, /### Goals[\s\S]*?No primary story suite/);
assert.match(index, /`goals\/hierarchy`: \[Tasks and conversations\/Tasks\/Create\]/);
});
test("authored stories cannot collide with generated overview IDs", t => {
const f = fixture(t);
f.stories[0].ids = ["feature-map-tasks--overview"];
assert.match(validateCatalog(f.root, f.catalog, f.stories).join("\n"), /Duplicate story IDs/);
});
test("regeneration reports review drift from its own writes without refreshing fingerprints", t => {
const f = fixture(t);
f.write("ui/storybook/.storybook/preview.tsx", "export default { parameters: { options: { storySort: { order: [],\n}, } } };\n");
reconcileFeatureArtifacts(f.root, featureIndex(f.root), true);
f.write("maps/storybook-map/INDEX.md", "");
const generatedSource = "ui/storybook/generated/feature-index.json";
f.catalog.sharedReview.sources.push(generatedSource);
f.catalog.entries[0].sources.push(generatedSource);
f.catalog.sharedReview.fingerprint = fingerprint(f.root, f.catalog.sharedReview.sources);
f.catalog.entries[0].fingerprint = fingerprint(f.root, f.catalog.entries[0].sources);
assert.deepEqual(reconcileCatalog(f.root, f.catalog, f.stories, true), []);
const reviewed = f.catalog.sharedReview.fingerprint;
f.write("maps/feature-map/tasks.md", "## Sub-features\n- `create`: Updated description.\n- `discussion`: discuss\n## Gotchas\n");
const errors = reconcileCatalog(f.root, f.catalog, f.stories, true);
assert.equal(errors.filter(error => error.includes("source changed; review")).length, 2);
assert.equal(f.catalog.sharedReview.fingerprint, reviewed);
assert.notEqual(fingerprint(f.root, f.catalog.sharedReview.sources), reviewed);
f.catalog.sharedReview.fingerprint = fingerprint(f.root, f.catalog.sharedReview.sources);
f.catalog.entries[0].fingerprint = fingerprint(f.root, f.catalog.entries[0].sources);
assert.deepEqual(reconcileCatalog(f.root, f.catalog, f.stories, true), []);
assert.deepEqual(reconcileCatalog(f.root, f.catalog, f.stories), []);
});
test("Storybook parser discovers nested files, filters helpers, preserves explicit IDs and counts play functions", t => {
const f = fixture(t);
f.write("ui/package.json", '{"type":"module"}');
symlinkSync(fileURLToPath(new URL("../ui/node_modules", import.meta.url)), path.join(f.root, "ui/node_modules"), "junction");
f.write(f.file, `
import type { Meta, StoryObj } from "@storybook/react-vite";
const meta = { title: "Tasks/Create", id: "stable-task", excludeStories: ["empty"] } satisfies Meta;
test("the CSF parser preserves explicit IDs, export filtering and play counts", t => {
const f = mapFixture(t);
f.write(f.file, `import type { Meta } from '@storybook/react-vite';
const meta = { id: 'stable-task', title: 'Work/Tasks/Create', excludeStories: ['helper'], parameters: { paperclip: { capabilities: ['tasks/create'] } } } satisfies Meta;
export default meta;
type Story = StoryObj<typeof meta>;
export const empty = { value: "fixture" };
export const Empty: Story = {};
export const Filled: Story = { play: async () => {} };
`);
f.write("ui/storybook/stories/nested/other.stories.ts", `
export default { title: "Other/Subject", includeStories: ["Included"] };
export const helper = {};
export const Included = {};
export const Empty = {};
export const Filled = { play: async () => {} };
`);
f.write("ui/storybook/stories/nested/fixture.ts", "export const fixture = {};");
const stories = scanStories(f.root);
assert.equal(stories.length, 2);
assert.deepEqual(stories.find(story => story.file === f.file), {
file: f.file, title: "Tasks/Create", metaId: "stable-task", ids: ["stable-task--empty", "stable-task--filled"], plays: 1,
const [story] = scanStories(f.root);
assert.deepEqual(story.ids, ["stable-task--empty", "stable-task--filled"]);
assert.equal(story.plays, 1);
});
test("independent story and feature branches merge in either order with identical clean generated maps", t => {
const f = mapFixture(t);
f.write(".gitignore", readFileSync(path.join(f.root, ".gitignore"), "utf8") + "node_modules\n");
const git = (...args) => execFileSync("git", ["-c", "user.name=Map test", "-c", "user.email=map@example.test", "-c", "commit.gpgsign=false", ...args], {
cwd: f.root, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env: { ...process.env, GIT_CONFIG_GLOBAL: "/dev/null", GIT_CONFIG_NOSYSTEM: "1" },
});
assert.deepEqual(stories.find(story => story.file.endsWith("other.stories.ts")), {
file: "ui/storybook/stories/nested/other.stories.ts", title: "Other/Subject", metaId: undefined, ids: ["other-subject--included"], plays: 0,
});
git("init", "-b", "main");
git("add", ".");
git("commit", "-qm", "Initial recipes and story");
git("checkout", "-b", "story-change");
f.story("task", { capabilities: ["tasks/create"], notes: "Retain creation draft." }, { exports: "export const Empty = {}; export const Draft = {};" });
git("add", "."); git("commit", "-qm", "Add task draft example");
git("checkout", "-b", "feature-addition", "main");
f.feature("goals", "Goals", ["hierarchy"], { order: 20 });
f.story("goal", { capabilities: ["goals/hierarchy"] }, { area: "goals", title: "Work/Goals/Goal" });
git("add", "."); git("commit", "-qm", "Add goal capability and example");
const results = [];
for (const [first, second] of [["story-change", "feature-addition"], ["feature-addition", "story-change"]]) {
git("checkout", "-b", `merged-${first}`, "main");
git("merge", "--no-edit", first);
git("merge", "--no-edit", second);
const result = generateStorybook(f.root);
assert.equal(git("status", "--porcelain"), "");
assert.deepEqual(result.stories.flatMap(story => story.ids).sort(), ["stable-goal--empty", "stable-task--draft", "stable-task--empty"]);
results.push(["ui/storybook/generated/catalog.json", "ui/storybook/generated/feature-index.json", "maps/generated/storybook.md", "maps/generated/verification.md", "ui/storybook/.storybook/preview.tsx"].map(file => readFileSync(path.join(f.root, file), "utf8")));
}
assert.deepEqual(results[0], results[1]);
});
+39 -80
View File
@@ -1,51 +1,11 @@
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { featureIndex, mapIndexes, pageInventory, sidebarLabel } from "./feature-map.mjs";
export { featureIndex, sidebarLabel } from "./feature-map.mjs";
export const generatedRoot = "ui/storybook/generated";
export const sidebarLabel = title => title.replaceAll("/", ", ");
export function featureIndex(root) {
const sections = [];
let section;
const seen = new Set();
const source = readFileSync(path.join(root, "maps/feature-map/README.md"), "utf8");
for (const line of source.split("\n")) {
if (line.startsWith("### ")) {
section = { title: line.slice(4), features: [] };
sections.push(section);
}
const match = line.match(/^\| \[([^\]]+)\]\(\.\/([a-z0-9-]+)\.md\) \| (.*) \|$/);
if (!match) {
if (line.startsWith("| [")) throw new Error(`Unrecognized feature-map row: ${line}`);
continue;
}
if (!section || seen.has(match[2])) throw new Error(`Invalid feature-map entry: ${line}`);
const [, title, id, description] = match;
seen.add(id);
const recipe = readFileSync(path.join(root, `maps/feature-map/${id}.md`), "utf8");
const body = recipe.split(/^## Sub-features\s*$/m)[1]?.split(/^## /m)[0];
if (!body) throw new Error(`Missing sub-features: ${id}`);
const capabilities = [];
for (const row of body.trim().split("\n")) {
const capability = row.match(/^- `([^`]+)`:\s*(.*)$/);
if (capability) {
const [, key, text] = capability;
capabilities.push({ id: `${id}/${key}`, label: key.replaceAll("-", " ").replace(/^./, letter => letter.toUpperCase()), description: text });
} else if (row.trim() && capabilities.length) {
capabilities.at(-1).description += ` ${row.trim()}`;
}
}
if (!capabilities.length || new Set(capabilities.map(item => item.id)).size !== capabilities.length) throw new Error(`Invalid sub-features: ${id}`);
section.features.push({ id, title, description, capabilities });
}
const populated = sections.filter(item => item.features.length);
if (!populated.length) throw new Error("Feature-map index has no feature families");
for (const file of readdirSync(path.join(root, "maps/feature-map"))) {
if (file.endsWith(".md") && file !== "README.md" && !seen.has(file.slice(0, -3))) throw new Error(`Feature recipe missing from index: ${file}`);
}
return { sections: populated };
}
export const generatedPreview = "ui/storybook/.storybook/preview.tsx";
export function featureOrder(index) {
return ["Overview", ...index.sections.flatMap(section => [sidebarLabel(section.title),
@@ -56,6 +16,24 @@ export function featureOrder(index) {
export function featureArtifacts(index) {
const outputs = new Map([
[`${generatedRoot}/feature-index.json`, JSON.stringify(index, null, 2) + "\n"],
[generatedPreview, [
'import type { Preview } from "@storybook/react-vite";',
'import base from "./preview-base";',
"",
"const preview: Preview = {",
" ...base,",
" parameters: {",
" ...base.parameters,",
" options: {",
" ...base.parameters?.options,",
` storySort: { order: ${JSON.stringify(featureOrder(index))} },`,
" },",
" },",
"};",
"export default preview;",
"",
].join("\n")],
...mapIndexes(index),
]);
for (const section of index.sections) {
for (const feature of section.features) {
@@ -80,47 +58,28 @@ export function featureArtifacts(index) {
return outputs;
}
export function reconcileFeatureArtifacts(root, index, write = false) {
const outputs = featureArtifacts(index);
const errors = [];
function inspect(directory) {
if (!existsSync(path.join(root, directory))) return;
for (const entry of readdirSync(path.join(root, directory), { withFileTypes: true })) {
const file = `${directory}/${entry.name}`;
if (entry.isDirectory()) inspect(file);
else if (!outputs.has(file)) errors.push(`Unexpected generated feature file: ${file}`);
}
}
inspect(generatedRoot);
if (errors.length) return errors;
export function writeArtifacts(root, outputs) {
for (const [file, content] of outputs) {
const destination = path.join(root, file);
if (write) {
mkdirSync(path.dirname(destination), { recursive: true });
writeFileSync(destination, content);
} else if (!existsSync(destination) || readFileSync(destination, "utf8") !== content) {
errors.push(`${file}: generated feature index is stale; run storybook-catalog.mjs --write`);
if (existsSync(destination) && readFileSync(destination, "utf8") === content) continue;
mkdirSync(path.dirname(destination), { recursive: true });
writeFileSync(destination, content);
}
}
export function generateFeatureArtifacts(root, index = featureIndex(root)) {
const outputs = featureArtifacts(index);
outputs.set("maps/generated/coverage.json", JSON.stringify(pageInventory(root, index), null, 2) + "\n");
const directory = `${generatedRoot}/features`;
if (existsSync(path.join(root, directory))) {
for (const name of readdirSync(path.join(root, directory))) {
const file = `${directory}/${name}`;
if (name.endsWith(".stories.tsx") && !outputs.has(file)) rmSync(path.join(root, file), { force: true });
}
}
const previewFile = "ui/storybook/.storybook/preview.tsx";
const previewPath = path.join(root, previewFile);
const preview = readFileSync(previewPath, "utf8");
const pattern = /(\bstorySort:\s*\{\s*order:\s*)([\s\S]*?)(,\s*\n\s*\},)/g;
if ([...preview.matchAll(pattern)].length !== 1) throw new Error("Expected one inline storySort.order in preview.tsx");
const order = JSON.stringify(featureOrder(index), null, 2)
.replace(/("[^"]+",)\n\s+\[\n\s+"Overview",\n\s+"\*"\n\s+\]/g, '$1 ["Overview", "*"]')
.replaceAll("\n", "\n ");
const updated = preview.replace(pattern, (_, before, value, after) => before + order + after);
if (write) writeFileSync(previewPath, updated);
else if (updated !== preview) errors.push(`${previewFile}: generated sidebar order is stale; run storybook-catalog.mjs --write`);
return errors;
writeArtifacts(root, outputs);
}
if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
const root = fileURLToPath(new URL("..", import.meta.url));
const errors = reconcileFeatureArtifacts(root, featureIndex(root));
if (errors.length) {
errors.forEach(error => console.error(error));
process.exitCode = 1;
}
generateFeatureArtifacts(fileURLToPath(new URL("..", import.meta.url)));
}
+84 -59
View File
@@ -1,73 +1,98 @@
import assert from "node:assert/strict";
import { mkdtempSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs";
import os from "node:os";
import fs, { existsSync, readFileSync, rmSync } from "node:fs";
import { syncBuiltinESMExports } from "node:module";
import path from "node:path";
import { test } from "node:test";
import { featureArtifacts, featureIndex, featureOrder, reconcileFeatureArtifacts } from "./storybook-feature-index.mjs";
import { featureArtifacts, featureIndex, featureOrder, generateFeatureArtifacts } from "./storybook-feature-index.mjs";
import { mapFixture } from "./map-test-fixture.mjs";
function fixture(t) {
const root = mkdtempSync(path.join(os.tmpdir(), "storybook-feature-index-"));
t.after(() => rmSync(root, { recursive: true, force: true }));
const write = (file, text) => {
mkdirSync(path.dirname(path.join(root, file)), { recursive: true });
writeFileSync(path.join(root, file), text);
};
write("maps/feature-map/README.md", "# Map\n### Work\n| [Tasks](./tasks.md) | Create and follow work. |\n| [Goals](./goals.md) | Align work. |\n### Connections\n| [Apps](./apps.md) | Connect tools. |\n");
write("maps/feature-map/tasks.md", "# Tasks\n## Sub-features\n- `create`: Create work;\n retain the initial description.\n- `review`: Review it.\n## How to get to it\nNot a capability.\n");
write("maps/feature-map/goals.md", "# Goals\n## Sub-features\n- `hierarchy`: Link goals.\n## Gotchas\n");
write("maps/feature-map/apps.md", "# Apps\n## Sub-features\n- `connect`: Connect an app.\n## Gotchas\n");
write("ui/storybook/.storybook/preview.tsx", "export default { parameters: { options: { storySort: { order: [],\n}, unrelated: true } } };\n");
return { root, write };
}
test("feature index preserves recipe names, map order, and multiline capability descriptions", t => {
const { root } = fixture(t);
const index = featureIndex(root);
test("recipes own discovery, names, section order and multiline capability descriptions", t => {
const f = mapFixture(t);
f.feature("goals", "Goals", ["hierarchy"], { order: 20 });
f.feature("apps", "Apps", ["connect"], { section: "Connections", sectionOrder: 20 });
const recipe = path.join(f.root, "maps/feature-map/tasks.md");
f.write("maps/feature-map/tasks.md", readFileSync(recipe, "utf8").replace("create work.", "Create work;\n retain its description."));
const index = featureIndex(f.root);
assert.deepEqual(index.sections.map(section => section.title), ["Work", "Connections"]);
assert.deepEqual(index.sections.flatMap(section => section.features.map(feature => feature.id)), ["tasks", "goals", "apps"]);
assert.deepEqual(index.sections[0].features[0].capabilities, [
{ id: "tasks/create", label: "Create", description: "Create work; retain the initial description." },
{ id: "tasks/review", label: "Review", description: "Review it." },
]);
assert.equal(index.sections[0].features[0].capabilities[0].description, "Create work; retain its description.");
assert.deepEqual(featureOrder(index), ["Overview", "Work", ["Tasks", ["Overview", "*"], "Goals", ["Overview", "*"]], "Connections", ["Apps", ["Overview", "*"]], "Foundations"]);
});
test("every feature gets a stable overview, including features with no authored stories", t => {
const { root } = fixture(t);
const index = featureIndex(root);
const outputs = featureArtifacts(index);
const file = "ui/storybook/generated/features/goals.stories.tsx";
assert.match(outputs.get(file), /id: "feature-map-goals"/);
assert.match(outputs.get(file), /title: "Work\/Goals\/Overview"/);
index.sections[0].features[1].title = "Work alignment";
assert.match(featureArtifacts(index).get(file), /id: "feature-map-goals"/);
assert.match(featureArtifacts(index).get(file), /title: "Work\/Work alignment\/Overview"/);
index.sections[0].features[1].title = "CLI/API and local worktrees";
assert.match(featureArtifacts(index).get(file), /title: "Work\/CLI, API and local worktrees\/Overview"/);
assert.ok(featureOrder(index)[2].includes("CLI, API and local worktrees"));
test("equal local orders preserve independently added features using their stable filename", t => {
const f = mapFixture(t);
f.feature("goals", "Goals");
f.feature("apps", "Apps");
assert.deepEqual(featureIndex(f.root).sections[0].features.map(feature => feature.id), ["apps", "goals", "tasks"]);
});
test("generated guides detect upstream drift, local edits, missing files, and unknown files", t => {
const { root, write } = fixture(t);
const index = featureIndex(root);
assert.equal(reconcileFeatureArtifacts(root, index).length, 5);
assert.deepEqual(reconcileFeatureArtifacts(root, index, true), []);
assert.deepEqual(reconcileFeatureArtifacts(root, index), []);
write("ui/storybook/generated/features/goals.stories.tsx", "export default {};");
assert.match(reconcileFeatureArtifacts(root, index).join("\n"), /goals.stories.tsx: generated feature index is stale/);
reconcileFeatureArtifacts(root, index, true);
index.sections.reverse();
assert.match(reconcileFeatureArtifacts(root, index).join("\n"), /preview.tsx: generated sidebar order is stale/);
assert.match(readFileSync(path.join(root, "ui/storybook/.storybook/preview.tsx"), "utf8"), /unrelated: true/);
write("ui/storybook/generated/features/orphan.stories.tsx", "keep this visible");
assert.match(reconcileFeatureArtifacts(root, index, true).join("\n"), /Unexpected generated feature file/);
assert.equal(readFileSync(path.join(root, "ui/storybook/generated/features/orphan.stories.tsx"), "utf8"), "keep this visible");
test("every discovered feature gets a stable overview, including areas without stories", t => {
const f = mapFixture(t);
f.feature("goals", "CLI/API and goals", ["hierarchy"]);
const index = featureIndex(f.root);
const output = featureArtifacts(index).get("ui/storybook/generated/features/goals.stories.tsx");
assert.match(output, /id: "feature-map-goals"/);
assert.match(output, /title: "Work\/CLI, API and goals\/Overview"/);
});
test("malformed or omitted map entries fail instead of silently hiding a feature", t => {
const { root, write } = fixture(t);
write("maps/feature-map/README.md", "### Work\n| [Tasks](./tasks.md) | Tasks |\n");
assert.throws(() => featureIndex(root), /missing from index/);
write("maps/feature-map/README.md", "### Work\n| [Tasks](tasks.md) | Tasks |\n");
assert.throws(() => featureIndex(root), /Unrecognized feature-map row/);
test("fresh generation rebuilds missing outputs, removes retired overviews and never edits authored preview", t => {
const f = mapFixture(t);
const authored = readFileSync(path.join(f.root, "ui/storybook/.storybook/preview-base.tsx"), "utf8");
f.feature("goals", "Goals", ["hierarchy"]);
generateFeatureArtifacts(f.root);
const overview = path.join(f.root, "ui/storybook/generated/features/goals.stories.tsx");
assert.ok(existsSync(overview));
assert.match(readFileSync(path.join(f.root, "ui/storybook/.storybook/preview.tsx"), "utf8"), /storySort: \{ order: \[/);
rmSync(path.join(f.root, "maps/feature-map/goals.md"));
rmSync(path.join(f.root, "maps/agent-access-map/goals.md"));
generateFeatureArtifacts(f.root);
assert.equal(existsSync(overview), false);
assert.equal(readFileSync(path.join(f.root, "ui/storybook/.storybook/preview-base.tsx"), "utf8"), authored);
assert.match(readFileSync(path.join(f.root, "maps/generated/feature-map.md"), "utf8"), /Tasks/);
});
test("missing metadata, duplicate capabilities and inconsistent group order fail visibly", t => {
const f = mapFixture(t);
f.write("maps/feature-map/new.md", "# New\n");
assert.throws(() => featureIndex(f.root), /missing navigation/);
f.feature("new", "New", ["create", "create"]);
assert.throws(() => featureIndex(f.root), /duplicate capability/);
f.feature("new", "New", ["create"], { sectionOrder: 99 });
assert.throws(() => featureIndex(f.root), /inconsistent section order/);
});
test("overlapping generators can both retire the same overview", t => {
const f = mapFixture(t);
const retired = "ui/storybook/generated/features/retired.stories.tsx";
f.write(retired, "export const Overview = {};\n");
const directory = path.join(f.root, "ui/storybook/generated/features");
const readDirectory = fs.readdirSync;
let competed = false;
// Reproduce the interleaving deterministically: the other generator removes
// the file after this generator lists it, before this generator removes it.
const mock = t.mock.method(fs, "readdirSync", (...args) => {
const listing = readDirectory(...args);
if (args[0] === directory && !competed) {
competed = true;
rmSync(path.join(f.root, retired));
}
return listing;
});
syncBuiltinESMExports();
try {
generateFeatureArtifacts(f.root);
assert.equal(competed, true);
assert.equal(existsSync(path.join(f.root, retired)), false);
assert.ok(existsSync(path.join(directory, "tasks.stories.tsx")));
} finally {
mock.mock.restore();
syncBuiltinESMExports();
}
});
test("verification guidance rejects orphan capability references", t => {
const f = mapFixture(t);
const file = "maps/feature-map/tasks.md";
f.write(file, readFileSync(path.join(f.root, file), "utf8") + "\n### Storybook verification\n\n#### `missing`\n\nScope: cli\nStorybook: Use CLI.\nProduction: Execute.\nSources: Inspect.\n");
assert.throws(() => featureIndex(f.root), /unknown or duplicate verification capability/);
});
@@ -1,7 +1,7 @@
import { defineConfig } from "@playwright/test";
export default defineConfig({
testDir: ".",
testMatch: "feature-gap-stories.spec.ts",
testMatch: ["feature-gap-stories.spec.ts", "map-navigation.spec.ts"],
timeout: 60_000,
expect: { timeout: 15_000 },
retries: 0,
@@ -1,20 +1,14 @@
import { assertRenderState } from "./feature-gap-render-states";
import { readFileSync, writeFileSync } from "node:fs";
import { writeFileSync } from "node:fs";
import { expect, test } from "@playwright/test";
import { scanStories } from "../../scripts/storybook-catalog.mjs";
import { generateStorybook } from "../../scripts/storybook-catalog.mjs";
const root = new URL("../../", import.meta.url).pathname;
const catalog = JSON.parse(
readFileSync(
new URL("../../maps/storybook-map/catalog.json", import.meta.url),
"utf8",
),
);
const { catalog, stories: parsed } = generateStorybook(root, { write: false });
const suites = catalog.entries.filter(
(entry: { stableId: string }) =>
entry.stableId.startsWith("feature-") &&
!entry.stableId.startsWith("feature-map-"),
);
const parsed = scanStories(root);
let index: { entries: Record<string, { tags: string[] }> };
test.beforeAll(async ({ request }) => {
const response = await request.get("/index.json");
@@ -42,6 +36,7 @@ for (const suite of suites) {
const file = parsed.find(
(story: { file: string }) => story.file === suite.file,
);
if (!file) throw new Error(`Missing parsed story: ${suite.file}`);
for (const id of file.ids) {
test(id, async ({ page }, info) => {
expect(
@@ -0,0 +1,38 @@
import { expect, test } from "@playwright/test";
// Exercise the generated guide through the built Storybook manager. These checks
// need no image baselines and do not imply production acceptance.
test("guide filters and opens an area without story examples", async ({ page }) => {
const errors: string[] = [];
page.on("pageerror", error => errors.push(error.message));
await page.goto("/?path=/story/overview-storybook-guide--coverage-guide");
const frame = page.frameLocator("#storybook-preview-iframe");
await expect(frame.getByRole("heading", { name: "Paperclip feature map" })).toBeVisible();
await frame.getByRole("textbox", { name: "Find a feature or capability" }).fill("cli-operations");
await frame.getByRole("link", { name: "CLI/API and local worktrees", exact: true }).click();
await expect(page).toHaveURL(/feature-map-cli-operations--overview/);
await expect(frame.getByRole("heading", { name: "CLI/API and local worktrees", exact: true })).toBeVisible();
const capability = frame.locator("section#context");
await expect(capability.getByText(/No cataloged example yet/)).toBeVisible();
await capability.getByText("Verification scope", { exact: true }).click();
await expect(capability.getByText("No authored story required for CLI profile/context selection.", { exact: true })).toBeVisible();
await expect(capability.getByRole("link", { name: "context.ts", exact: true })).toHaveAttribute("href", "https://github.com/paperclipai/paperclip/blob/master/cli/src/commands/client/context.ts");
await expect(frame.getByRole("link", { name: "Agent access contract" })).toHaveAttribute("href", /agent-access-map\/cli-operations\.md$/);
expect(errors).toEqual([]);
});
test("capability order and related foundations links survive generation", async ({ page }) => {
const errors: string[] = [];
page.on("pageerror", error => errors.push(error.message));
await page.goto("/?path=/story/feature-map-developer-labs--overview");
const frame = page.frameLocator("#storybook-preview-iframe");
await expect(frame.getByRole("navigation", { name: "Capabilities" }).getByRole("link")).toHaveText(["Design", "Interaction labs", "Performance", "Route gates"]);
const design = frame.locator("section#design");
const related = design.getByRole("link", { name: "Primitive Matrix", exact: true });
await expect(related).toHaveAttribute("href", /foundations-primitive-matrix--/);
await related.click();
await expect(page).toHaveURL(/foundations-primitive-matrix--/);
await expect(frame.locator("body")).toHaveClass(/sb-show-main/);
await expect(frame.locator("#storybook-root")).not.toBeEmpty();
expect(errors).toEqual([]);
});
+3 -3
View File
@@ -17,10 +17,10 @@
"dev": "vite",
"build": "vite build",
"build:preview": "vite build --config vite.preview.config.mjs",
"storybook": "node ../scripts/storybook-feature-index.mjs && storybook dev -p 6006 -c storybook/.storybook",
"build-storybook": "node ../scripts/storybook-feature-index.mjs && storybook build -c storybook/.storybook -o storybook-static",
"storybook": "storybook dev -p 6006 -c storybook/.storybook",
"build-storybook": "storybook build -c storybook/.storybook -o storybook-static",
"preview": "vite preview",
"typecheck": "tsc -b",
"typecheck": "node ../scripts/storybook-catalog.mjs && tsc -b",
"clean": "rm -rf dist dist-preview storybook-static tsconfig.tsbuildinfo",
"prepack": "rm -f package.dev.json && cp package.json package.dev.json && node ../scripts/generate-ui-package-json.mjs",
"postpack": "if [ -f package.dev.json ]; then mv package.dev.json package.json; fi"
+3
View File
@@ -4,6 +4,9 @@ import type { StorybookConfig } from "@storybook/react-vite";
import tailwindcss from "@tailwindcss/vite";
import { mergeConfig } from "vite";
import { storybookAgentAvatarAssets } from "../../../scripts/storybook-agent-avatar-assets.mjs";
import { generateStorybook } from "../../../scripts/storybook-catalog.mjs";
generateStorybook();
const storybookConfigDir = path.dirname(fileURLToPath(import.meta.url));
const paperclipInstanceOrigin = (() => {
@@ -852,73 +852,6 @@ const preview: Preview = {
},
},
parameters: {
options: {
storySort: {
order: [
"Overview",
"Getting started and access",
[
"Onboarding and first work", ["Overview", "*"],
"Login, invitations, and access", ["Overview", "*"],
"Companies and portability", ["Overview", "*"]
],
"Tasks and conversations",
[
"Task creation and lifecycle", ["Overview", "*"],
"Delegation, dependencies, and signoff", ["Overview", "*"],
"Inbox, decisions, and search", ["Overview", "*"],
"Agent conversations and project handoff", ["Overview", "*"],
"Questions and approvals", ["Overview", "*"],
"Steering and queued messages", ["Overview", "*"],
"Documents, attachments, and work products", ["Overview", "*"]
],
"Agents and reusable capabilities",
[
"Hiring, configuration, and organization", ["Overview", "*"],
"Runs, harnesses, and model accounts", ["Overview", "*"],
"Skills and Skill Studio", ["Overview", "*"],
"Team packages and installation", ["Overview", "*"]
],
"Projects and execution",
[
"Projects and repositories", ["Overview", "*"],
"Goals and work alignment", ["Overview", "*"],
"Workspaces, services, and files", ["Overview", "*"],
"Execution environments", ["Overview", "*"],
"Recovery", ["Overview", "*"]
],
"Apps, channels, and extensions",
[
"Connection setup", ["Overview", "*"],
"App access and action permissions", ["Overview", "*"],
"External chat and email", ["Overview", "*"],
"Tool gateways and access profiles", ["Overview", "*"],
"Secrets and proposals", ["Overview", "*"],
"Plugins", ["Overview", "*"]
],
"Automation and structured work",
[
"Routines, schedules, and triggers", ["Overview", "*"],
"Pipelines, review queues, and learnings", ["Overview", "*"],
"Cases", ["Overview", "*"],
"Status cards", ["Overview", "*"]
],
"Oversight and operation",
[
"Costs and budgets", ["Overview", "*"],
"Dashboards and audit trails", ["Overview", "*"],
"Navigation, profile, and announcements", ["Overview", "*"],
"Instance operations", ["Overview", "*"],
"CLI, API and local worktrees", ["Overview", "*"]
],
"Contributor surfaces",
[
"Developer previews and diagnostic labs", ["Overview", "*"]
],
"Foundations"
],
},
},
actions: { argTypesRegex: "^on[A-Z].*" },
a11y: {
test: "error",
File diff suppressed because it is too large. Load diff
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-access",
title: "Getting started and access/Login, invitations, and access/Overview",
component: FeatureOverview,
args: { area: "access" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-activity",
title: "Oversight and operation/Dashboards and audit trails/Overview",
component: FeatureOverview,
args: { area: "activity" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-agent-chat",
title: "Tasks and conversations/Agent conversations and project handoff/Overview",
component: FeatureOverview,
args: { area: "agent-chat" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-agents",
title: "Agents and reusable capabilities/Hiring, configuration, and organization/Overview",
component: FeatureOverview,
args: { area: "agents" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-app-permissions",
title: "Apps, channels, and extensions/App access and action permissions/Overview",
component: FeatureOverview,
args: { area: "app-permissions" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-budgets-costs",
title: "Oversight and operation/Costs and budgets/Overview",
component: FeatureOverview,
args: { area: "budgets-costs" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-cases",
title: "Automation and structured work/Cases/Overview",
component: FeatureOverview,
args: { area: "cases" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-chat-channels",
title: "Apps, channels, and extensions/External chat and email/Overview",
component: FeatureOverview,
args: { area: "chat-channels" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-cli-operations",
title: "Oversight and operation/CLI, API and local worktrees/Overview",
component: FeatureOverview,
args: { area: "cli-operations" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-companies",
title: "Getting started and access/Companies and portability/Overview",
component: FeatureOverview,
args: { area: "companies" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-connection-setup",
title: "Apps, channels, and extensions/Connection setup/Overview",
component: FeatureOverview,
args: { area: "connection-setup" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-developer-labs",
title: "Contributor surfaces/Developer previews and diagnostic labs/Overview",
component: FeatureOverview,
args: { area: "developer-labs" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-documents-artifacts",
title: "Tasks and conversations/Documents, attachments, and work products/Overview",
component: FeatureOverview,
args: { area: "documents-artifacts" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-execution-environments",
title: "Projects and execution/Execution environments/Overview",
component: FeatureOverview,
args: { area: "execution-environments" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-gateways-profiles",
title: "Apps, channels, and extensions/Tool gateways and access profiles/Overview",
component: FeatureOverview,
args: { area: "gateways-profiles" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-goals",
title: "Projects and execution/Goals and work alignment/Overview",
component: FeatureOverview,
args: { area: "goals" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-inbox-search",
title: "Tasks and conversations/Inbox, decisions, and search/Overview",
component: FeatureOverview,
args: { area: "inbox-search" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-instance-operations",
title: "Oversight and operation/Instance operations/Overview",
component: FeatureOverview,
args: { area: "instance-operations" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-navigation-preferences",
title: "Oversight and operation/Navigation, profile, and announcements/Overview",
component: FeatureOverview,
args: { area: "navigation-preferences" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-onboarding",
title: "Getting started and access/Onboarding and first work/Overview",
component: FeatureOverview,
args: { area: "onboarding" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-pipelines",
title: "Automation and structured work/Pipelines, review queues, and learnings/Overview",
component: FeatureOverview,
args: { area: "pipelines" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-plugins",
title: "Apps, channels, and extensions/Plugins/Overview",
component: FeatureOverview,
args: { area: "plugins" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-projects",
title: "Projects and execution/Projects and repositories/Overview",
component: FeatureOverview,
args: { area: "projects" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-questions-and-approvals",
title: "Tasks and conversations/Questions and approvals/Overview",
component: FeatureOverview,
args: { area: "questions-and-approvals" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-recovery",
title: "Projects and execution/Recovery/Overview",
component: FeatureOverview,
args: { area: "recovery" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-routines",
title: "Automation and structured work/Routines, schedules, and triggers/Overview",
component: FeatureOverview,
args: { area: "routines" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-runs-adapters",
title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/Overview",
component: FeatureOverview,
args: { area: "runs-adapters" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-secrets",
title: "Apps, channels, and extensions/Secrets and proposals/Overview",
component: FeatureOverview,
args: { area: "secrets" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-skills",
title: "Agents and reusable capabilities/Skills and Skill Studio/Overview",
component: FeatureOverview,
args: { area: "skills" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-status-cards",
title: "Automation and structured work/Status cards/Overview",
component: FeatureOverview,
args: { area: "status-cards" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-steering",
title: "Tasks and conversations/Steering and queued messages/Overview",
component: FeatureOverview,
args: { area: "steering" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
@@ -1,13 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react-vite";
import { FeatureOverview } from "../../support/feature-map/FeatureOverview";
const meta = {
id: "feature-map-task-coordination",
title: "Tasks and conversations/Delegation, dependencies, and signoff/Overview",
component: FeatureOverview,
args: { area: "task-coordination" },
tags: ["!autodocs"],
parameters: { layout: "fullscreen" },
} satisfies Meta<typeof FeatureOverview>;
export default meta;
export const Overview: StoryObj<typeof meta> = {};
Loaded 100 of 367 files, more files were not shown because too many files have changed in this diff. Show more