diff --git a/.agents/skills/create-verification-skill/SKILL.md b/.agents/skills/create-verification-skill/SKILL.md index 782513a549b..1897be5cdcb 100644 --- a/.agents/skills/create-verification-skill/SKILL.md +++ b/.agents/skills/create-verification-skill/SKILL.md @@ -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-/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 `, 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 diff --git a/.agents/skills/maintain-storybook/SKILL.md b/.agents/skills/maintain-storybook/SKILL.md index 417b07ab20d..7fbb804bf0a 100644 --- a/.agents/skills/maintain-storybook/SKILL.md +++ b/.agents/skills/maintain-storybook/SKILL.md @@ -62,40 +62,38 @@ built `index.json`; use explicit meta IDs when needed and compare IDs afterward. Place stories under `ui/storybook/stories//`. 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---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---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. diff --git a/.agents/skills/maintain-verification-skill/SKILL.md b/.agents/skills/maintain-verification-skill/SKILL.md index 8d261ef3fb4..c30385aa8d8 100644 --- a/.agents/skills/maintain-verification-skill/SKILL.md +++ b/.agents/skills/maintain-verification-skill/SKILL.md @@ -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 diff --git a/.agents/skills/review-storybook/SKILL.md b/.agents/skills/review-storybook/SKILL.md index 216701e4924..603b903a433 100644 --- a/.agents/skills/review-storybook/SKILL.md +++ b/.agents/skills/review-storybook/SKILL.md @@ -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 diff --git a/.agents/skills/verify-paperclip/SKILL.md b/.agents/skills/verify-paperclip/SKILL.md index 9e10d7c2f90..b570578d092 100644 --- a/.agents/skills/verify-paperclip/SKILL.md +++ b/.agents/skills/verify-paperclip/SKILL.md @@ -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 diff --git a/.gitignore b/.gitignore index 20034f04bcb..8a43761535a 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/AGENTS.md b/AGENTS.md index 8060761c160..2fe511d0b0c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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: diff --git a/doc/DEVELOPING.md b/doc/DEVELOPING.md index 2a35c21259e..3fa2691e3f3 100644 --- a/doc/DEVELOPING.md +++ b/doc/DEVELOPING.md @@ -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//` 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 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 diff --git a/maps/README.md b/maps/README.md index d747280d101..2ea07cdd7fd 100644 --- a/maps/README.md +++ b/maps/README.md @@ -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/.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. diff --git a/maps/agent-access-map/README.md b/maps/agent-access-map/README.md index b8d6986494d..97e156b878b 100644 --- a/maps/agent-access-map/README.md +++ b/maps/agent-access-map/README.md @@ -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 diff --git a/maps/feature-map/README.md b/maps/feature-map/README.md index 94aae4ea71c..c99d1ba3fc0 100644 --- a/maps/feature-map/README.md +++ b/maps/feature-map/README.md @@ -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. diff --git a/maps/feature-map/access.md b/maps/feature-map/access.md index 7bfed7126ee..406adb138f8 100644 --- a/maps/feature-map/access.md +++ b/maps/feature-map/access.md @@ -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) diff --git a/maps/feature-map/activity.md b/maps/feature-map/activity.md index 49f9489906f..7763cad03ed 100644 --- a/maps/feature-map/activity.md +++ b/maps/feature-map/activity.md @@ -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) diff --git a/maps/feature-map/agent-chat.md b/maps/feature-map/agent-chat.md index 7152588c2fc..a5fc7048e1d 100644 --- a/maps/feature-map/agent-chat.md +++ b/maps/feature-map/agent-chat.md @@ -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) diff --git a/maps/feature-map/agents.md b/maps/feature-map/agents.md index db866c65d14..d9a9ae8e755 100644 --- a/maps/feature-map/agents.md +++ b/maps/feature-map/agents.md @@ -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. diff --git a/maps/feature-map/app-permissions.md b/maps/feature-map/app-permissions.md index 7726294d328..521ca22fec0 100644 --- a/maps/feature-map/app-permissions.md +++ b/maps/feature-map/app-permissions.md @@ -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) diff --git a/maps/feature-map/budgets-costs.md b/maps/feature-map/budgets-costs.md index 2c7fed9149e..1a71daec1c7 100644 --- a/maps/feature-map/budgets-costs.md +++ b/maps/feature-map/budgets-costs.md @@ -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) diff --git a/maps/feature-map/cases.md b/maps/feature-map/cases.md index a36ad4b9c13..41fccd07fc2 100644 --- a/maps/feature-map/cases.md +++ b/maps/feature-map/cases.md @@ -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) diff --git a/maps/feature-map/chat-channels.md b/maps/feature-map/chat-channels.md index edc4337e531..00f0918b261 100644 --- a/maps/feature-map/chat-channels.md +++ b/maps/feature-map/chat-channels.md @@ -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. diff --git a/maps/feature-map/cli-operations.md b/maps/feature-map/cli-operations.md index e3ddaeb6e38..b8ad053c22c 100644 --- a/maps/feature-map/cli-operations.md +++ b/maps/feature-map/cli-operations.md @@ -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) diff --git a/maps/feature-map/companies.md b/maps/feature-map/companies.md index b4fbbfed251..12b7caac314 100644 --- a/maps/feature-map/companies.md +++ b/maps/feature-map/companies.md @@ -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. diff --git a/maps/feature-map/connection-setup.md b/maps/feature-map/connection-setup.md index f98f29b4721..bc4257662a8 100644 --- a/maps/feature-map/connection-setup.md +++ b/maps/feature-map/connection-setup.md @@ -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. diff --git a/maps/feature-map/coverage.json b/maps/feature-map/coverage.json deleted file mode 100644 index 7fc99df425e..00000000000 --- a/maps/feature-map/coverage.json +++ /dev/null @@ -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" - ] - } - ] -} diff --git a/maps/feature-map/developer-labs.md b/maps/feature-map/developer-labs.md index f2cdeb607d1..70f027621f9 100644 --- a/maps/feature-map/developer-labs.md +++ b/maps/feature-map/developer-labs.md @@ -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. diff --git a/maps/feature-map/documents-artifacts.md b/maps/feature-map/documents-artifacts.md index c3ae6f1c3cd..37be4f67dc4 100644 --- a/maps/feature-map/documents-artifacts.md +++ b/maps/feature-map/documents-artifacts.md @@ -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. diff --git a/maps/feature-map/execution-environments.md b/maps/feature-map/execution-environments.md index dda710a1d89..00d59b7dcb8 100644 --- a/maps/feature-map/execution-environments.md +++ b/maps/feature-map/execution-environments.md @@ -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) diff --git a/maps/feature-map/gateways-profiles.md b/maps/feature-map/gateways-profiles.md index de5f4b58e9d..2fc7eae8779 100644 --- a/maps/feature-map/gateways-profiles.md +++ b/maps/feature-map/gateways-profiles.md @@ -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) diff --git a/maps/feature-map/goals.md b/maps/feature-map/goals.md index 44322e7fbe3..e133ab5d112 100644 --- a/maps/feature-map/goals.md +++ b/maps/feature-map/goals.md @@ -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. diff --git a/maps/feature-map/inbox-search.md b/maps/feature-map/inbox-search.md index 4c5b60696b9..04d20711aed 100644 --- a/maps/feature-map/inbox-search.md +++ b/maps/feature-map/inbox-search.md @@ -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) diff --git a/maps/feature-map/instance-operations.md b/maps/feature-map/instance-operations.md index e83ef87450f..d04297487d5 100644 --- a/maps/feature-map/instance-operations.md +++ b/maps/feature-map/instance-operations.md @@ -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) diff --git a/maps/feature-map/navigation-preferences.md b/maps/feature-map/navigation-preferences.md index bb2490483c4..c12be921974 100644 --- a/maps/feature-map/navigation-preferences.md +++ b/maps/feature-map/navigation-preferences.md @@ -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) diff --git a/maps/feature-map/onboarding.md b/maps/feature-map/onboarding.md index ecfaeefaaef..6a79b77d484 100644 --- a/maps/feature-map/onboarding.md +++ b/maps/feature-map/onboarding.md @@ -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. diff --git a/maps/feature-map/pipelines.md b/maps/feature-map/pipelines.md index a8f7780796a..471d45fe003 100644 --- a/maps/feature-map/pipelines.md +++ b/maps/feature-map/pipelines.md @@ -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) diff --git a/maps/feature-map/plugins.md b/maps/feature-map/plugins.md index 839f2a5e26e..5126c080c3f 100644 --- a/maps/feature-map/plugins.md +++ b/maps/feature-map/plugins.md @@ -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. diff --git a/maps/feature-map/projects.md b/maps/feature-map/projects.md index 0ed3470073f..6e4d042cc8d 100644 --- a/maps/feature-map/projects.md +++ b/maps/feature-map/projects.md @@ -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. diff --git a/maps/feature-map/questions-and-approvals.md b/maps/feature-map/questions-and-approvals.md index 4ecf303f2aa..a1331c32574 100644 --- a/maps/feature-map/questions-and-approvals.md +++ b/maps/feature-map/questions-and-approvals.md @@ -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. diff --git a/maps/feature-map/recovery.md b/maps/feature-map/recovery.md index 7e7c1ab34f8..c21609715b9 100644 --- a/maps/feature-map/recovery.md +++ b/maps/feature-map/recovery.md @@ -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) diff --git a/maps/feature-map/routines.md b/maps/feature-map/routines.md index 621fd21bca6..9a85ac2062d 100644 --- a/maps/feature-map/routines.md +++ b/maps/feature-map/routines.md @@ -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. diff --git a/maps/feature-map/runs-adapters.md b/maps/feature-map/runs-adapters.md index 89c1c6c7d96..bd050519935 100644 --- a/maps/feature-map/runs-adapters.md +++ b/maps/feature-map/runs-adapters.md @@ -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. diff --git a/maps/feature-map/secrets.md b/maps/feature-map/secrets.md index 68658519cd9..3b44fae6615 100644 --- a/maps/feature-map/secrets.md +++ b/maps/feature-map/secrets.md @@ -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. diff --git a/maps/feature-map/skills.md b/maps/feature-map/skills.md index 4085f690090..276bbcbbcbf 100644 --- a/maps/feature-map/skills.md +++ b/maps/feature-map/skills.md @@ -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. diff --git a/maps/feature-map/status-cards.md b/maps/feature-map/status-cards.md index c91082da6b6..395215d442a 100644 --- a/maps/feature-map/status-cards.md +++ b/maps/feature-map/status-cards.md @@ -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) diff --git a/maps/feature-map/steering.md b/maps/feature-map/steering.md index 8366f9614d9..8ee67ca3b04 100644 --- a/maps/feature-map/steering.md +++ b/maps/feature-map/steering.md @@ -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) diff --git a/maps/feature-map/task-coordination.md b/maps/feature-map/task-coordination.md index aff32dc01d1..427edcda712 100644 --- a/maps/feature-map/task-coordination.md +++ b/maps/feature-map/task-coordination.md @@ -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. diff --git a/maps/feature-map/tasks.md b/maps/feature-map/tasks.md index b1fce19b313..0b2d90936ad 100644 --- a/maps/feature-map/tasks.md +++ b/maps/feature-map/tasks.md @@ -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. diff --git a/maps/feature-map/teams.md b/maps/feature-map/teams.md index c3ecdecbd4a..f6fc151941f 100644 --- a/maps/feature-map/teams.md +++ b/maps/feature-map/teams.md @@ -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. diff --git a/maps/feature-map/workspaces.md b/maps/feature-map/workspaces.md index b4fbadeac52..8d5ee64f22d 100644 --- a/maps/feature-map/workspaces.md +++ b/maps/feature-map/workspaces.md @@ -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) diff --git a/maps/storybook-map/INDEX.md b/maps/storybook-map/INDEX.md deleted file mode 100644 index af857db8b44..00000000000 --- a/maps/storybook-map/INDEX.md +++ /dev/null @@ -1,791 +0,0 @@ -# Storybook by feature - - - -[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. diff --git a/maps/storybook-map/README.md b/maps/storybook-map/README.md index 77e90a39384..40d10b62213 100644 --- a/maps/storybook-map/README.md +++ b/maps/storybook-map/README.md @@ -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//`, 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---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//`. 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---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. diff --git a/maps/storybook-map/REVIEW.md b/maps/storybook-map/REVIEW.md deleted file mode 100644 index 60d416401c9..00000000000 --- a/maps/storybook-map/REVIEW.md +++ /dev/null @@ -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. diff --git a/maps/storybook-map/VERIFICATION.md b/maps/storybook-map/VERIFICATION.md deleted file mode 100644 index 2d167174cff..00000000000 --- a/maps/storybook-map/VERIFICATION.md +++ /dev/null @@ -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. diff --git a/maps/storybook-map/catalog.json b/maps/storybook-map/catalog.json deleted file mode 100644 index 59df9e33b62..00000000000 --- a/maps/storybook-map/catalog.json +++ /dev/null @@ -1,6627 +0,0 @@ -{ - "version": 1, - "sharedReview": { - "sources": [ - "ui/storybook/.storybook/main.ts", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "maps/feature-map/README.md", - "scripts/storybook-feature-index.mjs", - "ui/storybook/generated/feature-index.json", - "ui/storybook/support/feature-map/FeatureOverview.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "fingerprint": "1f6d48d7e205c2ff2f7c33aa784a82ca0ef961093bba7de319d50e22dfb4f17a" - }, - "entries": [ - { - "file": "ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx", - "capabilities": [ - "connection-setup/catalog" - ], - "purpose": "Apps/Canonical icon registry", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/AppLogo.tsx", - "ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx" - ], - "fingerprint": "6cccd3d57ac6d02f9fbeed4173a7813a4249d734b8f2d28f98c29706cbcc8548", - "stableId": "apps-canonical-icon-registry", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Canonical icon registry" - }, - { - "file": "ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "connection-setup/failure", - "connection-setup/draft-recovery", - "connection-setup/identity-and-access", - "app-permissions/action-policy", - "app-permissions/test-action" - ], - "purpose": "Apps/Connections/Arcade", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/JsonSchemaForm.tsx", - "ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx", - "ui/src/features/connections/remote-mcp/providers.ts", - "ui/src/features/connections/remote-mcp/types.ts", - "ui/storybook/fixtures/remoteMcpConnections.ts", - "ui/storybook/prototypes/RemoteMcpConnectionReview.tsx", - "ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx", - "maps/feature-map/app-permissions.md" - ], - "fingerprint": "935bbdd07ef2e35b65fc6e3b4201f846f9735177e3b4415c5bbe8d0e159e0f9c", - "stableId": "apps-connections-arcade", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade" - }, - { - "file": "ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "connection-setup/failure", - "connection-setup/draft-recovery", - "connection-setup/identity-and-access", - "app-permissions/action-policy", - "app-permissions/test-action" - ], - "purpose": "Apps/Connections/Composio", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/JsonSchemaForm.tsx", - "ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx", - "ui/src/features/connections/remote-mcp/providers.ts", - "ui/src/features/connections/remote-mcp/types.ts", - "ui/storybook/fixtures/remoteMcpConnections.ts", - "ui/storybook/prototypes/RemoteMcpConnectionReview.tsx", - "ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx", - "maps/feature-map/app-permissions.md" - ], - "fingerprint": "452224b19d14b6e3a7396cc1b55cb7663adaf6bf1c3202935da0f61d20be34c9", - "stableId": "apps-connections-composio", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connections/Composio" - }, - { - "file": "ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx", - "capabilities": [ - "connection-setup/identity-and-access" - ], - "purpose": "Apps/Connections/Provider choice", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/JsonSchemaForm.tsx", - "ui/src/components/task-chat/QuestionForm.tsx", - "ui/src/features/connections/remote-mcp/RemoteMcpAccountChoice.tsx", - "ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx", - "ui/src/features/connections/remote-mcp/providers.ts", - "ui/src/features/connections/remote-mcp/types.ts", - "ui/storybook/fixtures/remoteMcpConnections.ts", - "ui/storybook/prototypes/RemoteMcpConnectionReview.tsx", - "ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx" - ], - "fingerprint": "8661b29e8740f133ec6b457931fd7344e9225bc6f8acdd84573ac843ee9e7e97", - "stableId": "apps-connections-provider-choice", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connections/Provider choice" - }, - { - "file": "ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "connection-setup/failure", - "connection-setup/draft-recovery", - "connection-setup/identity-and-access", - "app-permissions/action-policy", - "app-permissions/test-action" - ], - "purpose": "Apps/Connections/Executor", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/JsonSchemaForm.tsx", - "ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx", - "ui/src/features/connections/remote-mcp/providers.ts", - "ui/src/features/connections/remote-mcp/types.ts", - "ui/storybook/fixtures/remoteMcpConnections.ts", - "ui/storybook/prototypes/RemoteMcpConnectionReview.tsx", - "ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx", - "maps/feature-map/app-permissions.md" - ], - "fingerprint": "e405d30ca0c64ceae9302500b07876c0dc57c8d0cbbedf23c432dfb9fe4a339d", - "stableId": "apps-connections-executor", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connections/Executor" - }, - { - "file": "ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "connection-setup/failure", - "connection-setup/draft-recovery", - "connection-setup/identity-and-access", - "app-permissions/action-policy", - "app-permissions/test-action" - ], - "purpose": "Apps/Connections/Zapier", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/JsonSchemaForm.tsx", - "ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx", - "ui/src/features/connections/remote-mcp/providers.ts", - "ui/src/features/connections/remote-mcp/types.ts", - "ui/storybook/fixtures/remoteMcpConnections.ts", - "ui/storybook/prototypes/RemoteMcpConnectionReview.tsx", - "ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx", - "maps/feature-map/app-permissions.md" - ], - "fingerprint": "a92fb11928da7e60fa8ef1db8b9090828c02dd60095dc581e620263522c721be", - "stableId": "apps-connections-zapier", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier" - }, - { - "file": "ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx", - "capabilities": [ - "gateways-profiles/profiles" - ], - "purpose": "Tools/Access profiles", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/AgentToolsTab.tsx", - "ui/src/pages/tools/profiles/ProfileDetail.tsx", - "ui/src/pages/tools/profiles/ProfileWizard.tsx", - "ui/src/pages/tools/profiles/ProfilesIndex.tsx", - "ui/src/pages/tools/profiles/WizardToolsStep.tsx", - "ui/src/pages/tools/profiles/profile-model.ts", - "ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx" - ], - "fingerprint": "23dfe9b1750b7eae8e6eae652f820ae2ff3e1415ce1b35e27717e24c3eed681b", - "stableId": "tools-access-profiles", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Tools/Access profiles" - }, - { - "file": "ui/storybook/stories/app-permissions/action-card.stories.tsx", - "capabilities": [ - "app-permissions/test-action", - "app-permissions/action-policy" - ], - "purpose": "Tools & Access/ActionCard", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/app-permissions.md", - "ui/src/components/actions/ActionCard.tsx", - "ui/storybook/stories/app-permissions/action-card.stories.tsx" - ], - "fingerprint": "37849ece1ec378382e41b84ee23d506ee9cbcee923e421b6fc9929fc4d420cc5", - "stableId": "tools-access-actioncard", - "sidebarTitle": "Apps, channels, and extensions/App access and action permissions/Tools & Access/ActionCard" - }, - { - "file": "ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx", - "capabilities": [ - "app-permissions/test-action", - "app-permissions/action-policy" - ], - "purpose": "Apps/Action permissions test", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/app-permissions.md", - "ui/src/pages/apps/app-detail/PermissionsPanel.tsx", - "ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx" - ], - "fingerprint": "7804d31cc4bf5fabd5191b201a85258f9d4c9a670331ac611628f8001114d687", - "stableId": "apps-action-permissions-test", - "sidebarTitle": "Apps, channels, and extensions/App access and action permissions/Apps/Action permissions test" - }, - { - "file": "ui/storybook/stories/activity/activity-feed.stories.tsx", - "capabilities": [ - "activity/activity", - "gateways-profiles/activity" - ], - "purpose": "Tools/Activity (audit feed)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/activity.md", - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/tools/AuditTab.tsx", - "ui/storybook/stories/activity/activity-feed.stories.tsx" - ], - "fingerprint": "42f1ebbd11a7b47dd507f43c287c46a9191b8ce323b9c15d83a6d8ec5521eeee", - "stableId": "tools-activity-audit-feed", - "sidebarTitle": "Oversight and operation/Dashboards and audit trails/Tools/Activity (audit feed)" - }, - { - "file": "ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx", - "capabilities": [ - "agent-chat/discovery", - "agent-chat/history" - ], - "purpose": "Design explorations/Agent chat sidebar/Pages", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "ui/src/components/AgentChatPicker.tsx", - "ui/src/components/AgentIconPicker.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgentChats.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/agent-chat-sidebar/AgentChatSidebarReview.tsx", - "ui/storybook/prototypes/agent-chat-sidebar/fixtures.ts", - "ui/storybook/prototypes/agent-chat/AgentChatPrototype.tsx", - "ui/storybook/prototypes/agent-chat/AgentChatSidebar.tsx", - "ui/storybook/prototypes/chat-entry/ChatEntryReview.tsx", - "ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx" - ], - "fingerprint": "ab2f77b8b4ed82dbed8c6a3e3cfb1060ba9beed81daada29fec72e9c8c660402", - "stableId": "design-explorations-agent-chat-sidebar-pages", - "sidebarTitle": "Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Pages" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx", - "capabilities": [ - "questions-and-approvals/dismiss-and-reopen", - "agent-chat/history" - ], - "purpose": "Chat & Comments/Agent Chat Unanswered Questions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/questions-and-approvals.md", - "ui/src/components/TaskChatThread.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/unansweredQuestionChat.tsx", - "ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx" - ], - "fingerprint": "20c4a640715abcfeadc2763e5d7485aefd32d3e8d596e6392646f8e3264c3b78", - "stableId": "chat-comments-agent-chat-unanswered-questions", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Chat & Comments/Agent Chat Unanswered Questions" - }, - { - "file": "ui/storybook/stories/agent-chat/agent-chat.stories.tsx", - "capabilities": [ - "agent-chat/discovery", - "agent-chat/history", - "agent-chat/handoff" - ], - "purpose": "Design explorations/Agent chat", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "ui/src/components/AgentChatPicker.tsx", - "ui/src/components/AgentIconPicker.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgentChats.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/agent-chat-sidebar/AgentChatSidebarReview.tsx", - "ui/storybook/prototypes/agent-chat-sidebar/fixtures.ts", - "ui/storybook/prototypes/agent-chat/AgentChatPrototype.tsx", - "ui/storybook/prototypes/agent-chat/AgentChatSidebar.tsx", - "ui/storybook/prototypes/chat-entry/ChatEntryReview.tsx", - "ui/storybook/stories/agent-chat/agent-chat.stories.tsx" - ], - "fingerprint": "7c0310b7b706473dad7a6bc22540d7a0c44f0aacd50816ac6a7673958e655f5f", - "stableId": "design-explorations-agent-chat", - "sidebarTitle": "Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat" - }, - { - "file": "ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx", - "capabilities": [ - "runs-adapters/validation", - "agents/hire" - ], - "purpose": "Onboarding/Saved connections", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "maps/feature-map/runs-adapters.md", - "ui/src/components/new-agent/AgentProviderConnection.tsx", - "ui/storybook/fixtures/onboardingEnvironment.ts", - "ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx" - ], - "fingerprint": "49e00454cf0fed46e03b30feafb73704723581718a58ec6a250a40dbc480261a", - "stableId": "onboarding-saved-connections", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/Onboarding/Saved connections" - }, - { - "file": "ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx", - "capabilities": [ - "agent-chat/discovery", - "agent-chat/history" - ], - "purpose": "Design explorations/Agent chat sidebar/Components", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "Support module re-exports production AgentConversationSidebar; search/selection use fixture callbacks.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agent-chat.md", - "ui/src/components/AgentConversationSidebar.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/agent-chat-sidebar/AgentConversationSidebar.tsx", - "ui/storybook/prototypes/agent-chat-sidebar/fixtures.ts", - "ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx" - ], - "fingerprint": "2a57c402c2036a5c934b9d8da71699b3c4c93f023d12b9f80834b04fd16a4d7e", - "stableId": "design-explorations-agent-chat-sidebar-components", - "sidebarTitle": "Tasks and conversations/Agent conversations and project handoff/Design explorations/Agent chat sidebar/Components" - }, - { - "file": "ui/storybook/stories/agents/agent-detail.stories.tsx", - "capabilities": [ - "agents/lifecycle", - "agents/instructions" - ], - "purpose": "Pages/Agent Detail", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/pages/AgentDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/agent-detail.stories.tsx" - ], - "fingerprint": "b3f02fa740f2397d82ee459dd686ff8fb34ec383f3192ca07b895c9ce6d1508d", - "stableId": "pages-agent-detail", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Pages/Agent Detail" - }, - { - "file": "ui/storybook/stories/agents/agent-files.stories.tsx", - "capabilities": [ - "agents/instructions" - ], - "purpose": "Agents/Persistent files", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/pages/AgentDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/agent-files.stories.tsx" - ], - "fingerprint": "6324b721acf10b3ce10aa174a789ed09a99f821d4ee651d770026a7e23712463", - "stableId": "agents-persistent-files", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Persistent files" - }, - { - "file": "ui/storybook/stories/agents/agent-management.stories.tsx", - "capabilities": [ - "agents/lifecycle", - "agents/instructions", - "execution-environments/assignment" - ], - "purpose": "Product/Agent Management", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/components/ActiveAgentsPanel.tsx", - "ui/src/components/AgentActionButtons.tsx", - "ui/src/components/AgentConfigForm.tsx", - "ui/src/components/AgentIconPicker.tsx", - "ui/src/components/AgentProperties.tsx", - "ui/src/components/agent-config-defaults.ts", - "ui/src/components/agent-config-primitives.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/agent-management.stories.tsx", - "maps/feature-map/execution-environments.md" - ], - "fingerprint": "825f3c53828c756a52b4d710ae84fc5bd9b36d00affd6f4c0ffaf8ae9562e4c1", - "stableId": "product-agent-management", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Product/Agent Management" - }, - { - "file": "ui/storybook/stories/agents/agent-persona-pages.stories.tsx", - "capabilities": [ - "agents/organization", - "navigation-preferences/profile" - ], - "purpose": "Agents/Personas/Full pages", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agents.md", - "maps/feature-map/navigation-preferences.md", - "ui/src/components/Layout.tsx", - "ui/src/components/new-agent/AgentBasicsDialog.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.tsx", - "ui/src/pages/Dashboard.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/src/pages/NewAgent.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/agent-persona-pages.stories.tsx" - ], - "fingerprint": "8033cb412e8ceea24791e49fa2c22f651a7d27c504415152bfe99b0e7e45bd73", - "stableId": "agents-personas-full-pages", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas/Full pages" - }, - { - "file": "ui/storybook/stories/agents/agent-personas.stories.tsx", - "capabilities": [ - "agents/organization", - "navigation-preferences/profile" - ], - "purpose": "Agents/Personas", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "maps/feature-map/navigation-preferences.md", - "ui/src/components/AgentAvatar.tsx", - "ui/src/components/AgentCharacter.tsx", - "ui/src/components/AgentIdentity.tsx", - "ui/src/components/ui/button.tsx", - "ui/storybook/stories/agents/agent-personas.stories.tsx" - ], - "fingerprint": "43f4316011eeec7f2c1b1aa5e73f6194c49ba0fb1eb9484375a3929792f4cbf1", - "stableId": "agents-personas", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas" - }, - { - "file": "ui/storybook/stories/agents/agent-settings-redesign.stories.tsx", - "capabilities": [ - "agents/lifecycle", - "agents/instructions" - ], - "purpose": "Agents/Configuration refresh", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Production configuration panels in a locally composed settings shell; full AgentDetail route parity remains unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/components/AgentActionButtons.tsx", - "ui/src/components/AgentConfigForm.tsx", - "ui/src/components/AgentContextualSidebar.tsx", - "ui/src/components/NewIssueDialog.tsx", - "ui/src/components/RuntimeTestCard.tsx", - "ui/src/components/onboarding/PillGuy.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/AgentToolsTab.tsx", - "ui/src/pages/agent-detail-navigation.ts", - "ui/src/pages/agent-skills/AgentSkillsTab.tsx", - "ui/storybook/fixtures/onboardingEnvironment.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/RuntimeTestCard.tsx", - "ui/storybook/prototypes/agent-settings/AgentSettingsPreview.tsx", - "ui/storybook/prototypes/agent-settings/fixtures.ts", - "ui/storybook/prototypes/new-agent-fixtures.ts", - "ui/storybook/stories/agents/agent-settings-redesign.stories.tsx" - ], - "fingerprint": "f3f3f3b232dd5e600485e2701153e069aa545eba232264c69c6eb64e21fd0f24", - "stableId": "agents-configuration-refresh", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Configuration refresh" - }, - { - "file": "ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx", - "capabilities": [ - "connection-setup/channel-setup", - "gateways-profiles/client-connect" - ], - "purpose": "Components/Agent setup prompt", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "maps/feature-map/gateways-profiles.md", - "ui/src/components/AgentSetupPrompt.tsx", - "ui/src/components/IssueContinuationHandoff.tsx", - "ui/src/components/routine-triggers/TriggerWizard.tsx", - "ui/src/components/routine-triggers/WebhookFields.tsx", - "ui/src/pages/apps/chat/GitHubSetupPrompt.tsx", - "ui/src/pages/apps/chat/SlackSetupPrompt.tsx", - "ui/src/pages/tools/McpConfigHelpDialog.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/routineTriggerWizard.tsx", - "ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx" - ], - "fingerprint": "379018ba98ba89a2a05b26f5db3e28d85d81af08b77a011c55d9bc6118fa1a15", - "stableId": "components-agent-setup-prompt", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Components/Agent setup prompt" - }, - { - "file": "ui/storybook/stories/skills/agent-skill-row.stories.tsx", - "capabilities": [ - "skills/policy" - ], - "purpose": "Agent Skills/AgentSkillRow", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/icons/github-icon.tsx", - "ui/src/pages/agent-skills/AgentSkillRow.tsx", - "ui/storybook/stories/skills/agent-skill-row.stories.tsx" - ], - "fingerprint": "4eeb2029b5b1002afe393ab41da89a949c28d955130caa9feee4068b4b63fd2f", - "stableId": "agent-skills-agentskillrow", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Agent Skills/AgentSkillRow" - }, - { - "file": "ui/storybook/stories/skills/agent-skills-edge.stories.tsx", - "capabilities": [ - "skills/policy" - ], - "purpose": "QA / Agent skills edge states", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/pages/agent-skills/AgentSkillsTab.tsx", - "ui/storybook/stories/skills/agent-skills-edge.stories.tsx" - ], - "fingerprint": "e2beaa5b5d5fb0b9ee34935d05548d0448c250129b3c2377eb7973f284fdc452", - "stableId": "qa-agent-skills-edge-states", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/QA / Agent skills edge states" - }, - { - "file": "ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx", - "capabilities": [ - "chat-channels/providers", - "connection-setup/channel-setup" - ], - "purpose": "Connections/AgentMail setup", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "maps/feature-map/connection-setup.md", - "ui/src/components/chat/ChatSetupNavigation.tsx", - "ui/src/pages/apps/chat/EmailEndpointSetup.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx" - ], - "fingerprint": "69bd5253a034d76a1f13712cf59b8fba7c1678d95a8dd355988727cdccf77404", - "stableId": "connections-agentmail-setup", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/AgentMail setup" - }, - { - "file": "ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx", - "capabilities": [ - "chat-channels/lifecycle" - ], - "purpose": "Connections/AgentMail settings", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/pages/apps/chat/EmailEndpointSetup.tsx", - "ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx" - ], - "fingerprint": "2fb050825b457f876fa18d08cd101093d19187f47d7cd8b5a51c871d28d7553e", - "stableId": "connections-agentmail-settings", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/AgentMail settings" - }, - { - "file": "ui/storybook/stories/chat-channels/agentmail.stories.tsx", - "capabilities": [ - "chat-channels/conversation" - ], - "purpose": "Connections/AgentMail tasks", - "status": "unreviewed", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/components/AgentIconPicker.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/presentation-mode.tsx", - "ui/storybook/stories/chat-channels/agentmail.stories.tsx" - ], - "fingerprint": "5f4cd880d1c6baa0c88dc65bf5919cf451ea3c4bdd8b479ee2e3d2906ce1bd1c", - "stableId": "connections-agentmail-tasks", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/AgentMail tasks" - }, - { - "file": "ui/storybook/stories/skills/agents-using-skill.stories.tsx", - "capabilities": [ - "skills/policy" - ], - "purpose": "Skill Studio/AgentsUsingSkill", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/skill-studio/AgentsUsingSkillDialog.tsx", - "ui/storybook/stories/skills/agents-using-skill.stories.tsx" - ], - "fingerprint": "28d0e3a9ffe07d1c48b2e7e73cd67df55047c47cec1163779d1a9c46beb981ef", - "stableId": "skill-studio-agentsusingskill", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/AgentsUsingSkill" - }, - { - "file": "ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Usage limits", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/ai-connections/ManagedAiConnectionDetails.tsx", - "ui/storybook/prototypes/AiConnectionUsageReview.tsx", - "ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx" - ], - "fingerprint": "293a8407e94d525533e5beb8920d78e4b47b2326568460bfe02bb3bdd9f81eaf", - "stableId": "ai-connections-usage-limits", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Usage limits" - }, - { - "file": "ui/storybook/stories/runs-adapters/ai-connections.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Review", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/BreadcrumbBar.tsx", - "ui/src/components/ai-connections/AiConnectionAccountControls.tsx", - "ui/src/components/ai-connections/AiConnectionAuth.tsx", - "ui/src/components/ai-connections/AiConnectionManagement.tsx", - "ui/src/components/ai-connections/AiConnectionPicker.tsx", - "ui/src/components/ai-connections/model.ts", - "ui/src/components/onboarding/CredentialModeLink.tsx", - "ui/src/components/onboarding/ModelSourceTiles.tsx", - "ui/src/features/connections/ConnectionIntentInteractionBody.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/apps/AppDetail.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/fixtures/aiConnections.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/AiConnectionsReview.tsx", - "ui/storybook/prototypes/AiConnectorPages.tsx", - "ui/storybook/prototypes/AiReviewFrame.tsx", - "ui/storybook/prototypes/AiTaskConnectionReview.tsx", - "ui/storybook/stories/runs-adapters/ai-connections.stories.tsx" - ], - "fingerprint": "9a5d741ffbff64ab6e14e03130a1b7a53403d6e69ee48108ba1358d0093facf2", - "stableId": "ai-connections-review", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Review" - }, - { - "file": "ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx", - "capabilities": [ - "navigation-preferences/announcements" - ], - "purpose": "Announcements/AnnouncementCard", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/navigation-preferences.md", - "ui/src/components/AnnouncementCard.tsx", - "ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx" - ], - "fingerprint": "39d0cbdb22d29fee065260ad54fb01da1df21897f3228275875250793ef23bf8", - "stableId": "announcements-announcementcard", - "sidebarTitle": "Oversight and operation/Navigation, profile, and announcements/Announcements/AnnouncementCard" - }, - { - "file": "ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx", - "capabilities": [ - "activity/activity", - "gateways-profiles/activity" - ], - "purpose": "Apps/App detail · Activity (lifecycle)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/activity.md", - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/apps/app-detail/ActivityPanel.tsx", - "ui/src/pages/apps/app-detail/types.ts", - "ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx" - ], - "fingerprint": "6c813a16621d93fe9f817b1b01d451a35b4b552727976168e938409d100b26e9", - "stableId": "apps-app-detail-·-activity-lifecycle", - "sidebarTitle": "Oversight and operation/Dashboards and audit trails/Apps/App detail · Activity (lifecycle)" - }, - { - "file": "ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx", - "capabilities": [ - "connection-setup/catalog" - ], - "purpose": "Apps/Catalog source selection", - "status": "proposed", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/CatalogSourceFilters.tsx", - "ui/storybook/prototypes/ConnectorCatalogNavigation.tsx", - "ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx" - ], - "fingerprint": "e93a8979af016cd9823399c8a3888b5e03de8718defa31fa00a1ccd521241bd6", - "stableId": "apps-catalog-source-selection", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Catalog source selection" - }, - { - "file": "ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx", - "capabilities": [ - "connection-setup/catalog" - ], - "purpose": "Apps/Connect discoverability (PAP-11091)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/src/pages/tools/PasteConfigTab.tsx", - "ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx" - ], - "fingerprint": "c9c741dd4b9fdac34e49e6940c5be47c3c728dcb0ad4c057eb18d90d4e25f4aa", - "stableId": "apps-connect-discoverability-pap-11091", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connect discoverability (PAP-11091)" - }, - { - "file": "ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx", - "capabilities": [ - "connection-setup/identity-and-access" - ], - "purpose": "Apps/Connect name at create time (PAP-11283)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx" - ], - "fingerprint": "9de4f6ee6436b4edee2cbfa8f21ddd34b587da624a3f77b9b167a810fd0f60df", - "stableId": "apps-connect-name-at-create-time-pap-11283", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connect name at create time (PAP-11283)" - }, - { - "file": "ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx", - "capabilities": [ - "app-permissions/account-maintenance" - ], - "purpose": "Apps/Managed accounts", - "status": "current", - "implementation": "production", - "boundary": "fixture-server", - "notes": "Production Browse requires owned tests/aggregator-accounts/test-drive.ts on localhost:4310; providers are simulated. Not an offline story.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/app-permissions.md", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/prototypes/ManagedAggregatorAccounts.tsx", - "ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx" - ], - "fingerprint": "a1627ade7b4327780b978e7f58fc54d70f30337ef109c8ef2afc793450045b1b", - "stableId": "apps-managed-accounts", - "sidebarTitle": "Apps, channels, and extensions/App access and action permissions/Apps/Managed accounts" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Commit", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "7a6d3f80bcdbdc75b9d4b212ac5ad48fe33ec983cadabd2d9d8a75f4bd373ccb", - "stableId": "explorations-artifact-cards-commit", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Commit" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Data", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "d811c07d4b2febcca8880f2cbb370d5fd6812aab11981122e1ff0cd452026ea1", - "stableId": "explorations-artifact-cards-data", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Data" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Document", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "84f56eaeecd79297c6aaef270770229d3692325313dc4838ca1bf758c518abb0", - "stableId": "explorations-artifact-cards-document", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Document" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/File", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "d2ccd3e4eb8272bfc2e54292141e6367d169979933c27f9d099e437000c5522f", - "stableId": "explorations-artifact-cards-file", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/File" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Image", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "3f56a6aa81d4ccbbd5666840bc017a813482e9a40df61c0ac18aa6d42f7c860a", - "stableId": "explorations-artifact-cards-image", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Image" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Link preview", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "30807b316e1ddc32e3288927283512507974ef537dee5d7ecb11936b6bcb7131", - "stableId": "explorations-artifact-cards-link-preview", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Link preview" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Pull request", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx" - ], - "fingerprint": "21959a663489bd8ab8389ef1492a2b459c7159efa87033253d2430827f288bfc", - "stableId": "explorations-artifact-cards-pull-request", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Pull request" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Explorations/Artifact cards/Video", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/RichArtifactCards.tsx", - "ui/storybook/support/artifact-cards/storyConfig.tsx", - "ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx" - ], - "fingerprint": "7187d0b7c3486eaa0e9b7abe375eb11db9c993701ee23edf3f1703a99c1acdd2", - "stableId": "explorations-artifact-cards-video", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Video" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments" - ], - "purpose": "Artifact upload/01 Artifacts pane", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/artifacts/ArtifactUploadArea.tsx", - "ui/src/components/issue-properties/IssuePropertiesArtifactsTab.tsx", - "ui/src/components/side-panel/SidePanelFrame.tsx", - "ui/src/components/side-panel/SidePanelMobileTabs.tsx", - "ui/src/components/side-panel/SidePanelTabs.tsx", - "ui/src/components/side-panel/types.ts", - "ui/src/components/task-side-panel/TaskDocumentPanel.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx", - "ui/storybook/support/artifact-upload/UploadPreview.tsx", - "ui/storybook/support/artifact-upload/fixtures.ts" - ], - "fingerprint": "97036aef581ed62b1032742741c139e710f0f2a9e634c75e507ce5dc38d938e5", - "stableId": "artifact-upload-01-artifacts-pane", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Artifact upload/01 Artifacts pane" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments" - ], - "purpose": "Artifact upload/02 Paused task journey", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/Layout.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/src/components/artifacts/ArtifactUploadArea.tsx", - "ui/src/components/issue-properties/IssuePropertiesArtifactsTab.tsx", - "ui/src/components/side-panel/SidePanelFrame.tsx", - "ui/src/components/side-panel/SidePanelMobileTabs.tsx", - "ui/src/components/side-panel/SidePanelTabs.tsx", - "ui/src/components/side-panel/types.ts", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/TaskChatPausedTakeover.tsx", - "ui/src/components/task-side-panel/TaskDocumentPanel.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx", - "ui/storybook/support/artifact-upload/UploadPreview.tsx", - "ui/storybook/support/artifact-upload/fixtures.ts" - ], - "fingerprint": "ce98222afff00d7dfdfa7f84fd5e909bfe49fe8e5c1bd0f7f188942d11eafec7", - "stableId": "artifact-upload-02-paused-task-journey", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Artifact upload/02 Paused task journey" - }, - { - "file": "ui/storybook/stories/documents-artifacts/artifacts.stories.tsx", - "capabilities": [ - "documents-artifacts/library", - "documents-artifacts/work-products" - ], - "purpose": "Pages/Artifacts", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/EmptyState.tsx", - "ui/src/components/artifacts/ArtifactCard.tsx", - "ui/src/pages/Artifacts.tsx", - "ui/storybook/stories/documents-artifacts/artifacts.stories.tsx" - ], - "fingerprint": "8752ed42735eb3e31b788c3d6661109a5a1230b667575cf5b4f78ba4f2f950af", - "stableId": "pages-artifacts", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Pages/Artifacts" - }, - { - "file": "ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx", - "capabilities": [ - "tasks/completion", - "recovery/diagnosis" - ], - "purpose": "Paperclip/Assigned Backlog Safeguards", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "maps/feature-map/tasks.md", - "ui/src/components/IssueAssignedBacklogNotice.tsx", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/IssueRow.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx" - ], - "fingerprint": "634be5456a6554553c9c19852941533fd657b48ea9aaf97ea2774a5b52fed8d0", - "stableId": "paperclip-assigned-backlog-safeguards", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Paperclip/Assigned Backlog Safeguards" - }, - { - "file": "ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx", - "capabilities": [ - "inbox-search/triage", - "recovery/diagnosis" - ], - "purpose": "Product/Inbox/Blocked tab", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "maps/feature-map/recovery.md", - "ui/src/components/BlockedInboxView.tsx", - "ui/src/components/BlockedReasonChip.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx" - ], - "fingerprint": "1ef985b27fe351ee34b584ca878c66819fd46986eb09dbce59c408c66b35a495", - "stableId": "product-inbox-blocked-tab", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Product/Inbox/Blocked tab" - }, - { - "file": "ui/storybook/stories/workspaces/browser-use-activity.stories.tsx", - "capabilities": [ - "workspaces/services", - "tasks/discussion" - ], - "purpose": "Tasks/Browser Use/Task activity", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "maps/feature-map/workspaces.md", - "ui/src/components/task-chat/TaskChatThreadView.tsx", - "ui/src/components/task-side-panel/TaskBrowserActivity.tsx", - "ui/src/components/task-side-panel/TaskBrowserPanel.tsx", - "ui/storybook/fixtures/browser-use.tsx", - "ui/storybook/stories/workspaces/browser-use-activity.stories.tsx" - ], - "fingerprint": "00c08cb6566e12b7fd9dce179296397813ea3e2ab4ee47d27cd1ca948496ca15", - "stableId": "tasks-browser-use-task-activity", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Task activity" - }, - { - "file": "ui/storybook/stories/workspaces/browser-use-footer.stories.tsx", - "capabilities": [ - "workspaces/services", - "tasks/discussion" - ], - "purpose": "Tasks/Browser Use/Footer", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "maps/feature-map/workspaces.md", - "ui/src/components/task-side-panel/TaskBrowserFooter.tsx", - "ui/src/components/task-side-panel/TaskBrowserPanel.tsx", - "ui/storybook/fixtures/browser-use.tsx", - "ui/storybook/stories/workspaces/browser-use-footer.stories.tsx" - ], - "fingerprint": "fda7ec26101f5b6fe68da1f7b6a96c364878c5f14884d639e406412e8341959f", - "stableId": "tasks-browser-use-footer", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Footer" - }, - { - "file": "ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx", - "capabilities": [ - "connection-setup/credentials" - ], - "purpose": "Connections/Browser Use Cloud/Settings", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/task-side-panel/TaskBrowserPanel.tsx", - "ui/src/pages/apps/app-detail/BrowserUseSettingsPanel.tsx", - "ui/storybook/fixtures/browser-use.tsx", - "ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx" - ], - "fingerprint": "c4b0593a7d8fd826c8949fa2374c469fdc6a4ad8cbf6efd01fbd97f6db833228", - "stableId": "connections-browser-use-cloud-settings", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Connections/Browser Use Cloud/Settings" - }, - { - "file": "ui/storybook/stories/workspaces/browser-use.stories.tsx", - "capabilities": [ - "workspaces/services", - "tasks/discussion" - ], - "purpose": "Tasks/Browser Use/Panel", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "maps/feature-map/workspaces.md", - "ui/src/components/task-side-panel/TaskBrowserPanel.tsx", - "ui/src/components/task-side-panel/TaskSidePanel.tsx", - "ui/storybook/fixtures/browser-use.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/workspaces/browser-use.stories.tsx" - ], - "fingerprint": "dafe2721334717ad745e72100e23577dbe3816a3b9ee9224a114ff84fbbb4729", - "stableId": "tasks-browser-use-panel", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Tasks/Browser Use/Panel" - }, - { - "file": "ui/storybook/stories/budgets-costs/budget-finance.stories.tsx", - "capabilities": [ - "budgets-costs/cost-reporting", - "budgets-costs/budgets", - "budgets-costs/incidents" - ], - "purpose": "Product/Budget & Finance", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "ui/src/components/AccountingModelCard.tsx", - "ui/src/components/BillerSpendCard.tsx", - "ui/src/components/BudgetIncidentCard.tsx", - "ui/src/components/BudgetSidebarMarker.tsx", - "ui/src/components/ClaudeSubscriptionPanel.tsx", - "ui/src/components/CodexSubscriptionPanel.tsx", - "ui/src/components/FinanceBillerCard.tsx", - "ui/src/components/FinanceKindCard.tsx", - "ui/src/components/FinanceTimelineCard.tsx", - "ui/src/components/ProviderQuotaCard.tsx", - "ui/storybook/stories/budgets-costs/budget-finance.stories.tsx" - ], - "fingerprint": "1af4d0af7d3dc0008dce21ac303af6aa90fb46593389fc7e47602a490e3ca8c7", - "stableId": "product-budget-finance", - "sidebarTitle": "Oversight and operation/Costs and budgets/Product/Budget & Finance" - }, - { - "file": "ui/storybook/stories/agents/built-in-agents.stories.tsx", - "capabilities": [ - "agents/built-in" - ], - "purpose": "Product/Built-in Agents", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/components/BuiltInAgentBadges.tsx", - "ui/src/components/BuiltInBundlePanel.tsx", - "ui/src/components/ConfigureBuiltInAgentModal.tsx", - "ui/src/components/EmptyState.tsx", - "ui/src/components/EntityRow.tsx", - "ui/src/components/InlineBanner.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/storybook/stories/agents/built-in-agents.stories.tsx" - ], - "fingerprint": "33d0aceb2ce1d9841cb03ea0b3ca84e4daadd367a424ef57d104e40733d948eb", - "stableId": "product-built-in-agents", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Product/Built-in Agents" - }, - { - "file": "ui/storybook/stories/tasks/chat-comments.stories.tsx", - "capabilities": [ - "tasks/discussion", - "runs-adapters/runs" - ], - "purpose": "Product/Chat & Comments", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/runs-adapters.md", - "maps/feature-map/tasks.md", - "ui/src/components/CommentThread.tsx", - "ui/src/components/InlineEntitySelector.tsx", - "ui/src/components/IssueChatThread.tsx", - "ui/src/components/MarkdownBody.tsx", - "ui/src/components/MarkdownEditor.tsx", - "ui/src/components/RunChatSurface.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/chat-comments.stories.tsx" - ], - "fingerprint": "af6b855e4223073858c00f3d39b294222d32a7eb4f9c780cb3a1259a4c3edbdb", - "stableId": "product-chat-comments", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Product/Chat & Comments" - }, - { - "file": "ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx", - "capabilities": [ - "chat-channels/providers" - ], - "purpose": "Connections/Chat connection actions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx" - ], - "fingerprint": "bd604a05920f1015bac52ede82ba83726bf4d79126b7f8f8c8afcd5aa4aca630", - "stableId": "connections-chat-connection-actions", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Chat connection actions" - }, - { - "file": "ui/storybook/stories/agent-chat/chat-entry.stories.tsx", - "capabilities": [ - "agent-chat/discovery", - "agent-chat/history" - ], - "purpose": "Design explorations/Chat entry", - "status": "historical", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "ui/src/components/AgentChatPicker.tsx", - "ui/src/components/AgentIconPicker.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgentChats.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/agent-chat-sidebar/AgentChatSidebarReview.tsx", - "ui/storybook/prototypes/agent-chat-sidebar/fixtures.ts", - "ui/storybook/prototypes/agent-chat/AgentChatPrototype.tsx", - "ui/storybook/prototypes/agent-chat/AgentChatSidebar.tsx", - "ui/storybook/prototypes/chat-entry/ChatEntryReview.tsx", - "ui/storybook/stories/agent-chat/chat-entry.stories.tsx" - ], - "fingerprint": "726b0bc2e1b5aaf7c5afef3a4e184d2aa6240988706bf266c12878141a41e631", - "replacement": "ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx", - "stableId": "design-explorations-chat-entry", - "sidebarTitle": "Tasks and conversations/Agent conversations and project handoff/Design explorations/Chat entry" - }, - { - "file": "ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx", - "capabilities": [ - "chat-channels/lifecycle", - "chat-channels/identity", - "chat-channels/conversation" - ], - "purpose": "Connections/Chat management", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/api/chatEndpoints.ts", - "ui/src/api/execution-workspaces.ts", - "ui/src/api/projects.ts", - "ui/src/components/Layout.tsx", - "ui/src/pages/apps/chat/ChatEndpointDetail.tsx", - "ui/src/pages/apps/chat/ChatExecutionDefaults.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx" - ], - "fingerprint": "1b095845d727d6703d3cfb3b27120927c8ac8b8fd4f2950770c7c5f4aed44d3b", - "stableId": "connections-chat-management", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Chat management" - }, - { - "file": "ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx", - "capabilities": [ - "recovery/reconnect" - ], - "purpose": "App/Connection recovery", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/CloudAccessGate.tsx", - "ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx" - ], - "fingerprint": "65051e49291a3917a3b62604fa76747d2df1825f2601f9abbf2e4ab45b5add9d", - "stableId": "app-connection-recovery", - "sidebarTitle": "Projects and execution/Recovery/App/Connection recovery" - }, - { - "file": "ui/storybook/stories/tasks/completed-activity.stories.tsx", - "capabilities": [ - "tasks/discussion", - "runs-adapters/runs" - ], - "purpose": "Tasks/Completed activity preview", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/runs-adapters.md", - "maps/feature-map/tasks.md", - "ui/src/components/task-chat/TaskChatRunnerActivityGroup.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/prototypes/completed-activity/CompletedActivityPreview.tsx", - "ui/storybook/stories/tasks/completed-activity.stories.tsx" - ], - "fingerprint": "d6a288300082825b36c483a4c1e1dda3ca7ecf4ba7bada065d88ad8f2098c869", - "stableId": "tasks-completed-activity-preview", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Tasks/Completed activity preview" - }, - { - "file": "ui/storybook/stories/tasks/composer-add-menu.stories.tsx", - "capabilities": [ - "tasks/create" - ], - "purpose": "Composer/Add menu", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/MobileBottomNav.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/TaskChatComposerDock.tsx", - "ui/storybook/prototypes/composer-model-picker/fixtures.ts", - "ui/storybook/stories/tasks/composer-add-menu.stories.tsx" - ], - "fingerprint": "a3d8d5ddf558df4e5118c747bb1c42ef1d43b23202200614a96c7a4c5ab47e91", - "stableId": "composer-add-menu", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Composer/Add menu" - }, - { - "file": "ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx", - "capabilities": [ - "tasks/create", - "runs-adapters/availability" - ], - "purpose": "Composer/Mobile assignee picker", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/runs-adapters.md", - "maps/feature-map/tasks.md", - "ui/src/components/AgentAvatar.tsx", - "ui/src/components/task-chat/ComposerAddMenu.tsx", - "ui/src/components/task-chat/ComposerRunSettingsPicker.tsx", - "ui/src/components/task-chat/composer-run-settings.ts", - "ui/storybook/prototypes/composer-model-picker/ComposerRunSettingsLiveStory.tsx", - "ui/storybook/prototypes/composer-model-picker/fixtures.ts", - "ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx" - ], - "fingerprint": "62cb4bb214ab3848b9008c2456293027e86bb5bc55bda9c8671a5ea972555ee8", - "stableId": "composer-mobile-assignee-picker", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Composer/Mobile assignee picker" - }, - { - "file": "ui/storybook/stories/tasks/composer-model-picker.stories.tsx", - "capabilities": [ - "tasks/create", - "runs-adapters/availability" - ], - "purpose": "Composer/Model and effort picker", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/runs-adapters.md", - "maps/feature-map/tasks.md", - "ui/src/components/AgentAvatar.tsx", - "ui/src/components/task-chat/ComposerAddMenu.tsx", - "ui/src/components/task-chat/ComposerRunSettingsPicker.tsx", - "ui/src/components/task-chat/composer-run-settings.ts", - "ui/storybook/prototypes/composer-model-picker/ComposerModelPickerPreview.tsx", - "ui/storybook/prototypes/composer-model-picker/ComposerRunSettingsLiveStory.tsx", - "ui/storybook/prototypes/composer-model-picker/fixtures.ts", - "ui/storybook/stories/tasks/composer-model-picker.stories.tsx" - ], - "fingerprint": "6fdfb5463f7601772919b8c73e97b2571f5c13bf728390ecffc22a7438d67ce7", - "stableId": "composer-model-and-effort-picker", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Composer/Model and effort picker" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx", - "capabilities": [ - "questions-and-approvals/questions" - ], - "purpose": "Composer/Question flow", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/questions-and-approvals.md", - "ui/src/components/task-chat/QuestionForm.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx" - ], - "fingerprint": "c1b27485d6807fe060e4420340b6dee67a2630642f4a7b5bbcee330f4c12efa3", - "stableId": "composer-question-flow", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Composer/Question flow" - }, - { - "file": "ui/storybook/stories/steering/composer-queued-messages.stories.tsx", - "capabilities": [ - "steering/queue", - "steering/edit-order-discard", - "steering/steer", - "steering/interrupt" - ], - "purpose": "Composer/Steering and queued messages", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/steering.md", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/TaskChatQueuedMessages.tsx", - "ui/storybook/prototypes/composer-model-picker/fixtures.ts", - "ui/storybook/stories/steering/composer-queued-messages.stories.tsx" - ], - "fingerprint": "a7a8c31427592e9e35a4da6c90e08c334835e9f84544f2e887aa102c3fc35071", - "stableId": "composer-steering-and-queued-messages", - "sidebarTitle": "Tasks and conversations/Steering and queued messages/Composer/Steering and queued messages" - }, - { - "file": "ui/storybook/stories/connection-setup/connection-instructions.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "agents/instructions" - ], - "purpose": "Design explorations/Connections/Agent instructions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agents.md", - "maps/feature-map/connection-setup.md", - "ui/src/components/Layout.tsx", - "ui/src/features/connections/ConnectionInstructions.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/apps/AppDetail.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/fixtures/connectionInstructions.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/connection-setup/connection-instructions.stories.tsx" - ], - "fingerprint": "fbe38d3bcc75a349708824554ebc89e2b537765679f1bc20c83382187d3f7b8d", - "stableId": "design-explorations-connections-agent-instructions", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Design explorations/Connections/Agent instructions" - }, - { - "file": "ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx", - "capabilities": [ - "runs-adapters/validation", - "connection-setup/catalog" - ], - "purpose": "Connectors/Pool host", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "maps/feature-map/runs-adapters.md", - "ui/src/components/AppConnectionSidebar.tsx", - "ui/src/components/BreadcrumbBar.tsx", - "ui/src/pages/apps/AppDetail.tsx", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/prototypes/ConnectionPoolConnectorHost.tsx", - "ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx" - ], - "fingerprint": "8435510a61a26df876ed1f5ab088873738bcc4e57c3b17d8bb59a1fc548f111e", - "stableId": "connectors-pool-host", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/Connectors/Pool host" - }, - { - "file": "ui/storybook/stories/runs-adapters/connection-pools.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Connection pools", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/IssueMonitorBanner.tsx", - "ui/src/components/RunRetryDetails.tsx", - "ui/src/components/ai-connections/AiConnectionField.tsx", - "ui/src/components/ai-connections/AiConnectionPoolRunDetails.tsx", - "ui/src/components/task-chat/ComposerRunSettingsPicker.tsx", - "ui/src/components/task-chat/composer-run-settings.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/runs-adapters/connection-pools.stories.tsx" - ], - "fingerprint": "b614f0bcfb914ae817cbfba36d8dd80091068ad6e6a630ec239a7d9f7b3e05c1", - "stableId": "ai-connections-connection-pools", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Connection pools" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx", - "capabilities": [ - "questions-and-approvals/tool-review", - "connection-setup/task-request" - ], - "purpose": "Chat & Comments/Connection Reviews", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "maps/feature-map/questions-and-approvals.md", - "ui/src/components/IssueThreadInteractionCard.tsx", - "ui/src/components/TaskChatThread.tsx", - "ui/src/pages/apps/ReviewQueueCard.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx" - ], - "fingerprint": "20866331e244be5a10686f155ff0e0e1d9e644abdea71ca9b63ed46fd925732c", - "stableId": "chat-comments-connection-reviews", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Chat & Comments/Connection Reviews" - }, - { - "file": "ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx", - "capabilities": [ - "tasks/organize", - "questions-and-approvals/governance", - "budgets-costs/budgets", - "activity/activity" - ], - "purpose": "Product/Control Plane Surfaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/activity.md", - "maps/feature-map/budgets-costs.md", - "maps/feature-map/questions-and-approvals.md", - "maps/feature-map/tasks.md", - "ui/src/components/ActivityRow.tsx", - "ui/src/components/ApprovalCard.tsx", - "ui/src/components/BudgetPolicyCard.tsx", - "ui/src/components/Identity.tsx", - "ui/src/components/IssueRow.tsx", - "ui/src/components/PriorityIcon.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx" - ], - "fingerprint": "ad5842a0179d5b824f4b08170e82ce66fe3929eb93021af3606e7c9dd81ddc12", - "stableId": "product-control-plane-surfaces", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Product/Control Plane Surfaces" - }, - { - "file": "ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx", - "capabilities": [ - "budgets-costs/cost-reporting", - "budgets-costs/budgets" - ], - "purpose": "Costs/Subscriptions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/Costs.tsx", - "ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx" - ], - "fingerprint": "7eeef3d9becbe18d7f7e644f4fc8628c386071f151a038842fac12e97602c81d", - "stableId": "costs-subscriptions", - "sidebarTitle": "Oversight and operation/Costs and budgets/Costs/Subscriptions" - }, - { - "file": "ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx", - "capabilities": [ - "secrets/runtime-delivery", - "recovery/diagnosis" - ], - "purpose": "Task credential access/01 Notice", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "maps/feature-map/secrets.md", - "ui/src/components/task-chat/TaskChatMarker.tsx", - "ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx" - ], - "fingerprint": "e47db04211055da618b8759ca77f1c725fd6370a660619fa621e7df53c6e140a", - "stableId": "task-credential-access-01-notice", - "sidebarTitle": "Apps, channels, and extensions/Secrets and proposals/Task credential access/01 Notice" - }, - { - "file": "ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx", - "capabilities": [ - "secrets/runtime-delivery", - "recovery/diagnosis" - ], - "purpose": "Task credential access/02 Task page", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "maps/feature-map/secrets.md", - "ui/src/components/Layout.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx", - "ui/storybook/support/credential-access/CredentialTaskPage.tsx" - ], - "fingerprint": "33c0737e68af1841115aad7f962e7e81af6ea5659bc335bc0f842a47ca7b6868", - "stableId": "task-credential-access-02-task-page", - "sidebarTitle": "Apps, channels, and extensions/Secrets and proposals/Task credential access/02 Task page" - }, - { - "file": "ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments" - ], - "purpose": "Components/CSV File Tab", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/task-side-panel/TaskAttachmentPanel.tsx", - "ui/src/components/task-side-panel/TaskWorkspaceFilePanel.tsx", - "ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx" - ], - "fingerprint": "734738f2d9a747215f4a34baa7d448238fbfc2da7218c79b1eff8643aed6cefc", - "stableId": "components-csv-file-tab", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Components/CSV File Tab" - }, - { - "file": "ui/storybook/stories/activity/data-viz-misc.stories.tsx", - "capabilities": [ - "activity/overview" - ], - "purpose": "Product/Data Visualization & Misc", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/activity.md", - "ui/src/components/ActivityCharts.tsx", - "ui/src/components/AsciiArtAnimation.tsx", - "ui/src/components/CompanyPatternIcon.tsx", - "ui/src/components/EntityRow.tsx", - "ui/src/components/FilterBar.tsx", - "ui/src/components/KanbanBoard.tsx", - "ui/src/components/LiveRunWidget.tsx", - "ui/src/components/OnboardingWizard.tsx", - "ui/src/components/PackageFileTree.tsx", - "ui/src/components/PageSkeleton.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/src/components/SwipeToArchive.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/activity/data-viz-misc.stories.tsx" - ], - "fingerprint": "2861c5c594bbc3c30682958dd3727488f776e411368bcfdcbde39c14cb64cef6", - "stableId": "product-data-visualization-misc", - "sidebarTitle": "Oversight and operation/Dashboards and audit trails/Product/Data Visualization & Misc" - }, - { - "file": "ui/storybook/stories/inbox-search/decision-card.stories.tsx", - "capabilities": [ - "inbox-search/decisions" - ], - "purpose": "Decisions/DecisionCard", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "ui/src/components/DecisionCard.tsx", - "ui/storybook/stories/inbox-search/decision-card.stories.tsx" - ], - "fingerprint": "172482180fa305e06238da1fa90a277dd1eb109354d8bfeb0b2b833b9aba798d", - "stableId": "decisions-decisioncard", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Decisions/DecisionCard" - }, - { - "file": "ui/storybook/stories/companies/decision-models/01-settings.stories.tsx", - "capabilities": [ - "companies/identity", - "budgets-costs/cost-reporting", - "companies/decision-models" - ], - "purpose": "Decision models/01 Settings", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "maps/feature-map/companies.md", - "ui/src/components/decision-models/DecisionModelSettings.tsx", - "ui/storybook/stories/companies/decision-models/01-settings.stories.tsx", - "ui/storybook/support/decision-models/fixtures.ts" - ], - "fingerprint": "deb224b7109eeb7c2672ac22e63c5ea62053198eac5ba69d796c13b418bff263", - "stableId": "decision-models-01-settings", - "sidebarTitle": "Getting started and access/Companies and portability/Decision models/01 Settings" - }, - { - "file": "ui/storybook/stories/companies/decision-models/02-history.stories.tsx", - "capabilities": [ - "companies/identity", - "budgets-costs/cost-reporting", - "companies/decision-models" - ], - "purpose": "Decision models/02 History", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "maps/feature-map/companies.md", - "ui/src/components/decision-models/DecisionHistory.tsx", - "ui/storybook/stories/companies/decision-models/02-history.stories.tsx", - "ui/storybook/support/decision-models/fixtures.ts" - ], - "fingerprint": "a32eb6bdb93e8fd8ecb05ed6bc8a7483c6c39e77b862700ff1ae192293d139ee", - "stableId": "decision-models-02-history", - "sidebarTitle": "Getting started and access/Companies and portability/Decision models/02 History" - }, - { - "file": "ui/storybook/stories/companies/decision-models/03-journey.stories.tsx", - "capabilities": [ - "companies/identity", - "budgets-costs/cost-reporting", - "companies/decision-models" - ], - "purpose": "Decision models/03 Journey", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "maps/feature-map/companies.md", - "ui/src/components/Layout.tsx", - "ui/src/pages/CompanySettings.tsx", - "ui/src/pages/Costs.tsx", - "ui/storybook/stories/companies/decision-models/03-journey.stories.tsx", - "ui/storybook/support/decision-models/fixtures.ts" - ], - "fingerprint": "18b3ec30595cccd821d30fbf6eef0ca7b072666c9fd98b48f866b4420144a244", - "stableId": "decision-models-03-journey", - "sidebarTitle": "Getting started and access/Companies and portability/Decision models/03 Journey" - }, - { - "file": "ui/storybook/stories/inbox-search/decisions-desk.stories.tsx", - "capabilities": [ - "inbox-search/decisions" - ], - "purpose": "Pages/Decisions Desk", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "ui/src/components/AttentionQueueRow.tsx", - "ui/src/pages/DecisionQueuePage.tsx", - "ui/src/pages/WhatNeedsMe.tsx", - "ui/storybook/stories/inbox-search/decisions-desk.stories.tsx" - ], - "fingerprint": "4b39ccddf9d5ed2847fe0bd9f0078b183ffcaeb41b67121410909ef10a73e938", - "stableId": "pages-decisions-desk", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Pages/Decisions Desk" - }, - { - "file": "ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx", - "capabilities": [ - "instance-operations/server-service" - ], - "purpose": "Product/Dev Ops Surfaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/instance-operations.md", - "ui/src/components/DevRestartBanner.tsx", - "ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx" - ], - "fingerprint": "65b11bebc5c0a3f7644149c7ba18c7cd7fa810c300e60459ea045904f771c0ef", - "stableId": "product-dev-ops-surfaces", - "sidebarTitle": "Oversight and operation/Instance operations/Product/Dev Ops Surfaces" - }, - { - "file": "ui/storybook/stories/tasks/dialogs-modals.stories.tsx", - "capabilities": [ - "tasks/create", - "agents/hire", - "projects/lifecycle", - "goals/hierarchy" - ], - "purpose": "Product/Dialogs & Modals", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agents.md", - "maps/feature-map/goals.md", - "maps/feature-map/projects.md", - "maps/feature-map/tasks.md", - "ui/src/components/DocumentDiffModal.tsx", - "ui/src/components/ExecutionWorkspaceCloseDialog.tsx", - "ui/src/components/ImageGalleryModal.tsx", - "ui/src/components/NewAgentDialog.tsx", - "ui/src/components/NewGoalDialog.tsx", - "ui/src/components/NewIssueDialog.tsx", - "ui/src/components/NewProjectDialog.tsx", - "ui/src/components/PathInstructionsModal.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/dialogs-modals.stories.tsx" - ], - "fingerprint": "0106caca8a9ad499602499ab64ad96f7cbb9db6815195218775cc317ba7204ad", - "stableId": "product-dialogs-modals", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Product/Dialogs & Modals" - }, - { - "file": "ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx", - "capabilities": [ - "documents-artifacts/annotations" - ], - "purpose": "Product/Documents/Annotations", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/DocumentAnnotationLayer.tsx", - "ui/src/components/DocumentAnnotationPanel.tsx", - "ui/src/components/IssueDocumentAnnotations.tsx", - "ui/src/components/IssueDocumentsSection.tsx", - "ui/src/components/MarkdownBody.tsx", - "ui/src/components/MarkdownEditor.tsx", - "ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx" - ], - "fingerprint": "37f01db23f298992b973fed56fd439ae0a0586bfc703af55dcf9fa69f14b86de", - "stableId": "product-documents-annotations", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Product/Documents/Annotations" - }, - { - "file": "ui/storybook/stories/documents-artifacts/document-comments.stories.tsx", - "capabilities": [ - "documents-artifacts/annotations" - ], - "purpose": "Product/Document Comments", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/DocumentAnnotationLayer.tsx", - "ui/src/components/DocumentAnnotationPanel.tsx", - "ui/storybook/stories/documents-artifacts/document-comments.stories.tsx" - ], - "fingerprint": "1ff3445ed22893256cecf44c00c5f4714ae573e4d26351388fb672efe8726df4", - "stableId": "product-document-comments", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Product/Document Comments" - }, - { - "file": "ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx", - "capabilities": [ - "runs-adapters/validation", - "gateways-profiles/client-connect" - ], - "purpose": "Assistant connections/Dot Runner", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "maps/feature-map/runs-adapters.md", - "ui/src/components/DotRunnerConnection.tsx", - "ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx" - ], - "fingerprint": "65219fd330a54350d2c91a485039d2a8dc6886cce3dbde64bce2b514d2bdcc95", - "stableId": "assistant-connections-dot-runner", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/Assistant connections/Dot Runner" - }, - { - "file": "ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "connection-setup/failure" - ], - "purpose": "Apps/Enterpret connector", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/app-detail/AdvancedPanel.tsx", - "ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx" - ], - "fingerprint": "81be6c7c5dd054799a393b8c61c29c4190cf8a112fd9e573e0010c2cbab393c9", - "stableId": "apps-enterpret-connector", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Enterpret connector" - }, - { - "file": "ui/storybook/stories/secrets/environment-variables-editor.stories.tsx", - "capabilities": [ - "secrets/runtime-delivery" - ], - "purpose": "Product/Environment Variables Editor", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/secrets.md", - "ui/src/components/environment-variables-editor/index.tsx", - "ui/storybook/stories/secrets/environment-variables-editor.stories.tsx" - ], - "fingerprint": "e358e40a80d2d2dc92050836098375e0f9d88a3b59491d24c1a4c4b784e70c00", - "stableId": "product-environment-variables-editor", - "sidebarTitle": "Apps, channels, and extensions/Secrets and proposals/Product/Environment Variables Editor" - }, - { - "file": "ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx", - "capabilities": [ - "recovery/diagnosis" - ], - "purpose": "Task chat/Recovery notice", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/ExecutionBlockerNotice.tsx", - "ui/src/components/WorkspaceFileRecovery.tsx", - "ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx", - "ui/storybook/support/workspace-file-recovery/fixture.tsx" - ], - "fingerprint": "cb2da1b3f76b1b644f7b11fb6f55c27950ae51ce3e590ead878d3703606588d7", - "stableId": "task-chat-recovery-notice", - "sidebarTitle": "Projects and execution/Recovery/Task chat/Recovery notice" - }, - { - "file": "ui/storybook/stories/recovery/execution-recovery.stories.tsx", - "capabilities": [ - "recovery/diagnosis" - ], - "purpose": "Tasks/Execution recovery", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/ActiveAgentsPanel.tsx", - "ui/src/components/IssueRow.tsx", - "ui/src/components/task-chat/TaskChatLiveRunPill.tsx", - "ui/src/components/task-chat/TaskChatRunnerTurn.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/recovery/execution-recovery.stories.tsx" - ], - "fingerprint": "4cfa6fd775c9cf04e0586ed5a7218df3e8bb51dcaadf80b9a26a979aabf61e98", - "stableId": "tasks-execution-recovery", - "sidebarTitle": "Projects and execution/Recovery/Tasks/Execution recovery" - }, - { - "file": "ui/storybook/stories/agents/external-agent-invite/components.stories.tsx", - "capabilities": [ - "agents/hire", - "access/invitations" - ], - "purpose": "Onboarding/External agent invitation/Components", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/agents.md", - "ui/src/components/new-agent/ExternalAgentInviteContent.tsx", - "ui/storybook/stories/agents/external-agent-invite/components.stories.tsx" - ], - "fingerprint": "596b3f1c4e49684683cbf309dc516c5b2d14c1032f2f3c2dba44257bc25c13ef", - "stableId": "onboarding-external-agent-invitation-components", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Components" - }, - { - "file": "ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx", - "capabilities": [ - "agents/hire", - "access/invitations" - ], - "purpose": "Onboarding/External agent invitation/Journeys", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/agents.md", - "ui/src/components/AnimatedDialogContent.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/new-agent/AgentBasicsDialog.tsx", - "ui/src/components/new-agent/ExternalAgentInviteContent.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/support/external-agent-invite/ExternalAgentInvitePreview.tsx", - "ui/storybook/support/external-agent-invite/fixtures.ts", - "ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx" - ], - "fingerprint": "fcca4eb4429c48361c9f39c01fe0aa3dab983452fbe8b1cf6be0266a9ff391ad", - "stableId": "onboarding-external-agent-invitation-journeys", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Journeys" - }, - { - "file": "ui/storybook/stories/tasks/external-objects.stories.tsx", - "capabilities": [ - "tasks/properties" - ], - "purpose": "Foundations/External Objects", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/ExternalObjectPill.tsx", - "ui/src/components/ExternalObjectStatusIcon.tsx", - "ui/src/components/ExternalObjectStatusSummary.tsx", - "ui/src/components/IssueFiltersPopover.tsx", - "ui/src/components/IssueProperties.tsx", - "ui/src/components/IssueRelatedWorkPanel.tsx", - "ui/src/components/IssueRow.tsx", - "ui/src/components/MarkdownBody.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/external-objects.stories.tsx" - ], - "fingerprint": "1a7a6fc735b582b7f0968b97d0159528834a499f6d090c0ec678a1092dc6e3ac", - "stableId": "foundations-external-objects", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/External Objects" - }, - { - "file": "ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx", - "capabilities": [ - "companies/identity", - "budgets-costs/cost-reporting", - "companies/fast-responses" - ], - "purpose": "Fast responses/01 Settings", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "maps/feature-map/companies.md", - "ui/src/components/fast-responses/FastResponseSettings.tsx", - "ui/storybook/support/decision-models/fixtures.ts", - "ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx" - ], - "fingerprint": "569c9d9b91872d61d0b4fe44b114d7f9c81bb8c5a5ca5b3545235cd935d8129e", - "stableId": "fast-responses-01-settings", - "sidebarTitle": "Getting started and access/Companies and portability/Fast responses/01 Settings" - }, - { - "file": "ui/storybook/stories/companies/fast-responses/02-history.stories.tsx", - "capabilities": [ - "companies/identity", - "budgets-costs/cost-reporting", - "companies/fast-responses" - ], - "purpose": "Fast responses/02 History", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "maps/feature-map/companies.md", - "ui/src/components/decision-models/DecisionHistory.tsx", - "ui/storybook/support/decision-models/fixtures.ts", - "ui/storybook/stories/companies/fast-responses/02-history.stories.tsx" - ], - "fingerprint": "0be6f0579e9daf13ba3bc6500c4a5980efc09407a408498385219391a5fdd3c1", - "stableId": "fast-responses-02-history", - "sidebarTitle": "Getting started and access/Companies and portability/Fast responses/02 History" - }, - { - "file": "ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments" - ], - "purpose": "Components/File Viewer Sheet", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/FileViewerSheet.tsx", - "ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx" - ], - "fingerprint": "8626806337c9c664e11cee4587b80e068dfd3e6259e8c8fc2d3d1648b68abf84", - "stableId": "components-file-viewer-sheet", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Components/File Viewer Sheet" - }, - { - "file": "ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "routines/triggers" - ], - "purpose": "PR reviews/Fireflies and app webhooks", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "maps/feature-map/routines.md", - "ui/src/components/Layout.tsx", - "ui/src/components/RoutineTriggerCard.tsx", - "ui/src/components/routine-sections/context.tsx", - "ui/src/components/routine-sections/editable-sections.production.tsx", - "ui/src/components/routine-triggers/TriggerWizard.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/RoutineDetail.tsx", - "ui/src/pages/Routines.tsx", - "ui/src/pages/apps/AppLogo.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/app-detail/PermissionsPanel.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/routineWebhooks.tsx", - "ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx" - ], - "fingerprint": "0a85fc855275fb6dfbd89dbc9d25bed994b940af1a01d95b04d4375d843fd1dc", - "stableId": "pr-reviews-fireflies-and-app-webhooks", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/PR reviews/Fireflies and app webhooks" - }, - { - "file": "ui/storybook/stories/skills/fork-skill-flow.stories.tsx", - "capabilities": [ - "skills/authoring" - ], - "purpose": "Skill Studio/EditACopy", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/skill-studio/AgentsUsingSkillDialog.tsx", - "ui/src/components/skill-studio/ForkSkillDialog.tsx", - "ui/src/components/skill-studio/SkillProvenance.tsx", - "ui/storybook/stories/skills/fork-skill-flow.stories.tsx" - ], - "fingerprint": "7cd95e52a451f78371dc2c5793679c14b28f1fb486dcb2ed5f8b1f4e041267a8", - "stableId": "skill-studio-editacopy", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/EditACopy" - }, - { - "file": "ui/storybook/stories/foundations/forms-editors.stories.tsx", - "capabilities": [ - "developer-labs/design" - ], - "purpose": "Components/Forms & Editors", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "ui/src/components/ExecutionParticipantPicker.tsx", - "ui/src/components/FoldCurtain.tsx", - "ui/src/components/InlineEditor.tsx", - "ui/src/components/InlineEntitySelector.tsx", - "ui/src/components/JsonSchemaForm.tsx", - "ui/src/components/MarkdownBody.tsx", - "ui/src/components/MarkdownEditor.tsx", - "ui/src/components/ReportsToPicker.tsx", - "ui/src/components/RoutineRunVariablesDialog.tsx", - "ui/src/components/RoutineVariablesEditor.tsx", - "ui/src/components/ScheduleEditor.tsx", - "ui/src/components/environment-variables-editor/index.tsx", - "ui/src/components/ui/badge.tsx", - "ui/src/components/ui/button.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/foundations/forms-editors.stories.tsx", - "maps/feature-map/developer-labs.md" - ], - "exception": "Shared foundations or contributor guide; no single business capability owns this suite.", - "fingerprint": "28920ad31b69171ba62c0fd1f5b7f1581d527ede597acd6b445c5f8e773c2f64", - "stableId": "components-forms-editors", - "sidebarTitle": "Foundations/Components/Forms & Editors", - "home": "foundations" - }, - { - "file": "ui/storybook/stories/foundations/foundations.stories.tsx", - "capabilities": [ - "developer-labs/design" - ], - "purpose": "Foundations/Primitive Matrix", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "ui/src/components/ui/badge.tsx", - "ui/src/components/ui/button.tsx", - "ui/src/components/ui/card.tsx", - "ui/src/components/ui/checkbox.tsx", - "ui/src/components/ui/dialog.tsx", - "ui/src/components/ui/input.tsx", - "ui/src/components/ui/label.tsx", - "ui/src/components/ui/popover.tsx", - "ui/src/components/ui/select.tsx", - "ui/src/components/ui/separator.tsx", - "ui/src/components/ui/tabs.tsx", - "ui/src/components/ui/textarea.tsx", - "ui/src/components/ui/toggle-switch.tsx", - "ui/src/components/ui/tooltip.tsx", - "ui/storybook/stories/foundations/foundations.stories.tsx", - "maps/feature-map/developer-labs.md" - ], - "exception": "Shared foundations or contributor guide; no single business capability owns this suite.", - "fingerprint": "59d7a5410b79c4825e561dc3286e6138f97fe6fa89a30ccced2c980cf8fc4fe3", - "stableId": "foundations-primitive-matrix", - "sidebarTitle": "Foundations/Primitive Matrix", - "home": "foundations" - }, - { - "file": "ui/storybook/stories/skills/frontmatter-panel.stories.tsx", - "capabilities": [ - "skills/authoring" - ], - "purpose": "Product/Skill Studio · FrontmatterPanel", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/FrontmatterPanel.tsx", - "ui/storybook/stories/skills/frontmatter-panel.stories.tsx" - ], - "fingerprint": "e7b2ffabdadc43d7fa2f564465792539d25f15da54fb4f7fec31cc4a2f0aec76", - "stableId": "product-skill-studio-·-frontmatterpanel", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Product/Skill Studio · FrontmatterPanel" - }, - { - "file": "ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx", - "capabilities": [ - "gateways-profiles/gateway" - ], - "purpose": "Tools/Gateways (PAP-11182)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/tools/GatewaysTab.tsx", - "ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx" - ], - "fingerprint": "c4e0e6770f0ed5d6cad1805717b38b9ab6a96e1c885a2013af979556dd45e8ae", - "stableId": "tools-gateways-pap-11182", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Tools/Gateways (PAP-11182)" - }, - { - "file": "ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx", - "capabilities": [ - "chat-channels/providers", - "chat-channels/conversation" - ], - "purpose": "Connectors/GitHub bot management", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/api/chatEndpoints.ts", - "ui/src/api/execution-workspaces.ts", - "ui/src/api/projects.ts", - "ui/src/components/Layout.tsx", - "ui/src/components/OnboardingWizard.tsx", - "ui/src/pages/apps/chat/ChatConversationList.tsx", - "ui/src/pages/apps/chat/ChatEndpointDetail.tsx", - "ui/src/pages/apps/chat/ChatExecutionDefaults.tsx", - "ui/src/pages/apps/chat/GitHubAppIdentity.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/GitHubConnectionComplete.tsx", - "ui/storybook/fixtures/onboardingDraft.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx", - "ui/storybook/support/github-bot-management/fixture-api.tsx", - "ui/storybook/support/github-bot-management/fixtures.ts" - ], - "fingerprint": "bc53bda552a9a7f4835d2c78ec0dc66492b5804db227b9adce191f4d6dc27c53", - "stableId": "connectors-github-bot-management", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connectors/GitHub bot management" - }, - { - "file": "ui/storybook/stories/chat-channels/github-chat.stories.tsx", - "capabilities": [ - "chat-channels/providers", - "chat-channels/conversation" - ], - "purpose": "Historical/GitHub chat prototypes", - "status": "historical", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/components/GitHubAgentTrustWarning.tsx", - "ui/src/components/SetupWizard.tsx", - "ui/src/pages/apps/chat/GitHubSetupPrompt.tsx", - "ui/storybook/prototypes/github-chat/AccessEditor.tsx", - "ui/storybook/prototypes/github-chat/GitHubChatPreview.tsx", - "ui/storybook/prototypes/github-chat/fixtures.ts", - "ui/storybook/stories/chat-channels/github-chat.stories.tsx" - ], - "replacement": "ui/storybook/stories/chat-channels/github-connections.stories.tsx", - "fingerprint": "efb2ea9851242dfd79874e3a3c9bc46b17b7728e2b10f6b2127a2437638f0499", - "stableId": "historical-github-chat-prototypes", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Historical/GitHub chat prototypes" - }, - { - "file": "ui/storybook/stories/chat-channels/github-connections.stories.tsx", - "capabilities": [ - "chat-channels/providers", - "connection-setup/channel-setup" - ], - "purpose": "Connections/GitHub and Code Review Bot", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "maps/feature-map/connection-setup.md", - "ui/src/components/SetupWizard.tsx", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/chat/ChatEndpointSetup.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/github-connections.stories.tsx" - ], - "fingerprint": "e59cc39bf1cf6db5359c94a30c7b64e3b8cb175b576295f16d541850929abce9", - "stableId": "connections-github-and-code-review-bot", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/GitHub and Code Review Bot" - }, - { - "file": "ui/storybook/stories/skills/github-skills-journey.stories.tsx", - "capabilities": [ - "skills/versions", - "skills/discovery", - "skills/policy" - ], - "purpose": "Skills/GitHub sync journey", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/Layout.tsx", - "ui/src/pages/CompanySkills.tsx", - "ui/src/pages/SkillSources.tsx", - "ui/src/pages/SkillStudio.tsx", - "ui/storybook/fixtures/githubSkillSources.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/skills/github-skills-journey.stories.tsx" - ], - "fingerprint": "04b12de08d13813c1332d46f9bed8164f329aaf73ea0c57cbf83ecb6d3a4c6b1", - "stableId": "skills-github-sync-journey", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub sync journey" - }, - { - "file": "ui/storybook/stories/skills/github-synced-skills.stories.tsx", - "capabilities": [ - "skills/versions", - "skills/discovery" - ], - "purpose": "Skills/GitHub synced skills", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/pages/SkillSources.tsx", - "ui/storybook/fixtures/githubSkillSources.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/skills/github-synced-skills.stories.tsx" - ], - "fingerprint": "c14509e4b57e7587f560824f417c8439dbb6bc3d303d37dec169ab819c867d36", - "stableId": "skills-github-synced-skills", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skills/GitHub synced skills" - }, - { - "file": "ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments", - "workspaces/files-git" - ], - "purpose": "HTML artifacts/01 Preview", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "maps/feature-map/workspaces.md", - "ui/src/components/task-side-panel/TaskAttachmentPanel.tsx", - "ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx", - "ui/storybook/support/html-artifacts/fixtures.ts" - ], - "fingerprint": "404690079b8b85bf7aaab867266a14096f7d57bea2665032efba2f82617008df", - "stableId": "html-artifacts-01-preview", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/01 Preview" - }, - { - "file": "ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments", - "workspaces/files-git" - ], - "purpose": "HTML artifacts/02 Workspace", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "maps/feature-map/workspaces.md", - "ui/src/components/FileViewerSheet.tsx", - "ui/src/components/task-side-panel/TaskWorkspaceFilePanel.tsx", - "ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx", - "ui/storybook/support/html-artifacts/fixtures.ts" - ], - "fingerprint": "4ced4be164f64cb1dd0158cf3afc9939e63e4447a3911b33e664544277693f0b", - "stableId": "html-artifacts-02-workspace", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/02 Workspace" - }, - { - "file": "ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments", - "workspaces/files-git" - ], - "purpose": "HTML artifacts/03 Task journey", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "maps/feature-map/workspaces.md", - "ui/src/components/Layout.tsx", - "ui/src/components/artifacts/IssueArtifactCard.tsx", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-side-panel/TaskSidePanel.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx", - "ui/storybook/support/html-artifacts/fixtures.ts" - ], - "fingerprint": "c5cb892dd95ec005e52e6c61de414aedb5fe2a443a729038767028edd3c52b6d", - "stableId": "html-artifacts-03-task-journey", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/03 Task journey" - }, - { - "file": "ui/storybook/stories/chat-channels/imessage-photon.stories.tsx", - "capabilities": [ - "chat-channels/conversation", - "chat-channels/providers", - "chat-channels/identity", - "chat-channels/lifecycle", - "connection-setup/channel-setup", - "connection-setup/failure" - ], - "purpose": "Connections/iMessage Photon", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/api/chatEndpoints.ts", - "ui/src/api/execution-workspaces.ts", - "ui/src/api/projects.ts", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/chat/ChatEndpointDetail.tsx", - "ui/src/pages/apps/chat/ChatEndpointSetup.tsx", - "ui/src/pages/apps/chat/ChatExecutionDefaults.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/imessage-photon.stories.tsx", - "maps/feature-map/connection-setup.md" - ], - "fingerprint": "0bde3836db1263b123716adacf6873f4acda21680527cc5d172a262d5706db33", - "stableId": "connections-imessage-photon", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/iMessage Photon" - }, - { - "file": "ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx", - "capabilities": [ - "connection-setup/task-request" - ], - "purpose": "Connections/In-task connections", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/TaskChatInteractionCard.tsx", - "ui/src/features/connections/ConnectionIntentInteractionBody.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx" - ], - "fingerprint": "0f7d921de69bc5e5164123985848a1a58bc2c860ebe085e70c300d36cc02a018", - "stableId": "connections-in-task-connections", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Connections/In-task connections" - }, - { - "file": "ui/storybook/stories/steering/interrupt-handoff.stories.tsx", - "capabilities": [ - "steering/interrupt" - ], - "purpose": "Surfaces/Interrupt Handoff", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/steering.md", - "ui/src/components/interrupt-handoff/InterruptHandoffViews.tsx", - "ui/storybook/stories/steering/interrupt-handoff.stories.tsx" - ], - "fingerprint": "dbfb5b79928aefbc232eb6abbb17325aa6e5e0002c32bda062b529d2f486faab", - "stableId": "surfaces-interrupt-handoff", - "sidebarTitle": "Tasks and conversations/Steering and queued messages/Surfaces/Interrupt Handoff" - }, - { - "file": "ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx", - "capabilities": [ - "recovery/diagnosis", - "task-coordination/dependencies" - ], - "purpose": "Product/Issue/Blocked notice", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "maps/feature-map/task-coordination.md", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/task-chat/TaskChatBlockerLinks.tsx", - "ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx" - ], - "fingerprint": "90f1eae150c50bd1a428ce322a8d65ceec8b24b6addc8b3b4ea5e90231bc1a2c", - "stableId": "product-issue-blocked-notice", - "sidebarTitle": "Projects and execution/Recovery/Product/Issue/Blocked notice" - }, - { - "file": "ui/storybook/stories/tasks/issue-management.stories.tsx", - "capabilities": [ - "tasks/properties", - "tasks/organize" - ], - "purpose": "Product/Issue Management", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/Identity.tsx", - "ui/src/components/IssueColumns.tsx", - "ui/src/components/IssueContinuationHandoff.tsx", - "ui/src/components/IssueDocumentsSection.tsx", - "ui/src/components/IssueFiltersPopover.tsx", - "ui/src/components/IssueGroupHeader.tsx", - "ui/src/components/IssueLinkQuicklook.tsx", - "ui/src/components/IssueProperties.tsx", - "ui/src/components/IssueRunLedger.tsx", - "ui/src/components/IssueWorkspaceCard.tsx", - "ui/src/components/IssuesList.tsx", - "ui/src/components/IssuesQuicklook.tsx", - "ui/src/components/PriorityIcon.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/issue-management.stories.tsx", - "ui/storybook/support/issue-creation-visibility.tsx" - ], - "fingerprint": "554a97d096cb27b9418fa2dc5a3bc0cb853e8bafa128ef9abd7cf1c3df3a6bd5", - "stableId": "product-issue-management", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Product/Issue Management" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx", - "capabilities": [ - "questions-and-approvals/plan-review", - "task-coordination/delegation" - ], - "purpose": "Issue Detail/Plan Decompositions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/questions-and-approvals.md", - "maps/feature-map/task-coordination.md", - "ui/src/components/IssuePlanDecompositionsSection.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx" - ], - "fingerprint": "b2a44ee40bf7e673563ad6e164e3476306782a9ea74e132fa5330eb78acb82e0", - "stableId": "issue-detail-plan-decompositions", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Issue Detail/Plan Decompositions" - }, - { - "file": "ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx", - "capabilities": [ - "task-coordination/signoff" - ], - "purpose": "Product/Decisions/Stalled review actions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/task-coordination.md", - "ui/src/components/AttentionQueueRow.tsx", - "ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx" - ], - "fingerprint": "3c5317b38030ea75a8d57284af6d3ca2f0258dce52c694adc7b36fd41f6f875f", - "stableId": "product-decisions-stalled-review-actions", - "sidebarTitle": "Tasks and conversations/Delegation, dependencies, and signoff/Product/Decisions/Stalled review actions" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx", - "capabilities": [ - "questions-and-approvals/questions", - "questions-and-approvals/confirmations", - "questions-and-approvals/audience", - "questions-and-approvals/plan-review", - "questions-and-approvals/continuation" - ], - "purpose": "Chat & Comments/Issue Thread Interactions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/questions-and-approvals.md", - "ui/src/components/IssueChatThread.tsx", - "ui/src/components/IssueThreadInteractionCard.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx" - ], - "fingerprint": "c36c3843d115a3dda4aded27d0ed2098105b18568b66e054f77088beca9a6e3c", - "stableId": "chat-comments-issue-thread-interactions", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Chat & Comments/Issue Thread Interactions" - }, - { - "file": "ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/07 Subscription sign-in", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx" - ], - "fingerprint": "7ec5fe9129699ed14dd55c4e3849c602100a1a934bad44b6fd6d31af4e8a0458", - "stableId": "ai-connections-provider-routing-07-subscription-sign-in", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/07 Subscription sign-in" - }, - { - "file": "ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx", - "capabilities": [ - "connection-setup/handoff" - ], - "purpose": "Apps/Managed Cloud OAuth handoff", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/PaperclipCloudOAuthHandoff.tsx", - "ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx" - ], - "fingerprint": "3dfb21c9edeec6693db673e59fd0963597858d010c4eb1de35dc47535780d0c1", - "stableId": "apps-managed-cloud-oauth-handoff", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Managed Cloud OAuth handoff" - }, - { - "file": "ui/storybook/stories/connection-setup/memory-connectors.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "agents/instructions" - ], - "purpose": "Apps/Connections/Memory", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agents.md", - "maps/feature-map/connection-setup.md", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/InstanceExperimentalSettings.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/stories/connection-setup/memory-connectors.stories.tsx" - ], - "fingerprint": "cc6f6d6a84e516e87c3c7d4d2c4303e693b92ea5117958bf4f9db96ac0f5a993", - "stableId": "apps-connections-memory", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Connections/Memory" - }, - { - "file": "ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx", - "capabilities": [ - "tasks/create" - ], - "purpose": "Components/Entity pickers/Mobile", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/InlineEntitySelector.tsx", - "ui/src/components/SearchableSelect.tsx", - "ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx" - ], - "fingerprint": "249524a570189f2b01ef83136346a0d1ee099e233e357aa92ffaecd52a376b32", - "stableId": "components-entity-pickers-mobile", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Components/Entity pickers/Mobile" - }, - { - "file": "ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx", - "capabilities": [ - "navigation-preferences/navigation" - ], - "purpose": "Prototypes/Task detail/Mobile tabs", - "status": "proposed", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "Local composition retained for its original design purpose; full production parity remains unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/navigation-preferences.md", - "ui/src/components/side-panel/index.ts", - "ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx" - ], - "fingerprint": "f4ca5d157e5d943470084559cd557a95f80e3d20348e972bb3fa8df93d339bf6", - "stableId": "prototypes-task-detail-mobile-tabs", - "sidebarTitle": "Oversight and operation/Navigation, profile, and announcements/Prototypes/Task detail/Mobile tabs" - }, - { - "file": "ui/storybook/stories/recovery/model-capacity-retry.stories.tsx", - "capabilities": [ - "recovery/bounded-continuation" - ], - "purpose": "Tasks/Model capacity retry", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/IssueScheduledRetryCard.tsx", - "ui/storybook/stories/recovery/model-capacity-retry.stories.tsx" - ], - "fingerprint": "cc935eea1a2ffc27882364655db860c441c4dc059be3d4886a4bd7d3839752bf", - "stableId": "tasks-model-capacity-retry", - "sidebarTitle": "Projects and execution/Recovery/Tasks/Model capacity retry" - }, - { - "file": "ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx", - "capabilities": [ - "task-coordination/tree-control" - ], - "purpose": "Product/Issue Monitor surfaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/task-coordination.md", - "ui/src/components/IssueMonitorBanner.tsx", - "ui/src/components/IssueProperties.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx" - ], - "fingerprint": "2a9a823ce7e27a2e49d80bafc21394af1d34a396d53299b89e0d0c7fe4ae60f6", - "stableId": "product-issue-monitor-surfaces", - "sidebarTitle": "Tasks and conversations/Delegation, dependencies, and signoff/Product/Issue Monitor surfaces" - }, - { - "file": "ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx", - "capabilities": [ - "navigation-preferences/navigation" - ], - "purpose": "Product/Navigation & Layout", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/navigation-preferences.md", - "ui/src/components/BreadcrumbBar.tsx", - "ui/src/components/CommandPalette.tsx", - "ui/src/components/CompanySwitcher.tsx", - "ui/src/components/KeyboardShortcutsCheatsheet.tsx", - "ui/src/components/MobileBottomNav.tsx", - "ui/src/components/PageTabBar.tsx", - "ui/src/components/Sidebar.tsx", - "ui/src/components/SidebarAccountMenu.tsx", - "ui/src/components/SidebarCompanyMenu.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx" - ], - "fingerprint": "80b5d40676ba4a9e37936b8481dd282e1e468c6e7b256cc8687a0a712e4d3dfe", - "stableId": "product-navigation-layout", - "sidebarTitle": "Oversight and operation/Navigation, profile, and announcements/Product/Navigation & Layout" - }, - { - "file": "ui/storybook/stories/agents/new-agent-onboarding.stories.tsx", - "capabilities": [ - "agents/hire" - ], - "purpose": "Onboarding/New agent", - "status": "historical", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "Retained local wizard predates production ui/src/components/new-agent flow; shared fields do not make the wizard current.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/src/components/AgentConfigForm.tsx", - "ui/src/components/NewIssueDialog.tsx", - "ui/src/components/RuntimeTestCard.tsx", - "ui/src/components/agent-config-primitives.tsx", - "ui/src/components/new-agent/AgentBasicsDialog.tsx", - "ui/src/components/onboarding/CredentialModeLink.tsx", - "ui/src/components/onboarding/FooterNav.tsx", - "ui/src/components/onboarding/ModelSourceTiles.tsx", - "ui/src/components/onboarding/OnboardingPrimitives.tsx", - "ui/src/components/onboarding/PillGuy.tsx", - "ui/src/components/onboarding/onboarding-motion.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/NewAgentWizard.tsx", - "ui/storybook/prototypes/ProviderConnectionPreview.tsx", - "ui/storybook/prototypes/RuntimeTestCard.tsx", - "ui/storybook/prototypes/new-agent-fixtures.ts", - "ui/storybook/stories/agents/new-agent-onboarding.stories.tsx" - ], - "replacement": "ui/storybook/stories/agents/agent-persona-pages.stories.tsx", - "fingerprint": "b79b3193788385fef0e26daaf1cf30f48e77ca2f224a70141a64c0feced97aea", - "stableId": "onboarding-new-agent", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/New agent" - }, - { - "file": "ui/storybook/stories/projects/new-project-repos.stories.tsx", - "capabilities": [ - "projects/repositories" - ], - "purpose": "Proposals/Project repos/New project", - "status": "proposed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "RepositoryEditor is shipped, but NewProjectPrototype composes its own creation flow. Preserve proposal until route parity is checked.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/projects.md", - "ui/src/components/RepositoryEditor.tsx", - "ui/src/components/SearchableSelect.tsx", - "ui/src/components/icons/github-icon.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/storybook/prototypes/project-repos/ProjectReposPrototype.tsx", - "ui/storybook/prototypes/project-repos/fixtures.ts", - "ui/storybook/stories/projects/new-project-repos.stories.tsx" - ], - "fingerprint": "bf8bd88964cbf20a95449a10485d2aaf074cfe3f88456144332b193c2920be4b", - "stableId": "proposals-project-repos-new-project", - "sidebarTitle": "Projects and execution/Projects and repositories/Proposals/Project repos/New project" - }, - { - "file": "ui/storybook/stories/tasks/new-task-composer.stories.tsx", - "capabilities": [ - "tasks/create", - "workspaces/binding" - ], - "purpose": "Composer/New task", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/MarkdownBody.tsx", - "ui/src/components/NewIssueDialog.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/new-task-composer.stories.tsx", - "maps/feature-map/workspaces.md" - ], - "fingerprint": "efb21d7fdb67867b886668295e55ac1e05f67c71029fb85b7f341c9662217705", - "stableId": "composer-new-task", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Composer/New task" - }, - { - "file": "ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx", - "capabilities": [ - "connection-setup/credentials", - "connection-setup/failure" - ], - "purpose": "Apps/Notion MCP connect flow (PAP-16650)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/AppLogo.tsx", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/app-detail/AdvancedPanel.tsx", - "ui/src/pages/apps/app-detail/IdentitiesSection.tsx", - "ui/src/pages/apps/app-detail/SetupPanel.tsx", - "ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx" - ], - "fingerprint": "7dc85c9cf9f5a37268aa1bca783d1c68d5cef474838ee79b4f1d2b293a7765d2", - "stableId": "apps-notion-mcp-connect-flow-pap-16650", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Apps/Notion MCP connect flow (PAP-16650)" - }, - { - "file": "ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx", - "capabilities": [ - "onboarding/adapter", - "onboarding/first-task" - ], - "purpose": "Onboarding/Agent arc", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/onboarding.md", - "ui/src/components/OnboardingWizard.tsx", - "ui/src/components/onboarding/PillGuy.tsx", - "ui/src/components/onboarding/Stepper.tsx", - "ui/storybook/fixtures/onboardingDraft.ts", - "ui/storybook/fixtures/onboardingEnvironment.ts", - "ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx" - ], - "fingerprint": "b963de5ca45df1b937323d98f79221755215038490df854191b8ece8e7c6e174", - "stableId": "onboarding-agent-arc", - "sidebarTitle": "Getting started and access/Onboarding and first work/Onboarding/Agent arc" - }, - { - "file": "ui/storybook/stories/onboarding/onboarding-character.stories.tsx", - "capabilities": [ - "onboarding/company" - ], - "purpose": "Onboarding/Character", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/onboarding.md", - "ui/src/components/onboarding/OnboardingCharacter.tsx", - "ui/src/components/ui/button.tsx", - "ui/storybook/stories/onboarding/onboarding-character.stories.tsx" - ], - "fingerprint": "a5dcbade2bfe0d1ac11473ae8ee14112a22fd2d51bc9bf3a86c9a979da396b91", - "stableId": "onboarding-character", - "sidebarTitle": "Getting started and access/Onboarding and first work/Onboarding/Character" - }, - { - "file": "ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx", - "capabilities": [ - "onboarding/adapter", - "onboarding/first-task" - ], - "purpose": "Onboarding/Connect a model", - "status": "historical", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "Older tile/mode preview; onboarding-agent-arc mounts the production wizard.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/onboarding.md", - "ui/src/components/onboarding/ConnectModelPreview.tsx", - "ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx" - ], - "replacement": "ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx", - "fingerprint": "d25e90d99be339dd918c5b0ca388683be54feae4750e4f358b675c359b75be77", - "stableId": "onboarding-connect-a-model", - "sidebarTitle": "Getting started and access/Onboarding and first work/Onboarding/Connect a model" - }, - { - "file": "ui/storybook/stories/task-coordination/originating-tasks.stories.tsx", - "capabilities": [ - "task-coordination/delegation", - "projects/task-context" - ], - "purpose": "UX Labs/Tasks Created From a Task", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/projects.md", - "maps/feature-map/task-coordination.md", - "ui/src/components/Layout.tsx", - "ui/src/components/task-detail/TaskDetailTasksPanel.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/src/pages/ProjectDetail.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/originating-tasks/OriginatingTasks.tsx", - "ui/storybook/stories/task-coordination/originating-tasks.stories.tsx" - ], - "fingerprint": "16042f0e39379552a00b618f7dda6eea0e5227e4a90e21fbea8fe35c1ecb820f", - "stableId": "ux-labs-tasks-created-from-a-task", - "sidebarTitle": "Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Tasks Created From a Task" - }, - { - "file": "ui/storybook/stories/overview/overview.stories.tsx", - "capabilities": [], - "purpose": "Overview/Storybook Guide", - "status": "unreviewed", - "implementation": "guide", - "boundary": "static", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "ui/src/components/ui/badge.tsx", - "ui/src/components/ui/input.tsx", - "ui/storybook/stories/overview/overview.stories.tsx", - "ui/storybook/support/feature-map/FeatureOverview.tsx", - "ui/storybook/generated/feature-index.json" - ], - "exception": "Shared foundations or contributor guide; no single business capability owns this suite.", - "fingerprint": "71c2ea943674edd2e8692f33040e301fbd0a25391db4ea01b42ee165ad34eaba", - "stableId": "overview-storybook-guide", - "sidebarTitle": "Overview/Storybook Guide" - }, - { - "file": "ui/storybook/stories/steering/paused-composer.stories.tsx", - "capabilities": [ - "steering/stop-and-pause" - ], - "purpose": "Composer/Paused task takeover", - "status": "historical", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/steering.md", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/storybook/prototypes/PausedTaskComposer.tsx", - "ui/storybook/stories/steering/paused-composer.stories.tsx" - ], - "replacement": "ui/storybook/stories/steering/task-execution-controls.stories.tsx", - "fingerprint": "7e7436ddeb1e004e1b11297e93f7e299600a2fa68d36993275ed2591f6b4a320", - "stableId": "composer-paused-task-takeover", - "sidebarTitle": "Tasks and conversations/Steering and queued messages/Composer/Paused task takeover" - }, - { - "file": "ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx", - "capabilities": [ - "app-permissions/agent-access", - "app-permissions/action-policy" - ], - "purpose": "Tools/Permitted vs Installed", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/app-permissions.md", - "ui/src/components/IssueThreadInteractionCard.tsx", - "ui/src/pages/AgentToolsTab.tsx", - "ui/src/pages/apps/AppsConnect.tsx", - "ui/src/pages/apps/app-detail/PermissionsPanel.tsx", - "ui/src/pages/apps/app-detail/types.ts", - "ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx" - ], - "fingerprint": "8142253f986d8f969b73602f8832ded6b86f459f8ad46257af48655bc737b234", - "stableId": "tools-permitted-vs-installed", - "sidebarTitle": "Apps, channels, and extensions/App access and action permissions/Tools/Permitted vs Installed" - }, - { - "file": "ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx", - "capabilities": [ - "connection-setup/identity-and-access" - ], - "purpose": "Reviews/PAP-17835 Personal connection identity", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/connection-setup.md", - "ui/src/pages/apps/app-detail/IdentitiesSection.tsx", - "ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx" - ], - "fingerprint": "7f0d4c64425d3657c8d2662cea6541f52cb6f13fa276c02fec5398cb7df5111a", - "stableId": "reviews-pap-17835-personal-connection-identity", - "sidebarTitle": "Apps, channels, and extensions/Connection setup/Reviews/PAP-17835 Personal connection identity" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/00 Review guide", - "status": "unreviewed", - "implementation": "guide", - "boundary": "static", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx" - ], - "fingerprint": "dc2d1c8a114ba4e6c065170fe2cd6b39c8b6b7dce3d7ae1afbfbddc15adf5beb", - "stableId": "primary-agent-00-review-guide", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/01-components.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/01 Components", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/AgentIdentity.tsx", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/01-components.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "1ba218400f92d323d120ad223d92a0ddeee6d104ee36f1873e110a3e0124a1bb", - "stableId": "primary-agent-01-components", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/02 Sidebar", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "cf72eaff02b96c8f81a285c96246ef80e9d97e836b47f8bb88734175d5d01664", - "stableId": "primary-agent-02-sidebar", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/03 Agents", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "d8107859209157fdcd775b1e0161aa9b39fd79280b57d2bcd29e76afa1944c2a", - "stableId": "primary-agent-03-agents", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/04 New task", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "2e30847e4f8d957c11600f3663358e0eb555f2185cb85c4c1c1b4d57eba62f51", - "stableId": "primary-agent-04-new-task", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/05 Chat", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "fa3248cdb686fb0827390fbabea3c2ed38950e5234141254a53756cd271b4903", - "stableId": "primary-agent-05-chat", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/06 Journeys", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "68a196913fd72374066dcccf55430d742881a983be2d914de2e02fd98a825fd0", - "stableId": "primary-agent-06-journeys", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys" - }, - { - "file": "ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx", - "capabilities": [ - "agents/primary-agent", - "tasks/create", - "agent-chat/discovery" - ], - "purpose": "Primary Agent/07 Confirmation", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "maps/feature-map/agents.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.production.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/SidebarAgents.tsx", - "ui/src/components/primary-agent/PrimaryAgentPresentation.tsx", - "ui/src/pages/AgentChat.tsx", - "ui/src/pages/AgentChats.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/Agents.production.tsx", - "ui/src/pages/Agents.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx", - "ui/storybook/support/primary-agent/PrimaryAgentStory.tsx" - ], - "fingerprint": "0d65a5877c6ef741b40ddd938c8066608307879ed029baafe59e7248e482558b", - "stableId": "primary-agent-07-confirmation", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/07 Confirmation" - }, - { - "file": "ui/storybook/stories/foundations/primitives-coverage.stories.tsx", - "capabilities": [ - "developer-labs/design" - ], - "purpose": "Foundations/Primitive Coverage", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "ui/src/components/ui/alert-dialog.tsx", - "ui/src/components/ui/avatar.tsx", - "ui/src/components/ui/breadcrumb.tsx", - "ui/src/components/ui/button.tsx", - "ui/src/components/ui/collapsible.tsx", - "ui/src/components/ui/command.tsx", - "ui/src/components/ui/dropdown-menu.tsx", - "ui/src/components/ui/radio-card.tsx", - "ui/src/components/ui/scroll-area.tsx", - "ui/src/components/ui/sheet.tsx", - "ui/src/components/ui/skeleton.tsx", - "ui/storybook/stories/foundations/primitives-coverage.stories.tsx", - "maps/feature-map/developer-labs.md" - ], - "exception": "Shared foundations or contributor guide; no single business capability owns this suite.", - "fingerprint": "bfacafe1d48789bac91fb595247ee767edf52cc705ba353031ccb155879b3d4c", - "stableId": "foundations-primitive-coverage", - "sidebarTitle": "Foundations/Primitive Coverage", - "home": "foundations" - }, - { - "file": "ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties" - ], - "purpose": "Private tasks/00 Review guide", - "status": "unreviewed", - "implementation": "guide", - "boundary": "static", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/tasks.md", - "ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx" - ], - "fingerprint": "dc46ad819f4c0d925acbd1170d8a9ee4018f2b49de0241a3b3d698f154ee9257", - "stableId": "private-tasks-00-review-guide", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/00 Review guide" - }, - { - "file": "ui/storybook/stories/access/private-tasks/01-creation.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties" - ], - "purpose": "Private tasks/01 Creation", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/DesignGuide.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/src/pages/Issues.tsx", - "ui/src/pages/ProjectDetail.tsx", - "ui/src/pages/Projects.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/01-creation.stories.tsx", - "ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "ea2ddeb4a186e49cdfb7241751e0b25b6565ddee24202c0e48169966ae3e2d96", - "stableId": "private-tasks-01-creation", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/01 Creation" - }, - { - "file": "ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties" - ], - "purpose": "Private tasks/02 Sharing", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/tasks.md", - "ui/src/components/IssueShareSheet.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "6595d72c6af25ff292b389d88e8d2019020f4e4a6965cceb2a50b793ec03b882", - "stableId": "private-tasks-02-sharing", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/02 Sharing" - }, - { - "file": "ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties" - ], - "purpose": "Private tasks/03 Task actions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/tasks.md", - "ui/src/components/IssuePrivacyActions.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "be8143e492deda70c9139b7e9f7022ae6b3c3b7603791074c22adb72a54adb79", - "stableId": "private-tasks-03-task-actions", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/03 Task actions" - }, - { - "file": "ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties" - ], - "purpose": "Private tasks/04 References and blockers", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/tasks.md", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/IssueReferencePill.tsx", - "ui/src/components/LockedIssueChip.tsx", - "ui/src/components/MarkdownBody.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/src/components/issue-properties/relation-controls.tsx", - "ui/src/components/task-detail/TaskDetailRelationsPanel.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "371547c4293f4f7e6e922113a9a6a2631bfe73979343fe70fc158b2e1fd3c5a4", - "stableId": "private-tasks-04-references-and-blockers", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/04 References and blockers" - }, - { - "file": "ui/storybook/stories/access/private-tasks/05-projects.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties", - "projects/lifecycle" - ], - "purpose": "Private tasks/05 Projects", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/projects.md", - "maps/feature-map/tasks.md", - "ui/src/components/IssueShareSheet.tsx", - "ui/src/components/ProjectAccessMembers.tsx", - "ui/src/components/ProjectProperties.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/05-projects.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "8b773d099d8ae633ab72108c0a4dd8b2c032aac03787ab47cda05426f456fb15", - "stableId": "private-tasks-05-projects", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/05 Projects" - }, - { - "file": "ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties", - "projects/lifecycle" - ], - "purpose": "Private tasks/06 Full product pages", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/projects.md", - "maps/feature-map/tasks.md", - "ui/src/components/Layout.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/DesignGuide.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/src/pages/Issues.tsx", - "ui/src/pages/ProjectDetail.tsx", - "ui/src/pages/Projects.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "a394e48a19ffce759f893bee7c28a1eceea2325ee9050cf41d42059afd5460d1", - "stableId": "private-tasks-06-full-product-pages", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/06 Full product pages" - }, - { - "file": "ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx", - "capabilities": [ - "access/resources", - "tasks/properties" - ], - "purpose": "Private tasks/07 User stories", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "maps/feature-map/tasks.md", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/IssuePrivacyActions.tsx", - "ui/src/components/IssueReferencePill.tsx", - "ui/src/components/IssueShareSheet.tsx", - "ui/src/components/Layout.tsx", - "ui/src/components/LockedIssueChip.tsx", - "ui/src/components/MarkdownBody.tsx", - "ui/src/components/ProjectAccessMembers.tsx", - "ui/src/components/ProjectProperties.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/src/components/issue-properties/relation-controls.tsx", - "ui/src/components/task-detail/TaskDetailRelationsPanel.tsx", - "ui/src/pages/DesignGuide.tsx", - "ui/src/pages/IssueDetail.tsx", - "ui/src/pages/Issues.tsx", - "ui/src/pages/ProjectDetail.tsx", - "ui/src/pages/Projects.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/privateTasks.ts", - "ui/storybook/stories/access/private-tasks/01-creation.stories.tsx", - "ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx", - "ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx", - "ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx", - "ui/storybook/stories/access/private-tasks/05-projects.stories.tsx", - "ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx", - "ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx", - "ui/storybook/support/private-tasks/PrivacyStory.tsx" - ], - "fingerprint": "ce4def84f6ceeb96cd91a285053edf1913baceb6628f70ac98612969bd46cf46", - "stableId": "private-tasks-07-user-stories", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Private tasks/07 User stories" - }, - { - "file": "ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx", - "capabilities": [ - "projects/defaults", - "workspaces/provisioning" - ], - "purpose": "Workspaces/Project runtime provision command", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/projects.md", - "maps/feature-map/workspaces.md", - "ui/src/components/ProjectProperties.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx" - ], - "fingerprint": "89c541df010f3ea0dafa6ed29e02882ffbbecca1aaa90a2606176ffe6b8f9f4d", - "stableId": "workspaces-project-runtime-provision-command", - "sidebarTitle": "Projects and execution/Projects and repositories/Workspaces/Project runtime provision command" - }, - { - "file": "ui/storybook/stories/projects/project-repos-configuration.stories.tsx", - "capabilities": [ - "projects/repositories" - ], - "purpose": "Proposals/Project repos/Configuration", - "status": "proposed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Production properties plus local configuration page composition; repository interaction is simulated.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/projects.md", - "ui/src/components/PageTabBar.tsx", - "ui/src/components/ProjectProperties.tsx", - "ui/src/components/RepositoryEditor.tsx", - "ui/src/components/SearchableSelect.tsx", - "ui/src/components/icons/github-icon.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/project-repos/ProjectConfigurationPage.tsx", - "ui/storybook/prototypes/project-repos/ProjectReposPrototype.tsx", - "ui/storybook/prototypes/project-repos/fixtures.ts", - "ui/storybook/stories/projects/project-repos-configuration.stories.tsx" - ], - "fingerprint": "8d96ac58686362abbaf468ba7cc400d43612fe0c8c21239cfa3fab2079ff5270", - "stableId": "proposals-project-repos-configuration", - "sidebarTitle": "Projects and execution/Projects and repositories/Proposals/Project repos/Configuration" - }, - { - "file": "ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx", - "capabilities": [ - "projects/lifecycle", - "goals/hierarchy", - "workspaces/binding" - ], - "purpose": "Product/Projects Goals Workspaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/goals.md", - "maps/feature-map/projects.md", - "maps/feature-map/workspaces.md", - "ui/src/components/GoalProperties.tsx", - "ui/src/components/GoalTree.tsx", - "ui/src/components/ProjectProperties.tsx", - "ui/src/components/ProjectWorkspaceSummaryCard.tsx", - "ui/src/components/ProjectWorkspacesContent.tsx", - "ui/src/components/WorkspaceRuntimeControls.tsx", - "ui/src/components/WorktreeBanner.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx" - ], - "fingerprint": "e7330baf164a462aaef557989a6334fd61e9b1f378dd6674f34f4e7bbe8f03bb", - "stableId": "product-projects-goals-workspaces", - "sidebarTitle": "Projects and execution/Projects and repositories/Product/Projects Goals Workspaces" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/00 Overview", - "status": "unreviewed", - "implementation": "guide", - "boundary": "static", - "notes": "Review guide retained; explanatory content does not establish runtime or production coverage.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/storybook/prototypes/provider-routing/ReviewIndex.tsx", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/prototypes/provider-routing/story-support.ts", - "ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx" - ], - "fingerprint": "58ea208bbfd6bbc068ff89a49aa2c71d55f244710d84f8d8574511bcc3593257", - "stableId": "ai-connections-provider-routing-00-overview", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/00 Overview" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/01 Onboarding", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/src/components/AdapterMark.tsx", - "ui/src/components/AgentActionButtons.tsx", - "ui/src/components/AgentConfigForm.tsx", - "ui/src/components/AgentContextualSidebar.tsx", - "ui/src/components/NewIssueDialog.tsx", - "ui/src/components/RuntimeTestCard.tsx", - "ui/src/components/agent-config-primitives.tsx", - "ui/src/components/ai-connections/AiConnectionManagement.tsx", - "ui/src/components/onboarding/CredentialModeLink.tsx", - "ui/src/components/onboarding/ModelSourceTiles.tsx", - "ui/src/components/onboarding/PillGuy.tsx", - "ui/src/features/connections/ConnectionChoiceList.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/AgentToolsTab.tsx", - "ui/src/pages/agent-detail-navigation.ts", - "ui/src/pages/agent-skills/AgentSkillsTab.tsx", - "ui/src/pages/apps/AppLogo.tsx", - "ui/storybook/fixtures/onboardingEnvironment.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/RuntimeTestCard.tsx", - "ui/storybook/prototypes/agent-settings/AgentSettingsPreview.tsx", - "ui/storybook/prototypes/agent-settings/fixtures.ts", - "ui/storybook/prototypes/new-agent-fixtures.ts", - "ui/storybook/prototypes/provider-routing/AgentSetup.tsx", - "ui/storybook/prototypes/provider-routing/ConnectionPicker.tsx", - "ui/storybook/prototypes/provider-routing/ConnectionSetup.tsx", - "ui/storybook/prototypes/provider-routing/model.ts", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/prototypes/provider-routing/story-support.ts", - "ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx" - ], - "fingerprint": "f39e0ecde64690f67d56519efc0b7b45f790f21b7836057f6735fffaff3d3ef5", - "stableId": "ai-connections-provider-routing-01-onboarding", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/01 Onboarding" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/02 Connect", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/src/components/ai-connections/AiProviderSetup.tsx", - "ui/src/features/connections/ConnectionChoiceList.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/apps/AppLogo.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/app-definition-display.ts", - "ui/storybook/prototypes/provider-routing/ConnectionCatalog.tsx", - "ui/storybook/prototypes/provider-routing/ConnectionSetup.tsx", - "ui/storybook/prototypes/provider-routing/model.ts", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/prototypes/provider-routing/story-support.ts", - "ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx" - ], - "fingerprint": "728d7d6f61446c644f7d1402b683ade30dbef0c893e409a5fa9526e247e1c179", - "stableId": "ai-connections-provider-routing-02-connect", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/02 Connect" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/03 Agent", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/src/components/AdapterMark.tsx", - "ui/src/components/AgentActionButtons.tsx", - "ui/src/components/AgentConfigForm.tsx", - "ui/src/components/AgentContextualSidebar.tsx", - "ui/src/components/NewIssueDialog.tsx", - "ui/src/components/RuntimeTestCard.tsx", - "ui/src/components/agent-config-primitives.tsx", - "ui/src/components/ai-connections/AiConnectionManagement.tsx", - "ui/src/components/onboarding/CredentialModeLink.tsx", - "ui/src/components/onboarding/ModelSourceTiles.tsx", - "ui/src/components/onboarding/PillGuy.tsx", - "ui/src/features/connections/ConnectionChoiceList.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/AgentDetail.tsx", - "ui/src/pages/AgentToolsTab.tsx", - "ui/src/pages/agent-detail-navigation.ts", - "ui/src/pages/agent-skills/AgentSkillsTab.tsx", - "ui/src/pages/apps/AppLogo.tsx", - "ui/storybook/fixtures/onboardingEnvironment.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/RuntimeTestCard.tsx", - "ui/storybook/prototypes/agent-settings/AgentSettingsPreview.tsx", - "ui/storybook/prototypes/agent-settings/fixtures.ts", - "ui/storybook/prototypes/new-agent-fixtures.ts", - "ui/storybook/prototypes/provider-routing/AgentSetup.tsx", - "ui/storybook/prototypes/provider-routing/ConnectionPicker.tsx", - "ui/storybook/prototypes/provider-routing/ConnectionSetup.tsx", - "ui/storybook/prototypes/provider-routing/model.ts", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/prototypes/provider-routing/story-support.ts", - "ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx" - ], - "fingerprint": "5d0c5dcd46b3814727322016a2bb4b58695f1435a9bd015c67898b549aac40fb", - "stableId": "ai-connections-provider-routing-03-agent", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/03 Agent" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/04 Manage", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/src/components/ai-connections/AiProviderSetup.tsx", - "ui/src/features/connections/ConnectionChoiceList.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/src/pages/apps/AppLogo.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/app-definition-display.ts", - "ui/storybook/prototypes/provider-routing/ConnectionCatalog.tsx", - "ui/storybook/prototypes/provider-routing/ConnectionSetup.tsx", - "ui/storybook/prototypes/provider-routing/Management.tsx", - "ui/storybook/prototypes/provider-routing/RoutingAccess.tsx", - "ui/storybook/prototypes/provider-routing/model.ts", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/prototypes/provider-routing/story-support.ts", - "ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx" - ], - "fingerprint": "34331e78cd92bccd47f5e2c7b83609e137846117e137615b4bd29bda065524e4", - "stableId": "ai-connections-provider-routing-04-manage", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/04 Manage" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/05 Recovery", - "status": "mixed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AdapterLoginChrome.tsx", - "ui/src/features/connections/ConnectionIntentInteractionBody.tsx", - "ui/src/features/connections/ConnectionSetupFlow.tsx", - "ui/storybook/prototypes/provider-routing/Recovery.tsx", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/prototypes/provider-routing/story-support.ts", - "ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx" - ], - "fingerprint": "fe9596ebe4de1f2e315d6e024c636f56e0b253b3af5d3a9c4cd6a3015309e7e7", - "stableId": "ai-connections-provider-routing-05-recovery", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/05 Recovery" - }, - { - "file": "ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx", - "capabilities": [ - "runs-adapters/validation" - ], - "purpose": "AI Connections/Provider routing/06 Production components", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/AgentConfigForm.tsx", - "ui/src/components/agent-config-primitives.tsx", - "ui/src/components/ai-connections/AiConnectionField.tsx", - "ui/src/components/ai-connections/AiConnectionSelect.tsx", - "ui/src/components/ai-connections/AiProviderSetup.tsx", - "ui/src/components/ai-connections/useConnectionModels.ts", - "ui/src/components/new-agent/AgentProviderConnection.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/src/pages/apps/app-definition-display.ts", - "ui/storybook/prototypes/provider-routing/ConnectionCatalog.tsx", - "ui/storybook/prototypes/provider-routing/model.ts", - "ui/storybook/prototypes/provider-routing/shared.tsx", - "ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx" - ], - "fingerprint": "ab0fe3f233b6f8dafdb6a946447535366ba687b9ccf8fafd2b877aa4e7cac230", - "stableId": "ai-connections-provider-routing-06-production-components", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/06 Production components" - }, - { - "file": "ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx", - "capabilities": [ - "gateways-profiles/client-connect" - ], - "purpose": "Assistant connections/Manage connections", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/McpConnect.tsx", - "ui/storybook/fixtures/publicMcp.ts", - "ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx" - ], - "fingerprint": "59a7260fb8b5b123828d9d0d0d2cd081d1456bbdf0ebedf7e65e5b880fe084b5", - "stableId": "assistant-connections-manage-connections", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Manage connections" - }, - { - "file": "ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx", - "capabilities": [ - "gateways-profiles/client-connect" - ], - "purpose": "Assistant connections/Consent", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/McpConnect.tsx", - "ui/storybook/fixtures/publicMcp.ts", - "ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx" - ], - "fingerprint": "263a310d8c4fdf4c693f77dddc923880330d9be73c69cbb05b83d3ed4d59490a", - "stableId": "assistant-connections-consent", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Consent" - }, - { - "file": "ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx", - "capabilities": [ - "gateways-profiles/client-connect" - ], - "purpose": "Assistant connections/Device authorization", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/McpConnect.tsx", - "ui/storybook/fixtures/publicMcp.ts", - "ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx" - ], - "fingerprint": "931a100cc1ad520bdb43712fad8b0284e47ad1a3ee531d55a5cbff0a430907c0", - "stableId": "assistant-connections-device-authorization", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Device authorization" - }, - { - "file": "ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx", - "capabilities": [ - "gateways-profiles/client-connect" - ], - "purpose": "Assistant connections/Start here", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/components/Layout.tsx", - "ui/src/pages/InstanceExperimentalSettings.tsx", - "ui/src/pages/apps/AssistantConnection.tsx", - "ui/src/pages/apps/Browse.tsx", - "ui/storybook/fixtures/publicMcp.ts", - "ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx", - "ui/storybook/support/public-mcp-presenter.tsx" - ], - "fingerprint": "683c517cdaa396555d0bafe049401ccd9768c4d4dec58c3fc4cbbb292e7c147d", - "stableId": "assistant-connections-start-here", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Start here" - }, - { - "file": "ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx", - "capabilities": [ - "gateways-profiles/client-connect", - "instance-operations/configuration" - ], - "purpose": "Assistant connections/Experimental setting", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/pages/InstanceExperimentalSettings.tsx", - "ui/storybook/fixtures/publicMcp.ts", - "ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx", - "maps/feature-map/instance-operations.md" - ], - "fingerprint": "06f786e22151a5e1ec113966cbe72f28841a10f4e580c73bab18733091429711", - "stableId": "assistant-connections-experimental-setting", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Experimental setting" - }, - { - "file": "ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx", - "capabilities": [ - "recovery/diagnosis", - "recovery/source-action" - ], - "purpose": "Design previews/Recovery notice", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/DispositionRecoveryNotice.tsx", - "ui/src/components/task-chat/TaskChatSystemNotice.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/prototypes/recovery-notice/RecoveryNoticePreview.tsx", - "ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx" - ], - "fingerprint": "44d25bc1cf087902bc991cc7fd1dc2bc19880c18189960dae47c68a9284bc0f6", - "stableId": "design-previews-recovery-notice", - "sidebarTitle": "Projects and execution/Recovery/Design previews/Recovery notice" - }, - { - "file": "ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx", - "capabilities": [ - "skills/versions", - "skills/discovery" - ], - "purpose": "Skills/Repository packages", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/Layout.tsx", - "ui/src/pages/CompanySkills.tsx", - "ui/src/pages/SkillSources.tsx", - "ui/src/pages/SkillStudio.tsx", - "ui/storybook/fixtures/githubSkillSources.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/skills/github-skills-journey.stories.tsx", - "ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx" - ], - "fingerprint": "d8af830b23aa96f0a92b898b16c090e76fe4e9b986517fbf72d9cdedf840e7e4", - "stableId": "skills-repository-packages", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skills/Repository packages" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx", - "capabilities": [ - "questions-and-approvals/questions", - "questions-and-approvals/confirmations", - "questions-and-approvals/audience" - ], - "purpose": "Chat & Comments/Rich ACP interactions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/questions-and-approvals.md", - "ui/src/components/IssueThreadInteractionCard.tsx", - "ui/src/components/task-chat/TaskChatCompactInteractionCard.tsx", - "ui/src/components/task-chat/TaskChatProtocolActivityRow.tsx", - "ui/src/components/task-chat/TaskChatProtocolCard.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/src/components/task-chat/transcript-adapter.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx" - ], - "fingerprint": "6a524bb57fd5e0c0e70ce6cb4b7d61076293f4380f93707a6786f1cccbdcc887", - "stableId": "chat-comments-rich-acp-interactions", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Chat & Comments/Rich ACP interactions" - }, - { - "file": "ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx", - "capabilities": [ - "documents-artifacts/work-products" - ], - "purpose": "Task Chat/Rich Work Product Cards", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/task-chat/RichWorkProductCard.tsx", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx" - ], - "fingerprint": "e02eeeed61f5311ac298a8655906089e96ca867670a1deebcc36fb7432fb3153", - "stableId": "task-chat-rich-work-product-cards", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Task Chat/Rich Work Product Cards" - }, - { - "file": "ui/storybook/stories/routines/routine-detail-c.stories.tsx", - "capabilities": [ - "routines/definition", - "routines/management", - "activity/routine-audit" - ], - "purpose": "Product/Routines · Detail (variation C)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/routines.md", - "ui/src/components/AgentActionButtons.tsx", - "ui/src/components/RoutineSaveBar.tsx", - "ui/src/components/RoutineSubSidebar.tsx", - "ui/src/components/routine-sections/context.tsx", - "ui/src/components/routine-sections/editable-sections.tsx", - "ui/src/components/routine-sections/operate-sections.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/routines/routine-detail-c.stories.tsx", - "maps/feature-map/activity.md" - ], - "fingerprint": "853370d71e85c5e01b79d19831cba7f839f4b75af42fa51e7e94f84e31a6eb81", - "stableId": "product-routines-·-detail-variation-c", - "sidebarTitle": "Automation and structured work/Routines, schedules, and triggers/Product/Routines · Detail (variation C)" - }, - { - "file": "ui/storybook/stories/routines/routine-secrets.stories.tsx", - "capabilities": [ - "routines/definition", - "secrets/runtime-delivery" - ], - "purpose": "Product/Routines · Secrets tab", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/routines.md", - "maps/feature-map/secrets.md", - "ui/src/components/RoutineHistoryTab.tsx", - "ui/src/components/environment-variables-editor/index.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/routines/routine-secrets.stories.tsx" - ], - "fingerprint": "ac3e04699ed84d7a11567f17b185c2bbe5c30d049586e03def563f774457e276", - "stableId": "product-routines-·-secrets-tab", - "sidebarTitle": "Automation and structured work/Routines, schedules, and triggers/Product/Routines · Secrets tab" - }, - { - "file": "ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx", - "capabilities": [ - "routines/triggers" - ], - "purpose": "Product/Routines/Webhooks UX preview", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/routines.md", - "ui/src/components/Layout.tsx", - "ui/src/components/routine-triggers/TriggerCard.tsx", - "ui/src/components/routine-triggers/TriggerWizard.tsx", - "ui/src/components/routine-triggers/WebhookFields.tsx", - "ui/src/pages/RoutineDetail.tsx", - "ui/src/pages/Routines.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/routineTriggerCard.tsx", - "ui/storybook/fixtures/routineTriggerWizard.tsx", - "ui/storybook/fixtures/routineWebhookFields.tsx", - "ui/storybook/fixtures/routineWebhooks.tsx", - "ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx" - ], - "fingerprint": "96129f07a13497700039df8275b2f8d3d74468793e042c01e61bda2bdc1ad8fe", - "stableId": "product-routines-webhooks-ux-preview", - "sidebarTitle": "Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks UX preview" - }, - { - "file": "ui/storybook/stories/routines/routine-webhooks.stories.tsx", - "capabilities": [ - "routines/triggers", - "routines/history", - "activity/routine-audit" - ], - "purpose": "Product/Routines/Webhooks", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/routines.md", - "ui/src/components/Layout.tsx", - "ui/src/pages/RoutineDetail.tsx", - "ui/src/pages/Routines.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/routineWebhooks.tsx", - "ui/storybook/stories/routines/routine-webhooks.stories.tsx", - "maps/feature-map/activity.md" - ], - "fingerprint": "93bdd95dd2c677ba7562f477b111486f93a081276a9e3c3a8af3c45874f20a5d", - "stableId": "product-routines-webhooks", - "sidebarTitle": "Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks" - }, - { - "file": "ui/storybook/stories/routines/routines-list-groups.stories.tsx", - "capabilities": [ - "routines/definition", - "routines/management" - ], - "purpose": "Product/Routines · List (grouped cards)", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/routines.md", - "ui/src/components/RoutineList.tsx", - "ui/storybook/stories/routines/routines-list-groups.stories.tsx" - ], - "fingerprint": "02a433aeee5be2ecc3284f0a27c45c4222e3abf05cbd478e55bfb7462a301d19", - "stableId": "product-routines-·-list-grouped-cards", - "sidebarTitle": "Automation and structured work/Routines, schedules, and triggers/Product/Routines · List (grouped cards)" - }, - { - "file": "ui/storybook/stories/tasks/runner-activity.stories.tsx", - "capabilities": [ - "tasks/discussion", - "runs-adapters/runs" - ], - "purpose": "Tasks/Runner activity preview", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/runs-adapters.md", - "maps/feature-map/tasks.md", - "ui/src/components/task-chat/TaskChatLiveRunPill.tsx", - "ui/src/components/task-chat/TaskChatLiveTail.tsx", - "ui/src/components/task-chat/TaskChatRunnerTurn.tsx", - "ui/src/components/task-chat/TaskChatThreadView.tsx", - "ui/src/components/task-chat/expansion-state.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/src/components/task-chat/transcript-adapter.ts", - "ui/storybook/prototypes/runner-activity/RunnerActivityPreview.tsx", - "ui/storybook/stories/tasks/runner-activity.stories.tsx" - ], - "fingerprint": "99a90f98646e1e307ec6255c7f7bd6ce72958ba83f9968f6e0ae3863949b697a", - "stableId": "tasks-runner-activity-preview", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Tasks/Runner activity preview" - }, - { - "file": "ui/storybook/stories/recovery/scheduled-retry.stories.tsx", - "capabilities": [ - "recovery/bounded-continuation" - ], - "purpose": "Product/Issue Scheduled retry surfaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/IssueProperties.tsx", - "ui/src/components/IssueScheduledRetryCard.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/recovery/scheduled-retry.stories.tsx" - ], - "fingerprint": "94225de83234003fe6c5bdc47767e50da8562f661dbf2c5678d9fb41490a86a5", - "stableId": "product-issue-scheduled-retry-surfaces", - "sidebarTitle": "Projects and execution/Recovery/Product/Issue Scheduled retry surfaces" - }, - { - "file": "ui/storybook/stories/inbox-search/search.stories.tsx", - "capabilities": [ - "inbox-search/search" - ], - "purpose": "Product/Search & Command K", - "status": "unreviewed", - "implementation": "prototype", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "ui/src/components/PageTabBar.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/src/components/search/MatchSourceChip.tsx", - "ui/src/components/search/SearchFilterBar.tsx", - "ui/src/components/search/SearchFilterChips.tsx", - "ui/src/components/search/SearchResultRow.tsx", - "ui/src/components/search/ZeroResultsRecovery.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/inbox-search/search.stories.tsx" - ], - "fingerprint": "a6661b568c8bc74f7667aeff4a5da84a05f507dd62679ee9039808e825eeef61", - "stableId": "product-search-command-k", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Product/Search & Command K" - }, - { - "file": "ui/storybook/stories/workspaces/searchable-select.stories.tsx", - "capabilities": [ - "workspaces/binding" - ], - "purpose": "Components/SearchableSelect/Workspace picker", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/workspaces.md", - "ui/src/components/SearchableSelect.tsx", - "ui/storybook/stories/workspaces/searchable-select.stories.tsx" - ], - "fingerprint": "e34c07642d243f0011ef4c589cfd061f1b20477f10ee3e299f5c197982acee3c", - "stableId": "components-searchableselect-workspace-picker", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Components/SearchableSelect/Workspace picker" - }, - { - "file": "ui/storybook/stories/secrets/secrets.stories.tsx", - "capabilities": [ - "secrets/company-secrets", - "secrets/vault-import" - ], - "purpose": "Product/Secrets", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/secrets.md", - "ui/src/components/SecretBindingPicker.tsx", - "ui/src/components/environment-variables-editor/index.tsx", - "ui/src/pages/Secrets.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/secrets/secrets.stories.tsx" - ], - "fingerprint": "b52b6355351b1d49d2fb5921f357fa957288ad646015c5bd99d02b5aec04fee2", - "stableId": "product-secrets", - "sidebarTitle": "Apps, channels, and extensions/Secrets and proposals/Product/Secrets" - }, - { - "file": "ui/storybook/stories/runs-adapters/session-goals.stories.tsx", - "capabilities": [ - "runs-adapters/session" - ], - "purpose": "Composer/Session goals", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/runs-adapters.md", - "ui/src/components/task-chat/RunnerGoalWidget.tsx", - "ui/storybook/stories/runs-adapters/session-goals.stories.tsx" - ], - "fingerprint": "91775a33b452fed0055f7e607384f3f95801a8bafbdf369cf149f8ebcc3943a8", - "stableId": "composer-session-goals", - "sidebarTitle": "Agents and reusable capabilities/Runs, harnesses, and model accounts/Composer/Session goals" - }, - { - "file": "ui/storybook/stories/skills/skill-import-progress.stories.tsx", - "capabilities": [ - "skills/versions", - "skills/discovery" - ], - "purpose": "Skills/Import progress", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/pages/skills/SkillImportProgress.tsx", - "ui/storybook/fixtures/githubSkillSources.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/skills/skill-import-progress.stories.tsx" - ], - "fingerprint": "4f517ad1f4e9a390e29d2f5f31bd78209179043f4253817b5a2788c8a4824a6c", - "stableId": "skills-import-progress", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skills/Import progress" - }, - { - "file": "ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx", - "capabilities": [ - "skills/policy" - ], - "purpose": "Product/Skills/Policy surfaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/components/skill-studio/SkillPolicySurfaces.tsx", - "ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx" - ], - "fingerprint": "1f39ed395b4e147167ad855f867d7cb61d4829f4077e74ffe7c53029d67b67de", - "stableId": "product-skills-policy-surfaces", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Product/Skills/Policy surfaces" - }, - { - "file": "ui/storybook/stories/skills/skills-store-detail.stories.tsx", - "capabilities": [ - "skills/discovery", - "skills/versions", - "skills/policy" - ], - "purpose": "Skills Store/Skill detail", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/pages/CompanySkills.tsx", - "ui/storybook/stories/skills/skills-store-detail.stories.tsx" - ], - "fingerprint": "18c72ba27b8f06c186e21552c62d03a477ceb0b4f0d66253ed556830d7cc9a75", - "stableId": "skills-store-skill-detail", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Skill detail" - }, - { - "file": "ui/storybook/stories/skills/skills-store-discovery.stories.tsx", - "capabilities": [ - "skills/discovery" - ], - "purpose": "Skills Store/Discovery grid", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/pages/CompanySkills.tsx", - "ui/storybook/stories/skills/skills-store-discovery.stories.tsx" - ], - "fingerprint": "8f492ae3f71ac39d7a752929df767b9d37a0e782e2d3ee515cfa1b5c22d0c1a9", - "stableId": "skills-store-discovery-grid", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Discovery grid" - }, - { - "file": "ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx", - "capabilities": [ - "chat-channels/providers", - "connection-setup/channel-setup" - ], - "purpose": "Connections/Slack/Automatic setup", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "maps/feature-map/connection-setup.md", - "ui/src/components/chat/ChatSetupNavigation.tsx", - "ui/src/pages/apps/chat/ChatEndpointSetup.tsx", - "ui/storybook/fixtures/SlackSetupFixture.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx" - ], - "fingerprint": "31f3622faa8699ee34e8a70c340c13a302b1d1184f98da084da68ddf9213d2b8", - "stableId": "connections-slack-automatic-setup", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Slack/Automatic setup" - }, - { - "file": "ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx", - "capabilities": [ - "chat-channels/identity" - ], - "purpose": "Connections/Slack/Avatar in Settings", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/pages/apps/chat/ChatCommunicationInstructions.tsx", - "ui/src/pages/apps/chat/SlackAvatarStep.tsx", - "ui/storybook/prototypes/slack-avatar/SlackAvatarSettingsPreview.tsx", - "ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx" - ], - "fingerprint": "c6688ca3e157bbbd52554dff87cbe1842db9f993b78d07e810492372835d2f98", - "stableId": "connections-slack-avatar-in-settings", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Slack/Avatar in Settings" - }, - { - "file": "ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx", - "capabilities": [ - "chat-channels/identity" - ], - "purpose": "Connections/Slack/Communication in Settings", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/pages/apps/chat/ChatCommunicationInstructions.tsx", - "ui/src/pages/apps/chat/SlackAvatarStep.tsx", - "ui/storybook/prototypes/slack-avatar/SlackAvatarSettingsPreview.tsx", - "ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx" - ], - "fingerprint": "176a29291c7a696273dbbe50622c0dc845015adc119c9ae162dc1c957943a177", - "stableId": "connections-slack-communication-in-settings", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Slack/Communication in Settings" - }, - { - "file": "ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx", - "capabilities": [ - "chat-channels/providers", - "connection-setup/channel-setup" - ], - "purpose": "Connections/Slack/Managed setup", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "maps/feature-map/connection-setup.md", - "ui/src/components/chat/ChatSetupNavigation.tsx", - "ui/src/pages/apps/chat/ChatEndpointSetup.tsx", - "ui/storybook/fixtures/SlackSetupFixture.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx" - ], - "fingerprint": "2615f5c6c170741458801ec39bdf19f84334db7cac3e38d1115d5cc4bbdd18f2", - "stableId": "connections-slack-managed-setup", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Slack/Managed setup" - }, - { - "file": "ui/storybook/stories/chat-channels/slack-tools.stories.tsx", - "capabilities": [ - "chat-channels/conversation" - ], - "purpose": "Connections/Slack/Task tools", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/pages/apps/chat/SlackToolSettings.tsx", - "ui/storybook/stories/chat-channels/slack-tools.stories.tsx" - ], - "fingerprint": "20189b2032c2aecf3242e8d086fed9ca0b02d7adaa80aff9a69b60f1b23bce18", - "stableId": "connections-slack-task-tools", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Connections/Slack/Task tools" - }, - { - "file": "ui/storybook/stories/recovery/source-issue-recovery.stories.tsx", - "capabilities": [ - "recovery/diagnosis", - "recovery/source-action" - ], - "purpose": "Paperclip/Source Issue Recovery", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/IssueRecoveryActionCard.tsx", - "ui/src/components/IssueRow.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/recovery/source-issue-recovery.stories.tsx" - ], - "fingerprint": "e83979b6d2737fef8666a36860817af9272d4d4df649a0784c04e4bc32b63028", - "stableId": "paperclip-source-issue-recovery", - "sidebarTitle": "Projects and execution/Recovery/Paperclip/Source Issue Recovery" - }, - { - "file": "ui/storybook/stories/recovery/source-resolved-fold.stories.tsx", - "capabilities": [ - "recovery/diagnosis", - "recovery/source-action" - ], - "purpose": "Paperclip/Source-resolved Fold", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/SourceResolvedFoldBadge.tsx", - "ui/src/components/SourceResolvedFoldCallout.tsx", - "ui/storybook/stories/recovery/source-resolved-fold.stories.tsx" - ], - "fingerprint": "6b42874521d91e0aa6323fb4d6744a6abd7931fda54e6591bdac9131fa2abaa4", - "stableId": "paperclip-source-resolved-fold", - "sidebarTitle": "Projects and execution/Recovery/Paperclip/Source-resolved Fold" - }, - { - "file": "ui/storybook/stories/foundations/status-language.stories.tsx", - "capabilities": [ - "developer-labs/design" - ], - "purpose": "Foundations/Status Language", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "ui/src/components/CopyText.tsx", - "ui/src/components/EmptyState.tsx", - "ui/src/components/Identity.tsx", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/IssueRow.tsx", - "ui/src/components/MetricCard.tsx", - "ui/src/components/PriorityIcon.tsx", - "ui/src/components/QuotaBar.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/src/components/StatusIcon.tsx", - "ui/src/components/ui/card.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/foundations/status-language.stories.tsx", - "maps/feature-map/developer-labs.md" - ], - "exception": "Shared foundations or contributor guide; no single business capability owns this suite.", - "fingerprint": "9cf8b929ba0d6ad4d8d2a6711aa7fb609ef57069d87a050f77dd389de608ee36", - "stableId": "foundations-status-language", - "sidebarTitle": "Foundations/Status Language", - "home": "foundations" - }, - { - "file": "ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx", - "capabilities": [ - "task-coordination/dependencies", - "task-coordination/delegation" - ], - "purpose": "UX Labs/Sub-issues Workflow Checklist", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/task-coordination.md", - "ui/src/components/IssuesList.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx" - ], - "fingerprint": "4461d14e90da3e93b82826efdddf131ae014c61a040f33cfae1df1368c6ddb2d", - "stableId": "ux-labs-sub-issues-workflow-checklist", - "sidebarTitle": "Tasks and conversations/Delegation, dependencies, and signoff/UX Labs/Sub-issues Workflow Checklist" - }, - { - "file": "ui/storybook/stories/tasks/successful-run-handoff.stories.tsx", - "capabilities": [ - "tasks/completion", - "recovery/diagnosis" - ], - "purpose": "Paperclip/Successful Run Handoff", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "maps/feature-map/tasks.md", - "ui/src/components/Identity.tsx", - "ui/src/components/IssueBlockedNotice.tsx", - "ui/src/components/IssueChatThread.tsx", - "ui/src/components/KanbanBoard.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/successful-run-handoff.stories.tsx" - ], - "fingerprint": "58d58a28f56037e392ab0f52d971f4c21f8745f84337552bc45bbeeffd0c6655", - "stableId": "paperclip-successful-run-handoff", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Paperclip/Successful Run Handoff" - }, - { - "file": "ui/storybook/stories/agents/summary-slot-card.stories.tsx", - "capabilities": [ - "agents/built-in" - ], - "purpose": "Summaries/SummarySlotCard", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/agents.md", - "ui/src/components/SummarySlotCard.tsx", - "ui/storybook/stories/agents/summary-slot-card.stories.tsx" - ], - "fingerprint": "88f4120cbc9da82fdcd44644259f8bacf39b482ef12950e0b26313b5c0a2c81d", - "stableId": "summaries-summaryslotcard", - "sidebarTitle": "Agents and reusable capabilities/Hiring, configuration, and organization/Summaries/SummarySlotCard" - }, - { - "file": "ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx", - "capabilities": [ - "documents-artifacts/library", - "documents-artifacts/work-products" - ], - "purpose": "Tasks/Artifact Gallery", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/ImageGalleryModal.tsx", - "ui/src/components/issue-properties/IssuePropertiesArtifactsTab.tsx", - "ui/src/components/task-chat/RichWorkProductCard.tsx", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx" - ], - "fingerprint": "4d8181361cd7fd9c38ad04cde9ce1ed245498d063650890ca356a6c1e304c448", - "stableId": "tasks-artifact-gallery", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Tasks/Artifact Gallery" - }, - { - "file": "ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx", - "capabilities": [ - "tasks/discussion", - "runs-adapters/runs" - ], - "purpose": "Tasks/Task chat review fixes", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/runs-adapters.md", - "maps/feature-map/tasks.md", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/TaskChatRunnerTurn.tsx", - "ui/src/components/task-chat/TaskChatStatusPill.tsx", - "ui/src/components/task-chat/task-chat-adapter.ts", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx" - ], - "fingerprint": "4747486949d9bca41e7bed36d511eb523651bc1e23ac0427892ff9b47e29cd28", - "stableId": "tasks-task-chat-review-fixes", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Tasks/Task chat review fixes" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx", - "capabilities": [ - "questions-and-approvals/questions", - "questions-and-approvals/confirmations", - "questions-and-approvals/audience" - ], - "purpose": "Composer/Interaction above composer", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/questions-and-approvals.md", - "ui/src/components/MobileBottomNav.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/TaskChatComposerDock.tsx", - "ui/src/components/task-chat/TaskChatInteractionCard.tsx", - "ui/src/components/task-chat/TaskChatProtocolCard.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/prototypes/composer-model-picker/fixtures.ts", - "ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx" - ], - "fingerprint": "a50e649ffce57fafe3ca37b31260463156238af8e58244b3cf33fdeac08353e2", - "stableId": "composer-interaction-above-composer", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Composer/Interaction above composer" - }, - { - "file": "ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx", - "capabilities": [ - "tasks/discussion" - ], - "purpose": "Task chat/Mobile streaming follow", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/MobileBottomNav.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/TaskChatComposerDock.tsx", - "ui/src/components/task-chat/TaskChatThreadView.tsx", - "ui/src/components/task-chat/useWindowAutoFollow.ts", - "ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx" - ], - "fingerprint": "840c21389fca0bf13a1df0d247a9d63836d8f38f4ca95c04838ca0cf36b881d9", - "stableId": "task-chat-mobile-streaming-follow", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Task chat/Mobile streaming follow" - }, - { - "file": "ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx", - "capabilities": [ - "tasks/discussion" - ], - "purpose": "Product/Task chat/System notice", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/task-chat/TaskChatSystemNotice.tsx", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx" - ], - "fingerprint": "1dd5a86762602b618007a3ed83d0500074560bb9168e7f1873aab0aad555deef", - "stableId": "product-task-chat-system-notice", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Product/Task chat/System notice" - }, - { - "file": "ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx", - "capabilities": [ - "questions-and-approvals/dismiss-and-reopen", - "tasks/discussion" - ], - "purpose": "Chat & Comments/Task Chat Unanswered Questions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/questions-and-approvals.md", - "maps/feature-map/tasks.md", - "ui/src/components/TaskChatThread.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/unansweredQuestionChat.tsx", - "ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx" - ], - "fingerprint": "2eb8af0c7b2ecf6914c9bf5d1351427309a5a3ce31b90124c82c23dc2b50bf54", - "stableId": "chat-comments-task-chat-unanswered-questions", - "sidebarTitle": "Tasks and conversations/Questions and approvals/Chat & Comments/Task Chat Unanswered Questions" - }, - { - "file": "ui/storybook/stories/tasks/task-context-notices.stories.tsx", - "capabilities": [ - "tasks/discussion" - ], - "purpose": "Tasks/Context notices", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/EmailMessageCard.tsx", - "ui/src/components/ExecutionBlockerNotice.tsx", - "ui/src/components/chat/ExternallyConnectedTaskBanner.tsx", - "ui/storybook/stories/tasks/task-context-notices.stories.tsx" - ], - "fingerprint": "794484576911fdab4a9b16db119890b75403316a8a4bbcce4041aee241c95193", - "stableId": "tasks-context-notices", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Tasks/Context notices" - }, - { - "file": "ui/storybook/stories/steering/task-execution-controls.stories.tsx", - "capabilities": [ - "steering/stop-and-pause" - ], - "purpose": "Composer/Execution controls", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/steering.md", - "ui/src/components/TaskTreeControls.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/task-chat/TaskChatMarker.tsx", - "ui/storybook/stories/steering/task-execution-controls.stories.tsx" - ], - "fingerprint": "8ac1afb1d07856297cf68417d309a9361a719eacceb9162ed54c86304e3c4634", - "stableId": "composer-execution-controls", - "sidebarTitle": "Tasks and conversations/Steering and queued messages/Composer/Execution controls" - }, - { - "file": "ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx", - "capabilities": [ - "documents-artifacts/attachments" - ], - "purpose": "Tasks/Text file tabs", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/task-side-panel/TaskSidePanel.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx" - ], - "fingerprint": "1028fe178cec6a8d04100a1a89364cd64ffda5112e5235443ad47e4f4ef0358f", - "stableId": "tasks-text-file-tabs", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Tasks/Text file tabs" - }, - { - "file": "ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx", - "capabilities": [ - "task-coordination/tree-control" - ], - "purpose": "Product/Task Watchdog surfaces", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/task-coordination.md", - "ui/src/components/IssueProperties.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx" - ], - "fingerprint": "ac40d01fdf92f09aeeb648ffe0a8304f5ea7aa8b47ab36bf7a62c89a1603a791", - "stableId": "product-task-watchdog-surfaces", - "sidebarTitle": "Tasks and conversations/Delegation, dependencies, and signoff/Product/Task Watchdog surfaces" - }, - { - "file": "ui/storybook/stories/teams/team-catalog.stories.tsx", - "capabilities": [ - "teams/preview", - "teams/discovery", - "teams/install", - "teams/configuration" - ], - "purpose": "Surfaces/Team Catalog", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/teams.md", - "ui/src/pages/TeamCatalog.fixtures.ts", - "ui/src/pages/TeamCatalog.tsx", - "ui/storybook/stories/teams/team-catalog.stories.tsx" - ], - "fingerprint": "00b449499c3b79649dc1f29b5f105996c79e063b3d03c31226d861ad2954803b", - "stableId": "surfaces-team-catalog", - "sidebarTitle": "Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog" - }, - { - "file": "ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx", - "capabilities": [ - "tasks/discussion" - ], - "purpose": "Chat & Comments/Human identity/00 Review guide", - "status": "unreviewed", - "implementation": "guide", - "boundary": "static", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx", - "ui/storybook/support/thread-human-identity/fixtures.ts" - ], - "fingerprint": "cb8b7d0dcdbd27bcaa16d2fcbc86e776b32db875bc6b4de3d752caa5aa9119da", - "stableId": "chat-comments-human-identity-00-review-guide", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/00 Review guide" - }, - { - "file": "ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx", - "capabilities": [ - "tasks/discussion" - ], - "purpose": "Chat & Comments/Human identity/01 Components", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/task-chat-adapter.ts", - "ui/src/components/task-chat/task-chat-model.ts", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx", - "ui/storybook/support/thread-human-identity/fixtures.ts" - ], - "fingerprint": "d87a48d3be494149116ab8fd366e90c17aa2e23805fb1f0d896464e10ba35b04", - "stableId": "chat-comments-human-identity-01-components", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/01 Components" - }, - { - "file": "ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx", - "capabilities": [ - "tasks/discussion" - ], - "purpose": "Chat & Comments/Human identity/02 Mixed-author journey", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/tasks.md", - "ui/src/components/Layout.tsx", - "ui/src/components/TaskChatThread.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx", - "ui/storybook/support/thread-human-identity/fixtures.ts" - ], - "fingerprint": "68b3cca3a5ed9b116b34bd1dde6ca8012c350c2a7c2b60cc928d7e5b30da8694", - "stableId": "chat-comments-human-identity-02-mixed-author-journey", - "sidebarTitle": "Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/02 Mixed-author journey" - }, - { - "file": "ui/storybook/stories/secrets/user-secrets.stories.tsx", - "capabilities": [ - "secrets/user-secrets" - ], - "purpose": "Product/User secrets", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/secrets.md", - "ui/src/components/environment-variables-editor/index.tsx", - "ui/src/pages/secrets/MissingUserSecretsBanner.tsx", - "ui/src/pages/secrets/MyUserSecretsTab.tsx", - "ui/src/pages/secrets/UserSecretDefinitionsTab.tsx", - "ui/storybook/stories/secrets/user-secrets.stories.tsx" - ], - "fingerprint": "7946ebdc6c576de9cdd30205131073f5029aec8e094397bab66c300c1f3a79ea", - "stableId": "product-user-secrets", - "sidebarTitle": "Apps, channels, and extensions/Secrets and proposals/Product/User secrets" - }, - { - "file": "ui/storybook/stories/developer-labs/ux-labs.stories.tsx", - "capabilities": [ - "developer-labs/interaction-labs" - ], - "purpose": "UX Labs/Converted Test Pages", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/developer-labs.md", - "ui/src/pages/InviteUxLab.tsx", - "ui/src/pages/IssueChatUxLab.tsx", - "ui/src/pages/RunTranscriptUxLab.tsx", - "ui/src/pages/SystemNoticeUxLab.tsx", - "ui/storybook/stories/developer-labs/ux-labs.stories.tsx" - ], - "fingerprint": "b8df6cf57fcda25d2b175bc3156d539fb71055b5dae069bca61af8903a01aaf8", - "stableId": "ux-labs-converted-test-pages", - "sidebarTitle": "Contributor surfaces/Developer previews and diagnostic labs/UX Labs/Converted Test Pages" - }, - { - "file": "ui/storybook/stories/inbox-search/what-needs-me.stories.tsx", - "capabilities": [ - "inbox-search/decisions" - ], - "purpose": "Pages/Decisions", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "ui/src/components/AttentionQueueRow.tsx", - "ui/src/components/IssueGroupHeader.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/storybook/stories/inbox-search/what-needs-me.stories.tsx" - ], - "fingerprint": "0920cb3c4e75ba896955144a41f714a18dc778ec63f7b3abfa7e08b1032c0e94", - "stableId": "pages-decisions", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Pages/Decisions" - }, - { - "file": "ui/storybook/stories/activity/work-timeline.stories.tsx", - "capabilities": [ - "activity/timeline" - ], - "purpose": "Pages/Work Timeline", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "Shipped subjects identified through imports and local wrappers; full state, fixture-contract and route parity remain unreviewed.", - "reviewedAt": "2026-10-12", - "sources": [ - "maps/feature-map/activity.md", - "ui/src/components/timeline/WorkTimelineChart.tsx", - "ui/src/pages/Timeline.tsx", - "ui/storybook/fixtures/workTimeline.human.sample.json", - "ui/storybook/fixtures/workTimeline.sample.json", - "ui/storybook/stories/activity/work-timeline.stories.tsx" - ], - "fingerprint": "4f6e9f556073d4bc6a812f633bcff32cb84c4c02488746b37797501684ef3899", - "stableId": "pages-work-timeline", - "sidebarTitle": "Oversight and operation/Dashboards and audit trails/Pages/Work Timeline" - }, - { - "file": "ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx", - "capabilities": [ - "recovery/workspace" - ], - "purpose": "Workspace branch recovery/01 Repair card", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/WorkspaceBaseRefRecoveryNotice.tsx", - "ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx", - "ui/storybook/support/workspace-branch-recovery/fixtures.ts" - ], - "fingerprint": "449d4ae2d427627089327567690e88219a14dfaeac3265bb3014cf1555e0da5d", - "stableId": "workspace-branch-recovery-01-repair-card", - "sidebarTitle": "Projects and execution/Recovery/Workspace branch recovery/01 Repair card" - }, - { - "file": "ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx", - "capabilities": [ - "recovery/workspace" - ], - "purpose": "Workspace branch recovery/02 Task journey", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/Layout.tsx", - "ui/src/components/StatusBadge.tsx", - "ui/src/components/WorkspaceBaseRefRecoveryNotice.tsx", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx", - "ui/storybook/support/workspace-branch-recovery/fixtures.ts" - ], - "fingerprint": "c30653d1cd266832f7bdd401bc302a579d4170b7ea9b2523feccbdc66a58e997", - "stableId": "workspace-branch-recovery-02-task-journey", - "sidebarTitle": "Projects and execution/Recovery/Workspace branch recovery/02 Task journey" - }, - { - "file": "ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx", - "capabilities": [ - "workspaces/files-git" - ], - "purpose": "Issue/Workspace File Browser", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/workspaces.md", - "ui/src/components/FileViewerSheet.tsx", - "ui/src/components/IssueWorkspaceCard.tsx", - "ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx" - ], - "fingerprint": "a37dfdde49f89e907842859bfebde7d3c88a4ebabce4d003a9e4f722b73bb098", - "stableId": "issue-workspace-file-browser", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Issue/Workspace File Browser" - }, - { - "file": "ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx", - "capabilities": [ - "workspaces/provisioning" - ], - "purpose": "Workspaces/Runtime provisioning status", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/workspaces.md", - "ui/src/pages/ExecutionWorkspaceDetail.tsx", - "ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx" - ], - "fingerprint": "4a4e9dc99829632e221a1c558f54502bbba8b1547768d0fdce97cad3c0c5fc02", - "stableId": "workspaces-runtime-provisioning-status", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Workspaces/Runtime provisioning status" - }, - { - "file": "ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx", - "capabilities": [ - "workspaces/services" - ], - "purpose": "Workspaces/Service control bar", - "status": "unreviewed", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/workspaces.md", - "ui/src/components/WorkspaceServiceControlBar.tsx", - "ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx" - ], - "fingerprint": "01ffe1c604d850af606be5ebd4a4ba652716ef6b1ca833d6aa6f8d564ced64c1", - "stableId": "workspaces-service-control-bar", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Workspaces/Service control bar" - }, - { - "file": "ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx", - "capabilities": [ - "recovery/workspace", - "recovery/source-action" - ], - "purpose": "Workspace finalization recovery/01 Notice", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/WorkspaceExportRecovery.tsx", - "ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx", - "ui/storybook/support/workspace-finalization-recovery/fixtures.tsx" - ], - "fingerprint": "5026bd7133f40a9c61371e22ed6976efc67013fd3047bf85056026de86bf6cec", - "stableId": "workspace-finalization-recovery-01-notice", - "sidebarTitle": "Projects and execution/Recovery/Workspace finalization recovery/01 Notice" - }, - { - "file": "ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx", - "capabilities": [ - "recovery/workspace", - "recovery/source-action" - ], - "purpose": "Workspace finalization recovery/02 Task journey", - "status": "unreviewed", - "implementation": "mixed", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/Layout.tsx", - "ui/src/components/WorkspaceExportRecovery.tsx", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx", - "ui/storybook/support/workspace-finalization-recovery/fixtures.tsx" - ], - "fingerprint": "934a8f1882d8b5f5381aba9d0f27026849870a1fa417178fb6bc4170c54b15ba", - "stableId": "workspace-finalization-recovery-02-task-journey", - "sidebarTitle": "Projects and execution/Recovery/Workspace finalization recovery/02 Task journey" - }, - { - "file": "ui/storybook/stories/instance-operations/backup-retention.stories.tsx", - "capabilities": [ - "instance-operations/backup", - "instance-operations/configuration" - ], - "purpose": "Oversight and operation/Instance operations/Backup retention", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/instance-operations.md", - "ui/src/pages/InstanceGeneralSettings.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/instance-operations/backup-retention.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-backup-retention", - "sidebarTitle": "Oversight and operation/Instance operations/Backup retention", - "fingerprint": "7dff68beb89f54e70e7afeb7abac2970c4e9101fae2320dc403a66ff7ae68f7a" - }, - { - "file": "ui/storybook/stories/recovery/recovery-gap-states.stories.tsx", - "capabilities": [ - "recovery/exhaustion", - "recovery/unknown-outcome" - ], - "purpose": "Projects and execution/Recovery/Exhaustion and user decisions", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "ui/src/components/DispositionRecoveryNotice.tsx", - "ui/src/components/IssueRecoveryActionCard.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/recovery/recovery-gap-states.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-recovery-gap-states", - "sidebarTitle": "Projects and execution/Recovery/Exhaustion and user decisions", - "fingerprint": "8eb7fd4ef6387f3b39c3c83ac6fe945761999a0c2c6a9eb124e2c4550f8718a1" - }, - { - "file": "ui/storybook/stories/steering/durable-response-queue.stories.tsx", - "capabilities": [ - "steering/approval-queue", - "recovery/user-continuation" - ], - "purpose": "Tasks and conversations/Steering and queued messages/Accepted response delivery", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/recovery.md", - "maps/feature-map/steering.md", - "ui/src/components/task-chat/TaskChatQueuedMessages.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/steering/durable-response-queue.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-durable-response-queue", - "sidebarTitle": "Tasks and conversations/Steering and queued messages/Accepted response delivery", - "fingerprint": "9dce4d11180c4e178e8e2c23d85175f97256d8137727076c6fbc979ea3fd1734" - }, - { - "file": "ui/storybook/stories/workspaces/workspace-close.stories.tsx", - "capabilities": [ - "workspaces/closure" - ], - "purpose": "Projects and execution/Workspaces, services, and files/Close readiness", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/workspaces.md", - "ui/src/components/ExecutionWorkspaceCloseDialog.tsx", - "ui/src/components/ToastViewport.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/workspaces/workspace-close.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-workspace-close", - "sidebarTitle": "Projects and execution/Workspaces, services, and files/Close readiness", - "fingerprint": "08b1e604b188130184296c8aee286f8dde12c8026654f0760388bd492e1ffe5b" - }, - { - "file": "ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx", - "capabilities": [ - "budgets-costs/resolution" - ], - "purpose": "Oversight and operation/Costs and budgets/Resolve a budget incident", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/budgets-costs.md", - "ui/src/pages/Costs.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-budget-resolution", - "sidebarTitle": "Oversight and operation/Costs and budgets/Resolve a budget incident", - "fingerprint": "8cf347aa01c0b4cb1364735794581b9123a23aba2151278a1a83354d582053ef" - }, - { - "file": "ui/storybook/stories/activity/run-audit.stories.tsx", - "capabilities": [ - "activity/runs" - ], - "purpose": "Oversight and operation/Dashboards and audit trails/Execution history", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "AuditRuns list, completed receipt, empty/loading/failed/denied and no-match filter. Run records are fixture snapshots; no real execution or scoped audit proof.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/activity.md", - "ui/src/pages/audit/AuditRuns.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/activity/run-audit.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-run-audit", - "sidebarTitle": "Oversight and operation/Dashboards and audit trails/Execution history", - "fingerprint": "0a43211053a4c36b6ae4061a624b7e223660931b565a234a829b38d53eab4861" - }, - { - "file": "ui/storybook/stories/secrets/proposal-review.stories.tsx", - "capabilities": [ - "secrets/proposals" - ], - "purpose": "Apps, channels, and extensions/Secrets and proposals/Proposal review", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/secrets.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/secrets/ProposalsTab.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/secrets/proposal-review.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-secret-proposal-review", - "sidebarTitle": "Apps, channels, and extensions/Secrets and proposals/Proposal review", - "fingerprint": "eb3a67d3543f732a6be88f3a2ee9b070f171ff18a037f1869f64b3edd66dfb14" - }, - { - "file": "ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx", - "capabilities": [ - "gateways-profiles/tokens" - ], - "purpose": "Apps, channels, and extensions/Tool gateways and access profiles/Named gateway tokens", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/gateways-profiles.md", - "ui/src/api/tools.ts", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/apps/gateways/NewGatewayDialog.tsx", - "ui/src/pages/apps/gateways/panels/TokensPanel.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-gateway-tokens", - "sidebarTitle": "Apps, channels, and extensions/Tool gateways and access profiles/Named gateway tokens", - "fingerprint": "0c565737015544b791cf7b4fda2f80fd9456368aeb8f0df0f9a4f60ad221b028" - }, - { - "file": "ui/storybook/stories/access/cli-authorization.stories.tsx", - "capabilities": [ - "access/cli-auth" - ], - "purpose": "Getting started and access/Login, invitations, and access/CLI authorization", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "ui/src/lib/router.tsx", - "ui/src/pages/CliAuth.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/access/cli-authorization.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-cli-authorization", - "sidebarTitle": "Getting started and access/Login, invitations, and access/CLI authorization", - "fingerprint": "c87b678d05b7818fd201f97c7e41cd92ce25520123ef4d20b56dd0c9785455ee" - }, - { - "file": "ui/storybook/stories/access/sign-in.stories.tsx", - "capabilities": [ - "access/login" - ], - "purpose": "Getting started and access/Login, invitations, and access/Sign in", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "ui/src/lib/router.tsx", - "ui/src/pages/Auth.tsx", - "ui/src/pages/Companies.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/access/sign-in.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-sign-in", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Sign in", - "fingerprint": "b9524d5f5a97e14c7e3bc5989b94ebe0fea56ab8767df5c5efb24430b003d491" - }, - { - "file": "ui/storybook/stories/access/membership.stories.tsx", - "capabilities": [ - "access/membership" - ], - "purpose": "Getting started and access/Login, invitations, and access/Organization membership", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/access.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/CompanyAccess.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/access/membership.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-membership", - "sidebarTitle": "Getting started and access/Login, invitations, and access/Organization membership", - "fingerprint": "8bd65a1aa65dc4e4767390eefb1b731a410ff852ac6eced05f5e3e5249d1a356" - }, - { - "file": "ui/storybook/stories/companies/company-selection.stories.tsx", - "capabilities": [ - "companies/selection", - "companies/archive" - ], - "purpose": "Getting started and access/Companies and portability/Selection and archived organizations", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/companies.md", - "ui/src/pages/Companies.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/companies/company-selection.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-company-selection", - "sidebarTitle": "Getting started and access/Companies and portability/Selection and archived organizations", - "fingerprint": "0275b0bd6538672ef381ffb6fbdf68b7611e93df97334246cb4b3b1c6856bc17" - }, - { - "file": "ui/storybook/stories/plugins/plugin-management.stories.tsx", - "capabilities": [ - "plugins/installation", - "plugins/lifecycle" - ], - "purpose": "Apps, channels, and extensions/Plugins/Installation and lifecycle", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "PluginManager list states, install pending/error/success, disable and uninstall receipts. Local record transitions only; package loading and worker lifecycle require production verification.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/plugins.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/pages/PluginManager.tsx", - "ui/src/pages/PluginSettings.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/plugins/plugin-management.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/plugins.ts" - ], - "stableId": "feature-plugin-management", - "sidebarTitle": "Apps, channels, and extensions/Plugins/Installation and lifecycle", - "fingerprint": "fd52b6f6966ae05ad7ffb755eebcfa0aeb6d9cb7c246a9def116de663eb5feeb" - }, - { - "file": "ui/storybook/stories/plugins/plugin-configuration.stories.tsx", - "capabilities": [ - "plugins/configuration" - ], - "purpose": "Apps, channels, and extensions/Plugins/Configuration", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "PluginSettings configuration route with hydrated values, read pending/unavailable and saved/error/403 responses. Real config storage and plugin worker validation are not proved.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/plugins.md", - "ui/src/lib/router.tsx", - "ui/src/pages/PluginManager.tsx", - "ui/src/pages/PluginSettings.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/plugins/plugin-configuration.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/plugins.ts" - ], - "stableId": "feature-plugin-configuration", - "sidebarTitle": "Apps, channels, and extensions/Plugins/Configuration", - "fingerprint": "b80dc4cfa9311c9df6fb795a4b481405144342a9003062b2e0d8397d6f8b68e1" - }, - { - "file": "ui/storybook/stories/plugins/plugin-contributions.stories.tsx", - "capabilities": [ - "plugins/contributions" - ], - "purpose": "Apps, channels, and extensions/Plugins/Contributed routes", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/plugins.md", - "ui/src/lib/router.tsx", - "ui/src/pages/PluginManager.tsx", - "ui/src/pages/PluginPage.tsx", - "ui/src/pages/PluginSettings.tsx", - "ui/src/plugins/slots.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/plugins/plugin-contributions.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/plugins.ts" - ], - "stableId": "feature-plugin-contributions", - "sidebarTitle": "Apps, channels, and extensions/Plugins/Contributed routes", - "fingerprint": "09b20d50e157c332613c3c03ccded5ae21804011005891cacd4342ce653b8d67" - }, - { - "file": "ui/storybook/stories/cases/case-browse.stories.tsx", - "capabilities": [ - "cases/browse" - ], - "purpose": "Automation and structured work/Cases/Browse and hierarchy", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/cases.md", - "ui/src/pages/Cases.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/cases/case-browse.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/cases.ts" - ], - "stableId": "feature-case-browse", - "sidebarTitle": "Automation and structured work/Cases/Browse and hierarchy", - "fingerprint": "41f3255e05cc2ca30fc22ff25748cff9b7017189f6ebb71d6f42827602237691" - }, - { - "file": "ui/storybook/stories/cases/case-detail.stories.tsx", - "capabilities": [ - "cases/structure", - "cases/history", - "cases/task-links" - ], - "purpose": "Automation and structured work/Cases/Structure, history and task links", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "CaseDetail hierarchy and activity, CaseFieldsPanel arbitrary/empty data and IssueCasesPanel reverse links. Fixture relations/events; document revision history and persisted links remain production obligations.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/cases.md", - "ui/src/components/CaseFieldsPanel.tsx", - "ui/src/components/IssueCasesPanel.tsx", - "ui/src/lib/router.tsx", - "ui/src/pages/CaseDetail.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/cases/case-detail.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/cases.ts" - ], - "stableId": "feature-case-detail", - "sidebarTitle": "Automation and structured work/Cases/Structure, history and task links", - "fingerprint": "13a24fcf6de97812864194104d14343ec50130ba6aa5405078a1b127778ab0cf" - }, - { - "file": "ui/storybook/stories/status-cards/status-card-states.stories.tsx", - "capabilities": [ - "status-cards/authoring", - "status-cards/generation", - "status-cards/inspection", - "status-cards/archive" - ], - "purpose": "Automation and structured work/Status cards/Authoring, updates and archive", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/status-cards.md", - "ui/src/lib/router.tsx", - "ui/src/pages/StatusCards/ArchivedStatusCardRow.tsx", - "ui/src/pages/StatusCards/CreateStatusCardDialog.tsx", - "ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx", - "ui/src/pages/StatusCards/StatusCardTile.tsx", - "ui/src/pages/StatusCards/index.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/status-cards/status-card-states.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/status-cards.ts" - ], - "stableId": "feature-status-card-states", - "sidebarTitle": "Automation and structured work/Status cards/Authoring, updates and archive", - "fingerprint": "c6f52ca5e82fa4a14bc10b30177a0a9e689cd37d83fc5afbee77370f707bb13f" - }, - { - "file": "ui/storybook/stories/goals/goal-alignment.stories.tsx", - "capabilities": [ - "goals/alignment", - "goals/navigation" - ], - "purpose": "Projects and execution/Goals and work alignment/Aligned work and navigation", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/goals.md", - "ui/src/lib/router.tsx", - "ui/src/pages/GoalDetail.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/goals/goal-alignment.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-goal-alignment", - "sidebarTitle": "Projects and execution/Goals and work alignment/Aligned work and navigation", - "fingerprint": "a9a4bc0845dbed28f5cc458713f4ceecb3641a9ba1b60fe1867f3b573a471622" - }, - { - "file": "ui/storybook/stories/companies/company-import.stories.tsx", - "capabilities": [ - "companies/portability" - ], - "purpose": "Getting started and access/Companies and portability/Import preview", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/companies.md", - "ui/src/pages/CompanyImport.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/companies/company-import.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-company-import", - "sidebarTitle": "Getting started and access/Companies and portability/Import preview", - "fingerprint": "578c7550b2a601c0c71aa7a847f9c9505a642629a92da73af0ef7e750fb3f370" - }, - { - "file": "ui/storybook/stories/inbox-search/inbox-views.stories.tsx", - "capabilities": [ - "inbox-search/views" - ], - "purpose": "Tasks and conversations/Inbox, decisions, and search/Personal task views", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "ui/src/pages/Inbox.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/inbox-search/inbox-views.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-inbox-views", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Personal task views", - "fingerprint": "6b0a316d05b6e02af3c50075086063ae9c748ea4edc0e67156235bcc1eb8e21b" - }, - { - "file": "ui/storybook/stories/skills/skill-test-runs.stories.tsx", - "capabilities": [ - "skills/testing" - ], - "purpose": "Agents and reusable capabilities/Skills and Skill Studio/Test runs", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/skills.md", - "ui/src/lib/router.tsx", - "ui/src/pages/SkillStudio.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/skills/skill-test-runs.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/skills.ts" - ], - "stableId": "feature-skill-test-runs", - "sidebarTitle": "Agents and reusable capabilities/Skills and Skill Studio/Test runs", - "fingerprint": "4685add5676a5e6dd96885d326be891b8b48520787177d8540d5f3e2758cb8c5" - }, - { - "file": "ui/storybook/stories/onboarding/resume-draft.stories.tsx", - "capabilities": [ - "onboarding/resume" - ], - "purpose": "Getting started and access/Onboarding and first work/Resume a saved draft", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/onboarding.md", - "ui/src/api/companies-query.ts", - "ui/src/components/OnboardingWizard.tsx", - "ui/src/components/ui/button.tsx", - "ui/src/context/DialogContext.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/onboardingDraft.ts", - "ui/storybook/stories/onboarding/resume-draft.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-onboarding-resume", - "sidebarTitle": "Getting started and access/Onboarding and first work/Resume a saved draft", - "fingerprint": "90abcea935be1524a081ff34041f608fa2c0dd354dbc3bacbf16679cf580957f" - }, - { - "file": "ui/storybook/stories/routines/run-now.stories.tsx", - "capabilities": [ - "routines/run-now" - ], - "purpose": "Automation and structured work/Routines, schedules, and triggers/Run now", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/routines.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/lib/router.tsx", - "ui/src/pages/RoutineDetail.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/fixtures/routineWebhooks.tsx", - "ui/storybook/stories/routines/run-now.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-routine-run-now", - "sidebarTitle": "Automation and structured work/Routines, schedules, and triggers/Run now", - "fingerprint": "6d6f650f4990ad61045c6e3c47ae446cf5ac7a5240ca123a91c2c3216bf0d3c9" - }, - { - "file": "ui/storybook/stories/app-permissions/catalog-review.stories.tsx", - "capabilities": [ - "app-permissions/catalog-change" - ], - "purpose": "Apps, channels, and extensions/App access and action permissions/Review newly discovered actions", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/app-permissions.md", - "ui/src/pages/apps/app-detail/PermissionsPanel.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/app-permissions/catalog-review.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-catalog-review", - "sidebarTitle": "Apps, channels, and extensions/App access and action permissions/Review newly discovered actions", - "fingerprint": "0b4c214f3c5e138fa57da3ed59a64c368d8ac7615476164743b810c117e7cab6" - }, - { - "file": "ui/storybook/stories/chat-channels/channel-attachments.stories.tsx", - "capabilities": [ - "chat-channels/attachments" - ], - "purpose": "Apps, channels, and extensions/External chat and email/Task-linked files", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/chat-channels.md", - "ui/src/components/task-chat/TaskChatBubble.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/chat-channels/channel-attachments.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-channel-attachments", - "sidebarTitle": "Apps, channels, and extensions/External chat and email/Task-linked files", - "fingerprint": "aa6718bf5754d2f5603682ed76d5075e277ce19f35b38356f92f8e3f14bc4f43" - }, - { - "file": "ui/storybook/stories/steering/composer-draft-recovery.stories.tsx", - "capabilities": [ - "steering/drafts" - ], - "purpose": "Tasks and conversations/Steering and queued messages/Draft recovery", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/steering.md", - "ui/src/components/task-chat/TaskChatComposer.tsx", - "ui/src/components/ui/button.tsx", - "ui/src/lib/composer-draft.ts", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/steering/composer-draft-recovery.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-composer-draft-recovery", - "sidebarTitle": "Tasks and conversations/Steering and queued messages/Draft recovery", - "fingerprint": "1c242e44746a80add5d9d54ea46611fe58ec43aac42e9d8c61027495c7fa4279" - }, - { - "file": "ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx", - "capabilities": [ - "inbox-search/toasts" - ], - "purpose": "Tasks and conversations/Inbox, decisions, and search/Personal task notifications", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/inbox-search.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/components/ui/button.tsx", - "ui/src/context/LiveUpdatesProvider.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/live-events.ts" - ], - "stableId": "feature-personal-task-toasts", - "sidebarTitle": "Tasks and conversations/Inbox, decisions, and search/Personal task notifications", - "fingerprint": "956b02e1631234b0eaba5622e416edec931a8151a2f6c4f069cdefee3c51a428" - }, - { - "file": "ui/storybook/stories/agent-chat/conference-room.stories.tsx", - "capabilities": [ - "agent-chat/conference-room" - ], - "purpose": "Tasks and conversations/Agent conversations and project handoff/Conference Room", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/agent-chat.md", - "ui/src/pages/BoardChat.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/agent-chat/conference-room.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-conference-room", - "sidebarTitle": "Tasks and conversations/Agent conversations and project handoff/Conference Room", - "fingerprint": "2c2431d14a8e6106a6ede10021ea387b7b5e8a9770710f423cbe95ba316dc4da" - }, - { - "file": "ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx", - "capabilities": [ - "documents-artifacts/documents" - ], - "purpose": "Tasks and conversations/Documents, attachments, and work products/Document revisions", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/documents-artifacts.md", - "ui/src/components/DocumentFrameHeader.tsx", - "ui/src/components/IssueDocumentsSection.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/fixtures/paperclipData.ts", - "ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-document-revisions", - "sidebarTitle": "Tasks and conversations/Documents, attachments, and work products/Document revisions", - "fingerprint": "a1d9e6b7f17a5d75ac2ff91a0ad96b9de9dadab4b2e0340ac7ae94d32809409b" - }, - { - "file": "ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx", - "capabilities": [ - "navigation-preferences/preferences" - ], - "purpose": "Oversight and operation/Navigation, profile, and announcements/Sidebar preferences", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/navigation-preferences.md", - "ui/src/components/Sidebar.tsx", - "ui/src/components/SidebarSection.tsx", - "ui/src/plugins/launchers.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts" - ], - "stableId": "feature-sidebar-preferences", - "sidebarTitle": "Oversight and operation/Navigation, profile, and announcements/Sidebar preferences", - "fingerprint": "5426596737a1f27105954d0e7fde6729f0b3a2e83ba7dec9e288286a359ab216" - }, - { - "file": "ui/storybook/stories/pipelines/pipeline-board.stories.tsx", - "capabilities": [ - "pipelines/items" - ], - "purpose": "Automation and structured work/Pipelines, review queues, and learnings/Items", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "Production Pipelines board with stages/items and loading/empty/error/403. Snapshot rows only; transitions, liveness, guards and automation execution remain separate.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/pipelines.md", - "ui/src/lib/router.tsx", - "ui/src/pages/Pipelines.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/pipelines/pipeline-board.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/pipelines.ts" - ], - "stableId": "feature-pipeline-board", - "sidebarTitle": "Automation and structured work/Pipelines, review queues, and learnings/Items", - "fingerprint": "6259bfc636e56d936fa77164bd5acbc5967066721a37f75bc803f5a4db6b3be3" - }, - { - "file": "ui/storybook/stories/pipelines/stage-settings.stories.tsx", - "capabilities": [ - "pipelines/stages" - ], - "purpose": "Automation and structured work/Pipelines, review queues, and learnings/Stage settings", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/pipelines.md", - "ui/src/lib/router.tsx", - "ui/src/pages/PipelineSettings.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/pipelines/stage-settings.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/pipelines.ts" - ], - "stableId": "feature-pipeline-stages", - "sidebarTitle": "Automation and structured work/Pipelines, review queues, and learnings/Stage settings", - "fingerprint": "747e8cf58dd88118466de6b4ba8967f2f76ed31f7a8ee300f05265630367f0aa" - }, - { - "file": "ui/storybook/stories/pipelines/review-queue.stories.tsx", - "capabilities": [ - "pipelines/review" - ], - "purpose": "Automation and structured work/Pipelines, review queues, and learnings/Review queue", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/pipelines.md", - "ui/src/lib/router.tsx", - "ui/src/pages/Pipelines.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/pipelines/review-queue.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/pipelines.ts" - ], - "stableId": "feature-pipeline-review", - "sidebarTitle": "Automation and structured work/Pipelines, review queues, and learnings/Review queue", - "fingerprint": "360dedf71d3540f1b67880ba49687a3b6a8962a11fdc8c3a2acd375c695a883c" - }, - { - "file": "ui/storybook/stories/pipelines/learnings.stories.tsx", - "capabilities": [ - "pipelines/learnings" - ], - "purpose": "Automation and structured work/Pipelines, review queues, and learnings/Learnings", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/pipelines.md", - "ui/src/lib/router.tsx", - "ui/src/pages/Pipelines.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/pipelines/learnings.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/pipelines.ts" - ], - "stableId": "feature-pipeline-learnings", - "sidebarTitle": "Automation and structured work/Pipelines, review queues, and learnings/Learnings", - "fingerprint": "acc796cc3ca32601e40809ffb0b5e1406c1360785c988d74baca3172cad71b49" - }, - { - "file": "ui/storybook/stories/execution-environments/environment-states.stories.tsx", - "capabilities": [ - "execution-environments/configuration", - "execution-environments/capabilities", - "execution-environments/probe" - ], - "purpose": "Projects and execution/Execution environments/Configuration, capabilities, and probes", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "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.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/execution-environments.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/lib/router.tsx", - "ui/src/pages/CompanyEnvironments.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/execution-environments/environment-states.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/environments.ts" - ], - "stableId": "feature-execution-environments", - "sidebarTitle": "Projects and execution/Execution environments/Configuration, capabilities, and probes", - "fingerprint": "9a14e48be15b72210745d53541505a92e331437b67369d42d6364e78938b5120" - }, - { - "file": "ui/storybook/stories/execution-environments/custom-images.stories.tsx", - "capabilities": [ - "execution-environments/images" - ], - "purpose": "Projects and execution/Execution environments/Custom images", - "status": "current", - "implementation": "production", - "boundary": "fixtures", - "notes": "CompanyEnvironments image metadata: unconfigured, captured, unsupported, failed, loading and 403. No live setup terminal, provider capture, rollback or relink is executed.", - "reviewedAt": "2026-10-13", - "sources": [ - "maps/feature-map/execution-environments.md", - "ui/src/components/ToastViewport.tsx", - "ui/src/lib/router.tsx", - "ui/src/pages/CompanyEnvironments.tsx", - "ui/storybook/.storybook/preview.tsx", - "ui/storybook/stories/execution-environments/custom-images.stories.tsx", - "ui/storybook/support/capability-gaps/api.ts", - "ui/storybook/support/capability-gaps/environments.ts" - ], - "stableId": "feature-environment-images", - "sidebarTitle": "Projects and execution/Execution environments/Custom images", - "fingerprint": "0877c994c37d7272b9a1330897cf56d366162dc17e7503c753415dd1077c9446" - } - ] -} diff --git a/scripts/check-maps.mjs b/scripts/check-maps.mjs index 9aef27c5d32..a1b2ad05bd1 100644 --- a/scripts/check-maps.mjs +++ b/scripts/check-maps.mjs @@ -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; diff --git a/scripts/check-maps.test.mjs b/scripts/check-maps.test.mjs index aae6e43aff8..1af8e6775a1 100644 --- a/scripts/check-maps.test.mjs +++ b/scripts/check-maps.test.mjs @@ -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 }; } diff --git a/scripts/feature-map.mjs b/scripts/feature-map.mjs new file mode 100644 index 00000000000..ec6b485c813 --- /dev/null +++ b/scripts/feature-map.mjs @@ -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)) }; +} diff --git a/scripts/map-test-fixture.mjs b/scripts/map-test-fixture.mjs new file mode 100644 index 00000000000..6052b35f97f --- /dev/null +++ b/scripts/map-test-fixture.mjs @@ -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 }; +} diff --git a/scripts/storybook-catalog.d.mts b/scripts/storybook-catalog.d.mts new file mode 100644 index 00000000000..422c75bfbad --- /dev/null +++ b/scripts/storybook-catalog.d.mts @@ -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[]; diff --git a/scripts/storybook-catalog.mjs b/scripts/storybook-catalog.mjs index 43c50bcba81..618fb89389d 100644 --- a/scripts/storybook-catalog.mjs +++ b/scripts/storybook-catalog.mjs @@ -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", "", "", "", - "[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.`); } diff --git a/scripts/storybook-catalog.test.mjs b/scripts/storybook-catalog.test.mjs index 9c41a069ec4..c638759745f 100644 --- a/scripts/storybook-catalog.test.mjs +++ b/scripts/storybook-catalog.test.mjs @@ -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; - 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]); }); diff --git a/scripts/storybook-feature-index.mjs b/scripts/storybook-feature-index.mjs index 5dd7cf0afa9..d13df347b35 100644 --- a/scripts/storybook-feature-index.mjs +++ b/scripts/storybook-feature-index.mjs @@ -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))); } diff --git a/scripts/storybook-feature-index.test.mjs b/scripts/storybook-feature-index.test.mjs index dd345a0d694..6797dd41258 100644 --- a/scripts/storybook-feature-index.test.mjs +++ b/scripts/storybook-feature-index.test.mjs @@ -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/); }); diff --git a/tests/storybook-visual/feature-gap-stories.config.ts b/tests/storybook-visual/feature-gap-stories.config.ts index 97fa97230e4..d774c97fda9 100644 --- a/tests/storybook-visual/feature-gap-stories.config.ts +++ b/tests/storybook-visual/feature-gap-stories.config.ts @@ -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, diff --git a/tests/storybook-visual/feature-gap-stories.spec.ts b/tests/storybook-visual/feature-gap-stories.spec.ts index e9fd51e7072..5a4251bd6c8 100644 --- a/tests/storybook-visual/feature-gap-stories.spec.ts +++ b/tests/storybook-visual/feature-gap-stories.spec.ts @@ -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 }; 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( diff --git a/tests/storybook-visual/map-navigation.spec.ts b/tests/storybook-visual/map-navigation.spec.ts new file mode 100644 index 00000000000..7b75039adf3 --- /dev/null +++ b/tests/storybook-visual/map-navigation.spec.ts @@ -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([]); +}); diff --git a/ui/package.json b/ui/package.json index f59ad09df61..e040d290535 100644 --- a/ui/package.json +++ b/ui/package.json @@ -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" diff --git a/ui/storybook/.storybook/main.ts b/ui/storybook/.storybook/main.ts index 833fdb586e2..9fa6044d511 100644 --- a/ui/storybook/.storybook/main.ts +++ b/ui/storybook/.storybook/main.ts @@ -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 = (() => { diff --git a/ui/storybook/.storybook/preview.tsx b/ui/storybook/.storybook/preview-base.tsx similarity index 92% rename from ui/storybook/.storybook/preview.tsx rename to ui/storybook/.storybook/preview-base.tsx index 8b90a8116af..ff1cadb297d 100644 --- a/ui/storybook/.storybook/preview.tsx +++ b/ui/storybook/.storybook/preview-base.tsx @@ -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", diff --git a/ui/storybook/generated/feature-index.json b/ui/storybook/generated/feature-index.json deleted file mode 100644 index 8fe156a12a2..00000000000 --- a/ui/storybook/generated/feature-index.json +++ /dev/null @@ -1,1164 +0,0 @@ -{ - "sections": [ - { - "title": "Getting started and access", - "features": [ - { - "id": "onboarding", - "title": "Onboarding and first work", - "description": "Instance setup, company wizard, first agent and task.", - "capabilities": [ - { - "id": "onboarding/instance", - "label": "Instance", - "description": "choose local instance configuration and start the server." - }, - { - "id": "onboarding/company", - "label": "Company", - "description": "create a company with its identity and initial agent." - }, - { - "id": "onboarding/adapter", - "label": "Adapter", - "description": "choose an available harness, model, account, and execution environment." - }, - { - "id": "onboarding/first-task", - "label": "First task", - "description": "leave setup with a task whose execution or missing prerequisite is visible." - }, - { - "id": "onboarding/resume", - "label": "Resume", - "description": "return to an incomplete wizard without losing saved state." - } - ] - }, - { - "id": "access", - "title": "Login, invitations, and access", - "description": "Sessions, bootstrap, membership, roles, and CLI authorization.", - "capabilities": [ - { - "id": "access/login", - "label": "Login", - "description": "sign in or claim the board in the configured deployment mode." - }, - { - "id": "access/invitations", - "label": "Invitations", - "description": "join through a valid invite and handle expired or already-used links." - }, - { - "id": "access/membership", - "label": "Membership", - "description": "review join requests and manage company/instance membership and permissions." - }, - { - "id": "access/resources", - "label": "Resources", - "description": "respect company and resource boundaries on deep links and mutations." - }, - { - "id": "access/cli-auth", - "label": "Cli auth", - "description": "authorize a CLI session and revoke or replace credentials." - } - ] - }, - { - "id": "companies", - "title": "Companies and portability", - "description": "Company switching/settings, archival, package import/export.", - "capabilities": [ - { - "id": "companies/selection", - "label": "Selection", - "description": "create/select a company and keep navigation in its scope." - }, - { - "id": "companies/identity", - "label": "Identity", - "description": "update company identity and configured settings." - }, - { - "id": "companies/decision-models", - "label": "Decision models", - "description": "configure and test the company's decision model, then inspect invocation history and recorded usage." - }, - { - "id": "companies/fast-responses", - "label": "Fast responses", - "description": "configure and test the experimental fast-response service, then inspect acknowledgement history, failures, and recorded usage." - }, - { - "id": "companies/archive", - "label": "Archive", - "description": "archive and restore through the available controls without confusing archival with deletion." - }, - { - "id": "companies/portability", - "label": "Portability", - "description": "preview a company package and inspect imported agents, projects, skills, and conflicts." - } - ] - } - ] - }, - { - "title": "Tasks and conversations", - "features": [ - { - "id": "tasks", - "title": "Task creation and lifecycle", - "description": "Creation, assignment, lists, properties, comments, and completion.", - "capabilities": [ - { - "id": "tasks/create", - "label": "Create", - "description": "capture a title/request with the intended agent, project, and attachments." - }, - { - "id": "tasks/organize", - "label": "Organize", - "description": "filter, sort, group, and navigate tasks without losing the selected context." - }, - { - "id": "tasks/properties", - "label": "Properties", - "description": "change status, priority, assignee, project, and relationships where authorized." - }, - { - "id": "tasks/discussion", - "label": "Discussion", - "description": "persist comments, references, and files on the task." - }, - { - "id": "tasks/completion", - "label": "Completion", - "description": "distinguish backlog, active work, review, blocked, done, and cancelled outcomes." - } - ] - }, - { - "id": "task-coordination", - "title": "Delegation, dependencies, and signoff", - "description": "Child work, prerequisites, reviewers, and task-tree controls.", - "capabilities": [ - { - "id": "task-coordination/delegation", - "label": "Delegation", - "description": "inspect parent/child tasks and the original request behind delegated work." - }, - { - "id": "task-coordination/dependencies", - "label": "Dependencies", - "description": "show blocking tasks and wake eligible work when prerequisites resolve." - }, - { - "id": "task-coordination/signoff", - "label": "Signoff", - "description": "apply the configured implementation/review completion policy." - }, - { - "id": "task-coordination/tree-control", - "label": "Tree control", - "description": "pause or resume a task tree without bypassing its gates." - } - ] - }, - { - "id": "inbox-search", - "title": "Inbox, decisions, and search", - "description": "Personal triage, decision queues, unread/blocked views, search, and personal task toasts.", - "capabilities": [ - { - "id": "inbox-search/views", - "label": "Views", - "description": "use Mine, Recent, Unread, Blocked, and broader task views." - }, - { - "id": "inbox-search/triage", - "label": "Triage", - "description": "read or archive attention items without pretending the underlying task is complete." - }, - { - "id": "inbox-search/decisions", - "label": "Decisions", - "description": "open the source of a decision and act in the right context." - }, - { - "id": "inbox-search/search", - "label": "Search", - "description": "query company work and follow a result to its original record." - }, - { - "id": "inbox-search/toasts", - "label": "Toasts", - "description": "receive live task notifications only for personal participation or explicit mentions." - } - ] - }, - { - "id": "agent-chat", - "title": "Agent conversations and project handoff", - "description": "Persistent conversations, discovery, handoff, and gated board chat.", - "capabilities": [ - { - "id": "agent-chat/discovery", - "label": "Discovery", - "description": "find an agent and reopen an accessible recent conversation." - }, - { - "id": "agent-chat/history", - "label": "History", - "description": "send messages, inspect replies/files, and return to the same conversation." - }, - { - "id": "agent-chat/handoff", - "label": "Handoff", - "description": "create or identify a project/task from chat and follow the resulting work." - }, - { - "id": "agent-chat/conference-room", - "label": "Conference room", - "description": "use the separately gated board chat without assuming parity with agent chat." - } - ] - }, - { - "id": "questions-and-approvals", - "title": "Questions and approvals", - "description": "Question/plan responses, formal approvals, and app-tool review.", - "capabilities": [ - { - "id": "questions-and-approvals/questions", - "label": "Questions", - "description": "single-choice, multiple-choice, custom, and free-text answers; paged forms retain answers until submission and show validation failures." - }, - { - "id": "questions-and-approvals/dismiss-and-reopen", - "label": "Dismiss and reopen", - "description": "unanswered questions remain in the feed after dismissal or a newer message; reopening restores the form without inventing an answer." - }, - { - "id": "questions-and-approvals/confirmations", - "label": "Confirmations", - "description": "accept, decline, or request changes; stale, expired, resolved, and withdrawn requests cannot be acted on again." - }, - { - "id": "questions-and-approvals/plan-review", - "label": "Plan review", - "description": "inspect the requested plan revision before accepting or asking for changes. An ordinary planning task can proceed to execution; Agent Chat hands work to linked tasks and remains a conversation." - }, - { - "id": "questions-and-approvals/audience", - "label": "Audience", - "description": "the current actor, company, named audience, and review policy govern resolution. A visible request is not necessarily actionable by that viewer." - }, - { - "id": "questions-and-approvals/governance", - "label": "Governance", - "description": "pending/history views, approve/reject, revision request, and resubmission for formal board approvals." - }, - { - "id": "questions-and-approvals/tool-review", - "label": "Tool review", - "description": "approve once, always allow the displayed scope, or decline; decision status and provider execution outcome remain distinct." - }, - { - "id": "questions-and-approvals/continuation", - "label": "Continuation", - "description": "one recorded response leads to the eligible waiting run or continuation; repeated clicks, reloads, and competing tabs do not repeat work." - } - ] - }, - { - "id": "steering", - "title": "Steering and queued messages", - "description": "Follow-ups, queue edits, interruption, and pause/resume.", - "capabilities": [ - { - "id": "steering/queue", - "label": "Queue", - "description": "a busy task saves follow-ups and shows their order and wait reason." - }, - { - "id": "steering/edit-order-discard", - "label": "Edit order discard", - "description": "edit full Markdown, reorder, and discard eligible saved messages; ownership, revision conflicts, and already-dispatched states matter." - }, - { - "id": "steering/steer", - "label": "Steer", - "description": "explicit user action sends a queued message into a compatible active run; unavailable capabilities and provider rejection remain visible." - }, - { - "id": "steering/interrupt", - "label": "Interrupt", - "description": "stop the current execution and carry accepted follow-ups into the eligible continuation without delivering them twice." - }, - { - "id": "steering/stop-and-pause", - "label": "Stop and pause", - "description": "distinguish stop-in-flight, confirmed stop, task/ancestor pause, agent pause, and budget hold. Resume must respect the actual gate." - }, - { - "id": "steering/drafts", - "label": "Drafts", - "description": "switching tasks, reloading, and uncertain submission retain the correct task's draft and attachment receipts." - }, - { - "id": "steering/approval-queue", - "label": "Approval queue", - "description": "answered questions and accepted approvals have durable delivery distinct from editable ordinary comments." - } - ] - }, - { - "id": "documents-artifacts", - "title": "Documents, attachments, and work products", - "description": "Versioned documents, annotations, files, outputs, and artifact library.", - "capabilities": [ - { - "id": "documents-artifacts/documents", - "label": "Documents", - "description": "edit versioned task documents and inspect or restore revisions." - }, - { - "id": "documents-artifacts/annotations", - "label": "Annotations", - "description": "attach feedback to document content and inspect resolution state." - }, - { - "id": "documents-artifacts/attachments", - "label": "Attachments", - "description": "upload, preview, and download allowed files with company access checks." - }, - { - "id": "documents-artifacts/work-products", - "label": "Work products", - "description": "link deliverables to their source task, resource, and review context." - }, - { - "id": "documents-artifacts/library", - "label": "Library", - "description": "search, filter, group, and open artifact stacks." - } - ] - } - ] - }, - { - "title": "Agents and reusable capabilities", - "features": [ - { - "id": "agents", - "title": "Hiring, configuration, and organization", - "description": "Agent identity, instructions, reporting lines, lifecycle, and built-ins.", - "capabilities": [ - { - "id": "agents/hire", - "label": "Hire", - "description": "choose identity, adapter, model, and required account settings; edit reporting relationships through the agent configuration afterward." - }, - { - "id": "agents/instructions", - "label": "Instructions", - "description": "edit agent configuration and instruction files with durable revisions." - }, - { - "id": "agents/organization", - "label": "Organization", - "description": "inspect and change reporting relationships through supported controls." - }, - { - "id": "agents/primary-agent", - "label": "Primary agent", - "description": "choose a personal primary agent for the company, confirm replacement, and inspect its roster/sidebar and task/chat defaults." - }, - { - "id": "agents/lifecycle", - "label": "Lifecycle", - "description": "pause/resume or retire an agent while preserving history." - }, - { - "id": "agents/built-in", - "label": "Built in", - "description": "configure required agents without treating them as ordinary removable hires." - } - ] - }, - { - "id": "runs-adapters", - "title": "Runs, harnesses, and model accounts", - "description": "Adapter/model setup, account validation, transcripts, and run history.", - "capabilities": [ - { - "id": "runs-adapters/availability", - "label": "Availability", - "description": "discover installed adapters and available models/accounts." - }, - { - "id": "runs-adapters/validation", - "label": "Validation", - "description": "test an adapter in the selected execution environment and surface authentication failures." - }, - { - "id": "runs-adapters/runs", - "label": "Runs", - "description": "inspect run status, events, output, costs, and the source task." - }, - { - "id": "runs-adapters/session", - "label": "Session", - "description": "preserve or reset execution context through supported lifecycle actions." - } - ] - }, - { - "id": "skills", - "title": "Skills and Skill Studio", - "description": "Discovery, sources, authoring, revisions, tests, and agent policies.", - "capabilities": [ - { - "id": "skills/discovery", - "label": "Discovery", - "description": "browse installed/discover views and import a skill or source." - }, - { - "id": "skills/authoring", - "label": "Authoring", - "description": "create/edit a writable skill or fork a read-only source." - }, - { - "id": "skills/versions", - "label": "Versions", - "description": "inspect revisions, source updates, diffs, and selected releases." - }, - { - "id": "skills/policy", - "label": "Policy", - "description": "apply agent enablement and skill usage policy independently from installation." - }, - { - "id": "skills/testing", - "label": "Testing", - "description": "run a bounded Studio test and inspect its result and interactions." - } - ] - }, - { - "id": "teams", - "title": "Team packages and installation", - "description": "Catalog preview/install via CLI/API; catalog UI availability called out.", - "capabilities": [ - { - "id": "teams/discovery", - "label": "Discovery", - "description": "list available team catalog entries and inspect package contents." - }, - { - "id": "teams/preview", - "label": "Preview", - "description": "inspect proposed resources and installation options before mutation." - }, - { - "id": "teams/install", - "label": "Install", - "description": "install into the intended company and inspect resulting agents and resources." - }, - { - "id": "teams/configuration", - "label": "Configuration", - "description": "supply required adapters/accounts and verify installed agents can work." - } - ] - } - ] - }, - { - "title": "Projects and execution", - "features": [ - { - "id": "projects", - "title": "Projects and repositories", - "description": "Project lifecycle, task context, repository configuration, and defaults.", - "capabilities": [ - { - "id": "projects/lifecycle", - "label": "Lifecycle", - "description": "create, name, organize, and archive projects." - }, - { - "id": "projects/task-context", - "label": "Task context", - "description": "inspect project tasks and create work in the selected project." - }, - { - "id": "projects/repositories", - "label": "Repositories", - "description": "configure repository/workspace sources and verify usable checkouts." - }, - { - "id": "projects/defaults", - "label": "Defaults", - "description": "maintain project instructions, environment, goal, and budget context where offered." - } - ] - }, - { - "id": "goals", - "title": "Goals and work alignment", - "description": "Goal hierarchy, ownership, status, and project/task context.", - "capabilities": [ - { - "id": "goals/hierarchy", - "label": "Hierarchy", - "description": "create and inspect goal level, parent, owner, and status." - }, - { - "id": "goals/alignment", - "label": "Alignment", - "description": "associate work with a valid goal in the same company." - }, - { - "id": "goals/navigation", - "label": "Navigation", - "description": "follow goal/project/task context to understand why work exists." - } - ] - }, - { - "id": "workspaces", - "title": "Workspaces, services, and files", - "description": "Provisioning, task bindings, services/logs, Git/files, and closure.", - "capabilities": [ - { - "id": "workspaces/binding", - "label": "Binding", - "description": "identify the workspace actually bound to a task/run." - }, - { - "id": "workspaces/provisioning", - "label": "Provisioning", - "description": "observe readiness and failures instead of inferring readiness from a created record." - }, - { - "id": "workspaces/services", - "label": "Services", - "description": "start/stop supported services and inspect logs and exposed endpoints." - }, - { - "id": "workspaces/files-git", - "label": "Files git", - "description": "inspect workspace files and repository state used for the deliverable." - }, - { - "id": "workspaces/closure", - "label": "Closure", - "description": "close/reopen or reconcile through permitted controls without losing work." - } - ] - }, - { - "id": "execution-environments", - "title": "Execution environments", - "description": "Local, SSH, sandbox providers, target probes, and custom images.", - "capabilities": [ - { - "id": "execution-environments/configuration", - "label": "Configuration", - "description": "inspect local environments and configure available SSH/sandbox targets." - }, - { - "id": "execution-environments/capabilities", - "label": "Capabilities", - "description": "select only drivers/providers that advertise the required execution capability." - }, - { - "id": "execution-environments/probe", - "label": "Probe", - "description": "test reachability and runtime prerequisites in the actual target." - }, - { - "id": "execution-environments/assignment", - "label": "Assignment", - "description": "bind the intended agent/project/workspace to its execution target." - }, - { - "id": "execution-environments/images", - "label": "Images", - "description": "inspect supported sandbox custom-image preparation and terminal workflows." - } - ] - }, - { - "id": "recovery", - "title": "Recovery", - "description": "Stopped work, workspace repair, bounded continuation, and reconnect.", - "capabilities": [ - { - "id": "recovery/diagnosis", - "label": "Diagnosis", - "description": "a task/run exposes the recorded cause, evidence, owner, attempt progress, and next action without requiring a raw-log interpretation." - }, - { - "id": "recovery/bounded-continuation", - "label": "Bounded continuation", - "description": "supported interrupted work continues with preserved conversation context and bounded attempts, without blindly replaying tools." - }, - { - "id": "recovery/source-action", - "label": "Source action", - "description": "source-scoped recovery actions remain attached to the task; independent repair work may have its own issue and return owner." - }, - { - "id": "recovery/exhaustion", - "label": "Exhaustion", - "description": "exhausted or overdue recovery exposes the current gate and permitted operator action; it does not claim an automatic path is still live." - }, - { - "id": "recovery/workspace", - "label": "Workspace", - "description": "workspace divergence/export failures show the applicable repair, reconcile, or isolated reissue action with evidence and authority checks." - }, - { - "id": "recovery/unknown-outcome", - "label": "Unknown outcome", - "description": "uncertain external side effects require inspection and an explicit decision, not automatic replay." - }, - { - "id": "recovery/user-continuation", - "label": "User continuation", - "description": "saved user messages after a stop are reconsidered once cleanup proves the old execution is stopped; duplicate wakes are avoided." - }, - { - "id": "recovery/reconnect", - "label": "Reconnect", - "description": "browser stream recovery refreshes persisted state without claiming the agent itself restarted or that a failed run succeeded." - } - ] - } - ] - }, - { - "title": "Apps, channels, and extensions", - "features": [ - { - "id": "connection-setup", - "title": "Connection setup", - "description": "Catalog, MCP links, task requests, authentication, and setup resumption.", - "capabilities": [ - { - "id": "connection-setup/catalog", - "label": "Catalog", - "description": "find a provider, inspect its available methods, and open setup; unavailable methods explain their prerequisite rather than silently switching." - }, - { - "id": "connection-setup/identity-and-access", - "label": "Identity and access", - "description": "select personal/shared identity and eligible agents; an empty explicit selection and company-wide access must not be confused." - }, - { - "id": "connection-setup/credentials", - "label": "Credentials", - "description": "provider sign-in, key, or generic MCP URL follows its supported setup method; credentials are not retained in browser draft storage." - }, - { - "id": "connection-setup/handoff", - "label": "Handoff", - "description": "provider popup/full-page callback returns to the correct setup host with the original task intent and identity choice intact." - }, - { - "id": "connection-setup/draft-recovery", - "label": "Draft recovery", - "description": "cancel, Back, Save & exit, reload, Finish setup, and reconnect preserve the exact draft rather than creating duplicate connections." - }, - { - "id": "connection-setup/task-request", - "label": "Task request", - "description": "only the addressed person resolves the requested connection; usable access releases the pending task request through normal continuation." - }, - { - "id": "connection-setup/channel-setup", - "label": "Channel setup", - "description": "provider endpoint, represented agent, linked sender, and communication instructions are configured before an external message is used." - }, - { - "id": "connection-setup/failure", - "label": "Failure", - "description": "denied login, unreachable/private URL, expired credentials, and permission errors leave an actionable state rather than a false success." - } - ] - }, - { - "id": "app-permissions", - "title": "App access and action permissions", - "description": "Agent grants, off/ask/allowed actions, discovery, tests, and revocation.", - "capabilities": [ - { - "id": "app-permissions/agent-access", - "label": "Agent access", - "description": "grant the connection to all or selected eligible agents." - }, - { - "id": "app-permissions/action-policy", - "label": "Action policy", - "description": "set off/ask/allowed independently for available actions." - }, - { - "id": "app-permissions/catalog-change", - "label": "Catalog change", - "description": "review newly discovered/quarantined actions before enabling them." - }, - { - "id": "app-permissions/test-action", - "label": "Test action", - "description": "choose an actor and inputs and inspect a real action result." - }, - { - "id": "app-permissions/account-maintenance", - "label": "Account maintenance", - "description": "inspect accounts, reconnect/revoke, and review connection activity." - } - ] - }, - { - "id": "chat-channels", - "title": "External chat and email", - "description": "Provider-specific identity, threads, files, delivery, and endpoint upkeep.", - "capabilities": [ - { - "id": "chat-channels/providers", - "label": "Providers", - "description": "configure the available Slack, Discord, Microsoft Teams, Telegram, GitHub, AgentMail, and experimental iMessage Photon paths; availability still depends on gates and provider support." - }, - { - "id": "chat-channels/identity", - "label": "Identity", - "description": "link the external sender to the intended authorized Paperclip identity." - }, - { - "id": "chat-channels/conversation", - "label": "Conversation", - "description": "route inbound messages to the selected agent and send replies to the correct thread." - }, - { - "id": "chat-channels/attachments", - "label": "Attachments", - "description": "transfer supported files with inspectable delivery and failure states." - }, - { - "id": "chat-channels/lifecycle", - "label": "Lifecycle", - "description": "inspect endpoint activity, repair auth, and disable delivery when required." - } - ] - }, - { - "id": "gateways-profiles", - "title": "Tool gateways and access profiles", - "description": "Tool exposure, client configuration, tokens, profiles, and activity.", - "capabilities": [ - { - "id": "gateways-profiles/gateway", - "label": "Gateway", - "description": "create/edit an endpoint backed by a tool access profile." - }, - { - "id": "gateways-profiles/profiles", - "label": "Profiles", - "description": "define reusable tool access configuration and inspect draft/detail state." - }, - { - "id": "gateways-profiles/client-connect", - "label": "Client connect", - "description": "copy the intended endpoint/configuration to an authorized test client." - }, - { - "id": "gateways-profiles/tokens", - "label": "Tokens", - "description": "create/revoke client credentials and verify their scope." - }, - { - "id": "gateways-profiles/activity", - "label": "Activity", - "description": "inspect tool discovery/calls and explicit errors." - } - ] - }, - { - "id": "secrets", - "title": "Secrets and proposals", - "description": "Company/user credentials, grants, proposals, and vault import.", - "capabilities": [ - { - "id": "secrets/company-secrets", - "label": "Company secrets", - "description": "create/update secret references and control their bindings." - }, - { - "id": "secrets/user-secrets", - "label": "User secrets", - "description": "define required user credentials and set a value for the current user." - }, - { - "id": "secrets/proposals", - "label": "Proposals", - "description": "review proposed changes with the appropriate authority." - }, - { - "id": "secrets/vault-import", - "label": "Vault import", - "description": "import eligible external-vault references through the offered flow." - }, - { - "id": "secrets/runtime-delivery", - "label": "Runtime delivery", - "description": "deliver only the secret references authorized for the run/actor. Agent-owned instance secrets stay in the trusted server runtime and are never delivered to an agent." - } - ] - }, - { - "id": "plugins", - "title": "Plugins", - "description": "Installation/configuration, contributed pages/tools, and lifecycle.", - "capabilities": [ - { - "id": "plugins/installation", - "label": "Installation", - "description": "install a trusted test package or local development plugin through supported controls." - }, - { - "id": "plugins/configuration", - "label": "Configuration", - "description": "save validated configuration and inspect activation/failure state." - }, - { - "id": "plugins/contributions", - "label": "Contributions", - "description": "open plugin routes, settings, tools, and contributed resource tabs." - }, - { - "id": "plugins/lifecycle", - "label": "Lifecycle", - "description": "disable/remove or reload a disposable plugin and observe cleanup." - } - ] - } - ] - }, - { - "title": "Automation and structured work", - "features": [ - { - "id": "routines", - "title": "Routines, schedules, and triggers", - "description": "Definitions, variables, scheduled/webhook/manual runs, and history.", - "capabilities": [ - { - "id": "routines/definition", - "label": "Definition", - "description": "save the request, agent, project, variables, and execution context." - }, - { - "id": "routines/triggers", - "label": "Triggers", - "description": "configure supported schedules/webhooks or other offered triggers." - }, - { - "id": "routines/run-now", - "label": "Run now", - "description": "supply inputs and create an observable routine execution." - }, - { - "id": "routines/history", - "label": "History", - "description": "inspect resulting tasks and past outcomes." - }, - { - "id": "routines/management", - "label": "Management", - "description": "organize, pause/disable, archive, and distinguish plugin-managed routines." - } - ] - }, - { - "id": "pipelines", - "title": "Pipelines, review queues, and learnings", - "description": "Experimental stages, automation, items, review, and learning records.", - "capabilities": [ - { - "id": "pipelines/stages", - "label": "Stages", - "description": "configure stage order, behavior, and automation assignees." - }, - { - "id": "pipelines/items", - "label": "Items", - "description": "create or inspect items, grouping, stage state, and work references." - }, - { - "id": "pipelines/review", - "label": "Review", - "description": "act on the pipeline review queue and inspect the resulting transition." - }, - { - "id": "pipelines/learnings", - "label": "Learnings", - "description": "inspect the separate learning view and its source context." - } - ] - }, - { - "id": "cases", - "title": "Cases", - "description": "Experimental structured fields, relationships, revisions, and task links.", - "capabilities": [ - { - "id": "cases/browse", - "label": "Browse", - "description": "search, filter, sort, group, and navigate case records." - }, - { - "id": "cases/structure", - "label": "Structure", - "description": "inspect fields and parent/child relationships without losing matching descendants." - }, - { - "id": "cases/history", - "label": "History", - "description": "inspect revisions and activity for a record." - }, - { - "id": "cases/task-links", - "label": "Task links", - "description": "follow work associated with a case in both directions." - } - ] - }, - { - "id": "status-cards", - "title": "Status cards", - "description": "Experimental summaries, watched work, refresh history, and settings.", - "capabilities": [ - { - "id": "status-cards/authoring", - "label": "Authoring", - "description": "create a card and configure its prompt, refresh behavior, and summarizer." - }, - { - "id": "status-cards/generation", - "label": "Generation", - "description": "observe compilation/refresh tasks and their successful or failed output." - }, - { - "id": "status-cards/inspection", - "label": "Inspection", - "description": "read the summary, watched work, history, and available query debugging." - }, - { - "id": "status-cards/archive", - "label": "Archive", - "description": "archive and restore without confusing a stale summary with a current result." - } - ] - } - ] - }, - { - "title": "Oversight and operation", - "features": [ - { - "id": "budgets-costs", - "title": "Costs and budgets", - "description": "Spend reports, scoped limits, incidents, hard stops, and resumption.", - "capabilities": [ - { - "id": "budgets-costs/cost-reporting", - "label": "Cost reporting", - "description": "inspect spend by the offered time range and resource dimensions." - }, - { - "id": "budgets-costs/budgets", - "label": "Budgets", - "description": "configure supported company/project/agent limits and inspect usage." - }, - { - "id": "budgets-costs/incidents", - "label": "Incidents", - "description": "distinguish warnings, hard stops, and manual pauses." - }, - { - "id": "budgets-costs/resolution", - "label": "Resolution", - "description": "raise or resolve a budget incident through authorized controls and verify resumption." - } - ] - }, - { - "id": "activity", - "title": "Dashboards and audit trails", - "description": "Company health, live work, activity, runs, routines, and timeline.", - "capabilities": [ - { - "id": "activity/overview", - "label": "Overview", - "description": "inspect the company dashboard and live-work summary." - }, - { - "id": "activity/activity", - "label": "Activity", - "description": "filter and page through recorded actor/resource events." - }, - { - "id": "activity/runs", - "label": "Runs", - "description": "find executions and follow their task/agent context." - }, - { - "id": "activity/routine-audit", - "label": "Routine audit", - "description": "inspect routine execution activity separately from its definition." - }, - { - "id": "activity/timeline", - "label": "Timeline", - "description": "use the available timeline view to understand work over time." - } - ] - }, - { - "id": "navigation-preferences", - "title": "Navigation, profile, and announcements", - "description": "Sidebar state, favorites/recents, personal identity, and dismissals.", - "capabilities": [ - { - "id": "navigation-preferences/navigation", - "label": "Navigation", - "description": "use current sidebar links, favorites, recents, and available layout controls." - }, - { - "id": "navigation-preferences/preferences", - "label": "Preferences", - "description": "persist supported ordering/collapse choices for the intended user/company." - }, - { - "id": "navigation-preferences/profile", - "label": "Profile", - "description": "edit personal identity and inspect public profile links." - }, - { - "id": "navigation-preferences/announcements", - "label": "Announcements", - "description": "inspect and dismiss an announcement with its intended instance-wide user scope." - }, - { - "id": "navigation-preferences/fallbacks", - "label": "Fallbacks", - "description": "handle missing resources and old deep links without presenting another resource as the target." - } - ] - }, - { - "id": "instance-operations", - "title": "Instance operations", - "description": "Installation, updates, service health, configuration, and backups.", - "capabilities": [ - { - "id": "instance-operations/install-update", - "label": "Install update", - "description": "inspect install channel/version and apply supported update or rollback operations." - }, - { - "id": "instance-operations/server-service", - "label": "Server service", - "description": "start/stop the intended instance and inspect its service health." - }, - { - "id": "instance-operations/configuration", - "label": "Configuration", - "description": "configure database, server binding, storage, secrets, and available experimental settings." - }, - { - "id": "instance-operations/diagnostics", - "label": "Diagnostics", - "description": "use doctor/health output to distinguish readiness from a listening port." - }, - { - "id": "instance-operations/backup", - "label": "Backup", - "description": "create and inspect backups and verify restore only into a separate disposable target. Routine HTTP monitoring may use `GET /api/liveness` (or `HEAD`). It returns only process startup status and the public build commit without SQL or authentication. It remains reachable during an idle drain. Use `/api/health` for explicit database readiness, signed bootstrap, and authorized diagnostics; liveness does not establish database health or claim a workspace." - } - ] - }, - { - "id": "cli-operations", - "title": "CLI/API and local worktrees", - "description": "Explicit context, resource commands, outputs, runs, and isolated instances.", - "capabilities": [ - { - "id": "cli-operations/context", - "label": "Context", - "description": "choose instance/API base, profile, identity, and company explicitly." - }, - { - "id": "cli-operations/domain-commands", - "label": "Domain commands", - "description": "read/write tasks, agents, projects, goals, approvals, routines, and other registered resources." - }, - { - "id": "cli-operations/outputs", - "label": "Outputs", - "description": "work with documents/assets/skills and inspect machine-readable results." - }, - { - "id": "cli-operations/run-controls", - "label": "Run controls", - "description": "invoke/inspect supported runs and observe actual outcomes." - }, - { - "id": "cli-operations/worktree-instances", - "label": "Worktree instances", - "description": "initialize, seed, diagnose, and clean up only an owned development instance." - } - ] - } - ] - }, - { - "title": "Contributor surfaces", - "features": [ - { - "id": "developer-labs", - "title": "Developer previews and diagnostic labs", - "description": "Design examples, interaction fixtures, performance checks; not production acceptance.", - "capabilities": [ - { - "id": "developer-labs/design", - "label": "Design", - "description": "inspect shared components and layout examples in the design guide or Storybook." - }, - { - "id": "developer-labs/interaction-labs", - "label": "Interaction labs", - "description": "exercise synthetic bootstrap, task-chat, denial, and collaboration states." - }, - { - "id": "developer-labs/performance", - "label": "Performance", - "description": "measure the provided long-thread fixture with known data and environment." - }, - { - "id": "developer-labs/route-gates", - "label": "Route gates", - "description": "distinguish dev-only, experimental, historical, and fallback surfaces." - } - ] - } - ] - } - ] -} diff --git a/ui/storybook/generated/features/access.stories.tsx b/ui/storybook/generated/features/access.stories.tsx deleted file mode 100644 index 7dacca8e8ea..00000000000 --- a/ui/storybook/generated/features/access.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/activity.stories.tsx b/ui/storybook/generated/features/activity.stories.tsx deleted file mode 100644 index a967df0407a..00000000000 --- a/ui/storybook/generated/features/activity.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/agent-chat.stories.tsx b/ui/storybook/generated/features/agent-chat.stories.tsx deleted file mode 100644 index f9706d2e91f..00000000000 --- a/ui/storybook/generated/features/agent-chat.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/agents.stories.tsx b/ui/storybook/generated/features/agents.stories.tsx deleted file mode 100644 index 60ed8ea3d66..00000000000 --- a/ui/storybook/generated/features/agents.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/app-permissions.stories.tsx b/ui/storybook/generated/features/app-permissions.stories.tsx deleted file mode 100644 index 890719f34f0..00000000000 --- a/ui/storybook/generated/features/app-permissions.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/budgets-costs.stories.tsx b/ui/storybook/generated/features/budgets-costs.stories.tsx deleted file mode 100644 index 6eaa14c23cf..00000000000 --- a/ui/storybook/generated/features/budgets-costs.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/cases.stories.tsx b/ui/storybook/generated/features/cases.stories.tsx deleted file mode 100644 index a460b6f7194..00000000000 --- a/ui/storybook/generated/features/cases.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/chat-channels.stories.tsx b/ui/storybook/generated/features/chat-channels.stories.tsx deleted file mode 100644 index 59518d8f1e6..00000000000 --- a/ui/storybook/generated/features/chat-channels.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/cli-operations.stories.tsx b/ui/storybook/generated/features/cli-operations.stories.tsx deleted file mode 100644 index 71de7f942b6..00000000000 --- a/ui/storybook/generated/features/cli-operations.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/companies.stories.tsx b/ui/storybook/generated/features/companies.stories.tsx deleted file mode 100644 index c75fbc8f580..00000000000 --- a/ui/storybook/generated/features/companies.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/connection-setup.stories.tsx b/ui/storybook/generated/features/connection-setup.stories.tsx deleted file mode 100644 index dd82f534d6c..00000000000 --- a/ui/storybook/generated/features/connection-setup.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/developer-labs.stories.tsx b/ui/storybook/generated/features/developer-labs.stories.tsx deleted file mode 100644 index f4de9cc18fa..00000000000 --- a/ui/storybook/generated/features/developer-labs.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/documents-artifacts.stories.tsx b/ui/storybook/generated/features/documents-artifacts.stories.tsx deleted file mode 100644 index 203f38e439b..00000000000 --- a/ui/storybook/generated/features/documents-artifacts.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/execution-environments.stories.tsx b/ui/storybook/generated/features/execution-environments.stories.tsx deleted file mode 100644 index e3a1764173c..00000000000 --- a/ui/storybook/generated/features/execution-environments.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/gateways-profiles.stories.tsx b/ui/storybook/generated/features/gateways-profiles.stories.tsx deleted file mode 100644 index 17d8d379248..00000000000 --- a/ui/storybook/generated/features/gateways-profiles.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/goals.stories.tsx b/ui/storybook/generated/features/goals.stories.tsx deleted file mode 100644 index e50c247d3a0..00000000000 --- a/ui/storybook/generated/features/goals.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/inbox-search.stories.tsx b/ui/storybook/generated/features/inbox-search.stories.tsx deleted file mode 100644 index 6993432438b..00000000000 --- a/ui/storybook/generated/features/inbox-search.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/instance-operations.stories.tsx b/ui/storybook/generated/features/instance-operations.stories.tsx deleted file mode 100644 index dcd63d0fd1b..00000000000 --- a/ui/storybook/generated/features/instance-operations.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/navigation-preferences.stories.tsx b/ui/storybook/generated/features/navigation-preferences.stories.tsx deleted file mode 100644 index f894ec18769..00000000000 --- a/ui/storybook/generated/features/navigation-preferences.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/onboarding.stories.tsx b/ui/storybook/generated/features/onboarding.stories.tsx deleted file mode 100644 index 88bfe310c8f..00000000000 --- a/ui/storybook/generated/features/onboarding.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/pipelines.stories.tsx b/ui/storybook/generated/features/pipelines.stories.tsx deleted file mode 100644 index ea339376eb7..00000000000 --- a/ui/storybook/generated/features/pipelines.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/plugins.stories.tsx b/ui/storybook/generated/features/plugins.stories.tsx deleted file mode 100644 index 808e79900ba..00000000000 --- a/ui/storybook/generated/features/plugins.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/projects.stories.tsx b/ui/storybook/generated/features/projects.stories.tsx deleted file mode 100644 index 99b5af85c28..00000000000 --- a/ui/storybook/generated/features/projects.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/questions-and-approvals.stories.tsx b/ui/storybook/generated/features/questions-and-approvals.stories.tsx deleted file mode 100644 index c79a983be87..00000000000 --- a/ui/storybook/generated/features/questions-and-approvals.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/recovery.stories.tsx b/ui/storybook/generated/features/recovery.stories.tsx deleted file mode 100644 index a448fa3a752..00000000000 --- a/ui/storybook/generated/features/recovery.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/routines.stories.tsx b/ui/storybook/generated/features/routines.stories.tsx deleted file mode 100644 index c79537ead7c..00000000000 --- a/ui/storybook/generated/features/routines.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/runs-adapters.stories.tsx b/ui/storybook/generated/features/runs-adapters.stories.tsx deleted file mode 100644 index 393b9755ddd..00000000000 --- a/ui/storybook/generated/features/runs-adapters.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/secrets.stories.tsx b/ui/storybook/generated/features/secrets.stories.tsx deleted file mode 100644 index b2c5e2311f4..00000000000 --- a/ui/storybook/generated/features/secrets.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/skills.stories.tsx b/ui/storybook/generated/features/skills.stories.tsx deleted file mode 100644 index 79f3ccdeb56..00000000000 --- a/ui/storybook/generated/features/skills.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/status-cards.stories.tsx b/ui/storybook/generated/features/status-cards.stories.tsx deleted file mode 100644 index 7d2695581de..00000000000 --- a/ui/storybook/generated/features/status-cards.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/steering.stories.tsx b/ui/storybook/generated/features/steering.stories.tsx deleted file mode 100644 index 856161d7f14..00000000000 --- a/ui/storybook/generated/features/steering.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/task-coordination.stories.tsx b/ui/storybook/generated/features/task-coordination.stories.tsx deleted file mode 100644 index 1d6080ac941..00000000000 --- a/ui/storybook/generated/features/task-coordination.stories.tsx +++ /dev/null @@ -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; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/tasks.stories.tsx b/ui/storybook/generated/features/tasks.stories.tsx deleted file mode 100644 index 917ce1d9ff5..00000000000 --- a/ui/storybook/generated/features/tasks.stories.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { FeatureOverview } from "../../support/feature-map/FeatureOverview"; - -const meta = { - id: "feature-map-tasks", - title: "Tasks and conversations/Task creation and lifecycle/Overview", - component: FeatureOverview, - args: { area: "tasks" }, - tags: ["!autodocs"], - parameters: { layout: "fullscreen" }, -} satisfies Meta; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/teams.stories.tsx b/ui/storybook/generated/features/teams.stories.tsx deleted file mode 100644 index 42fa79255bc..00000000000 --- a/ui/storybook/generated/features/teams.stories.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { FeatureOverview } from "../../support/feature-map/FeatureOverview"; - -const meta = { - id: "feature-map-teams", - title: "Agents and reusable capabilities/Team packages and installation/Overview", - component: FeatureOverview, - args: { area: "teams" }, - tags: ["!autodocs"], - parameters: { layout: "fullscreen" }, -} satisfies Meta; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/generated/features/workspaces.stories.tsx b/ui/storybook/generated/features/workspaces.stories.tsx deleted file mode 100644 index 0d1790d4cf9..00000000000 --- a/ui/storybook/generated/features/workspaces.stories.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { FeatureOverview } from "../../support/feature-map/FeatureOverview"; - -const meta = { - id: "feature-map-workspaces", - title: "Projects and execution/Workspaces, services, and files/Overview", - component: FeatureOverview, - args: { area: "workspaces" }, - tags: ["!autodocs"], - parameters: { layout: "fullscreen" }, -} satisfies Meta; -export default meta; -export const Overview: StoryObj = {}; diff --git a/ui/storybook/map-tooling.test.ts b/ui/storybook/map-tooling.test.ts new file mode 100644 index 00000000000..f25534b5402 --- /dev/null +++ b/ui/storybook/map-tooling.test.ts @@ -0,0 +1,11 @@ +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; +import { test } from "vitest"; + +test("map sources combine without tracked index edits", () => { + execFileSync(process.execPath, ["--test", "scripts/check-maps.test.mjs", "scripts/storybook-catalog.test.mjs", "scripts/storybook-feature-index.test.mjs"], { + cwd: fileURLToPath(new URL("../../", import.meta.url)), + stdio: "pipe", + timeout: 60_000, + }); +}, 65_000); diff --git a/ui/storybook/stories/access/cli-authorization.stories.tsx b/ui/storybook/stories/access/cli-authorization.stories.tsx index 110d441e0e7..3dc27fd0fc0 100644 --- a/ui/storybook/stories/access/cli-authorization.stories.tsx +++ b/ui/storybook/stories/access/cli-authorization.stories.tsx @@ -21,6 +21,15 @@ const meta = { parameters: { initialEntries: ["/cli-auth/challenge-gap?token=fixture-code"], layout: "padded", + paperclip: { + "capabilities": [ + "access/cli-auth" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { let status = parameters.status ?? "pending"; diff --git a/ui/storybook/stories/access/membership.stories.tsx b/ui/storybook/stories/access/membership.stories.tsx index 661f119e917..a73aa491144 100644 --- a/ui/storybook/stories/access/membership.stories.tsx +++ b/ui/storybook/stories/access/membership.stories.tsx @@ -36,7 +36,17 @@ const meta = { title: "Getting started and access/Login, invitations, and access/Organization membership", component: MembershipHost, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "access/membership" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { member = { ...member, membershipRole: "operator", status: "active" }; return prepareFixtureApi( diff --git a/ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx b/ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx index 394510b4bb1..95e4fae852e 100644 --- a/ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/00-review-guide.stories.tsx @@ -267,7 +267,17 @@ function Overview() { export default { id: "private-tasks-00-review-guide", title: "Getting started and access/Login, invitations, and access/Private tasks/00 Review guide", - parameters: { layout: "fullscreen", docs: { story: { inline: false } } }, + parameters: { layout: "fullscreen", docs: { story: { inline: false } }, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties" + ], + "implementation": "guide", + "boundary": "static", + "notes": "Review guide retained; explanatory content does not establish runtime or production coverage. 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." + }, + }, render: () => , } satisfies Meta; export const CoverageAndUserStories: StoryObj = {}; diff --git a/ui/storybook/stories/access/private-tasks/01-creation.stories.tsx b/ui/storybook/stories/access/private-tasks/01-creation.stories.tsx index 5e3f9f666bc..e1bdf9a1350 100644 --- a/ui/storybook/stories/access/private-tasks/01-creation.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/01-creation.stories.tsx @@ -52,7 +52,17 @@ const meta = { id: "private-tasks-01-creation", title: "Getting started and access/Login, invitations, and access/Private tasks/01 Creation", decorators: [privacyDecorator], - parameters: { ...privacyParameters, waitForViewport: true, docs: { description: { component: "Route /PAP/issues with the new-task composer. Choose Private task from +; the lock chip keeps the selection visible. Hover, focus, or tap an inherited chip to see the parent task or private project that requires privacy. Mobile stories use the real shell and check that menu actions and composer controls stay inside the viewport." } } }, + parameters: { ...privacyParameters, waitForViewport: true, docs: { description: { component: "Route /PAP/issues with the new-task composer. Choose Private task from +; the lock chip keeps the selection visible. Hover, focus, or tap an inherited chip to see the parent task or private project that requires privacy. Mobile stories use the real shell and check that menu actions and composer controls stay inside the viewport." } }, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, args: { taskTitle: "Prepare my board briefing" }, argTypes: { taskTitle: { control: "text" } }, render: (args) => , diff --git a/ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx b/ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx index 7a72e78bee3..1e6633b0e59 100644 --- a/ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/02-sharing.stories.tsx @@ -72,7 +72,17 @@ const meta = { id: "private-tasks-02-sharing", title: "Getting started and access/Login, invitations, and access/Private tasks/02 Sharing", decorators: [privacyDecorator], - parameters: { ...privacyParameters, docs: { description: { component: "Task menu → Share → Add someone. Inspect avatars in search and selected values, inherited grants, reader access, confirmations, empty/loading/error states and mobile. The sticky-access paragraph is removed." } } }, + parameters: { ...privacyParameters, docs: { description: { component: "Task menu → Share → Add someone. Inspect avatars in search and selected values, inherited grants, reader access, confirmations, empty/loading/error states and mobile. The sticky-access paragraph is removed." } }, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, render: () => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx b/ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx index e60befdce7d..00db99bb491 100644 --- a/ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/03-task-actions.stories.tsx @@ -59,7 +59,17 @@ const meta = { id: "private-tasks-03-task-actions", title: "Getting started and access/Login, invitations, and access/Private tasks/03 Task actions", decorators: [privacyDecorator], - parameters: { ...privacyParameters, docs: { description: { component: "Task menu privacy actions, permission gates and disclosure confirmation." } } }, + parameters: { ...privacyParameters, docs: { description: { component: "Task menu privacy actions, permission gates and disclosure confirmation." } }, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, render: () => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx b/ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx index 78718c74ace..5ec48c6cc82 100644 --- a/ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/04-references-and-blockers.stories.tsx @@ -113,7 +113,17 @@ const meta = { id: "private-tasks-04-references-and-blockers", title: "Getting started and access/Login, invitations, and access/Private tasks/04 References and blockers", decorators: [privacyDecorator], - parameters: { ...privacyParameters, docs: { description: { component: "Task references, parent navigation and blockers redact unreadable task content. Inspect all existing reference variants and mobile." } } }, + parameters: { ...privacyParameters, docs: { description: { component: "Task references, parent navigation and blockers redact unreadable task content. Inspect all existing reference variants and mobile." } }, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, render: () => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/access/private-tasks/05-projects.stories.tsx b/ui/storybook/stories/access/private-tasks/05-projects.stories.tsx index a64f7c9c9c5..4bd4c4c96c7 100644 --- a/ui/storybook/stories/access/private-tasks/05-projects.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/05-projects.stories.tsx @@ -79,7 +79,18 @@ const meta = { id: "private-tasks-05-projects", title: "Getting started and access/Login, invitations, and access/Private tasks/05 Projects", decorators: [privacyDecorator], - parameters: { ...privacyParameters, docs: { description: { component: "Project settings → Manage access. Human and agent identities appear in the search dropdown and selected value. Owner, reader, error, loading and mobile states use production components." } } }, + parameters: { ...privacyParameters, docs: { description: { component: "Project settings → Manage access. Human and agent identities appear in the search dropdown and selected value. Owner, reader, error, loading and mobile states use production components." } }, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties", + "projects/lifecycle" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, args: { projectName: "Executive planning" }, argTypes: { projectName: { control: "text" } }, render: (args) => , diff --git a/ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx b/ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx index 8c47b0adf0d..c9fd4e6828a 100644 --- a/ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/06-full-product-pages.stories.tsx @@ -55,7 +55,18 @@ const meta = { title: "Getting started and access/Login, invitations, and access/Private tasks/06 Full product pages", excludeStories: ["PrivacyPage"], decorators: [privacyDecorator], - parameters: { ...privacyParameters, waitForViewport: true }, + parameters: { ...privacyParameters, waitForViewport: true, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties", + "projects/lifecycle" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, render: () => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx b/ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx index ae3516e7776..d26304ac1df 100644 --- a/ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx +++ b/ui/storybook/stories/access/private-tasks/07-user-stories.stories.tsx @@ -24,7 +24,17 @@ const meta = { id: "private-tasks-07-user-stories", title: "Getting started and access/Login, invitations, and access/Private tasks/07 User stories", decorators: [privacyDecorator], - parameters: { ...privacyParameters, waitForViewport: true }, + parameters: { ...privacyParameters, waitForViewport: true, + paperclip: { + "capabilities": [ + "access/resources", + "tasks/properties" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/access/sign-in.stories.tsx b/ui/storybook/stories/access/sign-in.stories.tsx index 8bab9eb7b0b..cbd176b59d7 100644 --- a/ui/storybook/stories/access/sign-in.stories.tsx +++ b/ui/storybook/stories/access/sign-in.stories.tsx @@ -24,6 +24,15 @@ const meta = { parameters: { layout: "fullscreen", initialEntries: ["/auth?next=/companies"], + paperclip: { + "capabilities": [ + "access/login" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { let session: unknown = null; diff --git a/ui/storybook/stories/activity/activity-feed.stories.tsx b/ui/storybook/stories/activity/activity-feed.stories.tsx index 5b81c288419..d08282b1546 100644 --- a/ui/storybook/stories/activity/activity-feed.stories.tsx +++ b/ui/storybook/stories/activity/activity-feed.stories.tsx @@ -156,7 +156,16 @@ function Seeded({ events }: { events: ToolGatewayActivityEvent[] }) { const meta: Meta = { id: "tools-activity-audit-feed", title: "Oversight and operation/Dashboards and audit trails/Tools/Activity (audit feed)", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "activity/activity", + "gateways-profiles/activity" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx b/ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx index 952790fc784..1287bc61554 100644 --- a/ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx +++ b/ui/storybook/stories/activity/app-activity-lifecycle.stories.tsx @@ -124,7 +124,16 @@ function Panel(props: ActivityPanelProps) { const meta: Meta = { id: "apps-app-detail-·-activity-lifecycle", title: "Oversight and operation/Dashboards and audit trails/Apps/App detail · Activity (lifecycle)", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "activity/activity", + "gateways-profiles/activity" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/activity/data-viz-misc.stories.tsx b/ui/storybook/stories/activity/data-viz-misc.stories.tsx index 54af2de347c..de97eba6476 100644 --- a/ui/storybook/stories/activity/data-viz-misc.stories.tsx +++ b/ui/storybook/stories/activity/data-viz-misc.stories.tsx @@ -651,6 +651,13 @@ const meta = { "Fixture-backed stories for charting, board, filtering, live run, onboarding, package preview, entity row, mobile gesture, generated icon, ASCII animation, and skeleton states.", }, }, + paperclip: { + "capabilities": [ + "activity/overview" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/activity/run-audit.stories.tsx b/ui/storybook/stories/activity/run-audit.stories.tsx index 942744a096c..eeb75753bd6 100644 --- a/ui/storybook/stories/activity/run-audit.stories.tsx +++ b/ui/storybook/stories/activity/run-audit.stories.tsx @@ -15,7 +15,17 @@ const meta = { "Oversight and operation/Dashboards and audit trails/Execution history", component: AuditRuns, args: { companyId: "company-storybook" }, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "activity/runs" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "AuditRuns list, completed receipt, empty/loading/failed/denied and no-match filter. Run records are fixture snapshots; no real execution or scoped audit proof." + }, + }, beforeEach: ({ parameters }) => prepareFixtureApi( [ diff --git a/ui/storybook/stories/activity/work-timeline.stories.tsx b/ui/storybook/stories/activity/work-timeline.stories.tsx index 7e4b4160eb4..2c7f769f204 100644 --- a/ui/storybook/stories/activity/work-timeline.stories.tsx +++ b/ui/storybook/stories/activity/work-timeline.stories.tsx @@ -162,7 +162,15 @@ const meta: Meta = { id: "pages-work-timeline", title: "Oversight and operation/Dashboards and audit trails/Pages/Work Timeline", component: TimelineHarness, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "activity/timeline" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx b/ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx index 1bab0c320fd..349753adbcc 100644 --- a/ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx +++ b/ui/storybook/stories/agent-chat/agent-chat-sidebar.stories.tsx @@ -8,7 +8,17 @@ const meta = { component: AgentChatPrototype, parameters: { layout: "fullscreen", docs: { description: { component: "The production chat sidebar and pages inside the real Paperclip Layout, including the existing transcript, composer, and context panel. Click Chat to see the landing page, search by name or role, or use + to start or reopen an agent conversation. Each agent has one conversation; sends stay in this Storybook's in-memory fixtures." - } } }, + } }, + paperclip: { + "capabilities": [ + "agent-chat/discovery", + "agent-chat/history" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Wrapper mounts production Layout and AgentChat; conversation selection and sends use in-memory routes. Directory name is not prototype evidence." + }, + }, args: { sidebarScenario: "conversation", scenario: "returning", contextInitiallyOpen: false }, render: args => , } satisfies Meta; diff --git a/ui/storybook/stories/agent-chat/agent-chat.stories.tsx b/ui/storybook/stories/agent-chat/agent-chat.stories.tsx index 493e1283f09..c9402b8ee18 100644 --- a/ui/storybook/stories/agent-chat/agent-chat.stories.tsx +++ b/ui/storybook/stories/agent-chat/agent-chat.stories.tsx @@ -13,6 +13,17 @@ const meta = { "Production Layout, AgentChat, IssueDetail, transcript and side-panel components run against in-memory routes. The landing page is a local ChatEntryLanding composition; first-use/default-agent behavior is not production acceptance. Sends append locally. Some unhandled API paths return empty fixture data, so this suite does not verify API contracts or primary-agent preference behavior.", }, }, + paperclip: { + "capabilities": [ + "agent-chat/discovery", + "agent-chat/history", + "agent-chat/handoff" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Production conversation/task routes with a local ChatEntryLanding. Default-agent behavior and fallback API responses remain outside current-product parity. ProjectCreated, ExistingProject, MultipleRepositories, ProjectWithoutRepository and ProjectCreationFailed show linked handoff results/navigation through shipped chat/task hosts. Tool execution and persistence are simulated." + }, }, argTypes: { scenario: { diff --git a/ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx b/ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx index 54928fc6ffb..3d6a3c7f5dc 100644 --- a/ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx +++ b/ui/storybook/stories/agent-chat/agent-conversation-sidebar.stories.tsx @@ -19,7 +19,18 @@ const meta = { component: AgentConversationSidebar, parameters: { layout: "fullscreen", docs: { description: { component: "Secondary agent navigation at the same width as the app's other contextual sidebars. Uses production AgentAvatar, Input, and Button. The entire row is a link; selection and search are interactive. Search matches agent name, title, and role. Escape clears the query. Browse all agents links to the existing agent directory in the page stories." - } } }, + } }, + paperclip: { + "capabilities": [ + "agent-chat/discovery", + "agent-chat/history" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "Support module re-exports production AgentConversationSidebar; search/selection use fixture callbacks." + }, + }, args: { agents: sidebarAgents, availableAgents: sidebarRoster(), activeId: "agent-codex", previews: sidebarPreviews }, render: args => , } satisfies Meta; diff --git a/ui/storybook/stories/agent-chat/chat-entry.stories.tsx b/ui/storybook/stories/agent-chat/chat-entry.stories.tsx index 35137094aed..4d395a40e43 100644 --- a/ui/storybook/stories/agent-chat/chat-entry.stories.tsx +++ b/ui/storybook/stories/agent-chat/chat-entry.stories.tsx @@ -8,7 +8,19 @@ const meta = { component: AgentChatPrototype, parameters: { layout: "fullscreen", docs: { description: { component: "Historical chat-entry exploration: the local sidebar and landing composition keeps a first-created-agent default. The current product uses the personal primary-agent preference and recent-conversation rules. Shared layout, picker and conversation components remain useful here, but these entry/default rules are retained design history. Selecting and sending use in-memory fixtures; no real agents run. Use Primary Agent journeys for current default-selection examples." - } } }, + } }, + paperclip: { + "capabilities": [ + "agent-chat/discovery", + "agent-chat/history" + ], + "status": "historical", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Retained first-created-agent sidebar/landing design predates personal primary-agent selection. Shared production conversation components remain useful.", + "replacement": "ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx" + }, + }, args: { entryScenario: "returning", scenario: "returning", contextInitiallyOpen: false }, render: (args) => , } satisfies Meta; diff --git a/ui/storybook/stories/agent-chat/conference-room.stories.tsx b/ui/storybook/stories/agent-chat/conference-room.stories.tsx index eb555e1ae38..3d954e0001d 100644 --- a/ui/storybook/stories/agent-chat/conference-room.stories.tsx +++ b/ui/storybook/stories/agent-chat/conference-room.stories.tsx @@ -19,6 +19,15 @@ const meta = { "Shipped Conference Room with isolated conversation receipts and SSE. This does not execute a provider or verify server access.", }, }, + paperclip: { + "capabilities": [ + "agent-chat/conference-room" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { let comments: unknown[] = []; diff --git a/ui/storybook/stories/agents/agent-detail.stories.tsx b/ui/storybook/stories/agents/agent-detail.stories.tsx index 96dc123e803..1b8faaf2612 100644 --- a/ui/storybook/stories/agents/agent-detail.stories.tsx +++ b/ui/storybook/stories/agents/agent-detail.stories.tsx @@ -192,7 +192,16 @@ function AgentDetailScenario() { const meta: Meta = { id: "pages-agent-detail", title: "Agents and reusable capabilities/Hiring, configuration, and organization/Pages/Agent Detail", - parameters: { layout: "fullscreen", a11y: { test: "off" } }, + parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "agents/lifecycle", + "agents/instructions" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/agents/agent-files.stories.tsx b/ui/storybook/stories/agents/agent-files.stories.tsx index 7a60e9119dc..5c77556165f 100644 --- a/ui/storybook/stories/agents/agent-files.stories.tsx +++ b/ui/storybook/stories/agents/agent-files.stories.tsx @@ -107,7 +107,15 @@ function AgentFilesStory({ failedSync = false, fullStorageRun = false, historica ; } const meta = { id: "agents-persistent-files", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Persistent files", component: AgentFilesStory, parameters: { layout: "fullscreen" } } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Persistent files", component: AgentFilesStory, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "agents/instructions" + ], + "implementation": "production", + "boundary": "fixtures" + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const InstructionsAndFiles: Story = {}; diff --git a/ui/storybook/stories/agents/agent-management.stories.tsx b/ui/storybook/stories/agents/agent-management.stories.tsx index 2b877ad5cee..40d59d66aaf 100644 --- a/ui/storybook/stories/agents/agent-management.stories.tsx +++ b/ui/storybook/stories/agents/agent-management.stories.tsx @@ -829,6 +829,16 @@ const meta = { "Agent management stories cover detail, configuration, icon, action, live-run, and config primitive states using extended Paperclip fixtures.", }, }, + paperclip: { + "capabilities": [ + "agents/lifecycle", + "agents/instructions", + "execution-environments/assignment" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/agents/agent-persona-pages.stories.tsx b/ui/storybook/stories/agents/agent-persona-pages.stories.tsx index f220ae53f89..2d5ac930f67 100644 --- a/ui/storybook/stories/agents/agent-persona-pages.stories.tsx +++ b/ui/storybook/stories/agents/agent-persona-pages.stories.tsx @@ -110,7 +110,16 @@ function PersonaPage({ path, meet = false }: { path: string; meet?: boolean }) { ; } const meta = { id: "agents-personas-full-pages", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas/Full pages", parameters: { layout: "fullscreen", a11y: { test: "off" } } } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas/Full pages", parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "agents/organization", + "navigation-preferences/profile" + ], + "implementation": "production", + "boundary": "fixtures" + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const AllAgents: Story = { render: () => }; diff --git a/ui/storybook/stories/agents/agent-personas.stories.tsx b/ui/storybook/stories/agents/agent-personas.stories.tsx index 57aeec4a853..ee142c19066 100644 --- a/ui/storybook/stories/agents/agent-personas.stories.tsx +++ b/ui/storybook/stories/agents/agent-personas.stories.tsx @@ -15,7 +15,16 @@ const meta = { title: "Agents and reusable capabilities/Hiring, configuration, and organization/Agents/Personas", component: AgentCharacter, args: { appearance, size: 256, state: "listening", label: "Chief of Staff" }, - parameters: { docs: { description: { component: "Persistent cap-v1 identities. The hero alone loads ClipLab. Development Storybook renders capsule PNGs locally on demand; published Storybook packages the same PNGs during its build, including every preset and both densities. Neither needs a running API." } } }, + parameters: { docs: { description: { component: "Persistent cap-v1 identities. The hero alone loads ClipLab. Development Storybook renders capsule PNGs locally on demand; published Storybook packages the same PNGs during its build, including every preset and both densities. Neither needs a running API." } }, + paperclip: { + "capabilities": [ + "agents/organization", + "navigation-preferences/profile" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, argTypes: { state: { control: "select", options: CHARACTER_STATES }, size: { control: "select", options: AGENT_AVATAR_SIZES }, diff --git a/ui/storybook/stories/agents/agent-settings-redesign.stories.tsx b/ui/storybook/stories/agents/agent-settings-redesign.stories.tsx index 5a0d1bcd92f..ba089806300 100644 --- a/ui/storybook/stories/agents/agent-settings-redesign.stories.tsx +++ b/ui/storybook/stories/agents/agent-settings-redesign.stories.tsx @@ -12,6 +12,16 @@ const meta = { "Design review of the full agent settings. Uses the existing navigation and functional tab components with isolated, mutable Storybook fixtures. No production data is changed.", }, }, + paperclip: { + "capabilities": [ + "agents/lifecycle", + "agents/instructions" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Production configuration panels in a locally composed settings shell; full AgentDetail route parity remains unreviewed." + }, }, argTypes: { initialTab: { diff --git a/ui/storybook/stories/agents/built-in-agents.stories.tsx b/ui/storybook/stories/agents/built-in-agents.stories.tsx index 9364b3fd3ab..16547287dc9 100644 --- a/ui/storybook/stories/agents/built-in-agents.stories.tsx +++ b/ui/storybook/stories/agents/built-in-agents.stories.tsx @@ -113,7 +113,15 @@ function SectionLabel({ children }: { children: React.ReactNode }) { const meta: Meta = { id: "product-built-in-agents", title: "Agents and reusable capabilities/Hiring, configuration, and organization/Product/Built-in Agents", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "agents/built-in" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/agents/external-agent-invite/components.stories.tsx b/ui/storybook/stories/agents/external-agent-invite/components.stories.tsx index 6e08aaa085e..cb0e18e9f75 100644 --- a/ui/storybook/stories/agents/external-agent-invite/components.stories.tsx +++ b/ui/storybook/stories/agents/external-agent-invite/components.stories.tsx @@ -6,7 +6,16 @@ const meta = { id: "onboarding-external-agent-invitation-components", title: "Agents and reusable capabilities/Hiring, configuration, and organization/Onboarding/External agent invitation/Components", component: DotConnectionChecks, - parameters: { layout: "centered", docs: { description: { component: "Controlled presentation states. Connection checks must be driven by server evidence. Subscription verification alone must never mark the connection ready." } } }, + parameters: { layout: "centered", docs: { description: { component: "Controlled presentation states. Connection checks must be driven by server evidence. Subscription verification alone must never mark the connection ready." } }, + paperclip: { + "capabilities": [ + "agents/hire", + "access/invitations" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, decorators: [Story =>
], } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx b/ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx index 31d87021728..67497f65697 100644 --- a/ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx +++ b/ui/storybook/stories/agents/external-agent-invite/journeys.stories.tsx @@ -10,6 +10,14 @@ const meta = { layout: "fullscreen", initialEntries: ["/PAP/agents"], docs: { description: { component: "Live invite flow using shared UI in the production app shell. Start at Invite an external agent, choose Dot, then copy the prompt. Storybook simulates each connection check after copying; no plugin, invitation, subscription, or cloud job is created. Hermes and Other use the existing external-agent prompt verbatim. The live self-hosted setup renews expired prompts and sends the event test automatically. Refresh the story to replay." } }, + paperclip: { + "capabilities": [ + "agents/hire", + "access/invitations" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, render: args => , } satisfies Meta; diff --git a/ui/storybook/stories/agents/new-agent-onboarding.stories.tsx b/ui/storybook/stories/agents/new-agent-onboarding.stories.tsx index 0c7c0a963d4..6a5221a7dca 100644 --- a/ui/storybook/stories/agents/new-agent-onboarding.stories.tsx +++ b/ui/storybook/stories/agents/new-agent-onboarding.stories.tsx @@ -9,6 +9,16 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design prototype: name → adapter → simulated creation → connection → configuration → confirmation. Each screen is directly inspectable below. All state is local to the story; subscription and API-key connections are simulated, and actual hiring is deferred. Use Start over to replay. The adapter and runner are fixed after creation." } }, + paperclip: { + "capabilities": [ + "agents/hire" + ], + "status": "historical", + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Retained local wizard predates production ui/src/components/new-agent flow; shared fields do not make the wizard current.", + "replacement": "ui/storybook/stories/agents/agent-persona-pages.stories.tsx" + }, }, argTypes: { testOutcome: { control: "select", options: ["pass", "fail"] }, diff --git a/ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx b/ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx index 851d249fe76..f064e752304 100644 --- a/ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/00-review-guide.stories.tsx @@ -51,5 +51,16 @@ function ReviewGuide() { ; } export default { id: "primary-agent-00-review-guide", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide", parameters: { layout: "fullscreen" }, render: () => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/00 Review guide", parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "guide", + "boundary": "static", + "notes": "Review guide retained; explanatory content does not establish runtime or production coverage. 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. 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." + }, + }, render: () => } satisfies Meta; export const StartHere: StoryObj = {}; diff --git a/ui/storybook/stories/agents/primary-agent/01-components.stories.tsx b/ui/storybook/stories/agents/primary-agent/01-components.stories.tsx index 20aad95c2f9..0fb15d37643 100644 --- a/ui/storybook/stories/agents/primary-agent/01-components.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/01-components.stories.tsx @@ -12,7 +12,16 @@ function Components(_args: PrimaryScenario) { ; } export default { id: "primary-agent-01-components", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components", component: Components, decorators: [primaryDecorator], parameters: primaryParameters, args: { primaryName: "Maia" }, render: args => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/01 Components", component: Components, decorators: [primaryDecorator], parameters: { ...primaryParameters, paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + } }, args: { primaryName: "Maia" }, render: args => } satisfies Meta; type Story = StoryObj; export const CrownIndicator: Story = {}; export const NoPrimary: Story = { args: { primaryId: null } }; diff --git a/ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx b/ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx index ca5b0d1056c..3c9702726f8 100644 --- a/ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/02-sidebar.stories.tsx @@ -3,7 +3,16 @@ import { userEvent, within } from "storybook/test"; import { PrimaryPage, mobile, primaryDecorator, primaryParameters } from "../../../support/primary-agent/PrimaryAgentStory"; export default { id: "primary-agent-02-sidebar", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar", decorators: [primaryDecorator], parameters: primaryParameters, args: { primaryName: "Maia" }, argTypes: { primaryName: { control: "text" } }, render: () => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/02 Sidebar", decorators: [primaryDecorator], parameters: { ...primaryParameters, paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + } }, args: { primaryName: "Maia" }, argTypes: { primaryName: { control: "text" } }, render: () => } satisfies Meta; type Story = StoryObj; export const IdlePrimary: Story = {}; export const ActiveColleague: Story = { parameters: { primaryAgent: { active: true } } }; diff --git a/ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx b/ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx index 17ae07fb2bc..33435caaa07 100644 --- a/ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/03-agents.stories.tsx @@ -2,7 +2,16 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { PrimaryPage, mobile, primaryDecorator, primaryParameters } from "../../../support/primary-agent/PrimaryAgentStory"; export default { id: "primary-agent-03-agents", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents", decorators: [primaryDecorator], parameters: primaryParameters, args: { primaryName: "Maia" }, argTypes: { primaryName: { control: "text" } }, render: () => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/03 Agents", decorators: [primaryDecorator], parameters: { ...primaryParameters, paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + } }, args: { primaryName: "Maia" }, argTypes: { primaryName: { control: "text" } }, render: () => } satisfies Meta; type Story = StoryObj; export const Roster: Story = {}; export const Profile: Story = { parameters: { initialEntries: ["/PAP/agents/maia"] } }; diff --git a/ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx b/ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx index e3d78f4d0a4..772220e7c06 100644 --- a/ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/04-new-task.stories.tsx @@ -2,7 +2,16 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { PrimaryPage, mobile, primaryDecorator, primaryParameters } from "../../../support/primary-agent/PrimaryAgentStory"; export default { id: "primary-agent-04-new-task", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task", decorators: [primaryDecorator], parameters: primaryParameters, render: () => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/04 New task", decorators: [primaryDecorator], parameters: { ...primaryParameters, paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + } }, render: () => } satisfies Meta; type Story = StoryObj; export const PrimaryFallback: Story = {}; export const RecentSpecialistWins: Story = { parameters: { primaryAgent: { recentAssignee: true } }, render: () => }; diff --git a/ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx b/ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx index e487734f4dd..d18518e41b8 100644 --- a/ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/05-chat.stories.tsx @@ -2,7 +2,18 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { PrimaryPage, mobile, primaryDecorator, primaryParameters } from "../../../support/primary-agent/PrimaryAgentStory"; export default { id: "primary-agent-05-chat", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat", decorators: [primaryDecorator], parameters: { ...primaryParameters, initialEntries: ["/PAP/chats"] }, render: () => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/05 Chat", decorators: [primaryDecorator], parameters: { ...primaryParameters, initialEntries: ["/PAP/chats"], + paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + }, + }, render: () => } satisfies Meta; type Story = StoryObj; export const PrimaryFallback: Story = {}; export const RecentConversationWins: Story = { parameters: { primaryAgent: { recentChat: true } } }; diff --git a/ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx b/ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx index c4496e5118e..5f495997ea2 100644 --- a/ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/06-journeys.stories.tsx @@ -12,7 +12,18 @@ async function openActions(canvasElement: HTMLElement, name: string, profile = f } const maiaProfile = { initialEntries: ["/PAP/agents/maia"] }; export default { id: "primary-agent-06-journeys", - title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys", decorators: [primaryDecorator], parameters: { ...primaryParameters, initialEntries: ["/PAP/agents/alex"] }, render: () => } satisfies Meta; + title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/06 Journeys", decorators: [primaryDecorator], parameters: { ...primaryParameters, initialEntries: ["/PAP/agents/alex"], + paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + }, + }, render: () => } satisfies Meta; type Story = StoryObj; async function confirmPrimaryChange(canvasElement: HTMLElement) { const page = within(canvasElement.ownerDocument.body); diff --git a/ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx b/ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx index be3e59897d7..70731cd3fd0 100644 --- a/ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx +++ b/ui/storybook/stories/agents/primary-agent/07-confirmation.stories.tsx @@ -6,7 +6,18 @@ export default { id: "primary-agent-07-confirmation", title: "Agents and reusable capabilities/Hiring, configuration, and organization/Primary Agent/07 Confirmation", decorators: [primaryDecorator], - parameters: { ...primaryParameters, initialEntries: ["/PAP/agents/alex"] }, + parameters: { ...primaryParameters, initialEntries: ["/PAP/agents/alex"], + paperclip: { + "capabilities": [ + "agents/primary-agent", + "tasks/create", + "agent-chat/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + }, + }, render: () => , } satisfies Meta; type Story = StoryObj; diff --git a/ui/storybook/stories/agents/summary-slot-card.stories.tsx b/ui/storybook/stories/agents/summary-slot-card.stories.tsx index 2742160f79b..6bf6bc00255 100644 --- a/ui/storybook/stories/agents/summary-slot-card.stories.tsx +++ b/ui/storybook/stories/agents/summary-slot-card.stories.tsx @@ -328,7 +328,15 @@ const meta: Meta = { id: "summaries-summaryslotcard", title: "Agents and reusable capabilities/Hiring, configuration, and organization/Summaries/SummarySlotCard", component: CardHarness, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "agents/built-in" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/app-permissions/action-card.stories.tsx b/ui/storybook/stories/app-permissions/action-card.stories.tsx index 5222edf27ef..70b50e6b14e 100644 --- a/ui/storybook/stories/app-permissions/action-card.stories.tsx +++ b/ui/storybook/stories/app-permissions/action-card.stories.tsx @@ -21,6 +21,14 @@ const baseProps = { }; const meta: Meta = { + parameters: { paperclip: { + "capabilities": [ + "app-permissions/test-action", + "app-permissions/action-policy" + ], + "implementation": "production", + "boundary": "fixtures" + } }, id: "tools-access-actioncard", title: "Apps, channels, and extensions/App access and action permissions/Tools & Access/ActionCard", component: ActionCard, diff --git a/ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx b/ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx index 235a8fde921..13fa5c0c260 100644 --- a/ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx +++ b/ui/storybook/stories/app-permissions/action-permissions-test.stories.tsx @@ -179,7 +179,16 @@ function PermissionsTestStory({ result, tool = TOOL, appName = "Asana", query }: const meta = { id: "apps-action-permissions-test", title: "Apps, channels, and extensions/App access and action permissions/Apps/Action permissions test", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "app-permissions/test-action", + "app-permissions/action-policy" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx b/ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx index 7fffdf2e6ef..fcc33ed9b4d 100644 --- a/ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx +++ b/ui/storybook/stories/app-permissions/apps-managed-accounts.stories.tsx @@ -1,7 +1,17 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { ManagedAggregatorAccounts } from "../../prototypes/ManagedAggregatorAccounts"; const meta = { id: "apps-managed-accounts", - title: "Apps, channels, and extensions/App access and action permissions/Apps/Managed accounts", component: ManagedAggregatorAccounts, parameters: { layout: "fullscreen", docs: { description: { component: "Production Apps page using production API routes and a disposable PostgreSQL database. Upstream Arcade, Composio and Executor responses are fixtures. Start tests/aggregator-accounts/test-drive.ts, then use the upstream controls and each gateway’s Refresh action." } } } } satisfies Meta; + title: "Apps, channels, and extensions/App access and action permissions/Apps/Managed accounts", component: ManagedAggregatorAccounts, parameters: { layout: "fullscreen", docs: { description: { component: "Production Apps page using production API routes and a disposable PostgreSQL database. Upstream Arcade, Composio and Executor responses are fixtures. Start tests/aggregator-accounts/test-drive.ts, then use the upstream controls and each gateway’s Refresh action." } }, + paperclip: { + "capabilities": [ + "app-permissions/account-maintenance" + ], + "status": "current", + "implementation": "production", + "boundary": "fixture-server", + "notes": "Production Browse requires owned tests/aggregator-accounts/test-drive.ts on localhost:4310; providers are simulated. Not an offline story." + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const FullStackTestDrive: Story = {}; diff --git a/ui/storybook/stories/app-permissions/catalog-review.stories.tsx b/ui/storybook/stories/app-permissions/catalog-review.stories.tsx index 4e14c58d30d..3cfd23c37ee 100644 --- a/ui/storybook/stories/app-permissions/catalog-review.stories.tsx +++ b/ui/storybook/stories/app-permissions/catalog-review.stories.tsx @@ -84,6 +84,15 @@ const meta = { "Shipped action section and quarantine reviewer with local catalog props. Discovery failures belong to the owning AppDetail API boundary; permissions and review persistence need production checks.", }, }, + paperclip: { + "capabilities": [ + "app-permissions/catalog-change" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx b/ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx index 07bb33c8104..069c91517d5 100644 --- a/ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx +++ b/ui/storybook/stories/app-permissions/permitted-vs-installed.stories.tsx @@ -124,7 +124,16 @@ function connection(id: string, name: string, installs: InstallState): ToolConne const meta: Meta = { id: "tools-permitted-vs-installed", title: "Apps, channels, and extensions/App access and action permissions/Tools/Permitted vs Installed", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "app-permissions/agent-access", + "app-permissions/action-policy" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/budgets-costs/budget-finance.stories.tsx b/ui/storybook/stories/budgets-costs/budget-finance.stories.tsx index df59337d580..b30069403c9 100644 --- a/ui/storybook/stories/budgets-costs/budget-finance.stories.tsx +++ b/ui/storybook/stories/budgets-costs/budget-finance.stories.tsx @@ -775,6 +775,16 @@ const meta = { "Budget and finance stories cover incident resolution states, sidebar markers, provider and biller quotas, finance ledgers, and Claude/Codex subscription panels.", }, }, + paperclip: { + "capabilities": [ + "budgets-costs/cost-reporting", + "budgets-costs/budgets", + "budgets-costs/incidents" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx b/ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx index b7b272acbf9..cd09f7a1249 100644 --- a/ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx +++ b/ui/storybook/stories/budgets-costs/budget-resolution.stories.tsx @@ -38,7 +38,17 @@ const meta = { title: "Oversight and operation/Costs and budgets/Resolve a budget incident", component: BudgetHost, args: { embedded: true, initialTab: "budgets", lockTab: true }, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "budgets-costs/resolution" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { currentIncident = { ...incident }; return prepareFixtureApi( diff --git a/ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx b/ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx index 6d55bb84345..5c894325c8b 100644 --- a/ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx +++ b/ui/storybook/stories/budgets-costs/costs/subscriptions.stories.tsx @@ -103,7 +103,16 @@ function SubscriptionCostsStory({ unknownPrice = false, stale = false, costGaps const meta = { id: "costs-subscriptions", title: "Oversight and operation/Costs and budgets/Costs/Subscriptions", component: SubscriptionCostsStory, parameters: { layout: "padded", docs: { description: { component: "Production Costs page with API spend, monthly subscription estimates, user and project costs. View details to edit monthly or annual prices. Provider calls are fixtures." } }, -} } satisfies Meta; + paperclip: { + "capabilities": [ + "budgets-costs/cost-reporting", + "budgets-costs/budgets" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "The upstream budget UI distinguishes soft warnings from hard stops; hard incidents retain raise-and-resume and keep-paused controls." + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const Overview: Story = { play: async ({ canvasElement }) => { diff --git a/ui/storybook/stories/cases/case-browse.stories.tsx b/ui/storybook/stories/cases/case-browse.stories.tsx index d455deec822..0f9181968b3 100644 --- a/ui/storybook/stories/cases/case-browse.stories.tsx +++ b/ui/storybook/stories/cases/case-browse.stories.tsx @@ -7,7 +7,17 @@ const meta = { id: "feature-case-browse", title: "Automation and structured work/Cases/Browse and hierarchy", component: Cases, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "cases/browse" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { const key = "paperclip:cases:company-storybook:view"; const previous = localStorage.getItem(key); diff --git a/ui/storybook/stories/cases/case-detail.stories.tsx b/ui/storybook/stories/cases/case-detail.stories.tsx index d789ca7a1c2..0bc572a48bb 100644 --- a/ui/storybook/stories/cases/case-detail.stories.tsx +++ b/ui/storybook/stories/cases/case-detail.stories.tsx @@ -25,7 +25,19 @@ const meta = { title: "Automation and structured work/Cases/Structure, history and task links", component: CaseDetailHost, - parameters: { layout: "padded", initialEntries: ["/PAP/cases/PAP-C42"] }, + parameters: { layout: "padded", initialEntries: ["/PAP/cases/PAP-C42"], + paperclip: { + "capabilities": [ + "cases/structure", + "cases/history", + "cases/task-links" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "CaseDetail hierarchy and activity, CaseFieldsPanel arbitrary/empty data and IssueCasesPanel reverse links. Fixture relations/events; document revision history and persisted links remain production obligations." + }, + }, beforeEach: ({ parameters }) => { const cleanup = installCaseFixtures( parameters.fixtureState as FixtureState, diff --git a/ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx b/ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx index 0542a1c4bfc..ffd82139ec1 100644 --- a/ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx +++ b/ui/storybook/stories/chat-channels/agentmail-onboarding.stories.tsx @@ -43,7 +43,16 @@ const meta = { id: "connections-agentmail-setup", title: "Apps, channels, and extensions/External chat and email/Connections/AgentMail setup", component: AgentMailJourney, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "chat-channels/providers", + "connection-setup/channel-setup" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { savedConnection: true }, beforeEach(context) { const scenario = (context.parameters.agentmailScenario ?? {}) as Scenario; diff --git a/ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx b/ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx index cb992253cab..2a67b4222a3 100644 --- a/ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx +++ b/ui/storybook/stories/chat-channels/agentmail-settings.stories.tsx @@ -9,7 +9,16 @@ const meta = { id: "connections-agentmail-settings", title: "Apps, channels, and extensions/External chat and email/Connections/AgentMail settings", component: EmailEndpointSettings, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "chat-channels/lifecycle" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Task-workspace reconciliation: EmailEndpointSettings remains the mounted inbox subsection. The surrounding ChatEndpointDetail connection-default editor and its save/inheritance behavior are not represented here." + }, + }, args: { endpointId: ENDPOINT, companyId: COMPANY, assignedAgentName: "Ralph" }, beforeEach(context) { let inbox: EmailEndpointSummary = { diff --git a/ui/storybook/stories/chat-channels/agentmail.stories.tsx b/ui/storybook/stories/chat-channels/agentmail.stories.tsx index 0089529b4db..ddf1734d506 100644 --- a/ui/storybook/stories/chat-channels/agentmail.stories.tsx +++ b/ui/storybook/stories/chat-channels/agentmail.stories.tsx @@ -548,7 +548,16 @@ const meta = { id: "connections-agentmail-tasks", title: "Apps, channels, and extensions/External chat and email/Connections/AgentMail tasks", component: EmailTaskExperience, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "chat-channels/conversation" + ], + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Local EmailTaskExperience combines production composer/bubbles with simulated email lifecycle; compare against IssueDetail before claiming page parity." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/chat-channels/channel-attachments.stories.tsx b/ui/storybook/stories/chat-channels/channel-attachments.stories.tsx index 3452549d93e..c4f697e75d1 100644 --- a/ui/storybook/stories/chat-channels/channel-attachments.stories.tsx +++ b/ui/storybook/stories/chat-channels/channel-attachments.stories.tsx @@ -43,6 +43,15 @@ const meta = { "Production task bubble with the saved attachment receipt and channel attribution. Provider upload, delivery, download authority and replay require production tests.", }, }, + paperclip: { + "capabilities": [ + "chat-channels/attachments" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx b/ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx index dc1793dd292..95d6656ccc6 100644 --- a/ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx +++ b/ui/storybook/stories/chat-channels/chat-connection-actions.stories.tsx @@ -13,7 +13,15 @@ const meta = { id: "connections-chat-connection-actions", title: "Apps, channels, and extensions/External chat and email/Connections/Chat connection actions", component: ConnectorCard, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "chat-channels/providers" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { row: { key: "slack", slug: "slack", name: "Slack", brandKey: "slack", diff --git a/ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx b/ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx index ef07eb50408..172b46d6a77 100644 --- a/ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx +++ b/ui/storybook/stories/chat-channels/chat-management/chat-management.stories.tsx @@ -114,7 +114,18 @@ const meta = { id: "connections-chat-management", title: "Apps, channels, and extensions/External chat and email/Connections/Chat management", component: ChatManagementPage, - parameters: { layout: "fullscreen", a11y: { test: "off" } }, + parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "chat-channels/lifecycle", + "chat-channels/identity", + "chat-channels/conversation" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + }, + }, args: { tab: "settings", scenario: "populated" }, argTypes: { tab: { control: "select", options: ["settings", "access", "conversations"] }, scenario: { control: "select", options: ["populated", "empty", "error", "channel-added"] } }, } satisfies Meta; diff --git a/ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx b/ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx index 442423df956..e03344abd8f 100644 --- a/ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx +++ b/ui/storybook/stories/chat-channels/github-bot-management/management.stories.tsx @@ -47,6 +47,15 @@ const meta = { "Production pages and components. Start with **01 Journey / Settings**, then use the actual contextual sidebar to visit Access, Reviews, and Conversations. Try editing instructions, switch tabs, and save or discard the shared draft. **01 Journey / Connected** opens the production confirmation modal over the same bot Settings. Close it with Done, the ×, or Escape and continue editing Settings. **02 States** covers empty, loading, recoverable error, long content, and mobile. **03 Components** isolates the policy editor, people access, repository access, review rows and detail, pending review, and conversations. Provider operations use isolated fixture APIs; these stories are not live GitHub evidence.", }, }, + paperclip: { + "capabilities": [ + "chat-channels/providers", + "chat-channels/conversation" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. Inspected channel task-default controls, optional API fields, avatar rendering and matching fixture updates; live defaults inheritance and permission checks remain outside these stories." + }, }, args: { state: "populated" as FixtureState }, argTypes: { diff --git a/ui/storybook/stories/chat-channels/github-chat.stories.tsx b/ui/storybook/stories/chat-channels/github-chat.stories.tsx index b32fb9383d8..6e0bac9779c 100644 --- a/ui/storybook/stories/chat-channels/github-chat.stories.tsx +++ b/ui/storybook/stories/chat-channels/github-chat.stories.tsx @@ -14,6 +14,17 @@ const meta = { "Historical design prototype. Production onboarding now has Choose agent and Connect GitHub, with personal or organization App ownership and automatic completion. This historical prototype predates the wizard and is not its acceptance test. Use the running app to review the current setup flow. Provider handoffs, tool checks, identity events, tasks, and reviews here are simulated.", }, }, + paperclip: { + "capabilities": [ + "chat-channels/providers", + "chat-channels/conversation" + ], + "status": "historical", + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Historical wizard retained for original setup/access/review design; current GitHub setup is ui/src/pages/apps/chat/GitHubChatSetup.tsx.", + "replacement": "ui/storybook/stories/chat-channels/github-connections.stories.tsx" + }, }, tags: ["autodocs"], } satisfies Meta; diff --git a/ui/storybook/stories/chat-channels/github-connections.stories.tsx b/ui/storybook/stories/chat-channels/github-connections.stories.tsx index a176546e78d..6406ba31f56 100644 --- a/ui/storybook/stories/chat-channels/github-connections.stories.tsx +++ b/ui/storybook/stories/chat-channels/github-connections.stories.tsx @@ -87,6 +87,14 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "Production catalog cards and setup pages with local API query fixtures. GitHub opens account/tool access; GitHub Code Review Bot opens Choose agent. These stories cover discovery and entry into setup, without live GitHub consent or app installation." } }, + paperclip: { + "capabilities": [ + "chat-channels/providers", + "connection-setup/channel-setup" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/chat-channels/imessage-photon.stories.tsx b/ui/storybook/stories/chat-channels/imessage-photon.stories.tsx index 00c7b2c4621..1912b7a5082 100644 --- a/ui/storybook/stories/chat-channels/imessage-photon.stories.tsx +++ b/ui/storybook/stories/chat-channels/imessage-photon.stories.tsx @@ -98,7 +98,21 @@ function Host(props: { screen?: Screen }) { const meta = { id: "connections-imessage-photon", title: "Apps, channels, and extensions/External chat and email/Connections/iMessage Photon", component: Host, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "chat-channels/conversation", + "chat-channels/providers", + "chat-channels/identity", + "chat-channels/lifecycle", + "connection-setup/channel-setup", + "connection-setup/failure" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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. 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." + }, + }, beforeEach: ({ parameters }) => { const scenario = (parameters.photonScenario ?? {}) as Scenario; resetFixture(scenario); diff --git a/ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx b/ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx index 813937e17b7..6fc78465ccb 100644 --- a/ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx +++ b/ui/storybook/stories/chat-channels/slack-automatic-setup.stories.tsx @@ -8,7 +8,16 @@ const meta = { title: "Apps, channels, and extensions/External chat and email/Connections/Slack/Automatic setup", component: SlackSetupFixture, parameters: { layout: "fullscreen", initialEntries: [`${start}&resume=slack-story`], - docs: { description: { component: "Production Slack setup pages in journey order. Automatic stories use the same four-step wizard; manual setup retains account linking. Slack creation, consent, verification, and identity discovery are simulated; use synthetic tokens only." } } }, + docs: { description: { component: "Production Slack setup pages in journey order. Automatic stories use the same four-step wizard; manual setup retains account linking. Slack creation, consent, verification, and identity discovery are simulated; use synthetic tokens only." } }, + paperclip: { + "capabilities": [ + "chat-channels/providers", + "connection-setup/channel-setup" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, render: args => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx b/ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx index 011d9367cf9..88d5b7f1f20 100644 --- a/ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx +++ b/ui/storybook/stories/chat-channels/slack-avatar-settings.stories.tsx @@ -12,6 +12,14 @@ const meta = { "The production avatar section in a Settings layout fixture. Download remains available after onboarding; upload instructions expand in place.", }, }, + paperclip: { + "capabilities": [ + "chat-channels/identity" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx b/ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx index 7e6d39a63dc..2ad767ceace 100644 --- a/ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx +++ b/ui/storybook/stories/chat-channels/slack-communication-settings.stories.tsx @@ -6,7 +6,16 @@ const meta = { id: "connections-slack-communication-in-settings", title: "Apps, channels, and extensions/External chat and email/Connections/Slack/Communication in Settings", component: SlackAvatarSettingsPreview, - parameters: { layout: "fullscreen", docs: { description: { component: "Production communication field in a Settings fixture. Saves use local story state; instructions apply to new tasks. Reply detail and progress are built-in behavior." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Production communication field in a Settings fixture. Saves use local story state; instructions apply to new tasks. Reply detail and progress are built-in behavior." } }, + paperclip: { + "capabilities": [ + "chat-channels/identity" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx b/ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx index 5af30cc73ad..21bc1276b00 100644 --- a/ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx +++ b/ui/storybook/stories/chat-channels/slack-managed-setup.stories.tsx @@ -7,7 +7,16 @@ const meta = { id: "connections-slack-managed-setup", title: "Apps, channels, and extensions/External chat and email/Connections/Slack/Managed setup", component: SlackSetupFixture, args: { managed: true }, - parameters: { layout: "fullscreen", initialEntries: [`${start}&resume=slack-story`] }, + parameters: { layout: "fullscreen", initialEntries: [`${start}&resume=slack-story`], + paperclip: { + "capabilities": [ + "chat-channels/providers", + "connection-setup/channel-setup" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, render: args => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/chat-channels/slack-tools.stories.tsx b/ui/storybook/stories/chat-channels/slack-tools.stories.tsx index c5eba3392a2..a4b7c4e533f 100644 --- a/ui/storybook/stories/chat-channels/slack-tools.stories.tsx +++ b/ui/storybook/stories/chat-channels/slack-tools.stories.tsx @@ -55,7 +55,15 @@ export default { id: "connections-slack-task-tools", title: "Apps, channels, and extensions/External chat and email/Connections/Slack/Task tools", component: Preview, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "chat-channels/conversation" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; type Story = StoryObj; export const Capabilities: Story = {}; diff --git a/ui/storybook/stories/companies/company-import.stories.tsx b/ui/storybook/stories/companies/company-import.stories.tsx index 2a71d23d3c5..6bb67c11c6b 100644 --- a/ui/storybook/stories/companies/company-import.stories.tsx +++ b/ui/storybook/stories/companies/company-import.stories.tsx @@ -52,7 +52,17 @@ const meta = { id: "feature-company-import", title: "Getting started and access/Companies and portability/Import preview", component: CompanyImport, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "companies/portability" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => prepareFixtureApi( [ diff --git a/ui/storybook/stories/companies/company-selection.stories.tsx b/ui/storybook/stories/companies/company-selection.stories.tsx index 539bd8fa154..df2573ee357 100644 --- a/ui/storybook/stories/companies/company-selection.stories.tsx +++ b/ui/storybook/stories/companies/company-selection.stories.tsx @@ -11,7 +11,18 @@ const meta = { title: "Getting started and access/Companies and portability/Selection and archived organizations", component: Companies, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "companies/selection", + "companies/archive" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { let companies = parameters.fixtureState === "empty" diff --git a/ui/storybook/stories/companies/decision-models/01-settings.stories.tsx b/ui/storybook/stories/companies/decision-models/01-settings.stories.tsx index f29a32edc68..33c1b817a3b 100644 --- a/ui/storybook/stories/companies/decision-models/01-settings.stories.tsx +++ b/ui/storybook/stories/companies/decision-models/01-settings.stories.tsx @@ -3,7 +3,17 @@ import { fn } from "storybook/test"; import { DecisionModelSettingsView } from "@/components/decision-models/DecisionModelSettings"; import { choices, configured, result, unconfigured } from "../../../support/decision-models/fixtures"; -const meta = { id: "decision-models-01-settings", +const meta = { + parameters: { paperclip: { + "capabilities": [ + "companies/identity", + "budgets-costs/cost-reporting", + "companies/decision-models" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + } }, id: "decision-models-01-settings", title: "Getting started and access/Companies and portability/Decision models/01 Settings", component: DecisionModelSettingsView, decorators: [Story =>
], args: { settings: configured, choices, onSave: fn(), onTest: fn(), onAdd: fn() }, diff --git a/ui/storybook/stories/companies/decision-models/02-history.stories.tsx b/ui/storybook/stories/companies/decision-models/02-history.stories.tsx index 5380d559d76..9d1cda63852 100644 --- a/ui/storybook/stories/companies/decision-models/02-history.stories.tsx +++ b/ui/storybook/stories/companies/decision-models/02-history.stories.tsx @@ -2,7 +2,17 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { DecisionHistoryTable } from "@/components/decision-models/DecisionHistory"; import { entry } from "../../../support/decision-models/fixtures"; -const meta = { id: "decision-models-02-history", +const meta = { + parameters: { paperclip: { + "capabilities": [ + "companies/identity", + "budgets-costs/cost-reporting", + "companies/decision-models" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + } }, id: "decision-models-02-history", title: "Getting started and access/Companies and portability/Decision models/02 History", component: DecisionHistoryTable, decorators: [Story =>
], args: { entries: [entry] }, } satisfies Meta; diff --git a/ui/storybook/stories/companies/decision-models/03-journey.stories.tsx b/ui/storybook/stories/companies/decision-models/03-journey.stories.tsx index 2140d99c977..30fce407a74 100644 --- a/ui/storybook/stories/companies/decision-models/03-journey.stories.tsx +++ b/ui/storybook/stories/companies/decision-models/03-journey.stories.tsx @@ -71,7 +71,17 @@ function Journey({ alreadyConfigured = false }: { alreadyConfigured?: boolean }) const meta = { id: "decision-models-03-journey", title: "Getting started and access/Companies and portability/Decision models/03 Journey", component: Journey, parameters: { layout: "fullscreen", initialEntries: ["/PAP/company/settings"], docs: { story: { inline: false }, description: { component: "Select an existing shared connection, preserve the background setting, save, run the sample, and follow View usage. Paid calls are fixtures." } }, -} } satisfies Meta; + paperclip: { + "capabilities": [ + "companies/identity", + "budgets-costs/cost-reporting", + "companies/decision-models" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const SetupToHistory: Story = { play: async ({ canvasElement }) => { diff --git a/ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx b/ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx index e306ab47450..10d934f48f0 100644 --- a/ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx +++ b/ui/storybook/stories/companies/fast-responses/01-settings.stories.tsx @@ -36,6 +36,16 @@ export const result: FastResponseTestResult = { }, }; const meta = { + parameters: { paperclip: { + "capabilities": [ + "companies/identity", + "budgets-costs/cost-reporting", + "companies/fast-responses" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + } }, id: "fast-responses-01-settings", title: "Getting started and access/Companies and portability/Fast responses/01 Settings", excludeStories: ["empty", "configured", "result"], diff --git a/ui/storybook/stories/companies/fast-responses/02-history.stories.tsx b/ui/storybook/stories/companies/fast-responses/02-history.stories.tsx index e3880534fb4..53cb78b4fed 100644 --- a/ui/storybook/stories/companies/fast-responses/02-history.stories.tsx +++ b/ui/storybook/stories/companies/fast-responses/02-history.stories.tsx @@ -16,6 +16,17 @@ const receipt: FastResponseHistoryEntry = { costStatus: "reported", }; const meta = { + parameters: { paperclip: { + "capabilities": [ + "companies/identity", + "budgets-costs/cost-reporting", + "companies/fast-responses" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + } }, id: "fast-responses-02-history", title: "Getting started and access/Companies and portability/Fast responses/02 History", component: DecisionHistoryTable, diff --git a/ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx b/ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx index 218ef2d7f97..1f5c148edd7 100644 --- a/ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx +++ b/ui/storybook/stories/connection-setup/AppLogoRegistry.stories.tsx @@ -32,7 +32,15 @@ function Registry() { } const meta = { id: "apps-canonical-icon-registry", - title: "Apps, channels, and extensions/Connection setup/Apps/Canonical icon registry", component: Registry, parameters: { layout: "fullscreen" } } satisfies Meta; + title: "Apps, channels, and extensions/Connection setup/Apps/Canonical icon registry", component: Registry, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/catalog" + ], + "implementation": "production", + "boundary": "fixtures" + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const Light: Story = { globals: { theme: "light" } }; diff --git a/ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx b/ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx index 15186c52ec4..6d3be1a2e14 100644 --- a/ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx +++ b/ui/storybook/stories/connection-setup/ArcadeConnection.stories.tsx @@ -7,7 +7,21 @@ const meta = { title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Arcade", component: RemoteMcpConnectionReview, args: { provider: "arcade", scenario: "journey" }, - parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "connection-setup/failure", + "connection-setup/draft-recovery", + "connection-setup/identity-and-access", + "app-permissions/action-policy", + "app-permissions/test-action" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, argTypes: { provider: { control: false } }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx b/ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx index 1919775505b..71b56890e43 100644 --- a/ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx +++ b/ui/storybook/stories/connection-setup/ComposioConnection.stories.tsx @@ -7,7 +7,21 @@ const meta = { title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Composio", component: RemoteMcpConnectionReview, args: { provider: "composio", scenario: "journey" }, - parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "connection-setup/failure", + "connection-setup/draft-recovery", + "connection-setup/identity-and-access", + "app-permissions/action-policy", + "app-permissions/test-action" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, argTypes: { provider: { control: false } }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx b/ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx index 4257a9628b1..e64af28e0e8 100644 --- a/ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx +++ b/ui/storybook/stories/connection-setup/ConnectionProviderChoice.stories.tsx @@ -112,7 +112,15 @@ const meta = { id: "apps-connections-provider-choice", title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Provider choice", component: ProviderChoice, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/identity-and-access" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx b/ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx index 4390599ef1a..54d215e1724 100644 --- a/ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx +++ b/ui/storybook/stories/connection-setup/ExecutorConnection.stories.tsx @@ -7,7 +7,21 @@ const meta = { title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Executor", component: RemoteMcpConnectionReview, args: { provider: "executor", scenario: "journey" }, - parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "connection-setup/failure", + "connection-setup/draft-recovery", + "connection-setup/identity-and-access", + "app-permissions/action-policy", + "app-permissions/test-action" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, argTypes: { provider: { control: false } }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx b/ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx index bb2d43cb3d0..608d959b941 100644 --- a/ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx +++ b/ui/storybook/stories/connection-setup/ZapierConnection.stories.tsx @@ -6,7 +6,21 @@ const meta = { title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Zapier", component: RemoteMcpConnectionReview, args: { provider: "zapier", scenario: "journey" }, - parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Interactive design review using application views with in-memory provider responses. No real authentication, tool calls, or credential persistence. Representative catalogs are examples; production discovery supplies the actual tools." } }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "connection-setup/failure", + "connection-setup/draft-recovery", + "connection-setup/identity-and-access", + "app-permissions/action-policy", + "app-permissions/test-action" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, argTypes: { provider: { control: false } }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx b/ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx index ac6538d07c6..9080c59ef60 100644 --- a/ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx +++ b/ui/storybook/stories/connection-setup/agent-setup-prompt.stories.tsx @@ -29,6 +29,14 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "A reusable handoff to an agent. Hover or focus to fan out the logos, click once to copy the prompt and open its preview. Logos travel into the preview; clipboard success stays in place. Supports reduced motion, keyboard dismissal, and manual copying when clipboard access fails. The default story copies the complete production Slack setup prompt." } }, + paperclip: { + "capabilities": [ + "connection-setup/channel-setup", + "gateways-profiles/client-connect" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, args: { prompt: slackPrompt, diff --git a/ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx b/ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx index 243d44d550d..5e0d7cdac8a 100644 --- a/ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx +++ b/ui/storybook/stories/connection-setup/apps-catalog-source-selection.stories.tsx @@ -9,6 +9,15 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "Focused chip navigation: Paperclip, Composio, Arcade, Installed, and All. Connected accounts remain above the paginated catalog. Uses shipped connection cards, public catalogs with native duplicates omitted, and sample saved accounts. No account authorization or mutations." } }, + paperclip: { + "capabilities": [ + "connection-setup/catalog" + ], + "status": "proposed", + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Local catalog composition uses shipped cards and filters; retains design exploration purpose, not acceptance of the Apps route." + }, }, argTypes: { initialSource: { control: "select", options: ["paperclip", "composio", "arcade", "installed", "all"] }, diff --git a/ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx b/ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx index a0221b3cb15..f4d4a480b0d 100644 --- a/ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx +++ b/ui/storybook/stories/connection-setup/apps-connect-discoverability.stories.tsx @@ -60,7 +60,15 @@ function PasteConfigHost() { const meta: Meta = { id: "apps-connect-discoverability-pap-11091", title: "Apps, channels, and extensions/Connection setup/Apps/Connect discoverability (PAP-11091)", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/catalog" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx b/ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx index 534ed375a32..4f5e605d087 100644 --- a/ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx +++ b/ui/storybook/stories/connection-setup/apps-connect-name.stories.tsx @@ -84,7 +84,15 @@ function KeyStepHost({ customName }: { customName?: string }) { const meta: Meta = { id: "apps-connect-name-at-create-time-pap-11283", title: "Apps, channels, and extensions/Connection setup/Apps/Connect name at create time (PAP-11283)", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/identity-and-access" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx b/ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx index f8be4abe552..eb1fd97dfb8 100644 --- a/ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx +++ b/ui/storybook/stories/connection-setup/browser-use-settings.stories.tsx @@ -38,6 +38,14 @@ const meta = { "Production credential settings: per-run spending cap, saved-profile access, multiple credentials, and loading/error/permission states. Saves and provider profiles are simulated; no credentials are present.", }, }, + paperclip: { + "capabilities": [ + "connection-setup/credentials" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, }, args: { connection, grants }, beforeEach: () => mockBrowserUse(), diff --git a/ui/storybook/stories/connection-setup/connection-instructions.stories.tsx b/ui/storybook/stories/connection-setup/connection-instructions.stories.tsx index 77bb5d0c59c..0f845c860d4 100644 --- a/ui/storybook/stories/connection-setup/connection-instructions.stories.tsx +++ b/ui/storybook/stories/connection-setup/connection-instructions.stories.tsx @@ -66,7 +66,16 @@ const meta = { title: "Apps, channels, and extensions/Connection setup/Design explorations/Connections/Agent instructions", component: ConnectionInstructionsPrototype, args: { providedInstructions: HONCHO }, - parameters: { layout: "fullscreen", docs: { description: { component: "Production Layout, ConnectionSetupFlow, AppDetail, identity/access controls, and searchable Actions list with local API fixtures. The production instructions editor saves and reloads through mocked APIs. Baseline stories omit template metadata. No provider calls." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Production Layout, ConnectionSetupFlow, AppDetail, identity/access controls, and searchable Actions list with local API fixtures. The production instructions editor saves and reloads through mocked APIs. Baseline stories omit template metadata. No provider calls." } }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "agents/instructions" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx b/ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx index b75fa183255..4eac578ddbf 100644 --- a/ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx +++ b/ui/storybook/stories/connection-setup/enterpret-connect-flow.stories.tsx @@ -235,6 +235,14 @@ const meta: Meta = { "Design review for the Enterpret catalog connector using production components and the real generated definition. Organization auth token is primary; its account-bound QA is required before release. Browser OAuth targets the same official read-only MCP; fresh live OAuth validation remains required. No real sign-in, token, or provider call.", }, }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "connection-setup/failure" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, }; export default meta; diff --git a/ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx b/ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx index c54e23d0f62..bf2c21eb5f0 100644 --- a/ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx +++ b/ui/storybook/stories/connection-setup/fireflies-pr.stories.tsx @@ -25,7 +25,16 @@ function Frame({ children }: { children: ReactNode }) { const meta = { id: "pr-reviews-fireflies-and-app-webhooks", title: "Apps, channels, and extensions/Connection setup/PR reviews/Fireflies and app webhooks", - parameters: { layout: "fullscreen", docs: { description: { component: "Coverage of PR #13890: Fireflies catalog/artwork and shared connection flow, preserved action permissions, generic webhook wizard and saved settings, and both advanced trigger editors. All network mutations are simulated. Use the toolbar to switch theme or viewport. Legacy stories only demonstrate resuming existing configurations; new webhooks use Another app or script." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Coverage of PR #13890: Fireflies catalog/artwork and shared connection flow, preserved action permissions, generic webhook wizard and saved settings, and both advanced trigger editors. All network mutations are simulated. Use the toolbar to switch theme or viewport. Legacy stories only demonstrate resuming existing configurations; new webhooks use Another app or script." } }, + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "routines/triggers" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, afterEach: ({ id }) => { document.body.dataset.firefliesStoryReady = id; }, beforeEach: () => { delete document.body.dataset.firefliesStoryReady; diff --git a/ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx b/ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx index ecd1ad3f3fd..6619ee44c5e 100644 --- a/ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx +++ b/ui/storybook/stories/connection-setup/in-feed-connections.stories.tsx @@ -39,7 +39,15 @@ type Scenario = { email?: boolean; access?: boolean; ai?: boolean; missingAiAcco const meta: Meta = { id: "connections-in-task-connections", title: "Apps, channels, and extensions/Connection setup/Connections/In-task connections", - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "connection-setup/task-request" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, afterEach: ({ id }) => { document.body.dataset.inFeedStoryReady = id; }, beforeEach: ({ parameters }) => { delete document.body.dataset.inFeedStoryReady; diff --git a/ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx b/ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx index 3f42764f63b..d429e3a462a 100644 --- a/ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx +++ b/ui/storybook/stories/connection-setup/managed-cloud-oauth-handoff.stories.tsx @@ -5,7 +5,15 @@ const meta: Meta = { id: "apps-managed-cloud-oauth-handoff", title: "Apps, channels, and extensions/Connection setup/Apps/Managed Cloud OAuth handoff", component: ManagedOAuthHandoffState, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/handoff" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { onRetry: () => undefined, onCancel: () => undefined, diff --git a/ui/storybook/stories/connection-setup/memory-connectors.stories.tsx b/ui/storybook/stories/connection-setup/memory-connectors.stories.tsx index 8585a9711c7..d73ac49d6bd 100644 --- a/ui/storybook/stories/connection-setup/memory-connectors.stories.tsx +++ b/ui/storybook/stories/connection-setup/memory-connectors.stories.tsx @@ -92,7 +92,16 @@ function MemoryReview({ provider = "mem0", scenario = "catalog" }: { provider?: ; } const meta = { id: "apps-connections-memory", - title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Memory", component: MemoryReview, parameters: { layout: "fullscreen" } } satisfies Meta; + title: "Apps, channels, and extensions/Connection setup/Apps/Connections/Memory", component: MemoryReview, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "agents/instructions" + ], + "implementation": "production", + "boundary": "fixtures" + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const CatalogAndSetup: Story = { args: { scenario: "catalog" } }; diff --git a/ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx b/ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx index 458c2a6c49c..2bdac06d89b 100644 --- a/ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx +++ b/ui/storybook/stories/connection-setup/notion-connect-flow.stories.tsx @@ -341,7 +341,16 @@ function VercelConnectProvenanceHost() { const meta: Meta = { id: "apps-notion-mcp-connect-flow-pap-16650", title: "Apps, channels, and extensions/Connection setup/Apps/Notion MCP connect flow (PAP-16650)", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/credentials", + "connection-setup/failure" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx b/ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx index 71619ea4e0c..a72b089dc0f 100644 --- a/ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx +++ b/ui/storybook/stories/connection-setup/personal-connection-identity.stories.tsx @@ -154,7 +154,15 @@ function IdentitiesHarness({ const meta: Meta = { id: "reviews-pap-17835-personal-connection-identity", title: "Apps, channels, and extensions/Connection setup/Reviews/PAP-17835 Personal connection identity", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "connection-setup/identity-and-access" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/developer-labs/ux-labs.stories.tsx b/ui/storybook/stories/developer-labs/ux-labs.stories.tsx index f72ae0db93c..ff54c65b39f 100644 --- a/ui/storybook/stories/developer-labs/ux-labs.stories.tsx +++ b/ui/storybook/stories/developer-labs/ux-labs.stories.tsx @@ -22,6 +22,13 @@ const meta = { "The former in-app UX test routes are represented here as Storybook stories so fixture-backed review surfaces stay out of production routing.", }, }, + paperclip: { + "capabilities": [ + "developer-labs/interaction-labs" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx index 91c6e0cda64..de1bee37ab4 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/commit.stories.tsx @@ -13,7 +13,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Commit", component: CommitCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, ...diffControls, diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx index 38842f75c12..7c565b4dca6 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/data.stories.tsx @@ -13,7 +13,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Data", component: DataCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, filename: textData("Filename used when downloading the data."), diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx index 968afbd5e5b..c6a4291c0a7 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/document.stories.tsx @@ -13,7 +13,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Document", component: DocumentCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, filename: textData("Actual document filename."), diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx index 5183567678d..370f75941ae 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/file.stories.tsx @@ -13,7 +13,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/File", component: FileCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, filename: textData("Original file name, also used for download."), diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx index 33efe33b3c5..d0af6416f17 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/image.stories.tsx @@ -14,7 +14,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Image", component: ImageCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, filename: textData("Original image filename."), diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx index baaa04c4994..c651c403fdc 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/link-preview.stories.tsx @@ -12,7 +12,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Link preview", component: LinkPreviewCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, url: textData( diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx index f992cfc6f07..0578592daee 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/pull-request.stories.tsx @@ -14,7 +14,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Pull request", component: PullRequestCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, ...diffControls, diff --git a/ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx index 902e01eb147..37ef6d45876 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-cards/video.stories.tsx @@ -14,7 +14,13 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/Explorations/Artifact cards/Video", component: VideoCard, decorators, - parameters, + parameters: { ...parameters, paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, argTypes: { ...identityControls, filename: textData("Original video filename."), diff --git a/ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx index 7e6490d781c..15c18ab55d3 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-upload/01-components.stories.tsx @@ -5,7 +5,15 @@ import { showFileDrag } from "../../../support/artifact-upload/fixtures"; const meta = { id: "artifact-upload-01-artifacts-pane", title: "Tasks and conversations/Documents, attachments, and work products/Artifact upload/01 Artifacts pane", component: UploadPreview, - parameters: { layout: "fullscreen", docs: { description: { component: "The upload icon sits in the tab header without text or a background. The entire Artifacts panel, including its header, padding, existing cards and empty space, accepts files. Drag-over stories enter through the actual header drag handler and highlight the complete visible panel, including after scrolling. Use the upload icon for one or several files. Markdown becomes a document; other files use artifact cards. Uploads are simulated in memory and reset when the story reloads. The Uploading story holds its example pending; Retry completes the sample CSV upload. No task or execution state changes." }, story: { inline: false } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "The upload icon sits in the tab header without text or a background. The entire Artifacts panel, including its header, padding, existing cards and empty space, accepts files. Drag-over stories enter through the actual header drag handler and highlight the complete visible panel, including after scrolling. Use the upload icon for one or several files. Markdown becomes a document; other files use artifact cards. Uploads are simulated in memory and reset when the story reloads. The Uploading story holds its example pending; Retry completes the sample CSV upload. No task or execution state changes." }, story: { inline: false } }, + paperclip: { + "capabilities": [ + "documents-artifacts/attachments" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, argTypes: { state: { control: "select", options: ["empty", "populated", "uploading", "error", "long"] } }, render: (args, context) =>
, } satisfies Meta; diff --git a/ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx b/ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx index 6dd1cfa0233..9a31a1d65a3 100644 --- a/ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifact-upload/02-task-journey.stories.tsx @@ -47,7 +47,15 @@ function Journey(props: { state?: PreviewState; panelOpenInitially?: boolean }) const meta = { id: "artifact-upload-02-paused-task-journey", title: "Tasks and conversations/Documents, attachments, and work products/Artifact upload/02 Paused task journey", component: Journey, - parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/PAP-214"], docs: { description: { component: "Start on the paused, unassigned PAP-214 placeholder in the production app shell. Upload or drop files in Artifacts, open a document in another tab, then return to Artifacts. On mobile, open Artifacts from the task header. Uses production chat bubbles, paused takeover, panel frame, desktop/mobile tabs, artifact list and document viewer. The story composes these components for review; upload persistence is simulated. No live issue is modified or resumed." }, story: { inline: false } } }, + parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/PAP-214"], docs: { description: { component: "Start on the paused, unassigned PAP-214 placeholder in the production app shell. Upload or drop files in Artifacts, open a document in another tab, then return to Artifacts. On mobile, open Artifacts from the task header. Uses production chat bubbles, paused takeover, panel frame, desktop/mobile tabs, artifact list and document viewer. The story composes these components for review; upload persistence is simulated. No live issue is modified or resumed." }, story: { inline: false } }, + paperclip: { + "capabilities": [ + "documents-artifacts/attachments" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, render: (args, context) => , } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/documents-artifacts/artifacts.stories.tsx b/ui/storybook/stories/documents-artifacts/artifacts.stories.tsx index ea0cbb85d83..0bc0635ca86 100644 --- a/ui/storybook/stories/documents-artifacts/artifacts.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/artifacts.stories.tsx @@ -475,6 +475,14 @@ const SELECTED_GROUP_ARTIFACTS: CompanyArtifact[] = [ ]; const meta: Meta = { + parameters: { paperclip: { + "capabilities": [ + "documents-artifacts/library", + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + } }, id: "pages-artifacts", title: "Tasks and conversations/Documents, attachments, and work products/Pages/Artifacts", }; diff --git a/ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx b/ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx index 2c275cef749..a84b9c01eb1 100644 --- a/ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/csv-preview.stories.tsx @@ -9,7 +9,15 @@ const meta: Meta = { id: "components-csv-file-tab", title: "Tasks and conversations/Documents, attachments, and work products/Components/CSV File Tab", component: TextAttachmentPreview, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "documents-artifacts/attachments" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, decorators: [(Story) =>
], }; export default meta; diff --git a/ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx b/ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx index deae38c99ba..0326a4cca6f 100644 --- a/ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/document-annotations.stories.tsx @@ -514,6 +514,13 @@ const meta = { "Document annotation surface for issue documents. Stories under 'Integrated' render the real IssueDocumentsSection chrome (count chip in header, panel + body in their actual layout). Stories under 'States' isolate the panel/layer for unit-level visual debugging.", }, }, + paperclip: { + "capabilities": [ + "documents-artifacts/annotations" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/documents-artifacts/document-comments.stories.tsx b/ui/storybook/stories/documents-artifacts/document-comments.stories.tsx index befef1c6b10..6073921b5d2 100644 --- a/ui/storybook/stories/documents-artifacts/document-comments.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/document-comments.stories.tsx @@ -179,6 +179,13 @@ const meta = { "Inline document comment panel (PAP-10960): simplified to drop the header, filter chips, and empty-state, surface the author identity in the composer, and clamp quotes to two lines.", }, }, + paperclip: { + "capabilities": [ + "documents-artifacts/annotations" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx b/ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx index a0823331855..9b11acb2091 100644 --- a/ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/document-revisions.stories.tsx @@ -23,6 +23,15 @@ const meta = { "Production document section. Loading and read errors currently yield the section's empty rendering; these examples expose that limitation. Revision authority and persisted concurrency require API tests.", }, }, + paperclip: { + "capabilities": [ + "documents-artifacts/documents" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { let doc = { diff --git a/ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx b/ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx index cbed714bd0e..c8ec8f81928 100644 --- a/ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/file-viewer.stories.tsx @@ -218,6 +218,13 @@ const meta: Meta = { parameters: { layout: "fullscreen", a11y: { test: "todo" }, + paperclip: { + "capabilities": [ + "documents-artifacts/attachments" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, }; diff --git a/ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx b/ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx index 9059baf18ce..a149a54e3ca 100644 --- a/ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/html-artifacts/01-preview.stories.tsx @@ -15,7 +15,16 @@ const meta = { title: "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/01 Preview", component: Preview, args: { html: reportHtml, title: "repository-usage.html", width: 800 }, - parameters: { layout: "fullscreen", docs: { description: { component: "Production attachment viewer. Inline CSS and JavaScript run in an opaque-origin sandbox. Remote dependencies and API requests are blocked. The original file is available through Download or Raw." }, story: { inline: false } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Production attachment viewer. Inline CSS and JavaScript run in an opaque-origin sandbox. Remote dependencies and API requests are blocked. The original file is available through Download or Raw." }, story: { inline: false } }, + paperclip: { + "capabilities": [ + "documents-artifacts/attachments", + "workspaces/files-git" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx b/ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx index 71e58e8b143..ed3599b6c39 100644 --- a/ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/html-artifacts/02-workspace.stories.tsx @@ -33,7 +33,16 @@ function Workspace({ sheet = false }: { sheet?: boolean }) { ; } const meta = { id: "html-artifacts-02-workspace", - title: "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/02 Workspace", component: Workspace, render: (args, context) => , parameters: { layout: "fullscreen", docs: { story: { inline: false } } } } satisfies Meta; + title: "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/02 Workspace", component: Workspace, render: (args, context) => , parameters: { layout: "fullscreen", docs: { story: { inline: false } }, + paperclip: { + "capabilities": [ + "documents-artifacts/attachments", + "workspaces/files-git" + ], + "implementation": "production", + "boundary": "fixtures" + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const TaskPanel: Story = {}; diff --git a/ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx b/ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx index 6b9df5170fb..8b28b5ee046 100644 --- a/ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/html-artifacts/03-task-journey.stories.tsx @@ -65,7 +65,16 @@ function Journey(props: { openInitially?: boolean }) { const meta = { id: "html-artifacts-03-task-journey", title: "Tasks and conversations/Documents, attachments, and work products/HTML artifacts/03 Task journey", component: Journey, - parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/html-artifact-journey"], docs: { description: { component: "Open the HTML artifact from the task's report card or Artifacts tab, filter the report, then switch to Raw beside Download. Uses the production app shell, artifact card, task panel and HTML renderer with simulated report data." }, story: { inline: false } } }, + parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/html-artifact-journey"], docs: { description: { component: "Open the HTML artifact from the task's report card or Artifacts tab, filter the report, then switch to Raw beside Download. Uses the production app shell, artifact card, task panel and HTML renderer with simulated report data." }, story: { inline: false } }, + paperclip: { + "capabilities": [ + "documents-artifacts/attachments", + "workspaces/files-git" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, beforeEach: () => { const originalFetch = window.fetch; const fixtureFetch: typeof window.fetch = async (input, init) => { diff --git a/ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx b/ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx index 5127de63abc..219190a7fea 100644 --- a/ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/rich-work-product-cards.stories.tsx @@ -9,7 +9,15 @@ const meta = { id: "task-chat-rich-work-product-cards", title: "Tasks and conversations/Documents, attachments, and work products/Task Chat/Rich Work Product Cards", component: RichWorkProductCard, - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx b/ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx index f2a2cbcee71..56075f95dfc 100644 --- a/ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/task-artifact-gallery.stories.tsx @@ -94,7 +94,16 @@ function GalleryStory({ scenario = "videos", width = 480 }: { scenario?: Scenari } const meta = { id: "tasks-artifact-gallery", - title: "Tasks and conversations/Documents, attachments, and work products/Tasks/Artifact Gallery", component: GalleryStory, parameters: { layout: "fullscreen" }, + title: "Tasks and conversations/Documents, attachments, and work products/Tasks/Artifact Gallery", component: GalleryStory, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "documents-artifacts/library", + "documents-artifacts/work-products" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { scenario: "videos", width: 480 }, beforeEach: ({ args }) => { const originalFetch = window.fetch; diff --git a/ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx b/ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx index 7e0c73ec666..5bfe8b5f72f 100644 --- a/ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx +++ b/ui/storybook/stories/documents-artifacts/task-text-files.stories.tsx @@ -41,7 +41,15 @@ function TextFilesStory({ initial = "list", width = 640 }: { initial?: "list" | ; } const meta = { id: "tasks-text-file-tabs", - title: "Tasks and conversations/Documents, attachments, and work products/Tasks/Text file tabs", component: TextFilesStory, parameters: { layout: "fullscreen" }, render: (args, context) => } satisfies Meta; + title: "Tasks and conversations/Documents, attachments, and work products/Tasks/Text file tabs", component: TextFilesStory, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "documents-artifacts/attachments" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, render: (args, context) => } satisfies Meta; export default meta; type Story = StoryObj; export const OpenFromArtifacts: Story = {}; diff --git a/ui/storybook/stories/execution-environments/custom-images.stories.tsx b/ui/storybook/stories/execution-environments/custom-images.stories.tsx index 83527f3054b..5ed0308ce88 100644 --- a/ui/storybook/stories/execution-environments/custom-images.stories.tsx +++ b/ui/storybook/stories/execution-environments/custom-images.stories.tsx @@ -35,6 +35,15 @@ const meta = { "Production environment admin page. API replies are fictional; no probe connects to a provider. List loading/errors currently fall back to empty saved environments rather than dedicated feedback.", }, }, + paperclip: { + "capabilities": [ + "execution-environments/images" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "CompanyEnvironments image metadata: unconfigured, captured, unsupported, failed, loading and 403. No live setup terminal, provider capture, rollback or relink is executed." + }, }, beforeEach: ({ parameters }) => installEnvironmentFixture( diff --git a/ui/storybook/stories/execution-environments/environment-states.stories.tsx b/ui/storybook/stories/execution-environments/environment-states.stories.tsx index 78511fec7cc..640b8beaa97 100644 --- a/ui/storybook/stories/execution-environments/environment-states.stories.tsx +++ b/ui/storybook/stories/execution-environments/environment-states.stories.tsx @@ -36,6 +36,17 @@ const meta = { "Production environment admin page. API replies are fictional; no probe connects to a provider. List loading/errors currently fall back to empty saved environments rather than dedicated feedback.", }, }, + paperclip: { + "capabilities": [ + "execution-environments/configuration", + "execution-environments/capabilities", + "execution-environments/probe" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => installEnvironmentFixture( diff --git a/ui/storybook/stories/foundations/forms-editors.stories.tsx b/ui/storybook/stories/foundations/forms-editors.stories.tsx index e418820fd13..60485f39a45 100644 --- a/ui/storybook/stories/foundations/forms-editors.stories.tsx +++ b/ui/storybook/stories/foundations/forms-editors.stories.tsx @@ -721,6 +721,16 @@ const meta = { "Fixture-backed stories for Paperclip form controls, markdown editors, inline editors, schedule controls, runtime-variable dialogs, and selection pickers.", }, }, + paperclip: { + "capabilities": [ + "developer-labs/design" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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.", + "home": "foundations", + "exception": "Shared foundations or contributor guide; no single business capability owns this suite." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/foundations/foundations.stories.tsx b/ui/storybook/stories/foundations/foundations.stories.tsx index 86d1c6eb810..82f07408542 100644 --- a/ui/storybook/stories/foundations/foundations.stories.tsx +++ b/ui/storybook/stories/foundations/foundations.stories.tsx @@ -291,6 +291,16 @@ const meta = { "Foundation stories keep base shadcn/Radix primitives visible in every variant and key interaction state used by Paperclip.", }, }, + paperclip: { + "capabilities": [ + "developer-labs/design" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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.", + "home": "foundations", + "exception": "Shared foundations or contributor guide; no single business capability owns this suite." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/foundations/primitives-coverage.stories.tsx b/ui/storybook/stories/foundations/primitives-coverage.stories.tsx index 98d99b099ad..eae9ea9fe05 100644 --- a/ui/storybook/stories/foundations/primitives-coverage.stories.tsx +++ b/ui/storybook/stories/foundations/primitives-coverage.stories.tsx @@ -78,6 +78,16 @@ const meta = { "Static snapshot coverage for shared ui/ primitives not exercised by existing stories: alert-dialog, avatar, breadcrumb, collapsible, command, dropdown-menu, radio-card, scroll-area, sheet, skeleton.", }, }, + paperclip: { + "capabilities": [ + "developer-labs/design" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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.", + "home": "foundations", + "exception": "Shared foundations or contributor guide; no single business capability owns this suite." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/foundations/status-language.stories.tsx b/ui/storybook/stories/foundations/status-language.stories.tsx index 82d356b9fb8..04e2221da2b 100644 --- a/ui/storybook/stories/foundations/status-language.stories.tsx +++ b/ui/storybook/stories/foundations/status-language.stories.tsx @@ -599,6 +599,16 @@ const meta = { "Status-language stories show the reusable operational labels, identity chips, metrics, and capacity indicators used throughout the board.", }, }, + paperclip: { + "capabilities": [ + "developer-labs/design" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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.", + "home": "foundations", + "exception": "Shared foundations or contributor guide; no single business capability owns this suite." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx b/ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx index c236a5bfae0..418d64bde0f 100644 --- a/ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/access-profiles.stories.tsx @@ -476,7 +476,15 @@ function SeededAgentTools() { const meta: Meta = { id: "tools-access-profiles", title: "Apps, channels, and extensions/Tool gateways and access profiles/Tools/Access profiles", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "gateways-profiles/profiles" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx b/ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx index f111d99654e..6e8984a0922 100644 --- a/ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/gateway-tokens.stories.tsx @@ -94,7 +94,17 @@ const meta = { title: "Apps, channels, and extensions/Tool gateways and access profiles/Named gateway tokens", component: Tokens, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "gateways-profiles/tokens" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { let current = { ...gateway, diff --git a/ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx b/ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx index 1eac81d5aa1..6d76b4a27da 100644 --- a/ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/gateways-tab.stories.tsx @@ -244,7 +244,15 @@ function GatewaysHost({ gateways }: { gateways: ToolMcpGatewayWithTokens[] }) { const meta: Meta = { id: "tools-gateways-pap-11182", title: "Apps, channels, and extensions/Tool gateways and access profiles/Tools/Gateways (PAP-11182)", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "gateways-profiles/gateway" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx b/ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx index 0f45100710d..c41c6f052b6 100644 --- a/ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/public-mcp-connections.stories.tsx @@ -5,7 +5,16 @@ import { installPublicMcpFixture } from "../../fixtures/publicMcp"; const meta = { id: "assistant-connections-manage-connections", title: "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Manage connections", component: AssistantConnectionsPage, - parameters: { layout: "padded", initialEntries: ["/assistant-connections"], docs: { description: { component: "Production /assistant-connections page. Revocation changes only the in-memory story fixture." } } }, + parameters: { layout: "padded", initialEntries: ["/assistant-connections"], docs: { description: { component: "Production /assistant-connections page. Revocation changes only the in-memory story fixture." } }, + paperclip: { + "capabilities": [ + "gateways-profiles/client-connect" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, + }, beforeEach: ({ parameters }) => installPublicMcpFixture(parameters.fixture), } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx b/ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx index 543046702af..0b80da2aeed 100644 --- a/ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/public-mcp-consent.stories.tsx @@ -8,7 +8,16 @@ const meta = { id: "assistant-connections-consent", title: "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Consent", component: McpConnectPage, - parameters: { layout: "padded", initialEntries: [`/mcp-connect/${request.id}`], docs: { description: { component: "Production consent page at /mcp-connect/:id. API fixtures are isolated. Successful consent stays in this preview; no OAuth credentials are issued." } } }, + parameters: { layout: "padded", initialEntries: [`/mcp-connect/${request.id}`], docs: { description: { component: "Production consent page at /mcp-connect/:id. API fixtures are isolated. Successful consent stays in this preview; no OAuth credentials are issued." } }, + paperclip: { + "capabilities": [ + "gateways-profiles/client-connect" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, + }, beforeEach: ({ parameters }) => installPublicMcpFixture(parameters.fixture), render: () => } />} />, } satisfies Meta; diff --git a/ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx b/ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx index 758bf5e7d3c..388790503f8 100644 --- a/ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/public-mcp-device.stories.tsx @@ -6,7 +6,16 @@ import { installPublicMcpFixture } from "../../fixtures/publicMcp"; const meta = { id: "assistant-connections-device-authorization", title: "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Device authorization", component: McpDevicePage, - parameters: { layout: "padded", fixture: {}, docs: { description: { component: "Production device consent. The assistant's private device code stays in its credential client; only the human verification code appears here. These isolated fixtures issue no credentials." } } }, + parameters: { layout: "padded", fixture: {}, docs: { description: { component: "Production device consent. The assistant's private device code stays in its credential client; only the human verification code appears here. These isolated fixtures issue no credentials." } }, + paperclip: { + "capabilities": [ + "gateways-profiles/client-connect" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { initialCode: "BCDF-GHJK" }, beforeEach: ({ parameters }) => installPublicMcpFixture(parameters.fixture), } satisfies Meta; diff --git a/ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx b/ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx index 9b4a481e1ad..692b30ffd6f 100644 --- a/ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/public-mcp-journey.stories.tsx @@ -27,6 +27,13 @@ const meta = { parameters: { layout: "fullscreen", initialEntries: ["/PAP/apps"], fixture: { enabled: false, empty: true }, docs: { description: { component: "Begin inside Paperclip. Open Assistant Connection (MCP), follow its Experimental settings link if needed, then choose your assistant. These are production pages in the real app shell; API responses are fixtures. Follow the displayed commands in a live instance to launch browser sign-in and consent. Storybook does not run a terminal, grant access, or simulate a successful OpenCode conversation. Consent states have their own stories. The Connected checkpoint represents returning after a real grant, not clicking a mock connect button." } }, + paperclip: { + "capabilities": [ + "gateways-profiles/client-connect" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, beforeEach: ({ parameters }) => installPublicMcpFixture(parameters.fixture), } satisfies Meta; diff --git a/ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx b/ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx index b0da6f0b013..bd238843cf0 100644 --- a/ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx +++ b/ui/storybook/stories/gateways-profiles/public-mcp-setting.stories.tsx @@ -5,7 +5,17 @@ import { installPublicMcpFixture } from "../../fixtures/publicMcp"; const meta = { id: "assistant-connections-experimental-setting", title: "Apps, channels, and extensions/Tool gateways and access profiles/Assistant connections/Experimental setting", component: InstanceExperimentalSettings, - parameters: { layout: "padded", initialEntries: ["/PAP/company/settings/instance/experimental"], docs: { description: { component: "The production Experimental page, including surrounding settings. Changes are local to this story." } } }, + parameters: { layout: "padded", initialEntries: ["/PAP/company/settings/instance/experimental"], docs: { description: { component: "The production Experimental page, including surrounding settings. Changes are local to this story." } }, + paperclip: { + "capabilities": [ + "gateways-profiles/client-connect", + "instance-operations/configuration" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => installPublicMcpFixture(parameters.fixture), } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/goals/goal-alignment.stories.tsx b/ui/storybook/stories/goals/goal-alignment.stories.tsx index a55d2d27b6a..6bb724ee37f 100644 --- a/ui/storybook/stories/goals/goal-alignment.stories.tsx +++ b/ui/storybook/stories/goals/goal-alignment.stories.tsx @@ -27,7 +27,18 @@ const meta = { title: "Projects and execution/Goals and work alignment/Aligned work and navigation", component: Goal, - parameters: { layout: "padded", initialEntries: ["/PAP/goals/goal-gap"] }, + parameters: { layout: "padded", initialEntries: ["/PAP/goals/goal-gap"], + paperclip: { + "capabilities": [ + "goals/alignment", + "goals/navigation" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => prepareFixtureApi( [ diff --git a/ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx b/ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx index 727d3ce83a7..f541d6ed518 100644 --- a/ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx +++ b/ui/storybook/stories/inbox-search/blocked-inbox.stories.tsx @@ -277,6 +277,15 @@ const meta = { "Stopped-work triage Inbox tab. Rows group by reason variant and sort by severity → stoppedSinceAt. The reason chip + owner + action combo sits next to the issue title. No quick archive on this tab.", }, }, + paperclip: { + "capabilities": [ + "inbox-search/triage", + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/inbox-search/decision-card.stories.tsx b/ui/storybook/stories/inbox-search/decision-card.stories.tsx index fa96bd89ed3..ca2f99d5d6a 100644 --- a/ui/storybook/stories/inbox-search/decision-card.stories.tsx +++ b/ui/storybook/stories/inbox-search/decision-card.stories.tsx @@ -91,6 +91,14 @@ const shared = { }; const meta: Meta = { + parameters: { paperclip: { + "capabilities": [ + "inbox-search/decisions" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + } }, id: "decisions-decisioncard", title: "Tasks and conversations/Inbox, decisions, and search/Decisions/DecisionCard", component: DecisionCard, diff --git a/ui/storybook/stories/inbox-search/decisions-desk.stories.tsx b/ui/storybook/stories/inbox-search/decisions-desk.stories.tsx index 8f8645dd134..1d679ccc105 100644 --- a/ui/storybook/stories/inbox-search/decisions-desk.stories.tsx +++ b/ui/storybook/stories/inbox-search/decisions-desk.stories.tsx @@ -446,7 +446,16 @@ const INTERACTION_AUDIENCE_ITEMS: AttentionItem[] = [ const meta: Meta = { id: "pages-decisions-desk", title: "Tasks and conversations/Inbox, decisions, and search/Pages/Decisions Desk", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "inbox-search/decisions" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, }; export default meta; diff --git a/ui/storybook/stories/inbox-search/inbox-views.stories.tsx b/ui/storybook/stories/inbox-search/inbox-views.stories.tsx index 9ae2fca438c..68bf11662f9 100644 --- a/ui/storybook/stories/inbox-search/inbox-views.stories.tsx +++ b/ui/storybook/stories/inbox-search/inbox-views.stories.tsx @@ -16,7 +16,17 @@ const meta = { "Tasks and conversations/Inbox, decisions, and search/Personal task views", component: InboxHost, args: { tab: "mine" }, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "inbox-search/views" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { const api = prepareFixtureApi( [ diff --git a/ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx b/ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx index 8c96408330c..fe3c32fc02c 100644 --- a/ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx +++ b/ui/storybook/stories/inbox-search/personal-task-toasts.stories.tsx @@ -65,6 +65,15 @@ const meta = { "Production socket consumer and toast viewport. Server eligibility metadata is simulated; persisted participation and mentions require multiplayer tests.", }, }, + paperclip: { + "capabilities": [ + "inbox-search/toasts" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: installLiveEventFixture, } satisfies Meta; diff --git a/ui/storybook/stories/inbox-search/search.stories.tsx b/ui/storybook/stories/inbox-search/search.stories.tsx index 0d261a95416..3474501a82e 100644 --- a/ui/storybook/stories/inbox-search/search.stories.tsx +++ b/ui/storybook/stories/inbox-search/search.stories.tsx @@ -726,6 +726,14 @@ const meta = { "Full search page surfaces and Command K Search-all handoff. Reuses StatusIcon, StatusBadge, Identity and PageTabBar; adds MatchSourceChip + SearchResultRow.", }, }, + paperclip: { + "capabilities": [ + "inbox-search/search" + ], + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Local search-page composition mounts production result components; does not establish parity with the production Search route. 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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/inbox-search/what-needs-me.stories.tsx b/ui/storybook/stories/inbox-search/what-needs-me.stories.tsx index 292e363df0c..a59b76c5f9e 100644 --- a/ui/storybook/stories/inbox-search/what-needs-me.stories.tsx +++ b/ui/storybook/stories/inbox-search/what-needs-me.stories.tsx @@ -491,7 +491,16 @@ const meta: Meta = { id: "pages-decisions", title: "Tasks and conversations/Inbox, decisions, and search/Pages/Decisions", component: Queue, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "inbox-search/decisions" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, }; export default meta; diff --git a/ui/storybook/stories/instance-operations/backup-retention.stories.tsx b/ui/storybook/stories/instance-operations/backup-retention.stories.tsx index 32962c98465..8c01d390528 100644 --- a/ui/storybook/stories/instance-operations/backup-retention.stories.tsx +++ b/ui/storybook/stories/instance-operations/backup-retention.stories.tsx @@ -19,6 +19,16 @@ const meta = { "Shipped general settings. Retention changes persist within this fixture; database backup and restoration require operator verification.", }, }, + paperclip: { + "capabilities": [ + "instance-operations/backup", + "instance-operations/configuration" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { settings = instanceGeneralSettingsSchema.parse({}); diff --git a/ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx b/ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx index 2bf35725d25..31cdb7176d6 100644 --- a/ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx +++ b/ui/storybook/stories/instance-operations/dev-ops-surfaces.stories.tsx @@ -64,6 +64,14 @@ const meta = { "Shows local development recovery surfaces, including the restart-required banner and its manual restart action.", }, }, + paperclip: { + "capabilities": [ + "instance-operations/server-service" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "The recipe distinguishes process liveness from authenticated database readiness; these examples do not exercise that operator API boundary." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx b/ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx index 5c0a53dba44..e74b3a7de98 100644 --- a/ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx +++ b/ui/storybook/stories/navigation-preferences/announcement-card.stories.tsx @@ -3,6 +3,13 @@ import { AnnouncementCard } from "@/components/AnnouncementCard"; import { announcementPreview, announcementAnimationPreview, announcementAnimationPreviewSrc } from "@/lib/announcement-preview"; const meta = { + parameters: { paperclip: { + "capabilities": [ + "navigation-preferences/announcements" + ], + "implementation": "production", + "boundary": "fixtures" + } }, id: "announcements-announcementcard", title: "Oversight and operation/Navigation, profile, and announcements/Announcements/AnnouncementCard", component: AnnouncementCard, diff --git a/ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx b/ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx index 39c5e0cc20b..4896828903c 100644 --- a/ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx +++ b/ui/storybook/stories/navigation-preferences/mobile-task-tabs.stories.tsx @@ -53,6 +53,15 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "A task toolbar with a vertical open-tab overview. The current document stays readable; titles wrap in the overview, selection is explicit, close actions stay visible, and controls have 44px touch targets. Inspired by Apple’s toolbar and safe-area guidance: https://developer.apple.com/design/human-interface-guidelines/toolbars and https://developer.apple.com/design/human-interface-guidelines/layout." } }, + paperclip: { + "capabilities": [ + "navigation-preferences/navigation" + ], + "status": "proposed", + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Local composition retained for its original design purpose; full production parity remains unreviewed." + }, }, globals: { viewport: { value: "mobile", isRotated: false }, theme: "light" }, } satisfies Meta; diff --git a/ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx b/ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx index 05316942295..b602a08b8c4 100644 --- a/ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx +++ b/ui/storybook/stories/navigation-preferences/navigation-layout.stories.tsx @@ -353,6 +353,13 @@ const meta = { "Navigation and layout stories cover the board shell components that orient operators across companies, work surfaces, command search, breadcrumbs, tabs, and mobile navigation.", }, }, + paperclip: { + "capabilities": [ + "navigation-preferences/navigation" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx b/ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx index edaaf5da008..4339365227d 100644 --- a/ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx +++ b/ui/storybook/stories/navigation-preferences/sidebar-preferences.stories.tsx @@ -26,6 +26,15 @@ const meta = { "Production sidebar with isolated saved order responses. Section collapse is session-local; recents are browser-local. No server persistence is claimed.", }, }, + paperclip: { + "capabilities": [ + "navigation-preferences/preferences" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => prepareFixtureApi( diff --git a/ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx b/ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx index 47189737929..c0e464764ed 100644 --- a/ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx +++ b/ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx @@ -34,7 +34,16 @@ import { const meta = { id: "onboarding-agent-arc", title: "Getting started and access/Onboarding and first work/Onboarding/Agent arc", - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "onboarding/adapter", + "onboarding/first-task" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/onboarding/onboarding-character.stories.tsx b/ui/storybook/stories/onboarding/onboarding-character.stories.tsx index b69cce348da..7fac5affea2 100644 --- a/ui/storybook/stories/onboarding/onboarding-character.stories.tsx +++ b/ui/storybook/stories/onboarding/onboarding-character.stories.tsx @@ -9,7 +9,15 @@ const meta = { title: "Getting started and access/Onboarding and first work/Onboarding/Character", component: OnboardingCharacter, args: { appearance: appearanceForPalette("bubblegum-sky"), awake: false }, - parameters: { docs: { description: { component: "The onboarding hero: the persona character (the studio's App export) on the shared ClipLab v0.2.0 engine. Gray and dozing until Review, where it plays the one-shot sleepy → wink → idle transition while its palette fades in, then settles into the idle loop. Reduced motion skips the sequence." } } }, + parameters: { docs: { description: { component: "The onboarding hero: the persona character (the studio's App export) on the shared ClipLab v0.2.0 engine. Gray and dozing until Review, where it plays the one-shot sleepy → wink → idle transition while its palette fades in, then settles into the idle loop. Reduced motion skips the sequence." } }, + paperclip: { + "capabilities": [ + "onboarding/company" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, argTypes: { awake: { control: "boolean" } }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx b/ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx index 065bc194575..0832cd19e5b 100644 --- a/ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx +++ b/ui/storybook/stories/onboarding/onboarding-connect-model.stories.tsx @@ -20,7 +20,19 @@ import { ConnectModelPreview } from "@/components/onboarding/ConnectModelPreview const meta = { id: "onboarding-connect-a-model", title: "Getting started and access/Onboarding and first work/Onboarding/Connect a model", - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "onboarding/adapter", + "onboarding/first-task" + ], + "status": "historical", + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Older tile/mode preview; onboarding-agent-arc mounts the production wizard.", + "replacement": "ui/storybook/stories/onboarding/onboarding-agent-arc.stories.tsx" + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/onboarding/resume-draft.stories.tsx b/ui/storybook/stories/onboarding/resume-draft.stories.tsx index bdaec9128ca..effbaa48431 100644 --- a/ui/storybook/stories/onboarding/resume-draft.stories.tsx +++ b/ui/storybook/stories/onboarding/resume-draft.stories.tsx @@ -40,7 +40,17 @@ const meta = { title: "Getting started and access/Onboarding and first work/Resume a saved draft", component: Resume, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "onboarding/resume" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { seedOnboardingDraft(); if (parameters.invalid) diff --git a/ui/storybook/stories/overview/overview.stories.tsx b/ui/storybook/stories/overview/overview.stories.tsx index 1c7b9b0a339..dca58faabab 100644 --- a/ui/storybook/stories/overview/overview.stories.tsx +++ b/ui/storybook/stories/overview/overview.stories.tsx @@ -5,7 +5,15 @@ const meta = { id: "overview-storybook-guide", title: "Overview/Storybook Guide", component: FeatureMapIndex, - parameters: { docs: { description: { component: "Feature-based navigation from the downstream catalog, with separate product, component, and fixture classifications. Story links come from this build's index." } } }, + parameters: { docs: { description: { component: "Feature-based navigation from the downstream catalog, with separate product, component, and fixture classifications. Story links come from this build's index." } }, + paperclip: { + "capabilities": [], + "implementation": "guide", + "boundary": "static", + "notes": "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.", + "exception": "Shared foundations or contributor guide; no single business capability owns this suite." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/pipelines/learnings.stories.tsx b/ui/storybook/stories/pipelines/learnings.stories.tsx index 66dc7bbd198..622c43d1e6d 100644 --- a/ui/storybook/stories/pipelines/learnings.stories.tsx +++ b/ui/storybook/stories/pipelines/learnings.stories.tsx @@ -21,6 +21,15 @@ const meta = { "Shipped Learnings with isolated API receipts. Guards, durable transitions, automation execution and learning provenance require production tests.", }, }, + paperclip: { + "capabilities": [ + "pipelines/learnings" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => installPipelineFixture(parameters.fixtureState as FixtureState).cleanup, diff --git a/ui/storybook/stories/pipelines/pipeline-board.stories.tsx b/ui/storybook/stories/pipelines/pipeline-board.stories.tsx index fe43f735422..4f433bf363f 100644 --- a/ui/storybook/stories/pipelines/pipeline-board.stories.tsx +++ b/ui/storybook/stories/pipelines/pipeline-board.stories.tsx @@ -25,6 +25,15 @@ const meta = { "Shipped Pipelines with isolated API receipts. Guards, durable transitions, automation execution and learning provenance require production tests.", }, }, + paperclip: { + "capabilities": [ + "pipelines/items" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "Production Pipelines board with stages/items and loading/empty/error/403. Snapshot rows only; transitions, liveness, guards and automation execution remain separate." + }, }, beforeEach: ({ parameters }) => installPipelineFixture(parameters.fixtureState as FixtureState).cleanup, diff --git a/ui/storybook/stories/pipelines/review-queue.stories.tsx b/ui/storybook/stories/pipelines/review-queue.stories.tsx index 4c31980cb0d..d82cf9e1afe 100644 --- a/ui/storybook/stories/pipelines/review-queue.stories.tsx +++ b/ui/storybook/stories/pipelines/review-queue.stories.tsx @@ -21,6 +21,15 @@ const meta = { "Shipped ReviewQueue with isolated API receipts. Guards, durable transitions, automation execution and learning provenance require production tests.", }, }, + paperclip: { + "capabilities": [ + "pipelines/review" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => installPipelineFixture(parameters.fixtureState as FixtureState).cleanup, diff --git a/ui/storybook/stories/pipelines/stage-settings.stories.tsx b/ui/storybook/stories/pipelines/stage-settings.stories.tsx index 3335f18d64a..78abfebaf33 100644 --- a/ui/storybook/stories/pipelines/stage-settings.stories.tsx +++ b/ui/storybook/stories/pipelines/stage-settings.stories.tsx @@ -28,6 +28,15 @@ const meta = { "Shipped PipelineSettings with isolated API receipts. Guards, durable transitions, automation execution and learning provenance require production tests.", }, }, + paperclip: { + "capabilities": [ + "pipelines/stages" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => installPipelineFixture(parameters.fixtureState as FixtureState, { diff --git a/ui/storybook/stories/plugins/plugin-configuration.stories.tsx b/ui/storybook/stories/plugins/plugin-configuration.stories.tsx index 7a9dbe58da7..4bb33376a99 100644 --- a/ui/storybook/stories/plugins/plugin-configuration.stories.tsx +++ b/ui/storybook/stories/plugins/plugin-configuration.stories.tsx @@ -26,6 +26,15 @@ const meta = { parameters: { layout: "padded", initialEntries: ["/PAP/plugins/plugin-gap/settings"], + paperclip: { + "capabilities": [ + "plugins/configuration" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "PluginSettings configuration route with hydrated values, read pending/unavailable and saved/error/403 responses. Real config storage and plugin worker validation are not proved." + }, }, beforeEach: ({ parameters }) => installPluginFixtures(parameters.fixtureState as FixtureState), diff --git a/ui/storybook/stories/plugins/plugin-contributions.stories.tsx b/ui/storybook/stories/plugins/plugin-contributions.stories.tsx index 18c029588ff..d6945d1282d 100644 --- a/ui/storybook/stories/plugins/plugin-contributions.stories.tsx +++ b/ui/storybook/stories/plugins/plugin-contributions.stories.tsx @@ -35,6 +35,15 @@ const meta = { parameters: { layout: "padded", initialEntries: ["/PAP/plugins/contribution-gap"], + paperclip: { + "capabilities": [ + "plugins/contributions" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { registerPluginReactComponent( diff --git a/ui/storybook/stories/plugins/plugin-management.stories.tsx b/ui/storybook/stories/plugins/plugin-management.stories.tsx index 2436fe9bad9..a388969fc05 100644 --- a/ui/storybook/stories/plugins/plugin-management.stories.tsx +++ b/ui/storybook/stories/plugins/plugin-management.stories.tsx @@ -16,7 +16,18 @@ const meta = { id: "feature-plugin-management", title: "Apps, channels, and extensions/Plugins/Installation and lifecycle", component: Plugins, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "plugins/installation", + "plugins/lifecycle" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "PluginManager list states, install pending/error/success, disable and uninstall receipts. Local record transitions only; package loading and worker lifecycle require production verification." + }, + }, beforeEach: ({ parameters }) => installPluginFixtures( parameters.fixtureState as FixtureState, diff --git a/ui/storybook/stories/projects/new-project-repos.stories.tsx b/ui/storybook/stories/projects/new-project-repos.stories.tsx index 74179ac965e..4735bcb0d07 100644 --- a/ui/storybook/stories/projects/new-project-repos.stories.tsx +++ b/ui/storybook/stories/projects/new-project-repos.stories.tsx @@ -9,7 +9,17 @@ const meta = { title: "Projects and execution/Projects and repositories/Proposals/Project repos/New project", component: NewProjectPrototype, tags: ["!autodocs"], - parameters: { layout: "fullscreen", viewport: { options: reviewViewports }, docs: { description: { component: "Interactive design proposal only. The project name starts empty and focused, with an outlined folder icon. The source repo region scrolls while the title, name, and actions remain visible. GitHub setup uses the existing ConnectionSetupFlow; Continue to GitHub simulates a successful provider return. Creation and repository changes stay in memory." } } }, + parameters: { layout: "fullscreen", viewport: { options: reviewViewports }, docs: { description: { component: "Interactive design proposal only. The project name starts empty and focused, with an outlined folder icon. The source repo region scrolls while the title, name, and actions remain visible. GitHub setup uses the existing ConnectionSetupFlow; Continue to GitHub simulates a successful provider return. Creation and repository changes stay in memory." } }, + paperclip: { + "capabilities": [ + "projects/repositories" + ], + "status": "proposed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "RepositoryEditor is shipped, but NewProjectPrototype composes its own creation flow. Preserve proposal until route parity is checked." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx b/ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx index 2cfdbe3effb..2a988d342fb 100644 --- a/ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx +++ b/ui/storybook/stories/projects/project-execution-workspace-strategy.stories.tsx @@ -31,7 +31,16 @@ const meta: Meta = { id: "workspaces-project-runtime-provision-command", title: "Projects and execution/Projects and repositories/Workspaces/Project runtime provision command", component: ProjectProperties, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "projects/defaults", + "workspaces/provisioning" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/projects/project-repos-configuration.stories.tsx b/ui/storybook/stories/projects/project-repos-configuration.stories.tsx index 1149d465441..ed805169f20 100644 --- a/ui/storybook/stories/projects/project-repos-configuration.stories.tsx +++ b/ui/storybook/stories/projects/project-repos-configuration.stories.tsx @@ -8,7 +8,17 @@ const meta = { title: "Projects and execution/Projects and repositories/Proposals/Project repos/Configuration", component: ProjectConfigurationPrototype, tags: ["!autodocs"], - parameters: { layout: "fullscreen", viewport: { options: reviewViewports }, docs: { description: { component: "Full Onboarding configuration page, based on the Bull staging reference: sidebar, header, tabs, actual ProjectProperties, and the proposed source repo editor in the Codebase slot. Add/remove repos, save or discard, connect another GitHub account, and preserve existing text URLs. All writes and provider sign-in are simulated in Storybook." } } }, + parameters: { layout: "fullscreen", viewport: { options: reviewViewports }, docs: { description: { component: "Full Onboarding configuration page, based on the Bull staging reference: sidebar, header, tabs, actual ProjectProperties, and the proposed source repo editor in the Codebase slot. Add/remove repos, save or discard, connect another GitHub account, and preserve existing text URLs. All writes and provider sign-in are simulated in Storybook." } }, + paperclip: { + "capabilities": [ + "projects/repositories" + ], + "status": "proposed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Production properties plus local configuration page composition; repository interaction is simulated." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx b/ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx index 7eb9e5fbd2f..f8920d65e97 100644 --- a/ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx +++ b/ui/storybook/stories/projects/projects-goals-workspaces.stories.tsx @@ -507,6 +507,16 @@ const meta = { "Projects, goals, and workspaces stories cover project properties, workspace cards/lists, goal hierarchy panels, runtime controls, and worktree branding states.", }, }, + paperclip: { + "capabilities": [ + "projects/lifecycle", + "goals/hierarchy", + "workspaces/binding" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx b/ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx index f292721632b..7adc3501166 100644 --- a/ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/agent-chat-unanswered-questions.stories.tsx @@ -3,7 +3,16 @@ import { expect, userEvent, within, waitFor } from "storybook/test"; import { QuestionChat, question } from "../../fixtures/unansweredQuestionChat"; const meta = { id: "chat-comments-agent-chat-unanswered-questions", - title: "Tasks and conversations/Questions and approvals/Chat & Comments/Agent Chat Unanswered Questions", parameters: { layout: "fullscreen" }, component: QuestionChat, + title: "Tasks and conversations/Questions and approvals/Chat & Comments/Agent Chat Unanswered Questions", parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "questions-and-approvals/dismiss-and-reopen", + "agent-chat/history" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, component: QuestionChat, beforeEach: () => { localStorage.removeItem(`paperclip:task-question-dismissals:user-board:${question.issueId}`); for (const key of Object.keys(localStorage)) { diff --git a/ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx b/ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx index 34ec7fba1e1..9716ccb8047 100644 --- a/ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/composer-question-flow.stories.tsx @@ -91,6 +91,13 @@ const meta = { parameters: { layout: "padded", docs: { description: { component: "A structured question card above the usable composer. Choices stay selected until Next or Submit, and Other opens a text field." } }, + paperclip: { + "capabilities": [ + "questions-and-approvals/questions" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx b/ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx index 825c61b0a8b..b8b4950de8c 100644 --- a/ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/connection-reviews.stories.tsx @@ -46,7 +46,16 @@ const readRequest: RequestConfirmationInteraction = { const meta = { id: "chat-comments-connection-reviews", title: "Tasks and conversations/Questions and approvals/Chat & Comments/Connection Reviews", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "questions-and-approvals/tool-review", + "connection-setup/task-request" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx b/ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx index 0e3ab134d01..65a04cc8a0f 100644 --- a/ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/issue-plan-decompositions.stories.tsx @@ -90,6 +90,14 @@ const meta = { }, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "questions-and-approvals/plan-review", + "task-coordination/delegation" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx b/ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx index d72c03559b7..9a33db7e2ed 100644 --- a/ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/issue-thread-interactions.stories.tsx @@ -441,6 +441,18 @@ const meta = { "Interaction cards for `suggest_tasks`, `ask_user_questions`, `request_confirmation`, and `request_checkbox_confirmation`, shown both in isolation and inside the real `IssueChatThread` feed.", }, }, + paperclip: { + "capabilities": [ + "questions-and-approvals/questions", + "questions-and-approvals/confirmations", + "questions-and-approvals/audience", + "questions-and-approvals/plan-review", + "questions-and-approvals/continuation" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx b/ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx index 929b9bbd2cb..3d45b5cee96 100644 --- a/ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/rich-acp-interactions.stories.tsx @@ -183,7 +183,17 @@ function ProviderNotice() { const meta = { id: "chat-comments-rich-acp-interactions", title: "Tasks and conversations/Questions and approvals/Chat & Comments/Rich ACP interactions", - parameters: { layout: "fullscreen", docs: { description: { component: "Credential-free production UI fixtures. Callback receipts establish UI payload fidelity only; they do not claim provider execution or server persistence." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Credential-free production UI fixtures. Callback receipts establish UI payload fidelity only; they do not claim provider execution or server persistence." } }, + paperclip: { + "capabilities": [ + "questions-and-approvals/questions", + "questions-and-approvals/confirmations", + "questions-and-approvals/audience" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx b/ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx index 2f35277bfc9..d0c3fd1c05a 100644 --- a/ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/task-chat-interaction-above-composer.stories.tsx @@ -150,6 +150,17 @@ const meta = { layout: "fullscreen", options: { showPanel: false }, docs: { description: { component: "The production task interaction card and composer shown together. Dismissed questions do not contribute a composer pending indicator; other unresolved inputs retain one. Skip or a decision resolves the card. This local composition does not model persisted dismissal or the thread's history entry; use Task Chat Unanswered Questions for that fixture journey." } }, + paperclip: { + "capabilities": [ + "questions-and-approvals/questions", + "questions-and-approvals/confirmations", + "questions-and-approvals/audience" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { interaction: pendingAskUserQuestionsInteraction, mobile: false }, } satisfies Meta; diff --git a/ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx b/ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx index 286a3090528..d3e2a5a0e5e 100644 --- a/ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx +++ b/ui/storybook/stories/questions-and-approvals/task-chat-unanswered-questions.stories.tsx @@ -5,7 +5,17 @@ import { QuestionChat } from "../../fixtures/unansweredQuestionChat"; const meta = { id: "chat-comments-task-chat-unanswered-questions", title: "Tasks and conversations/Questions and approvals/Chat & Comments/Task Chat Unanswered Questions", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "questions-and-approvals/dismiss-and-reopen", + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, component: QuestionChat, args: { conversationMode: false }, } satisfies Meta; diff --git a/ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx b/ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx index 9db96e84bd6..b7c9fd04085 100644 --- a/ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx +++ b/ui/storybook/stories/recovery/cloud-access-recovery.stories.tsx @@ -5,7 +5,15 @@ const meta: Meta = { id: "app-connection-recovery", title: "Projects and execution/Recovery/App/Connection recovery", component: CloudAccessError, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "recovery/reconnect" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { temporary: true, retrying: false, onRetry: () => undefined }, }; diff --git a/ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx b/ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx index 769ff81491d..02f99649d73 100644 --- a/ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx +++ b/ui/storybook/stories/recovery/execution-blocker-notice.stories.tsx @@ -10,10 +10,17 @@ client.setQueryData(queryKeys.issues.runs("storybook-recovery"), [ { runId: "stopped-run", agentId: "agent", status: "failed" }, ]); const meta = { + parameters: { docs: { story: { inline: false } }, paperclip: { + "capabilities": [ + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Retained-file states cover the production repair form, source-bound evidence and unchanged task status; fixture APIs do not prove live provider recovery." + } }, id: "task-chat-recovery-notice", title: "Projects and execution/Recovery/Task chat/Recovery notice", component: ExecutionBlockerNotice, - parameters: { docs: { story: { inline: false } } }, decorators: [(Story, context) =>
], args: { companyId: "storybook-company", issueId: "storybook-recovery", onRetried: () => {}, diff --git a/ui/storybook/stories/recovery/execution-recovery.stories.tsx b/ui/storybook/stories/recovery/execution-recovery.stories.tsx index b057457b4bc..4cca47d423c 100644 --- a/ui/storybook/stories/recovery/execution-recovery.stories.tsx +++ b/ui/storybook/stories/recovery/execution-recovery.stories.tsx @@ -60,6 +60,13 @@ function QuietExecution({ execution }: { execution: ExecutionProjection }) { ); } const meta = { + parameters: { paperclip: { + "capabilities": [ + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures" + } }, id: "tasks-execution-recovery", title: "Projects and execution/Recovery/Tasks/Execution recovery", component: QuietExecution, diff --git a/ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx b/ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx index e13cb2a9f64..ece4b91b6b9 100644 --- a/ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx +++ b/ui/storybook/stories/recovery/issue-blocked-notice.stories.tsx @@ -46,6 +46,14 @@ const meta = { "Blocked/recovery notice on the issue thread. Rule C: a `blocked` issue with a genuinely unresolved (not-done) blocker tells the human that a message won't reopen it yet and names the unresolved leaf with its status. Done-but-pending-finalize blockers are `done`, so they fall into the Rule B reopen path and are NOT shown as reopen-suppressed.", }, }, + paperclip: { + "capabilities": [ + "recovery/diagnosis", + "task-coordination/dependencies" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/recovery/model-capacity-retry.stories.tsx b/ui/storybook/stories/recovery/model-capacity-retry.stories.tsx index 4385292d116..6d4783e4748 100644 --- a/ui/storybook/stories/recovery/model-capacity-retry.stories.tsx +++ b/ui/storybook/stories/recovery/model-capacity-retry.stories.tsx @@ -2,6 +2,13 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { IssueScheduledRetryCard } from "@/components/IssueScheduledRetryCard"; const meta = { + parameters: { paperclip: { + "capabilities": [ + "recovery/bounded-continuation" + ], + "implementation": "production", + "boundary": "fixtures" + } }, id: "tasks-model-capacity-retry", title: "Projects and execution/Recovery/Tasks/Model capacity retry", component: IssueScheduledRetryCard, diff --git a/ui/storybook/stories/recovery/recovery-gap-states.stories.tsx b/ui/storybook/stories/recovery/recovery-gap-states.stories.tsx index 719f8e690df..1c786dc8933 100644 --- a/ui/storybook/stories/recovery/recovery-gap-states.stories.tsx +++ b/ui/storybook/stories/recovery/recovery-gap-states.stories.tsx @@ -97,6 +97,16 @@ const meta = { "Shipped recovery notice/card. Decisions alter local fixture state only. Bounded attempts, unknown-side-effect replay and real continuation require production tests.", }, }, + paperclip: { + "capabilities": [ + "recovery/exhaustion", + "recovery/unknown-outcome" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx b/ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx index 5a4e4de344c..52714e7d773 100644 --- a/ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx +++ b/ui/storybook/stories/recovery/recovery-notice-preview.stories.tsx @@ -13,6 +13,15 @@ const meta = { component: "Production recovery notice with a simulated request. Rendering, disclosure, pending, failure, and acknowledgement use the same component as both task interfaces. No real task is changed.", }, }, + paperclip: { + "capabilities": [ + "recovery/diagnosis", + "recovery/source-action" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, }, args: { agentName: "Alex", diff --git a/ui/storybook/stories/recovery/scheduled-retry.stories.tsx b/ui/storybook/stories/recovery/scheduled-retry.stories.tsx index 4a9acd8f5df..ea5db607c11 100644 --- a/ui/storybook/stories/recovery/scheduled-retry.stories.tsx +++ b/ui/storybook/stories/recovery/scheduled-retry.stories.tsx @@ -154,6 +154,13 @@ const meta = { "Surfaces the IssueScheduledRetryCard and IssueProperties Scheduled retry row in transient/continuation/due-now variants for UX review. The card mounts above IssueMonitorActivityCard and the property row sits sibling-to (and above) Monitor.", }, }, + paperclip: { + "capabilities": [ + "recovery/bounded-continuation" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/recovery/source-issue-recovery.stories.tsx b/ui/storybook/stories/recovery/source-issue-recovery.stories.tsx index fe49dfc09b9..b0ad2423bed 100644 --- a/ui/storybook/stories/recovery/source-issue-recovery.stories.tsx +++ b/ui/storybook/stories/recovery/source-issue-recovery.stories.tsx @@ -577,7 +577,17 @@ const meta = { id: "paperclip-source-issue-recovery", title: "Projects and execution/Recovery/Paperclip/Source Issue Recovery", component: AllStatesPanel, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "recovery/diagnosis", + "recovery/source-action" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Source review confirms ordinary recovery fixtures remain applicable after the native-owner resolution gate; native-owner stop verification has its own suite." + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/recovery/source-resolved-fold.stories.tsx b/ui/storybook/stories/recovery/source-resolved-fold.stories.tsx index ba714b96e8e..32118f18b3c 100644 --- a/ui/storybook/stories/recovery/source-resolved-fold.stories.tsx +++ b/ui/storybook/stories/recovery/source-resolved-fold.stories.tsx @@ -57,7 +57,16 @@ const meta = { id: "paperclip-source-resolved-fold", title: "Projects and execution/Recovery/Paperclip/Source-resolved Fold", component: DefaultPanel, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "recovery/diagnosis", + "recovery/source-action" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx b/ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx index cdc9698d708..f302b873153 100644 --- a/ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx +++ b/ui/storybook/stories/recovery/workspace-branch-recovery/01-component.stories.tsx @@ -8,7 +8,15 @@ const meta = { title: "Projects and execution/Recovery/Workspace branch recovery/01 Repair card", component: WorkspaceBaseRefRecoveryNotice, args: { ...evidence, onRepair: simulateRepair }, - parameters: { layout: "fullscreen", docs: { description: { component: "Proposed inline repair using the reusable component. Repository data and save/retry responses are simulated here; this story does not change a live task. The default-branch action appears only with a verified repository default." } } }, + parameters: { layout: "fullscreen", docs: { description: { component: "Proposed inline repair using the reusable component. Repository data and save/retry responses are simulated here; this story does not change a live task. The default-branch action appears only with a verified repository default." } }, + paperclip: { + "capabilities": [ + "recovery/workspace" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, render: (args, context) =>
, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx b/ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx index f30e7a75a23..8338c51107f 100644 --- a/ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx +++ b/ui/storybook/stories/recovery/workspace-branch-recovery/02-task-journey.stories.tsx @@ -35,7 +35,15 @@ function Journey() { const meta = { id: "workspace-branch-recovery-02-task-journey", title: "Projects and execution/Recovery/Workspace branch recovery/02 Task journey", component: Journey, - parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/PAP-24"], docs: { description: { component: "Interactive proposal in the production app shell, using the shared task bubbles, composer and repair component. Save/retry and branch lookup are simulated. Use master or choose release/next; a missing branch shows an inline error. No live task is modified." }, story: { inline: false } } }, + parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/PAP-24"], docs: { description: { component: "Interactive proposal in the production app shell, using the shared task bubbles, composer and repair component. Save/retry and branch lookup are simulated. Use master or choose release/next; a missing branch shows an inline error. No live task is modified." }, story: { inline: false } }, + paperclip: { + "capabilities": [ + "recovery/workspace" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx b/ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx index eafd2bfd052..6948bc32f39 100644 --- a/ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx +++ b/ui/storybook/stories/recovery/workspace-finalization-recovery/01-notice.stories.tsx @@ -7,7 +7,18 @@ const meta = { title: "Projects and execution/Recovery/Workspace finalization recovery/01 Notice", component: WorkspaceExportRecovery, args: { action: automaticAction }, - parameters: { layout: "fullscreen", docs: { story: { inline: false }, description: { component: "Controller recovery runs in the harness. The task shows a quiet status and removes it when saving finishes. Legacy receipts without platform identity require operator assistance through the documented API; no shutdown form is shown to users." } } }, + parameters: { layout: "fullscreen", docs: { story: { inline: false }, description: { component: "Controller recovery runs in the harness. The task shows a quiet status and removes it when saving finishes. Legacy receipts without platform identity require operator assistance through the documented API; no shutdown form is shown to users." } }, + paperclip: { + "capabilities": [ + "recovery/workspace", + "recovery/source-action" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, decorators: [Story =>
], } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx b/ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx index 98a012faeb9..839458047cb 100644 --- a/ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx +++ b/ui/storybook/stories/recovery/workspace-finalization-recovery/02-task-journey.stories.tsx @@ -34,7 +34,17 @@ function Journey({ saved = false }: { saved?: boolean }) { const meta = { id: "workspace-finalization-recovery-02-task-journey", title: "Projects and execution/Recovery/Workspace finalization recovery/02 Task journey", component: Journey, args: { saved: false }, - parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/PAP-24"], docs: { description: { component: "A composed task conversation in the production app shell, using the shipped recovery notice, task bubbles and composer. Recovery happens automatically with no form or user action. This is a composed UI preview; finalization and approval resolution are verified separately by server tests." }, story: { inline: false } } }, + parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/PAP-24"], docs: { description: { component: "A composed task conversation in the production app shell, using the shipped recovery notice, task bubbles and composer. Recovery happens automatically with no form or user action. This is a composed UI preview; finalization and approval resolution are verified separately by server tests." }, story: { inline: false } }, + paperclip: { + "capabilities": [ + "recovery/workspace", + "recovery/source-action" + ], + "implementation": "mixed", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/routines/routine-detail-c.stories.tsx b/ui/storybook/stories/routines/routine-detail-c.stories.tsx index f536ef04caf..0f4f9eefcc8 100644 --- a/ui/storybook/stories/routines/routine-detail-c.stories.tsx +++ b/ui/storybook/stories/routines/routine-detail-c.stories.tsx @@ -446,6 +446,16 @@ const meta: Meta = { parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "routines/definition", + "routines/management", + "activity/routine-audit" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Activity mounts the shipped ActivitySection with fixture trigger/run/configuration events. This does not establish live routine execution or audit persistence." + }, }, }; diff --git a/ui/storybook/stories/routines/routine-secrets.stories.tsx b/ui/storybook/stories/routines/routine-secrets.stories.tsx index 8117b6ea4dc..b983211d3fa 100644 --- a/ui/storybook/stories/routines/routine-secrets.stories.tsx +++ b/ui/storybook/stories/routines/routine-secrets.stories.tsx @@ -52,6 +52,14 @@ const meta: Meta = { parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "routines/definition", + "secrets/runtime-delivery" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, }; diff --git a/ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx b/ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx index 093addf2e44..bf17d2ed346 100644 --- a/ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx +++ b/ui/storybook/stories/routines/routine-webhooks-ux.stories.tsx @@ -194,7 +194,15 @@ const meta = { id: "product-routines-webhooks-ux-preview", title: "Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks UX preview", component: Prototype, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "routines/triggers" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { stage: "setup", sender: "custom", page: "triggers", triggerKind: "choose", wizardStep: 0, scheduleSaved: false, checkResult: "waiting" }, argTypes: { triggerKind: { control: "radio", options: ["choose", "schedule", "webhook"] }, scheduleSaved: { control: "boolean" }, checkResult: { control: "select", options: ["waiting", "received", "rejected", "no_event"] }, stage: { control: "select", options: ["setup", "credentials", "waiting", "received", "failure"] }, sender: { control: "radio", options: ["custom", "github"] }, page: { control: "radio", options: ["triggers", "overview", "activity"] } }, } satisfies Meta; diff --git a/ui/storybook/stories/routines/routine-webhooks.stories.tsx b/ui/storybook/stories/routines/routine-webhooks.stories.tsx index 5769c0258d2..eaf6d3aac01 100644 --- a/ui/storybook/stories/routines/routine-webhooks.stories.tsx +++ b/ui/storybook/stories/routines/routine-webhooks.stories.tsx @@ -6,7 +6,18 @@ const meta = { id: "product-routines-webhooks", title: "Automation and structured work/Routines, schedules, and triggers/Product/Routines/Webhooks", component: WebhookReview, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "routines/triggers", + "routines/history", + "activity/routine-audit" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Runs and Activity mount RoutineDetail with fixture execution tasks/events and play assertions. Scheduler execution, delivery and audit persistence are not live." + }, + }, args: { signingMode: "bearer", state: "configured" }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/routines/routines-list-groups.stories.tsx b/ui/storybook/stories/routines/routines-list-groups.stories.tsx index 03955004ac3..2c014dba4fe 100644 --- a/ui/storybook/stories/routines/routines-list-groups.stories.tsx +++ b/ui/storybook/stories/routines/routines-list-groups.stories.tsx @@ -94,7 +94,16 @@ const meta: Meta = { id: "product-routines-·-list-grouped-cards", title: "Automation and structured work/Routines, schedules, and triggers/Product/Routines · List (grouped cards)", component: GroupedList, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "routines/definition", + "routines/management" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/routines/run-now.stories.tsx b/ui/storybook/stories/routines/run-now.stories.tsx index 390245e97da..b49c7922103 100644 --- a/ui/storybook/stories/routines/run-now.stories.tsx +++ b/ui/storybook/stories/routines/run-now.stories.tsx @@ -31,6 +31,15 @@ const meta = { parameters: { layout: "padded", initialEntries: ["/PAP/routines/routine-gap"], + paperclip: { + "capabilities": [ + "routines/run-now" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { submitted = null; diff --git a/ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx b/ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx index 2fd484a1c5c..83284124dcf 100644 --- a/ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx +++ b/ui/storybook/stories/runs-adapters/agent-connection-reuse.stories.tsx @@ -59,6 +59,15 @@ const meta = { "Production agent connection component with fixture API responses. Provider tests and subsequent hiring are simulated. Choose subscription or API key, reuse a saved connection, or enter a new key.", }, }, + paperclip: { + "capabilities": [ + "runs-adapters/validation", + "agents/hire" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, }, beforeEach: () => { resetOnboardingFixtureState(); diff --git a/ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx b/ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx index 849cc67ac65..0b6cba04500 100644 --- a/ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx +++ b/ui/storybook/stories/runs-adapters/ai-connection-usage.stories.tsx @@ -7,7 +7,15 @@ const meta = { id: "ai-connections-usage-limits", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Usage limits", component: AiConnectionUsageReview, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/runs-adapters/ai-connections.stories.tsx b/ui/storybook/stories/runs-adapters/ai-connections.stories.tsx index 100856e459b..835f6067504 100644 --- a/ui/storybook/stories/runs-adapters/ai-connections.stories.tsx +++ b/ui/storybook/stories/runs-adapters/ai-connections.stories.tsx @@ -14,7 +14,15 @@ const meta = { id: "ai-connections-review", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Review", component: AiConnectionsReview, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, decorators: [(Story, context) => ( )], diff --git a/ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx b/ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx index dac2a11391b..b3937908e54 100644 --- a/ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx +++ b/ui/storybook/stories/runs-adapters/connection-pool-connector.stories.tsx @@ -2,7 +2,16 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, userEvent, within } from "storybook/test"; import { ConnectionPoolConnectorHost } from "../../prototypes/ConnectionPoolConnectorHost"; const meta = { id: "connectors-pool-host", - title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/Connectors/Pool host", component: ConnectionPoolConnectorHost, parameters: { layout: "fullscreen" } } satisfies Meta; + title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/Connectors/Pool host", component: ConnectionPoolConnectorHost, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation", + "connection-setup/catalog" + ], + "implementation": "production", + "boundary": "fixtures" + }, + } } satisfies Meta; export default meta; type Story = StoryObj; export const Catalog: Story = {}; diff --git a/ui/storybook/stories/runs-adapters/connection-pools.stories.tsx b/ui/storybook/stories/runs-adapters/connection-pools.stories.tsx index 54ee9f59d36..bbb6f63f089 100644 --- a/ui/storybook/stories/runs-adapters/connection-pools.stories.tsx +++ b/ui/storybook/stories/runs-adapters/connection-pools.stories.tsx @@ -75,7 +75,15 @@ function PoolSurfaces({ scenario = "overview" }: { scenario?: Scenario }) { ; } const meta = { id: "ai-connections-connection-pools", - title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Connection pools", component: PoolSurfaces, parameters: { layout: "fullscreen", docs: { description: { component: "All user-facing Core additions for the private connection-pool plugin. These stories mount the production selector, composer, quota banners, and run details/retry metadata. Routing requires manual operator configuration; there is no settings toggle. Accounts are fixtures; no live provider calls or instance mutations occur." } } }, render: args => } satisfies Meta; + title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Connection pools", component: PoolSurfaces, parameters: { layout: "fullscreen", docs: { description: { component: "All user-facing Core additions for the private connection-pool plugin. These stories mount the production selector, composer, quota banners, and run details/retry metadata. Routing requires manual operator configuration; there is no settings toggle. Accounts are fixtures; no live provider calls or instance mutations occur." } }, + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, render: args => } satisfies Meta; export default meta; type Story = StoryObj; export const AllCoreSurfaces: Story = { args: { scenario: "overview" } }; diff --git a/ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx b/ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx index 18b0cbb3ac5..5852514acf6 100644 --- a/ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx +++ b/ui/storybook/stories/runs-adapters/dot-runner-connection.stories.tsx @@ -35,7 +35,16 @@ function ConnectionForm() { const meta = { id: "assistant-connections-dot-runner", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/Assistant connections/Dot Runner", component: ConnectionForm, - parameters: { layout: "padded", docs: { description: { component: "Production Dot pairing component. API responses, pairing code and account state are synthetic. This preview does not qualify a real Dot account." } } }, + parameters: { layout: "padded", docs: { description: { component: "Production Dot pairing component. API responses, pairing code and account state are synthetic. This preview does not qualify a real Dot account." } }, + paperclip: { + "capabilities": [ + "runs-adapters/validation", + "gateways-profiles/client-connect" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, beforeEach: ({ parameters }) => installFixture(Boolean(parameters.connected)), } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx b/ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx index 57a7cf82cc9..9cd7e97bfe6 100644 --- a/ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx +++ b/ui/storybook/stories/runs-adapters/local-ai-subscription.stories.tsx @@ -6,7 +6,15 @@ const meta = { id: "ai-connections-provider-routing-07-subscription-sign-in", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/07 Subscription sign-in", component: LocalProviderLoginInstructions, - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx index 32cbb80c225..81d8b834bd4 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-00-overview.stories.tsx @@ -6,7 +6,16 @@ const meta = { id: "ai-connections-provider-routing-00-overview", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/00 Overview", component: ReviewIndex, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "implementation": "guide", + "boundary": "static", + "notes": "Review guide retained; explanatory content does not establish runtime or production coverage." + }, + }, ...reviewLifecycle, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx index ee0cf983ab7..ce639c8e9a7 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-01-onboarding.stories.tsx @@ -7,7 +7,17 @@ const meta = { id: "ai-connections-provider-routing-01-onboarding", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/01 Onboarding", component: Onboarding, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow." + }, + }, ...reviewLifecycle, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx index 04294737078..ed19e70e6c0 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-02-connect.stories.tsx @@ -11,7 +11,17 @@ const meta = { id: "ai-connections-provider-routing-02-connect", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/02 Connect", component: ConnectionSetup, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow." + }, + }, ...reviewLifecycle, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx index dd7b66339d1..4364e00d01e 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-03-agent.stories.tsx @@ -10,7 +10,17 @@ const meta = { id: "ai-connections-provider-routing-03-agent", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/03 Agent", component: AgentSetup, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow." + }, + }, ...reviewLifecycle, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx index 3b40f1b84ea..fdf6ba2d138 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-04-manage.stories.tsx @@ -7,7 +7,17 @@ const meta = { id: "ai-connections-provider-routing-04-manage", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/04 Manage", component: Management, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow." + }, + }, ...reviewLifecycle, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx index e1e9b33a8f1..14537f29481 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-05-recovery.stories.tsx @@ -7,7 +7,17 @@ const meta = { id: "ai-connections-provider-routing-05-recovery", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/05 Recovery", component: Recovery, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow." + }, + }, ...reviewLifecycle, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx b/ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx index 2454daf4179..540420d7ec1 100644 --- a/ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx +++ b/ui/storybook/stories/runs-adapters/provider-routing-06-production.stories.tsx @@ -163,7 +163,16 @@ function AgentConnectionModes() { const meta = { id: "ai-connections-provider-routing-06-production-components", title: "Agents and reusable capabilities/Runs, harnesses, and model accounts/AI Connections/Provider routing/06 Production components", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "runs-adapters/validation" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "Design-review route uses simulated account/provider state; audit the rendered subject before treating it as the live connection flow." + }, + }, decorators: [ (Story) => ( diff --git a/ui/storybook/stories/runs-adapters/session-goals.stories.tsx b/ui/storybook/stories/runs-adapters/session-goals.stories.tsx index 6658a1ae754..e4e34eb4dc4 100644 --- a/ui/storybook/stories/runs-adapters/session-goals.stories.tsx +++ b/ui/storybook/stories/runs-adapters/session-goals.stories.tsx @@ -169,6 +169,13 @@ const meta = { "Capability, status, active-turn, and pending-control states for the issue composer session-goal widget.", }, }, + paperclip: { + "capabilities": [ + "runs-adapters/session" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx b/ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx index 3e541190fae..3d962b4e9eb 100644 --- a/ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx +++ b/ui/storybook/stories/secrets/credential-access/01-notice.stories.tsx @@ -5,7 +5,16 @@ const meta = { id: "task-credential-access-01-notice", title: "Apps, channels, and extensions/Secrets and proposals/Task credential access/01 Notice", component: TaskChatMarker, - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "secrets/runtime-delivery", + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, decorators: [Story =>
], args: { item: { diff --git a/ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx b/ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx index 5914d100ef0..1c2c3862349 100644 --- a/ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx +++ b/ui/storybook/stories/secrets/credential-access/02-task-page.stories.tsx @@ -7,6 +7,14 @@ const meta = { component: CredentialTaskPage, parameters: { layout: "fullscreen", waitForViewport: true, docs: { description: { component: "Production task detail and app shell. The latest credential failure stays expanded in the conversation and names the selected credential. The settings link uses the existing agent runtime route. Example data is local to Storybook." } }, + paperclip: { + "capabilities": [ + "secrets/runtime-delivery", + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, args: { otherPerson: false, runtimeMode: "native", newerAttempt: false }, render: args => , diff --git a/ui/storybook/stories/secrets/environment-variables-editor.stories.tsx b/ui/storybook/stories/secrets/environment-variables-editor.stories.tsx index e0aaa83dc11..b0413b9c3a8 100644 --- a/ui/storybook/stories/secrets/environment-variables-editor.stories.tsx +++ b/ui/storybook/stories/secrets/environment-variables-editor.stories.tsx @@ -93,7 +93,15 @@ function Editor({ const meta: Meta = { id: "product-environment-variables-editor", title: "Apps, channels, and extensions/Secrets and proposals/Product/Environment Variables Editor", - parameters: { layout: "fullscreen", a11y: { test: "off" } }, + parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "secrets/runtime-delivery" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/secrets/proposal-review.stories.tsx b/ui/storybook/stories/secrets/proposal-review.stories.tsx index 71713cc0c3c..6f28384d694 100644 --- a/ui/storybook/stories/secrets/proposal-review.stories.tsx +++ b/ui/storybook/stories/secrets/proposal-review.stories.tsx @@ -51,7 +51,17 @@ const meta = { id: "feature-secret-proposal-review", title: "Apps, channels, and extensions/Secrets and proposals/Proposal review", component: ProposalReview, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "secrets/proposals" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { rows = parameters.fixtureState === "empty" diff --git a/ui/storybook/stories/secrets/secrets.stories.tsx b/ui/storybook/stories/secrets/secrets.stories.tsx index fb039058f1f..88c1e01aed7 100644 --- a/ui/storybook/stories/secrets/secrets.stories.tsx +++ b/ui/storybook/stories/secrets/secrets.stories.tsx @@ -125,6 +125,14 @@ const meta: Meta = { a11y: { test: "off", }, + paperclip: { + "capabilities": [ + "secrets/company-secrets", + "secrets/vault-import" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, }; diff --git a/ui/storybook/stories/secrets/user-secrets.stories.tsx b/ui/storybook/stories/secrets/user-secrets.stories.tsx index 43544b079e0..53e4c52dde1 100644 --- a/ui/storybook/stories/secrets/user-secrets.stories.tsx +++ b/ui/storybook/stories/secrets/user-secrets.stories.tsx @@ -142,7 +142,15 @@ function Section({ title, children }: { title: string; children: ReactNode }) { const meta: Meta = { id: "product-user-secrets", title: "Apps, channels, and extensions/Secrets and proposals/Product/User secrets", - parameters: { layout: "fullscreen", a11y: { test: "off" } }, + parameters: { layout: "fullscreen", a11y: { test: "off" }, + paperclip: { + "capabilities": [ + "secrets/user-secrets" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/skills/agent-skill-row.stories.tsx b/ui/storybook/stories/skills/agent-skill-row.stories.tsx index c90f4e411f2..9987e3f5964 100644 --- a/ui/storybook/stories/skills/agent-skill-row.stories.tsx +++ b/ui/storybook/stories/skills/agent-skill-row.stories.tsx @@ -45,7 +45,15 @@ const meta: Meta = { id: "agent-skills-agentskillrow", title: "Agents and reusable capabilities/Skills and Skill Studio/Agent Skills/AgentSkillRow", component: AgentSkillRow, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "skills/policy" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, decorators: [ (Story) => (
diff --git a/ui/storybook/stories/skills/agent-skills-edge.stories.tsx b/ui/storybook/stories/skills/agent-skills-edge.stories.tsx index 939846b4fdd..906525cadcb 100644 --- a/ui/storybook/stories/skills/agent-skills-edge.stories.tsx +++ b/ui/storybook/stories/skills/agent-skills-edge.stories.tsx @@ -194,7 +194,15 @@ function EdgeState({ agent, snapshot }: { agent: Agent; snapshot: AgentSkillSnap const meta: Meta = { id: "qa-agent-skills-edge-states", title: "Agents and reusable capabilities/Skills and Skill Studio/QA / Agent skills edge states", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "skills/policy" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/skills/agents-using-skill.stories.tsx b/ui/storybook/stories/skills/agents-using-skill.stories.tsx index d813286384f..749460d6c8b 100644 --- a/ui/storybook/stories/skills/agents-using-skill.stories.tsx +++ b/ui/storybook/stories/skills/agents-using-skill.stories.tsx @@ -121,7 +121,15 @@ function Seed({ skill, children }: { skill: CompanySkillDetail; children: ReactN const meta: Meta = { id: "skill-studio-agentsusingskill", title: "Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/AgentsUsingSkill", - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "skills/policy" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/skills/fork-skill-flow.stories.tsx b/ui/storybook/stories/skills/fork-skill-flow.stories.tsx index c635419c204..e7d41e57f86 100644 --- a/ui/storybook/stories/skills/fork-skill-flow.stories.tsx +++ b/ui/storybook/stories/skills/fork-skill-flow.stories.tsx @@ -154,7 +154,15 @@ function Seed({ const meta: Meta = { id: "skill-studio-editacopy", title: "Agents and reusable capabilities/Skills and Skill Studio/Skill Studio/EditACopy", - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "skills/authoring" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/skills/frontmatter-panel.stories.tsx b/ui/storybook/stories/skills/frontmatter-panel.stories.tsx index a09ae7bb3eb..731fe311d00 100644 --- a/ui/storybook/stories/skills/frontmatter-panel.stories.tsx +++ b/ui/storybook/stories/skills/frontmatter-panel.stories.tsx @@ -69,7 +69,15 @@ const meta: Meta = { id: "product-skill-studio-·-frontmatterpanel", title: "Agents and reusable capabilities/Skills and Skill Studio/Product/Skill Studio · FrontmatterPanel", component: Harness, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "skills/authoring" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/skills/github-skills-journey.stories.tsx b/ui/storybook/stories/skills/github-skills-journey.stories.tsx index aad4fb527d5..745137d29d1 100644 --- a/ui/storybook/stories/skills/github-skills-journey.stories.tsx +++ b/ui/storybook/stories/skills/github-skills-journey.stories.tsx @@ -96,6 +96,16 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "Sequential checkpoints in the real Paperclip app shell: company navigation, Skills sidebar, breadcrumbs, library, source dialogs, and skill details. Each story starts at a checkpoint and remains interactive. Start at 01 and import acme/team-skills, open Installed, assign Code review to an agent, then refresh Sources to discover Security review. API responses and assignments are local fixtures; no GitHub OAuth, downloads, agent runs, or real mutations occur." } }, + paperclip: { + "capabilities": [ + "skills/versions", + "skills/discovery", + "skills/policy" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "AssignToAgent and AssignedSkill demonstrate library/detail assignment with local policy fixtures. No runtime enforcement or backend persistence proof." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/skills/github-synced-skills.stories.tsx b/ui/storybook/stories/skills/github-synced-skills.stories.tsx index c6201f83214..8a16489b421 100644 --- a/ui/storybook/stories/skills/github-synced-skills.stories.tsx +++ b/ui/storybook/stories/skills/github-synced-skills.stories.tsx @@ -39,6 +39,15 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "Production Sources page with local fixture data. Try importing a repository, searching and selecting skills, saving the selection, and refreshing. GitHub OAuth and external destinations require the running app." } }, + paperclip: { + "capabilities": [ + "skills/versions", + "skills/discovery" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx b/ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx index baf30f5e971..f109a717521 100644 --- a/ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx +++ b/ui/storybook/stories/skills/repository-skill-packages/repository-skill-packages.stories.tsx @@ -6,7 +6,16 @@ const meta = { id: "skills-repository-packages", title: "Agents and reusable capabilities/Skills and Skill Studio/Skills/Repository packages", component: GitHubSkillsJourney, tags: ['!autodocs'], parameters: { layout: 'fullscreen', docs: { description: { component: - 'Production Skills UI in the app shell with repository fixtures. Repository files stay together. Select which skills appear in your library. No GitHub access or runtime execution occurs in this preview.' } } }, + 'Production Skills UI in the app shell with repository fixtures. Repository files stay together. Select which skills appear in your library. No GitHub access or runtime execution occurs in this preview.' } }, + paperclip: { + "capabilities": [ + "skills/versions", + "skills/discovery" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, args: { packageScenario: 'ready' }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/skills/skill-import-progress.stories.tsx b/ui/storybook/stories/skills/skill-import-progress.stories.tsx index 77a177d657d..f50fa2d7b44 100644 --- a/ui/storybook/stories/skills/skill-import-progress.stories.tsx +++ b/ui/storybook/stories/skills/skill-import-progress.stories.tsx @@ -8,7 +8,16 @@ const meta = { component: SkillImportProgress, args: { repository: 'acme/team-skills' }, decorators: [Story =>
], - parameters: { docs: { description: { component: 'Fixed scan checkpoints for visual review. Counters here are fixture data; the production dialog receives real GitHub scan events. The full-app journey includes timed streaming and cancellation.' } } }, + parameters: { docs: { description: { component: 'Fixed scan checkpoints for visual review. Counters here are fixture data; the production dialog receives real GitHub scan events. The full-app journey includes timed streaming and cancellation.' } }, + paperclip: { + "capabilities": [ + "skills/versions", + "skills/discovery" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx b/ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx index 11b17e2daee..bb1d86964d7 100644 --- a/ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx +++ b/ui/storybook/stories/skills/skill-policy-surfaces.stories.tsx @@ -45,6 +45,13 @@ const meta = { "Core Skill Studio permission surfaces. No permission chrome under the open default; an actionable denial banner appears only for explicit policy or platform-safety failures.", }, }, + paperclip: { + "capabilities": [ + "skills/policy" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/skills/skill-test-runs.stories.tsx b/ui/storybook/stories/skills/skill-test-runs.stories.tsx index 2a868c40fc7..202ce07ad61 100644 --- a/ui/storybook/stories/skills/skill-test-runs.stories.tsx +++ b/ui/storybook/stories/skills/skill-test-runs.stories.tsx @@ -21,6 +21,15 @@ const meta = { parameters: { layout: "fullscreen", initialEntries: ["/PAP/skills/studio/skill-gap"], + paperclip: { + "capabilities": [ + "skills/testing" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, beforeEach: ({ parameters }) => { const skill = makeSkill(); diff --git a/ui/storybook/stories/skills/skills-store-detail.stories.tsx b/ui/storybook/stories/skills/skills-store-detail.stories.tsx index 1661541bb91..cf8449d818e 100644 --- a/ui/storybook/stories/skills/skills-store-detail.stories.tsx +++ b/ui/storybook/stories/skills/skills-store-detail.stories.tsx @@ -203,7 +203,18 @@ const meta: Meta = { id: "skills-store-skill-detail", title: "Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Skill detail", component: SkillDetailHarness, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "skills/discovery", + "skills/versions", + "skills/policy" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, }; export default meta; diff --git a/ui/storybook/stories/skills/skills-store-discovery.stories.tsx b/ui/storybook/stories/skills/skills-store-discovery.stories.tsx index 3ffb36ab6db..379e2e6372c 100644 --- a/ui/storybook/stories/skills/skills-store-discovery.stories.tsx +++ b/ui/storybook/stories/skills/skills-store-discovery.stories.tsx @@ -309,7 +309,15 @@ const meta: Meta = { id: "skills-store-discovery-grid", title: "Agents and reusable capabilities/Skills and Skill Studio/Skills Store/Discovery grid", component: DiscoveryGridHarness, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "skills/discovery" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/status-cards/status-card-states.stories.tsx b/ui/storybook/stories/status-cards/status-card-states.stories.tsx index 8e38f4c653a..648ca8e72cf 100644 --- a/ui/storybook/stories/status-cards/status-card-states.stories.tsx +++ b/ui/storybook/stories/status-cards/status-card-states.stories.tsx @@ -19,7 +19,20 @@ const meta = { title: "Automation and structured work/Status cards/Authoring, updates and archive", component: StatusCardHost, - parameters: { layout: "padded", initialEntries: ["/status"] }, + parameters: { layout: "padded", initialEntries: ["/status"], + paperclip: { + "capabilities": [ + "status-cards/authoring", + "status-cards/generation", + "status-cards/inspection", + "status-cards/archive" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { let card = makeStatusCard({ state: parameters.cardState ?? "active", diff --git a/ui/storybook/stories/steering/composer-draft-recovery.stories.tsx b/ui/storybook/stories/steering/composer-draft-recovery.stories.tsx index 9d920ac52c6..7feb2bf5a1b 100644 --- a/ui/storybook/stories/steering/composer-draft-recovery.stories.tsx +++ b/ui/storybook/stories/steering/composer-draft-recovery.stories.tsx @@ -37,7 +37,17 @@ const meta = { id: "feature-composer-draft-recovery", title: "Tasks and conversations/Steering and queued messages/Draft recovery", component: Drafts, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "steering/drafts" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => { resetFixtureDraft(first); resetFixtureDraft(second); diff --git a/ui/storybook/stories/steering/composer-queued-messages.stories.tsx b/ui/storybook/stories/steering/composer-queued-messages.stories.tsx index d23c3ba4c9c..f9576a5218e 100644 --- a/ui/storybook/stories/steering/composer-queued-messages.stories.tsx +++ b/ui/storybook/stories/steering/composer-queued-messages.stories.tsx @@ -133,6 +133,17 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "The production queued-message strip sits above the production composer. Steer, edit, reorder, discard, and legacy interrupt can be tried locally." } }, + paperclip: { + "capabilities": [ + "steering/queue", + "steering/edit-order-discard", + "steering/steer", + "steering/interrupt" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, }, args: { protocol: "paperclip_runner_v1", steeringDisposition: "available", initialEdit: false, mobile: false }, } satisfies Meta; diff --git a/ui/storybook/stories/steering/durable-response-queue.stories.tsx b/ui/storybook/stories/steering/durable-response-queue.stories.tsx index 2b68d243216..517d6ea987b 100644 --- a/ui/storybook/stories/steering/durable-response-queue.stories.tsx +++ b/ui/storybook/stories/steering/durable-response-queue.stories.tsx @@ -97,6 +97,16 @@ const meta = { "Production queue with an immutable accepted response and remote-cleanup wait. Delivery uses local state; it does not prove persisted queues or runtime continuation.", }, }, + paperclip: { + "capabilities": [ + "steering/approval-queue", + "recovery/user-continuation" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/steering/interrupt-handoff.stories.tsx b/ui/storybook/stories/steering/interrupt-handoff.stories.tsx index dd15023b494..2aa94b93fde 100644 --- a/ui/storybook/stories/steering/interrupt-handoff.stories.tsx +++ b/ui/storybook/stories/steering/interrupt-handoff.stories.tsx @@ -101,6 +101,13 @@ function ActivityCard({ } const meta: Meta = { + parameters: { paperclip: { + "capabilities": [ + "steering/interrupt" + ], + "implementation": "production", + "boundary": "fixtures" + } }, id: "surfaces-interrupt-handoff", title: "Tasks and conversations/Steering and queued messages/Surfaces/Interrupt Handoff", }; diff --git a/ui/storybook/stories/steering/paused-composer.stories.tsx b/ui/storybook/stories/steering/paused-composer.stories.tsx index e5582e64078..be758efe855 100644 --- a/ui/storybook/stories/steering/paused-composer.stories.tsx +++ b/ui/storybook/stories/steering/paused-composer.stories.tsx @@ -13,6 +13,16 @@ const meta = { "Design preview: a paused task replaces the entire composer with an amber takeover. Resume restores the real composer; no dismiss, attachments, or sending while paused. Actions are local Storybook fixtures. See Tasks / Execution Controls for the current behavior.", }, }, + paperclip: { + "capabilities": [ + "steering/stop-and-pause" + ], + "status": "historical", + "implementation": "prototype", + "boundary": "fixtures", + "notes": "Retained local paused takeover; task-execution-controls exercises the shipped pause/stop controls.", + "replacement": "ui/storybook/stories/steering/task-execution-controls.stories.tsx" + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/steering/task-execution-controls.stories.tsx b/ui/storybook/stories/steering/task-execution-controls.stories.tsx index 735fff914a2..fce4a64f854 100644 --- a/ui/storybook/stories/steering/task-execution-controls.stories.tsx +++ b/ui/storybook/stories/steering/task-execution-controls.stories.tsx @@ -321,7 +321,16 @@ const meta = { id: "composer-execution-controls", title: "Tasks and conversations/Steering and queued messages/Composer/Execution controls", component: TaskExecutionExample, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "steering/stop-and-pause" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx b/ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx index 22638d9abf0..5c7c1615130 100644 --- a/ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx +++ b/ui/storybook/stories/task-coordination/issue-review-panel.stories.tsx @@ -100,6 +100,13 @@ const meta = { "Stalled reviews remain actionable in the Decisions queue after removing decision summaries from the issue header.", }, }, + paperclip: { + "capabilities": [ + "task-coordination/signoff" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx b/ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx index 09357f19d7d..35585c557b3 100644 --- a/ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx +++ b/ui/storybook/stories/task-coordination/monitor-surfaces.stories.tsx @@ -320,6 +320,13 @@ const meta = { "Surfaces the pinned monitor banner, composer strip, and IssueProperties Monitor row across the wireframe-04 states (scheduled / retrying / due / overdue / cleared) for UX review.", }, }, + paperclip: { + "capabilities": [ + "task-coordination/tree-control" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/task-coordination/originating-tasks.stories.tsx b/ui/storybook/stories/task-coordination/originating-tasks.stories.tsx index a7932689b58..2a1d3e4c06e 100644 --- a/ui/storybook/stories/task-coordination/originating-tasks.stories.tsx +++ b/ui/storybook/stories/task-coordination/originating-tasks.stories.tsx @@ -9,6 +9,15 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "UX prototype based on the existing PAP-1953 phase-topology fixture, with illustrative cross-project follow-ups. Renders the actual Layout and IssueDetail route, with the production TaskSidePanel. No replica page shell or CSS overrides. Full Task Page uses the production query wiring with fixture API responses. Both legacy and native run origins are included. Subtasks includes all subtasks; created work is grouped independently by project, so a created subtask appears in both sections. An unrelated task by the same agent is deliberately excluded. Subtasks reuse TaskDetailSubtasksPanel and its progress bar. All created work uses the same task rows, grouped by project or No project, without progress bars. Unfinished work precedes finished work. No counts on the Tasks tab, extra header, search, controls, or relationship tabs. Task navigation, local chat and side-panel tabs remain interactive. The story uses the production Tasks panel with fixture data." } }, + paperclip: { + "capabilities": [ + "task-coordination/delegation", + "projects/task-context" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { scenario: "mixed", fullPage: true, narrow: false }, decorators: [(Story, context) => ], diff --git a/ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx b/ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx index c35e4874b8b..922c6944631 100644 --- a/ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx +++ b/ui/storybook/stories/task-coordination/sub-issues-workflow.stories.tsx @@ -265,6 +265,15 @@ const meta = { "Review surface for the PAP-2189 checklist-style sub-issues work. Renders the IssuesList component with the Sub-issues panel props so the progress strip, workflow sort, step gutter, current marker, done de-emphasis, and blocker chips are all visible against a PAP-1953-like topology.", }, }, + paperclip: { + "capabilities": [ + "task-coordination/dependencies", + "task-coordination/delegation" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, decorators: [ (StoryRender) => ( diff --git a/ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx b/ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx index 3530f65f1db..5ee0895703a 100644 --- a/ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx +++ b/ui/storybook/stories/task-coordination/task-watchdog-surfaces.stories.tsx @@ -112,6 +112,13 @@ const meta = { "Surfaces the IssueProperties Watchdog row in empty / configured / triggered-and-linked variants for UX review of the task-watchdog configuration UI (PAP-11294).", }, }, + paperclip: { + "capabilities": [ + "task-coordination/tree-control" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx b/ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx index 78680e64901..9a9afc3fcc0 100644 --- a/ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx +++ b/ui/storybook/stories/tasks/assigned-backlog-safeguards.stories.tsx @@ -208,7 +208,17 @@ const meta = { id: "paperclip-assigned-backlog-safeguards", title: "Tasks and conversations/Task creation and lifecycle/Paperclip/Assigned Backlog Safeguards", component: AllStates, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "tasks/completion", + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/tasks/chat-comments.stories.tsx b/ui/storybook/stories/tasks/chat-comments.stories.tsx index ba2bbd8d0cc..75cb3db7fd0 100644 --- a/ui/storybook/stories/tasks/chat-comments.stories.tsx +++ b/ui/storybook/stories/tasks/chat-comments.stories.tsx @@ -1023,6 +1023,15 @@ const meta = { "Chat and comments stories exercise CommentThread, RunChatSurface, and IssueChatThread across empty, single, long, markdown, mention, timeline, queued, linked-run, and streaming transcript states.", }, }, + paperclip: { + "capabilities": [ + "tasks/discussion", + "runs-adapters/runs" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/completed-activity.stories.tsx b/ui/storybook/stories/tasks/completed-activity.stories.tsx index e91f190473d..20c0f657d85 100644 --- a/ui/storybook/stories/tasks/completed-activity.stories.tsx +++ b/ui/storybook/stories/tasks/completed-activity.stories.tsx @@ -25,6 +25,16 @@ const meta = { "Production runner activity group. Completed commentary groups collapse to short action summaries. No failure counts in either state. Expand to see the original one-line activity rows and their full details. The live stories show a group settling while the next group starts.", }, }, + paperclip: { + "capabilities": [ + "tasks/discussion", + "runs-adapters/runs" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/tasks/composer-add-menu.stories.tsx b/ui/storybook/stories/tasks/composer-add-menu.stories.tsx index 21cabf9d4d3..e3e58b6b877 100644 --- a/ui/storybook/stories/tasks/composer-add-menu.stories.tsx +++ b/ui/storybook/stories/tasks/composer-add-menu.stories.tsx @@ -115,6 +115,14 @@ const meta = { layout: "fullscreen", options: { showPanel: false }, docs: { description: { component: "The production task composer. The Add menu opens upward on desktop and as a dialog on mobile for files, supported goals, Plan mode, and Ask mode. Plan and Ask are exclusive; selecting a mode shows a removable chip. Cmd+. cycles standard, Plan, and Ask. Mobile stories include capsule agent avatars and the actual bottom navigation." } }, + paperclip: { + "capabilities": [ + "tasks/create" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { initialMode: "standard", goalAvailable: true, mobile: false, mobileContext: false, fullBleedMobileContext: false }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx b/ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx index d72f59ff0b7..763454c45c6 100644 --- a/ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx +++ b/ui/storybook/stories/tasks/composer-mobile-assignee.stories.tsx @@ -9,6 +9,15 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "The same assignee, model, and effort picker shown on desktop, in its responsive mobile dialog. Agent capsule avatars use the shared persona palettes." } }, + paperclip: { + "capabilities": [ + "tasks/create", + "runs-adapters/availability" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { agentId: "codex", mobile: true, compact: true, initialPanel: "agents" }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/composer-model-picker.stories.tsx b/ui/storybook/stories/tasks/composer-model-picker.stories.tsx index 6f3ff357324..c97a2b7c025 100644 --- a/ui/storybook/stories/tasks/composer-model-picker.stories.tsx +++ b/ui/storybook/stories/tasks/composer-model-picker.stories.tsx @@ -13,6 +13,16 @@ const meta = { docs: { description: { component: "The approved composer picker design and two matching stories using the production picker. The assignee capsule stays beside Send on desktop and mobile. The assignee determines the harness and catalog; changing assignees clears per-message overrides. Effort is selected only with a model-specific slider where levels are known. The picker animates its height as content changes and opens as a modal on mobile. Custom IDs are accepted for harnesses that support them, while OpenRouter requires openrouter/provider/model. A fast-mode icon sits to the left of the effort label only for supported known Codex models, and the reset icon sits to the right." } }, + paperclip: { + "capabilities": [ + "tasks/create", + "runs-adapters/availability" + ], + "status": "mixed", + "implementation": "mixed", + "boundary": "fixtures", + "notes": "Most examples use a local picker implementation; live picker examples use ComposerRunSettingsLiveStory. Do not count the whole suite as production parity. 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." + }, }, args: { agentId: "codex", initialPanel: "closed" }, render: (args) => , diff --git a/ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx b/ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx index 13b559243f3..60be4c645e0 100644 --- a/ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx +++ b/ui/storybook/stories/tasks/control-plane-surfaces.stories.tsx @@ -257,6 +257,17 @@ const meta = { "Product-surface stories exercise the board UI components that carry Paperclip's task, approval, budget, activity, and agent governance workflows.", }, }, + paperclip: { + "capabilities": [ + "tasks/organize", + "questions-and-approvals/governance", + "budgets-costs/budgets", + "activity/activity" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/dialogs-modals.stories.tsx b/ui/storybook/stories/tasks/dialogs-modals.stories.tsx index 3eb5327e95f..558febb783d 100644 --- a/ui/storybook/stories/tasks/dialogs-modals.stories.tsx +++ b/ui/storybook/stories/tasks/dialogs-modals.stories.tsx @@ -683,6 +683,17 @@ const meta = { "Open-state stories for Paperclip creation dialogs, workspace confirmations, document diffing, image attachments, and path helper modals.", }, }, + paperclip: { + "capabilities": [ + "tasks/create", + "agents/hire", + "projects/lifecycle", + "goals/hierarchy" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/external-objects.stories.tsx b/ui/storybook/stories/tasks/external-objects.stories.tsx index 2a0069bc1ac..6694e5b2771 100644 --- a/ui/storybook/stories/tasks/external-objects.stories.tsx +++ b/ui/storybook/stories/tasks/external-objects.stories.tsx @@ -682,6 +682,14 @@ const meta = { "External-object surface gallery: the §6 state matrix, the inline markdown decoration, the related-work section, and the project-rollup sidebar marker. Mirrors the Phase 6 acceptance set from the UX spec.", }, }, + paperclip: { + "capabilities": [ + "tasks/properties" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/issue-management.stories.tsx b/ui/storybook/stories/tasks/issue-management.stories.tsx index e147873165a..c53fb3540e9 100644 --- a/ui/storybook/stories/tasks/issue-management.stories.tsx +++ b/ui/storybook/stories/tasks/issue-management.stories.tsx @@ -883,6 +883,15 @@ const meta = { "Issue-management stories exercise the full list, column, grouping, property, document, filter, continuation, run, workspace, and quicklook surfaces.", }, }, + paperclip: { + "capabilities": [ + "tasks/properties", + "tasks/organize" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx b/ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx index f01c3efadc0..4613939e50f 100644 --- a/ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx +++ b/ui/storybook/stories/tasks/mobile-entity-pickers.stories.tsx @@ -46,6 +46,14 @@ const meta = { parameters: { layout: "fullscreen", viewport: { defaultViewport: "mobile1" }, + paperclip: { + "capabilities": [ + "tasks/create" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/new-task-composer.stories.tsx b/ui/storybook/stories/tasks/new-task-composer.stories.tsx index 5cebf9df7b6..0c93423b8f6 100644 --- a/ui/storybook/stories/tasks/new-task-composer.stories.tsx +++ b/ui/storybook/stories/tasks/new-task-composer.stories.tsx @@ -217,6 +217,16 @@ const meta = { "The production new-task dialog renders TaskChatComposer. An inset bar shared with queued messages holds the colored project picker and, for projects with isolation enabled, Worktrees. Choose a new worktree or reuse a project worktree. The shared editor supports agent, person, project, and task mentions plus skill and routine slash-command chips. Agent mentions show the agent's current avatar. The editor, add menu, work modes, assignee/model/effort picker, and send button are shared with task chat. Creation is mocked locally; no agents run.", }, }, + paperclip: { + "capabilities": [ + "tasks/create", + "workspaces/binding" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "WorktreePicker, ReuseWorktree, CreateWithReusedWorktree and NewWorktreeAfterReuse exercise workspace selection and submitted fixture request values. Actual admission/binding and execution remain outside this story. 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." + }, }, args: { scenario: "empty" }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/runner-activity.stories.tsx b/ui/storybook/stories/tasks/runner-activity.stories.tsx index 829817578a9..5aa883262f7 100644 --- a/ui/storybook/stories/tasks/runner-activity.stories.tsx +++ b/ui/storybook/stories/tasks/runner-activity.stories.tsx @@ -25,6 +25,16 @@ const meta = { "Production runner turn with deterministic event playback. Each commentary boundary starts a separate activity group. Compact groups roll through one tool or thinking item at a time. Expand a group to keep its history growing inline, and click any expanded row to inspect its detail. Pause, Next, and Replay control simulated events; no runner or task API is called.", }, }, + paperclip: { + "capabilities": [ + "tasks/discussion", + "runs-adapters/runs" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/tasks/successful-run-handoff.stories.tsx b/ui/storybook/stories/tasks/successful-run-handoff.stories.tsx index 5044a46281d..11cc23630fb 100644 --- a/ui/storybook/stories/tasks/successful-run-handoff.stories.tsx +++ b/ui/storybook/stories/tasks/successful-run-handoff.stories.tsx @@ -243,6 +243,15 @@ const meta = { component: SuccessfulRunHandoffStates, parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "tasks/completion", + "recovery/diagnosis" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx b/ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx index a2346dab7dd..1e6a96ea09a 100644 --- a/ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx +++ b/ui/storybook/stories/tasks/task-chat-chain-of-thought.stories.tsx @@ -162,7 +162,17 @@ const meta = { id: "tasks-task-chat-review-fixes", title: "Tasks and conversations/Task creation and lifecycle/Tasks/Task chat review fixes", component: ChainOfThoughtReview, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "tasks/discussion", + "runs-adapters/runs" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx b/ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx index 9454036c6e6..014409ef3bd 100644 --- a/ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx +++ b/ui/storybook/stories/tasks/task-chat-mobile-follow.stories.tsx @@ -50,6 +50,14 @@ const meta = { parameters: { layout: "fullscreen", docs: { description: { component: "Controlled output in the production thread and composer. At the bottom, updates stay visible. Scroll up to hold your reading position, then return to the bottom to resume following. Stop pauses the fixture; send a message to resume. No agent or provider calls." } }, + paperclip: { + "capabilities": [ + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, globals: { theme: "light", viewport: { value: "mobile", isRotated: false } }, } satisfies Meta; diff --git a/ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx b/ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx index 13c138382d6..f136409f2a1 100644 --- a/ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx +++ b/ui/storybook/stories/tasks/task-chat-system-notice.stories.tsx @@ -67,6 +67,14 @@ const meta = { "Compact control-plane notice used for structured task-thread events. Expand the row to inspect workspace metadata without presenting it as an agent reply.", }, }, + paperclip: { + "capabilities": [ + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, render: ({ item }) => , } satisfies Meta; diff --git a/ui/storybook/stories/tasks/task-context-notices.stories.tsx b/ui/storybook/stories/tasks/task-context-notices.stories.tsx index 945085fb208..f1703181ab3 100644 --- a/ui/storybook/stories/tasks/task-context-notices.stories.tsx +++ b/ui/storybook/stories/tasks/task-context-notices.stories.tsx @@ -48,7 +48,16 @@ const meta = { id: "tasks-context-notices", title: "Tasks and conversations/Task creation and lifecycle/Tasks/Context notices", component: TaskContextNotices, - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx b/ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx index db6f71466bf..ea6e2552248 100644 --- a/ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx +++ b/ui/storybook/stories/tasks/thread-human-identity/00-evidence.stories.tsx @@ -10,6 +10,14 @@ function ReviewGuide() {

These are representative fixtures, not a copy of private task data. The mixed journey uses the production shell, adapter, thread, and composer. Swap the viewer to verify that ownership follows authorUserId. Full Conversation includes all fixture messages. Sending is local to the preview.

; } -export default { id: "chat-comments-human-identity-00-review-guide", +export default { + parameters: { paperclip: { + "capabilities": [ + "tasks/discussion" + ], + "implementation": "guide", + "boundary": "static", + "notes": "Review guide retained; explanatory content does not establish runtime or production coverage. 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." + } }, id: "chat-comments-human-identity-00-review-guide", title: "Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/00 Review guide", component: ReviewGuide } satisfies Meta; export const DataFlow: StoryObj = {}; diff --git a/ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx b/ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx index f95ac6e2b64..6d29bb39a5f 100644 --- a/ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx +++ b/ui/storybook/stories/tasks/thread-human-identity/01-components.stories.tsx @@ -15,7 +15,16 @@ const meta = { id: "chat-comments-human-identity-01-components", title: "Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/01 Components", component: Bubble, args: { viewer: alexId, photo: null }, - parameters: { layout: "padded", docs: { description: { component: "Production adapter → model → TaskChatBubble → Identity. Other humans sit on the left on the same page surface as agents with their own name/photo; no-photo profiles use the shared initials fallback. Edit photo to exercise an uploaded Paperclip asset URL. External URLs use initials. The production avatar URL is taken from the company directory, never from the current viewer or the relay bot." } } }, + parameters: { layout: "padded", docs: { description: { component: "Production adapter → model → TaskChatBubble → Identity. Other humans sit on the left on the same page surface as agents with their own name/photo; no-photo profiles use the shared initials fallback. Edit photo to exercise an uploaded Paperclip asset URL. External URLs use initials. The production avatar URL is taken from the company directory, never from the current viewer or the relay bot." } }, + paperclip: { + "capabilities": [ + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx b/ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx index 0fea4b3e70b..1b4b65f176e 100644 --- a/ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx +++ b/ui/storybook/stories/tasks/thread-human-identity/02-task-journey.stories.tsx @@ -46,7 +46,16 @@ const meta = { id: "chat-comments-human-identity-02-mixed-author-journey", title: "Tasks and conversations/Task creation and lifecycle/Chat & Comments/Human identity/02 Mixed-author journey", component: Journey, args: { viewer: alexId, fullHistory: false }, - parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/human-identity-example"], docs: { story: { inline: false }, description: { component: "Representative turns from two humans and an agent in the production app shell and TaskChatThread, including its composer. Photos remain null so the shared initials fallback is visible. Swap the viewer: identity follows authorUserId. The default excerpt fits all three speakers in one view; Full Conversation includes all fixture messages. Sending is local to this preview." } } }, + parameters: { layout: "fullscreen", initialEntries: ["/PAP/issues/human-identity-example"], docs: { story: { inline: false }, description: { component: "Representative turns from two humans and an agent in the production app shell and TaskChatThread, including its composer. Photos remain null so the shared initials fallback is visible. Swap the viewer: identity follows authorUserId. The default excerpt fits all three speakers in one view; Full Conversation includes all fixture messages. Sending is local to this preview." } }, + paperclip: { + "capabilities": [ + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, } satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/storybook/stories/teams/team-catalog.stories.tsx b/ui/storybook/stories/teams/team-catalog.stories.tsx index f4359fb4b38..e33e48ca4ef 100644 --- a/ui/storybook/stories/teams/team-catalog.stories.tsx +++ b/ui/storybook/stories/teams/team-catalog.stories.tsx @@ -139,6 +139,17 @@ function Frame({ children, width = "max-w-3xl" }: { children: React.ReactNode; w } const meta: Meta = { + parameters: { paperclip: { + "capabilities": [ + "teams/preview", + "teams/discovery", + "teams/install", + "teams/configuration" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + } }, id: "surfaces-team-catalog", title: "Agents and reusable capabilities/Team packages and installation/Surfaces/Team Catalog", }; diff --git a/ui/storybook/stories/workspaces/browser-use-activity.stories.tsx b/ui/storybook/stories/workspaces/browser-use-activity.stories.tsx index bd359555029..0fdeb147650 100644 --- a/ui/storybook/stories/workspaces/browser-use-activity.stories.tsx +++ b/ui/storybook/stories/workspaces/browser-use-activity.stories.tsx @@ -21,6 +21,15 @@ const meta = { "The task-thread browser entry point, placed at the moment the browser was opened, including history and reopening a session. All data is simulated.", }, }, + paperclip: { + "capabilities": [ + "workspaces/services", + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { browser: browserFixture, onOpen: () => {} }, decorators: [ diff --git a/ui/storybook/stories/workspaces/browser-use-footer.stories.tsx b/ui/storybook/stories/workspaces/browser-use-footer.stories.tsx index a51134420ff..c778d180e90 100644 --- a/ui/storybook/stories/workspaces/browser-use-footer.stories.tsx +++ b/ui/storybook/stories/workspaces/browser-use-footer.stories.tsx @@ -26,6 +26,15 @@ const meta = { "The quiet footer: contextual Stop browsing and an options menu with automatic fitting and fixed viewport presets. Costs are recorded on the task and hidden here. Countdown appears only at five minutes or less. Keep browsing resets idle time; it cannot extend the provider’s lifetime limit.", }, }, + paperclip: { + "capabilities": [ + "workspaces/services", + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { browser: idle(600), diff --git a/ui/storybook/stories/workspaces/browser-use.stories.tsx b/ui/storybook/stories/workspaces/browser-use.stories.tsx index f132beed510..684e3309c20 100644 --- a/ui/storybook/stories/workspaces/browser-use.stories.tsx +++ b/ui/storybook/stories/workspaces/browser-use.stories.tsx @@ -25,6 +25,15 @@ const meta = { "Production Browser panel with offline provider fixtures. Fit to pane follows the available viewport after a short debounce. Fixed presets retain their dimensions. The provider interaction is mocked; live resize support was tested separately. No credentials or paid runs are used.", }, }, + paperclip: { + "capabilities": [ + "workspaces/services", + "tasks/discussion" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, }, args: { issueId: "browser-story" }, beforeEach: () => mockBrowserUse(), diff --git a/ui/storybook/stories/workspaces/searchable-select.stories.tsx b/ui/storybook/stories/workspaces/searchable-select.stories.tsx index 1600f40fcaa..f6f6d97d57b 100644 --- a/ui/storybook/stories/workspaces/searchable-select.stories.tsx +++ b/ui/storybook/stories/workspaces/searchable-select.stories.tsx @@ -187,7 +187,15 @@ function FormContext({ triggerClassName }: { triggerClassName?: string }) { const meta = { id: "components-searchableselect-workspace-picker", title: "Projects and execution/Workspaces, services, and files/Components/SearchableSelect/Workspace picker", - parameters: { layout: "centered" }, + parameters: { layout: "centered", + paperclip: { + "capabilities": [ + "workspaces/binding" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, } satisfies Meta; export default meta; diff --git a/ui/storybook/stories/workspaces/workspace-close.stories.tsx b/ui/storybook/stories/workspaces/workspace-close.stories.tsx index 8ba528a540d..98e4bea2d35 100644 --- a/ui/storybook/stories/workspaces/workspace-close.stories.tsx +++ b/ui/storybook/stories/workspaces/workspace-close.stories.tsx @@ -27,7 +27,17 @@ const meta = { title: "Projects and execution/Workspaces, services, and files/Close readiness", component: CloseWorkspace, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "workspaces/closure" + ], + "status": "current", + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, beforeEach: ({ parameters }) => prepareFixtureApi( [ diff --git a/ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx b/ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx index 72bc848e765..fc23caf627b 100644 --- a/ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx +++ b/ui/storybook/stories/workspaces/workspace-file-browser.stories.tsx @@ -199,7 +199,15 @@ function Placement() { const meta: Meta = { id: "issue-workspace-file-browser", title: "Projects and execution/Workspaces, services, and files/Issue/Workspace File Browser", - parameters: { layout: "fullscreen" }, + parameters: { layout: "fullscreen", + paperclip: { + "capabilities": [ + "workspaces/files-git" + ], + "implementation": "production", + "boundary": "fixtures" + }, + }, }; export default meta; diff --git a/ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx b/ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx index 7dfdcc6c46d..734416c8acf 100644 --- a/ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx +++ b/ui/storybook/stories/workspaces/workspace-runtime-provisioning.stories.tsx @@ -40,7 +40,16 @@ const meta: Meta = { id: "workspaces-runtime-provisioning-status", title: "Projects and execution/Workspaces, services, and files/Workspaces/Runtime provisioning status", component: RuntimeProvisionStatusValue, - parameters: { layout: "padded" }, + parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "workspaces/provisioning" + ], + "implementation": "production", + "boundary": "fixtures", + "notes": "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." + }, + }, }; export default meta; diff --git a/ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx b/ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx index f542218f387..2009099fd4e 100644 --- a/ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx +++ b/ui/storybook/stories/workspaces/workspace-service-control-bar.stories.tsx @@ -25,6 +25,13 @@ const meta: Meta = { component: WorkspaceServiceControlBar, parameters: { layout: "padded", + paperclip: { + "capabilities": [ + "workspaces/services" + ], + "implementation": "production", + "boundary": "fixtures" + }, }, args: { onAction: noop, diff --git a/ui/storybook/support/feature-map/FeatureOverview.tsx b/ui/storybook/support/feature-map/FeatureOverview.tsx index 025616fb8eb..b4c8429a0be 100644 --- a/ui/storybook/support/feature-map/FeatureOverview.tsx +++ b/ui/storybook/support/feature-map/FeatureOverview.tsx @@ -1,15 +1,22 @@ import { useEffect, useMemo, useState } from "react"; -import ReactMarkdown from "react-markdown"; +import ReactMarkdown, { defaultUrlTransform } from "react-markdown"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; -import catalog from "../../../../maps/storybook-map/catalog.json"; +import catalog from "../../generated/catalog.json"; import featureIndex from "../../generated/feature-index.json"; type Entry = Omit<(typeof catalog.entries)[number], "capabilities" | "home"> & { capabilities: string[]; home?: string }; const entries: Entry[] = catalog.entries; type IndexEntry = { id: string; type: string; importPath: string }; +type Capability = { + id: string; + label: string; + description: string; + verification?: { scope: string; storybook: string; production: string; sources: string }; +}; +type Feature = { id: string; title: string; description: string; capabilities: Capability[] }; const recipeRoot = "https://github.com/paperclipai/paperclip/blob/master/maps/feature-map/"; -const allFeatures = featureIndex.sections.flatMap(section => section.features); +const allFeatures: Feature[] = featureIndex.sections.flatMap(section => section.features); const examples = entries.filter(entry => entry.implementation !== "guide"); const featureHref = (id: string) => `./?path=/story/feature-map-${id}--overview`; @@ -123,6 +130,7 @@ export function FeatureOverview({ area }: { area: string }) {

{feature.title}

{feature.description}

Feature recipe and verification steps + Agent access contract

Capabilities follow the feature recipe in the same order. Related suites may live under another feature. A suite link does not establish that every behavior has an example or passed a test.

{error ?

Example links could not load. Reload to try again.

: null} @@ -139,6 +147,12 @@ export function FeatureOverview({ area }: { area: string }) { {suites.length ?
    {suites.map(entry => )}
:

No cataloged example yet. Use the feature recipe for entry points, verification steps, and known limits.

} + {capability.verification ?
+ Verification scope +

{capability.verification.storybook}

+

Production verification: {capability.verification.production}

+ defaultUrlTransform(new URL(url, `${recipeRoot}${area}.md`).href)}>{capability.verification.sources} +
: null} ); })}