AW-21 — Capability & playbook catalogue · Tasks
Epic: AW-21-capability-catalog · Program: Agent Workspace
Spec: spec.md · Plan: plan.md
Status: Draft v1 · Owner: Engineering · Date: 2026-09-06
Execute top to bottom. Every task names the files it creates or modifies and what "done" means.
[P1] / [P2] / [P3] is the phase from plan.md §11; each phase leaves
develop green on its own.
Conventions this repo enforces, applied to every task below without repeating them:
kebab-case filenames · tabs, width 4, single quotes, semicolons, no trailing commas · Jest in
packages/agent and apps/api, Vitest in packages/plugin* and web unit specs, Playwright in
apps/web/e2e · conventional commits (feat: / test: / chore:).
Phase 1 — The catalogue, read-only
Contracts and the plugin capability
T001 [P1] — Playbook contract types
Create packages/contracts/src/playbook/playbook-catalog.types.ts and
packages/contracts/src/playbook/index.ts; export from packages/contracts/src/index.ts.
Define exactly the types in plan.md §3.5:
PlaybookTriggerKind, PlaybookCategory, PlaybookCostBand, PlaybookArtefactKind,
PlaybookEscalationTarget, PlaybookStep, PlaybookConnectionNeed, PlaybookArtefact,
PlaybookEscalationPoint, PlaybookCaps, PlaybookTrigger, PlaybookProvision,
PlaybookCatalogEntry. All fields readonly. guardrailsAtAdoption is typed against the
existing AgentGuardrails shape.
Done: pnpm --filter @ever-works/contracts build emits declarations; nothing imports
@ever-works/agent from packages/contracts.
T002 [P1] — Playbook validator
Add validatePlaybookEntry(value: unknown): string | null to
packages/contracts/src/playbook/playbook-catalog.types.ts, returning the first violation:
slug matches ^[a-z0-9][a-z0-9-]{0,63}$; 2–8 steps; title ≤ 120, outcome ≤ 200, summary ≤ 600,
step title ≤ 120, reason ≤ 200; version is MAJOR.MINOR.PATCH; category and cost band are known
values. Add comparePlaybookVersions(a, b): -1|0|1.
Done: packages/contracts/src/playbook/__tests__/playbook-catalog.spec.ts (Vitest) covers
every violation branch and the version comparator, including 1.10.0 > 1.9.0.
T003 [P1] — Capability constant
Modify packages/plugin/src/contracts/facade-capabilities.ts: append
PLAYBOOK_PROVIDER: 'playbook-provider' to PLUGIN_CAPABILITIES with a comment naming this epic.
Done: appended, nothing reordered or removed.
T004 [P1] — Capability interface
Create packages/plugin/src/contracts/capabilities/playbook-provider.interface.ts defining
IPlaybookProviderPlugin with listPlaybooks(options): Promise<{ entries; total }> and
getPlaybook(slug, settings?): Promise<PlaybookCatalogEntry | null>, plus
PlaybookCatalogListOptions { limit; offset; category?; search?; settings? }. Export from
packages/plugin/src/contracts/capabilities/index.ts.
Done: pnpm --filter @ever-works/plugin build passes.
T005 [P1] — First-party plugin package skeleton
Create packages/plugins/everworks-playbooks/ with package.json, tsup.config.ts,
tsconfig.json, vitest.config.ts, src/index.ts, modelled file-for-file on
packages/plugins/everworks-skills/. everworks.plugin block: id: 'everworks-playbooks',
name: 'Ever Works Playbooks', category: 'utility', capabilities: ['playbook-provider'],
autoEnable: true, defaultForCapabilities: ['playbook-provider'], distribution: 'registry'.
Done: pnpm build:plugins builds it; pnpm --filter @ever-works/everworks-playbooks-plugin test
passes with no tests yet.
T006 [P1] — The 8 built-in playbooks
Create packages/plugins/everworks-playbooks/src/builtin-catalog.ts exporting a frozen
BUILTIN_PLAYBOOKS: readonly PlaybookCatalogEntry[] with exactly the 8 slugs in
plan.md §7. Every entry declares all fields from T001. At least
5 declare no required connection. Every provision.agentTemplateSlug is one of the 6 slugs in
packages/agent/src/agents/agent-templates.ts; every provision.skillSlugs entry exists in the
first-party skill catalogue.
Done: the file compiles and every entry passes validatePlaybookEntry.
T007 [P1] — Plugin implementation
Create packages/plugins/everworks-playbooks/src/everworks-playbooks.plugin.ts implementing
IPlaybookProviderPlugin over BUILTIN_PLAYBOOKS, with an optional remote manifest source
(1 h TTL, in-memory cache, stale-serve ≤ 24 h) that is off unless configured and always merged
under the built-ins. Every remote string is HTML-stripped and length-capped per T002; an entry
failing validation is dropped with a warn, never thrown.
Done: built-ins are returned when the remote source is unset, unreachable, or malformed.
T008 [P1] — Plugin settings schema
In the same file, declare the settings schema: remoteManifestUrl (string, optional),
remoteManifestToken (string, optional, x-secret: true), cacheTtlSeconds (integer,
default 3600). Never log or return the token.
Done: the token field carries x-secret: true; a settings-serialisation test asserts it is
stripped.
T009 [P1] — Plugin unit tests
Create packages/plugins/everworks-playbooks/src/everworks-playbooks.plugin.spec.ts and
packages/plugins/everworks-playbooks/src/builtin-catalog.spec.ts covering everything in
plan.md §10.1.
Done: both green; the integrity spec fails if a built-in references an unknown agent-template
or skill slug.
T010 [P1] — Canonical plugin doc
Modify docs/plugin-system/built-in-plugins.md: add everworks-playbooks with its capability.
Update no other count anywhere (Constitution VIII).
Done: the new plugin appears exactly once in the repo's canonical list.
Facade and API
T011 [P1] — Playbook catalogue facade
Create packages/agent/src/facades/playbook-catalog.facade.ts
(PlaybookCatalogFacadeService extends BaseFacadeService,
CAPABILITY = PLUGIN_CAPABILITIES.PLAYBOOK_PROVIDER), modelled on
packages/agent/src/facades/skills.facade.ts: resolve enabled providers for the scope, fan out,
dedupe by slug with the version-wins rule, page size 200, hard cap 2000 entries, a throwing
provider is logged and skipped. Register in packages/agent/src/facades/facades.module.ts and
export from packages/agent/src/facades/index.ts.
Done: packages/agent/src/facades/__tests__/playbook-catalog.facade.spec.ts covers fan-out,
dedupe, version-wins, the cap, and provider failure isolation.
T012 [P1] — Readiness service
Create packages/agent/src/services/playbook-readiness.service.ts resolving the four readiness
states, the missing-capability list (capability names + resolving plugin id as data), the two
blockers (ceiling 25, copy limit 3 — both read as 0 in P1 since no adoptions exist yet), the
agent-name collision suggestion, a 2 s budget after which unresolved checks are returned as
unknown, and a 60 s per-scope cache.
Done: packages/agent/src/services/__tests__/playbook-readiness.service.spec.ts covers every
state, both limits at their exact boundary, the collision suggestion and the partial result.
T013 [P1] — Adoption planner (pure)
Create packages/agent/src/services/playbook-adoption-plan.ts exporting
planAdoption(entry, input): AdoptionPlan and hashAdoptionPlan(plan): string (SHA-256 hex).
Pure, no IO. This one function is the single source of both the setup sheet's itemised list and
the executor's step list.
Done: packages/agent/src/services/__tests__/playbook-adoption-plan.spec.ts asserts the plan
item count equals the executor's step count for all 8 built-ins, and that the hash changes when
the entry version changes.
T014 [P1] — Catalogue service
Create apps/api/src/catalog/playbook-catalog.service.ts: merge facade output, apply
sanitisation caps, expose getIndex, listPlaybooks, getPlaybook, and a 300 s per-scope cache.
Report source: 'builtin' | 'remote' | 'merged' and staleSince when serving stale.
Done: unit-covered by the controller spec in T017.
T015 [P1] — Catalogue DTOs
Create apps/api/src/catalog/catalog.dto.ts with ListPlaybooksDto, PreflightDto,
AdoptPlaybookDto, RemoveArtifactsDto exactly as in
plan.md §4.1, using class-validator decorators (@IsIn,
@IsUUID, @Length, @Matches, @Min, @Max, @ArrayMaxSize).
Done: limit clamps at 50; search requires 2–64 chars; localTime rejects 24:00.
T016 [P1] — Catalogue controller and module
Create apps/api/src/catalog/catalog.controller.ts (@Controller('api/catalog'),
@UseGuards(AuthSessionGuard), @ApiTags('catalog'), @ApiBearerAuth(),
@Header('Cache-Control','private, no-store')) with the four P1 routes: GET /,
GET /playbooks, GET /playbooks/:slug, POST /playbooks/:slug/preflight. Throttles 60/60/60/30
per minute. Create apps/api/src/catalog/catalog.module.ts and register it in
apps/api/src/api.module.ts.
Done: routes appear in the OpenAPI document; GET /api/catalog returns five sections with a
per-section error field rather than a 500 when one source throws.
T017 [P1] — Catalogue controller spec
Create apps/api/src/catalog/catalog.controller.spec.ts covering
plan.md §10.3 row 1.
Done: green, including the "one failing source does not 500 the index" case.
Web — index, detail, workflows
T018 [P1] — Routes and constants
Modify apps/web/src/lib/constants.ts: add DASHBOARD_CATALOG: '/catalog',
DASHBOARD_CATALOG_PLAYBOOK: (slug) => '/catalog/playbooks/' + slug,
DASHBOARD_CATALOG_ADOPTIONS: '/catalog/adoptions',
DASHBOARD_CATALOG_ADOPTION: (id) => '/catalog/adoptions/' + id,
DASHBOARD_CATALOG_WORKFLOWS: '/catalog/workflows',
DASHBOARD_CATALOG_WORKFLOW: (id) => '/catalog/workflows/' + id.
Done: no existing constant's value changes.
T019 [P1] — API clients
Create apps/web/src/lib/api/catalog.ts and apps/web/src/lib/api/workflows.ts, both
import 'server-only' and built on serverFetch / serverMutation from
apps/web/src/lib/api/server-api.ts. workflows.ts wraps the existing api/workflows routes
— no new backend.
Done: typed against the T001 contracts; every method degrades to a typed error result rather
than throwing.
T020 [P1] — BFF proxies
Create apps/web/src/app/api/catalog/route.ts, .../catalog/playbooks/route.ts,
.../catalog/playbooks/[slug]/route.ts, .../catalog/playbooks/[slug]/preflight/route.ts.
Forward the active scope header; return the upstream status verbatim (no 200-with-[] masking).
Done: a 502 upstream surfaces as a 502 so the section can render its error state.
T021 [P1] — i18n keys (English)
Modify apps/web/messages/en.json: add the full dashboard.catalogPage namespace from
plan.md §8, plus dashboard.sidebar.navigation.catalog and
metadata.pages.catalog.
Done: every leaf name is camelCase and contains no literal .; pnpm --filter web test
i18n lint passes.
T022 [P1] — Locale parity sync
Run the locale parity-sync script so all 20 sibling files under apps/web/messages/ carry the
full dashboard.catalogPage path (a missing parent key collapses the whole subtree).
Done: every locale file contains the dashboard.catalogPage object; English deep-merge
fallback fills untranslated leaves.
T023 [P1] — Catalogue index page
Create apps/web/src/app/[locale]/(dashboard)/catalog/page.tsx (RSC) with one Promise.all of
five independently .catch()-guarded fetches, plus generateMetadata from
metadata.pages.catalog.
Done: first paint needs no client fetch; a failing source yields that section's error slot
only.
T024 [P1] — Index components
Create apps/web/src/components/catalog/: CatalogShell.tsx (client — search, both chip rows,
keyboard per FR-61), CatalogSection.tsx, PlaybookCard.tsx, ReadinessChip.tsx (client),
TaskTemplateMiniCard.tsx, StartingPointsRow.tsx. Reuse
apps/web/src/components/common/EmptyState.tsx for all five empty states.
Done: all copy comes from dashboard.catalogPage; readiness never relies on colour alone;
skeletons cause no layout shift when readiness resolves.
T025 [P1] — Playbook detail page
Create apps/web/src/app/[locale]/(dashboard)/catalog/playbooks/[slug]/page.tsx and
apps/web/src/components/catalog/PlaybookDetail.tsx rendering the eight labelled blocks from
spec §6.6 and the readiness panel. In P1 the primary button links to /agents/new with the label
Build it yourself; the Set it up behaviour lands in T033.
Done: an unknown slug renders a 404; every block renders non-empty for all 8 built-ins.
T026 [P1] — Workflows list and run pages
Create apps/web/src/app/[locale]/(dashboard)/catalog/workflows/page.tsx,
.../catalog/workflows/[id]/page.tsx, apps/web/src/components/catalog/WorkflowList.tsx and
apps/web/src/components/catalog/WorkflowRunTrace.tsx over the existing
api/workflows routes. Run posts to POST /api/workflows/:id/run and shows the returned run
id; an archived workflow's Run is replaced by Reactivate.
Done: the run control returns in under 1 s; the trace shows nodes, per-node outcome, edges
traversed, decision choices and the truncated output.
T027 [P1] — Sidebar entry
Modify apps/web/src/components/dashboard/DashboardSidebar.tsx: add one nav entry after
templates, labelled from dashboard.sidebar.navigation.catalog, pointing at
ROUTES.DASHBOARD_CATALOG.
Done: no existing entry moves; the active-route highlight works for /catalog and its
children.
T028 [P1] — P1 tests
Create apps/web/src/components/catalog/CatalogShell.unit.spec.tsx and
apps/web/src/components/catalog/PlaybookCard.unit.spec.tsx (Vitest), and the Playwright specs
apps/web/e2e/flow-capability-catalog-browse.spec.ts,
apps/web/e2e/flow-catalog-workflows-run.spec.ts,
apps/web/e2e/flow-playbook-preflight-blocked.spec.ts,
apps/web/e2e/flow-catalog-access-readonly.spec.ts. Extend the existing deep accessibility spec
to cover /catalog and one playbook detail page.
Done: all green locally and in CI; the accessibility pass reports no serious or critical
violations.
Phase 2 — Adoption
Schema
T029 [P2] — Entities
Create packages/agent/src/entities/playbook-adoption.entity.ts and
packages/agent/src/entities/playbook-adoption-artifact.entity.ts exactly as specified in
plan.md §3.2–§3.3. Use
PortableDateColumn from packages/agent/src/entities/_types.ts for every timestamp column —
a raw type: 'timestamp' makes the better-sqlite3 CI stack fail to boot. Declare the partial
unique index with TypeORM's where option.
Done: both entities compile; no @ManyToOne on agentId or artifactId.
T030 [P2] — Entity registration (four files + repositories)
Modify packages/agent/src/entities/index.ts,
packages/agent/src/database/_entity-names.ts (alphabetical),
packages/agent/src/database/_entities-inventory.ts,
packages/agent/src/database/_repository-inventory.ts; create
packages/agent/src/database/repositories/playbook-adoption.repository.ts and
.../playbook-adoption-artifact.repository.ts; add barrel lines to
packages/agent/src/database/index.ts.
Done: packages/agent/src/database/database.module.spec.ts drift checks pass.
T031 [P2] — Migration (same PR as T029, Constitution V)
Create apps/api/src/migrations/1791210000000-CreatePlaybookAdoptions.ts. up() creates
playbook_adoptions and playbook_adoption_artifacts plus all seven indexes, including the raw
CREATE UNIQUE INDEX uq_playbook_adoptions_inflight ON playbook_adoptions (userId, playbookSlug) WHERE status = 'provisioning'. down() drops them in reverse. Alters no existing table.
Done: pnpm typeorm migration:run applies cleanly on a fresh database and on one already
carrying every migration on develop (re-stamp before merge if one is newer than this file); migration:generate afterwards proposes nothing.
Background work
T032 [P2] — Dispatcher symbol and payload
Create packages/agent/src/tasks/playbook-adoption.types.ts (PlaybookAdoptionPayload { adoptionId; userId } — ids only) and
packages/agent/src/tasks/playbook-adoption-dispatcher.ts (interface +
PLAYBOOK_ADOPTION_DISPATCHER = Symbol(...), returning Promise<string | null>). Register the
name in packages/agent/src/tasks/_tasks-symbols.ts, wire it in
packages/agent/src/tasks/job-runtime.providers.ts, export from
packages/agent/src/tasks/index.ts.
Done: the symbol-drift spec passes; no call site imports a vendor SDK.
T033 [P2] — Trigger.dev adapter
Create packages/tasks/src/dispatchers/playbook-adoption.dispatcher.ts, modelled on
packages/tasks/src/dispatchers/workflow-run.dispatcher.ts. Returns null (never throws) when
the runtime is unconfigured.
Done: packages/tasks/src/dispatchers/playbook-adoption.dispatcher.spec.ts covers the
configured and unconfigured paths.
T034 [P2] — Adoption executor
Create packages/agent/src/services/playbook-adoption-executor.service.ts running the six steps
from plan.md §6.3 through the existing services:
AgentTemplatesService (packages/agent/src/agents/agent-templates.service.ts),
SkillsService.installFromCatalog + createBinding (packages/agent/src/skills/skills.service.ts),
TaskTemplatesService.create (packages/agent/src/tasks-domain/task-templates.service.ts),
AgentsService.update for guardrails and heartbeat cadence
(packages/agent/src/agents/agents.service.ts),
InboundTriggersService.create (packages/agent/src/triggers/inbound-triggers.service.ts),
WorkflowsService.create (packages/agent/src/services/workflows.service.ts).
Each step checks for its own artefact row first, writes the artefact row and bumps stepIndex in
one transaction, and never edits an existing row's configuration.
Done: re-running the executor against a completed adoption creates nothing; a step-2 failure
leaves step 1's artefacts and sets status: 'failed' with a failureCode.
T035 [P2] — Worker task and module
Create packages/tasks/src/tasks/trigger/playbook-adoption.task.ts
(task({ id: 'playbook-adoption', maxAttempts: 3 }), withWorkerContext, assertUuid on both
ids) and packages/tasks/src/trigger/worker/modules/trigger-playbook-adoption.module.ts,
following trigger-workflow-run.module.ts. Register in packages/tasks/src/index.ts.
Done: the task is discoverable by the trigger deploy; a redelivery resumes rather than
duplicates.
T036 [P2] — Stuck-adoption sweeper
Create packages/tasks/src/tasks/trigger/playbook-adoption-sweeper.task.ts —
schedules.task({ id: 'playbook-adoption-sweeper', cron: '11 * * * *' }). Moves any adoption in
provisioning for more than 15 minutes to failed with failureCode: 'timed_out'.
Done: the cron slot 11 * * * * is unused elsewhere in packages/tasks/src/tasks/trigger/;
a unit spec covers the boundary at exactly 15 minutes.
API and lifecycle
T037 [P2] — Adoption service
Create packages/agent/src/services/playbook-adoption.service.ts: adopt (validate plan hash,
re-check required connections, enforce the 25-adoption ceiling and 3-copy limit, insert the row,
dispatch, mark dispatch_failed on a null dispatch), resume, pause,
resumeSchedule, retire, list, get (with derived artefact changed / missing), and
dismissGraduation.
Done: packages/agent/src/services/__tests__/playbook-adoption-lifecycle.service.spec.ts
covers every legal and illegal transition and both limits at their exact boundary.
T038 [P2] — Adoption controller
Create apps/api/src/catalog/playbook-adoptions.controller.ts with the nine adoption routes from
plan.md §4 and the throttles listed there. Register in
apps/api/src/catalog/catalog.module.ts. Add POST /playbooks/:slug/adopt to
catalog.controller.ts.
Done: every error code in plan.md §4.3 is reachable and asserted.
T039 [P2] — Adoption controller spec + DI contract spec
Create apps/api/src/catalog/playbook-adoptions.controller.spec.ts and
apps/api/src/catalog/catalog.module.di-contract.spec.ts (modelled on
apps/api/src/tasks/tasks.module.di-contract.spec.ts).
Done: the DI spec fails if the facade or the dispatcher symbol is not bound.
Web
T040 [P2] — Server actions
Create apps/web/src/app/actions/catalog.ts ('use server') with
adoptPlaybookAction, resumeAdoptionAction, pauseAdoptionAction,
resumeAdoptionScheduleAction, retireAdoptionAction, each returning
{ success, …, error } result objects rather than throwing — the pattern in
apps/web/src/app/actions/skills.ts.
Done: every action re-validates the affected route on success.
T041 [P2] — Setup sheet
Create apps/web/src/components/catalog/PlaybookSetupSheet.tsx (client): three editable fields
(instance name, run time, Work scope), the itemised plan, the plan hash carried through to
confirm, the duplicate warning, the collision note, focus trap and focus return. Wire the detail
page's primary button to it, replacing T025's placeholder link.
Done: the sheet's item list is rendered from the preflight plan.items — it never composes
its own list.
T042 [P2] — Adoption progress, card, failure panel, list page
Create apps/web/src/components/catalog/AdoptionProgress.tsx (2 s poll while provisioning,
stop on terminal, hard stop after 150 polls), AdoptionCard.tsx, AdoptionArtifactList.tsx, and
the pages apps/web/src/app/[locale]/(dashboard)/catalog/adoptions/page.tsx and
.../catalog/adoptions/[id]/page.tsx.
Done: the failure panel lists created / not-created items with Try again,
Remove what was created (disabled until P3) and Leave it as is.
T043 [P2] — Already set up state on cards
Modify apps/web/src/components/catalog/PlaybookCard.tsx and ReadinessChip.tsx to render the
adopted readiness with a link to the adoption.
Done: a workspace with one adoption shows the chip on exactly that card.
T044 [P2] — P2 i18n
Modify apps/web/messages/en.json with the setup.*, progress.*, adoption.* groups from
plan.md §8; re-run the locale parity sync.
Done: no hardcoded English in any P2 component.
T045 [P2] — P2 tests
Create apps/web/e2e/flow-playbook-adoption.spec.ts,
apps/web/e2e/flow-playbook-adoption-failure-resume.spec.ts,
apps/web/e2e/flow-playbook-limits.spec.ts, plus
packages/agent/src/services/__tests__/playbook-adoption-executor.service.spec.ts.
Done: the adoption e2e asserts the created rows match the sheet's itemised list exactly, and
that the created Agent's guardrails are require_approval.
Phase 3 — Living with it
T046 [P3] — Artefact removal endpoint
Add POST /api/catalog/adoptions/:id/remove-artifacts to
apps/api/src/catalog/playbook-adoptions.controller.ts and the corresponding service method.
Per-item results (removed[], alreadyGone[]); an already-deleted target never fails the batch;
each removal writes an activity-log entry naming the artefact type and id only.
Done: a batch of 50 with 3 already-gone targets returns 200 with both arrays populated.
T047 [P3] — Removal sheet
Create apps/web/src/components/catalog/RemoveArtifactsSheet.tsx: every checkbox unchecked by
default, live Remove {count} items label, disabled at zero, Changed since setup flag on any
renamed artefact, and the output is kept line. Produced Knowledge Base documents, Missions,
Tasks and drafts are never listed.
Done: apps/web/src/components/catalog/RemoveArtifactsSheet.unit.spec.tsx asserts the
all-unchecked default and the live label.
T048 [P3] — 30-day rollup
Extend the adoption detail read to aggregate the created Agent's runs over 30 days: run count and
summed agent_runs.costCents rendered to 2 decimals. No runs yet · first run <date> when empty.
Done: the rollup is one scoped aggregate query, not a per-run fetch.
T049 [P3] — Reverse attribution
Add a "created by the <playbook> playbook" line to the Agent detail surface, resolved via
idx_playbook_artifacts_target.
Done: an Agent created outside a playbook renders nothing extra.
T050 [P3] — Repeated-failure warning
Show a persistent warning on an adoption whose last 3 consecutive runs failed, with the last
failure reason and a Run now control.
Done: the warning clears on the first successful run.
T051 [P3] — Graduation suggestion
Create apps/web/src/components/catalog/GraduationSuggestion.tsx and the
POST /api/catalog/adoptions/:id/dismiss-graduation endpoint. Eligible at ≥ 14 days active with
0 rejected approvals; Review the change shows exactly which action types would stop asking;
dismissal writes graduationDismissedUntil = now + 30 days.
Done: nothing changes without an explicit confirm; a unit spec covers the 14-day and 0-rejection
boundaries.
T052 [P3] — Remote catalogue source, wired
Enable the plugin's remote manifest path behind its settings, and add the stale banner
(dashboard.catalogPage.staleCatalogue) to the Playbooks section.
Done: with the remote source unreachable the built-ins still render and the banner shows the
last-updated age.
T053 [P3] — Hand the setup to an agent For playbooks declaring free-text inputs, add a secondary action that opens the agent chat composer pre-filled with the setup brief. It sends nothing — the person presses send. Done: the composer is pre-filled and no message is created until the user acts.
T054 [P3] — P3 tests
Extend apps/web/e2e/flow-playbook-adoption-failure-resume.spec.ts with the removal flow, and add
graduation and rollup coverage to
packages/agent/src/services/__tests__/playbook-adoption-lifecycle.service.spec.ts.
Done: green.
Program bookkeeping (do these with the P1 PR)
T055 — Vocabulary table
Modify docs/specs/features/agent-workspace/README.md §1: add two rows — Playbook (a packaged
outcome in the catalogue; do not introduce "recipe", "automation", "workflow" or "blueprint" as a synonym)
and Playbook adoption (the record of a workspace having set one up; do not introduce
"installation", "instance"). Program rule #2 requires this in the same PR that introduces the
nouns.
Done: both rows present, worded consistently with the existing table.
T056 — Tracker
Modify docs/specs/features/agent-workspace/TRACKER.md: mark AW-21's spec status and record the
P1/P2/P3 implementation split.
Done: the tracker reflects the phase actually merged.
T057 — Substrate note
Modify docs/specs/features/agent-workspace/EXISTING-SUBSTRATE.md: mark S1 (Workflows — no
UI) as addressed by AW-21 P1 and S12 (Task workflow templates buried) as surfaced by AW-21 P1.
Do not delete either row — the document is a record of what was found.
Done: both rows carry a "surfaced by AW-21 P1" note.
T058 — Spec-kit cross-links
Add AW-21 to any index that lists agent-workspace epics, and link this epic from
docs/specs/features/templates-catalog/ and docs/specs/features/skills/ as the surface that now
indexes them.
Done: every link resolves; no existing document's meaning changes.
Definition of done for the epic
- Every acceptance-criteria checkbox in spec.md §8 passes on a running build.
-
pnpm lint,pnpm type-checkandpnpm testare green from the repo root. - The migration applies forward on a database already at the newest
developmigration andmigration:generateafterwards proposes no further change. -
grep -rn "'everworks-" apps/api/src/catalog apps/web/src/components/catalogreturns nothing (Constitution II). -
grep -rn "@trigger.dev/sdk" packages/agent/src apps/api/srcreturns nothing new (Constitution IV). - Every new user-visible string resolves from
dashboard.catalogPage, and every locale file carries that parent key. - The program vocabulary table (T055) carries both new nouns.