diff --git a/.agents/skills/create-verification-skill/NOTICE.md b/.agents/skills/create-verification-skill/NOTICE.md index d887f754207..68ab4a95a19 100644 --- a/.agents/skills/create-verification-skill/NOTICE.md +++ b/.agents/skills/create-verification-skill/NOTICE.md @@ -7,7 +7,8 @@ The fork imported pstack 0.15.15 by Lauren Tan (poteto) from [cursor/plugins](https://github.com/cursor/plugins/tree/ccb5507cec1546dc88135c1139c811e6c59115ba/pstack), upstream revision `ccb5507cec1546dc88135c1139c811e6c59115ba`. -Paperclip adapts the workflow to the existing repo-root `feature-map/`. +Paperclip adapts the workflow to the sibling `maps/feature-map/` and +`maps/agent-access-map/` directories and their shared access contract. It preserves the invocation policy in `agents/openai.yaml`, removes the Cursor-specific `disable-model-invocation` frontmatter field, and omits the separate runtime skill dependency because Paperclip supplies execution. diff --git a/.agents/skills/create-verification-skill/SKILL.md b/.agents/skills/create-verification-skill/SKILL.md index de10a42c2d4..782513a549b 100644 --- a/.agents/skills/create-verification-skill/SKILL.md +++ b/.agents/skills/create-verification-skill/SKILL.md @@ -32,7 +32,19 @@ Write `.agents/skills/verify-/SKILL.md` with YAML frontmatter (`name: verif ## 3. Seed the feature map -For Paperclip, use the existing repo-root `feature-map/` directory and its `README.md`; have the generated verification skill reference that map instead of creating a second map inside the skill directory. Reuse existing feature files and use Poteto's format below for new or updated entries. 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. +For Paperclip, read the [map contract](../../../maps/README.md) and use the sibling +`maps/feature-map/` and `maps/agent-access-map/` directories. The generated +verification skill consumes both maps and reports drift; maintenance owns their +updates. Reuse existing feature files and preserve Poteto's product format. Every +new feature file needs a same-named agent access companion with matching stable +sub-feature IDs. Record APIs, actual agent entry points, policy, evidence and gaps +using the contract. Mark representative source inventory as `baseline` / +`source-only`; enumerate operations before claiming full access coverage. Reuse +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 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-verification-skill/NOTICE.md b/.agents/skills/maintain-verification-skill/NOTICE.md index 0c7b0648ebc..120888c9db5 100644 --- a/.agents/skills/maintain-verification-skill/NOTICE.md +++ b/.agents/skills/maintain-verification-skill/NOTICE.md @@ -7,7 +7,8 @@ The fork imported pstack 0.15.15 by Lauren Tan (poteto) from [cursor/plugins](https://github.com/cursor/plugins/tree/ccb5507cec1546dc88135c1139c811e6c59115ba/pstack), upstream revision `ccb5507cec1546dc88135c1139c811e6c59115ba`. -Paperclip adapts the workflow to the existing repo-root `feature-map/`. +Paperclip adapts the workflow to the sibling `maps/feature-map/` and +`maps/agent-access-map/` directories and their shared access contract. It preserves the invocation policy in `agents/openai.yaml`, removes the Cursor-specific `disable-model-invocation` frontmatter field, and omits the separate runtime skill dependency because Paperclip supplies execution. diff --git a/.agents/skills/maintain-verification-skill/SKILL.md b/.agents/skills/maintain-verification-skill/SKILL.md index d95e6e8842e..8d261ef3fb4 100644 --- a/.agents/skills/maintain-verification-skill/SKILL.md +++ b/.agents/skills/maintain-verification-skill/SKILL.md @@ -1,40 +1,124 @@ --- name: maintain-verification-skill -description: "Periodic pass that keeps a project's verification skill and feature map honest: parallel source readers per feature, one live session driving every feature, at most one PR of proven corrections. Use for /maintain-verification-skill or \"audit the verify skill\"." +description: "Keep a project's verification skill and product/agent access maps aligned with current source and real evidence. Use for /maintain-verification-skill, auditing the verify skill, or reconciling feature and agent access coverage." --- -# Maintain a verification skill +# Maintain a verification skill and its maps -A feature map rots the moment the app changes. This skill is the upkeep loop for a skill generated by `/create-verification-skill` (or any project-local verification skill with a feature map). The unit of rigor is the feature, not every sentence: cover every feature file from source and exercise every feature live, without terminalising every bullet. +Keep user journeys and agent access aligned with the app. For Paperclip, read the +[map contract](../../../maps/README.md), the +[feature index](../../../maps/feature-map/README.md), and the +[agent access index](../../../maps/agent-access-map/README.md). These are sibling +maps under `maps/`, with the same area filenames and capability IDs. Preserve +[Poteto's product format](../create-verification-skill/references/feature-map-example/). +Agent companions follow the shared contract; they do not duplicate user recipes. + +An API endpoint, an OpenAPI actor label, a declared scenario tool and an admitted +production agent path are different evidence. Verify which permitted agent +surface can actually express an operation. Track source review, operation review +and executed proof separately. A source-only baseline is useful, but cannot +certify complete coverage or live behavior. ## Outcomes -Pick one, and say which: +Pick one and report source scope, live scope and remaining gaps separately: -- **clean** — every feature got source and live coverage; nothing worth shipping. No branch, no PR. -- **changed** — one PR ships proven doc, harness, or map corrections. -- **blocked** — coverage could not finish or a proven fix could not ship safely. Say exactly what blocked it. +- **clean** — the requested scope got source and live coverage, with no corrections. +- **changed** — proven skill/map/check corrections are ready to review; name any + access gaps or unexecuted coverage that remains. +- **blocked** — requested coverage or a proven correction could not finish; name + the unmet prerequisite and evidence captured so far. + +A targeted audit covers its named areas; do not present it as a full pass. A full +pass reads every area from source and exercises every reachable feature, plus +relevant permitted-agent and denial paths. Report unreachable prerequisites and +not-run operations rather than silently reducing the scope. ## Edit scope -Only edit the verification skill's own directory (its SKILL.md and any harness scripts it owns) and its feature-map directory. For Paperclip, the map is the existing repo-root `feature-map/`; maintain it in place instead of creating or moving it into a skill directory. Use [Poteto's feature-map format](../create-verification-skill/references/feature-map-example/) for new or updated entries. Never edit product code during a run: a behavior the map describes that the app no longer does is either doc drift (fix the map) or a product regression (report it, don't paper over it in docs). +For Paperclip, edit the target verification skill, these maintenance instructions +when needed, `maps/`, and the map-specific structural check +`scripts/check-maps.mjs` / `scripts/check-maps.test.mjs`. Fix references to those +maps in contributor docs or skill instructions when their locations/IDs change. +Keep the maps in `maps/{feature-map,agent-access-map}/`, outside skill directories. + +For other projects, maintain their existing verification skill and map locations; +the Paperclip directory convention does not authorize relocating another repo. +Never edit product APIs, permission enforcement, tool bindings or UI behavior +in a maintenance run. Record product/access gaps for implementation separately; +a permission denial is not authorization to widen access. ## Pass -0. **Locate the target.** Find the verification skill to maintain: the project-local skill whose body has launch/drive sections and a feature map (usually `.agents/skills/verify-*/`). Several candidates → ask which one; none → stop and point at `/create-verification-skill` instead of inventing a target. +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. -1. **Index hygiene.** Read the feature map README and glob its sibling files. Fix missing, extra, duplicate, or dead entries. Lightweight; no generated inventory. +1. **Check both indexes.** Pair same-named feature and agent files, then match + stable sub-feature IDs. Fix orphan/missing entries and broken references. + For Paperclip run `node scripts/check-maps.mjs`. This checks structure, + not API authorization, real tool bindings or live behavior. -2. **Source wave.** One read-only subagent per feature file, launched concurrently. Each explains "how does this user-facing feature work?" from source, flags likely doc drift with citations, and returns one concise live-verification recipe. Children never drive the app and never edit files. Return shape: feature summary / source entry points / likely drift or none / one recipe. +2. **Source wave.** Use read-only subagents per area, with each reader owning + the feature file and its access companion; schedule within available slots. + Readers never edit or drive the app. Each returns the user capability/source + entry points, likely drift with citations, meaningful operations, their APIs, + actor/grant/resource/run/mode boundaries, real agent entry points by surface, + missing access/discovery/policy decisions, and a concise verification recipe. + Follow recent changes to routes, contracts, authorization, native tool + admission, CLI and MCP as well as UI. Inspect actual route/service policy; + compare it with OpenAPI and production bindings, not only scenario catalogs. -3. **Reconcile.** Every feature file has a returned summary. Merge overlapping recipes into as few app states as practical. Spot-check cited drift; don't re-prove clean claims. Sweep recent churn for user-facing surfaces missing from the map — require a concrete source path before calling one missing. +3. **Reconcile both maps.** Spot-check cited drift and merge recipes into as + few app states as practical. Every affected business operation needs an API + and a permitted agent path, or an explicit gap. A dedicated tool is optional + when existing API/CLI/MCP fallback suffices. Distinguish native/remote access + from legacy REST and personal assistant OAuth. Record field/scope limits, + unavailable clients, protocol requirements and native fallback restrictions. + Keep justified local/developer/operator exceptions, but split shared data + operations from presentation. A board-only route records a restriction and + 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. -4. **Live pass.** Required even when source looks clean. The coordinator owns all driving; follow the verification skill's own launch model — one long-lived instance driven serially for servers and UIs, or a fresh isolated session per drive for short-lived CLIs (the skill's Launch section decides, not this one). Exercise every feature at least once, and hold three invariants the whole pass, whatever the failure: (1) never drive an instance you haven't health-checked since it last did something surprising — doctor before first drive, doctor on each fresh session where sessions are the unit, doctor again after any failed drive, and where doctor can't see the failure (a wedged UI state on a healthy process), reset to a known state or relaunch rather than hoping; (2) evidence captured so far survives every cleanup, checked at its named location, not assumed; (3) nothing a drive started outlives that drive's usefulness — failed-iteration residue is cleaned whether the session is stuck, exited, or shared (for a shared instance, clean the residue, not the instance). A doctor failure caused by skill drift is drift: fix it under edit scope and retry once — restart whatever the fix invalidated, nothing more — before calling the pass `blocked`. A feature that can't be reached is `verified-unreachable` only with the concrete prerequisite (auth, entitlement, OS, external state) and the route attempted; if the map omits that prerequisite, that's drift. Any harness fix from triage gets re-driven live before it ships. Final teardown happens after the last drive of the run — including those re-proofs — so nothing outlives the run (evidence stays, per the skill). +4. **Live pass.** Required for a verification maintenance pass even if source + looks clean. The coordinator owns serial driving, using the target skill's + existing launch/doctor/evidence/cleanup workflow and Paperclip's existing + API/runner/MCP fixtures. Exercise the real user path and the relevant actual + agent path separately. For access checks use the permitted agent identity, + run, mode and target; assert results and relevant denials. A board request or + board test-as-agent does not replace agent-credential proof. Use disposable + fixtures for mutation/denial tests and record simulated providers honestly. + Never assume an optional client is admitted to a native run. -5. **Triage.** Wrong or missing user-POV description → doc drift, fix it. Working behavior the harness can't drive → harness gap, fix it; a harness fix follows the same helpers rule as generation (scripts executable, invocation documented in the skill body). App behavior that's actually broken → product gap; record it for the user, keep it out of this PR. + Keep three invariants: health-check before driving and after surprises; + verify captured evidence survives cleanup; clean up everything the drive + owned once no longer needed. Reset a wedged UI even if process health passes. + Follow the target skill's session model: one long-lived owned server/UI + instance, or isolated short-lived CLI sessions. After a skill-induced failure, + fix within edit scope and retry once, restarting only what was invalidated. + Record missing auth/provider/environment prerequisites and attempted paths. + Re-drive changed harness helpers before shipping them. Final teardown follows + the last proof attempt and preserves evidence. -6. **Ship or stop.** For changed: one PR of proven corrections, re-read every changed file first. For clean or blocked: no PR, report the outcome and the coverage honestly. +5. **Triage and record.** User description/recipe drift updates the product map; + endpoint/path/permission/discovery drift updates its companion. Missing or + broken product behavior stays a product gap, with evidence. Never rewrite a + 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. -Keep concise run notes (features covered, unreachable prerequisites, confirmed drift, outcome) in a scratch location; don't commit them. +6. **Review corrections.** Re-read changed files, check paired IDs/references and + run the smallest relevant validation. Report outcome and source/live coverage + honestly. If shipping is requested or already authorized, update the existing + task PR where appropriate, or create at most one PR of proven corrections. + A clean pass needs no branch or PR. Do not implement access-policy changes + merely to make the maintenance report green. + +Keep concise run notes and proof artifacts in the target skill's named evidence +location; do not commit ephemeral run logs as map content. Origin and license: [NOTICE.md](NOTICE.md). diff --git a/.agents/skills/verify-paperclip/SKILL.md b/.agents/skills/verify-paperclip/SKILL.md index 2728797cff8..b16467140a0 100644 --- a/.agents/skills/verify-paperclip/SKILL.md +++ b/.agents/skills/verify-paperclip/SKILL.md @@ -5,9 +5,13 @@ description: Launch an isolated Paperclip instance, drive its real web UI or CLI # Verify Paperclip -Use the repo-root [feature map](../../../feature-map/README.md) to select -verification recipes. Read the relevant feature file before driving it. Report -any recipe drift with evidence; map updates belong to +Read the [map contract](../../../maps/README.md), then use the +[feature map](../../../maps/feature-map/README.md) to select user verification +recipes. For API/agent access, read the same-named +[agent access companion](../../../maps/agent-access-map/README.md) and use the +actual permitted agent identity, target and work mode. Follow existing API/runner/MCP +fixtures for access proof; a board request does not prove agent access. Report +recipe or access drift with evidence; map updates belong to [maintain-verification-skill](../maintain-verification-skill/SKILL.md). Read [development instructions](../../../doc/DEVELOPING.md) for current commands. diff --git a/AGENTS.md b/AGENTS.md index 53f25d6d514..55ee4734b84 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -152,10 +152,16 @@ Notes: ## 7. Verification Before Hand-off -[feature-map/README.md](feature-map/README.md) is an optional reference for user +[maps/feature-map/README.md](maps/feature-map/README.md) is an optional reference for user entry points, verification recipes, and coverage gaps. The map records coverage scope, not proof that a live journey passed. +The sibling [agent access map](maps/agent-access-map/README.md) records APIs, +agent entry points and permission boundaries using the same capability IDs. +Follow [the map contract](maps/README.md): update affected entries when mapped +behavior or access changes, and run `node scripts/check-maps.mjs` after map edits. +Its structural checks do not prove live behavior or authorization. + Default local/agent test path: ```sh diff --git a/doc/DEVELOPING.md b/doc/DEVELOPING.md index feef1880754..233c2e5cf66 100644 --- a/doc/DEVELOPING.md +++ b/doc/DEVELOPING.md @@ -495,11 +495,17 @@ npx paperclipai allowed-hostname dotta-macbook-pro ## Test Commands -The [feature map](../feature-map/README.md) is an optional reference for user +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 verification steps and do not run automatically from the map. +The sibling [agent access map](../maps/agent-access-map/README.md) describes API +and agent reachability for the same capabilities. The [map contract](../maps/README.md) +defines synchronization, permissions and evidence. After map edits, run +`node scripts/check-maps.mjs` for structural/reference checks; it does not start an +instance or qualify access as an agent. + Use the cheap local default unless you are specifically working on browser flows: ```sh diff --git a/maps/README.md b/maps/README.md new file mode 100644 index 00000000000..5946460d2d4 --- /dev/null +++ b/maps/README.md @@ -0,0 +1,135 @@ +# Paperclip maps + +The maps describe the same capabilities from two perspectives: + +- [Feature map](feature-map/README.md): what a person can do, where to reach it, + and how to verify the user journey. Preserve its Poteto format. +- [Agent access map](agent-access-map/README.md): the APIs and agent entry points + for those capabilities, their permission boundaries, and access verification. + +These are sibling directories under `maps/`. Each feature file has a same-named +agent access companion. Reuse the product map's sub-feature IDs, so `tasks/create` +identifies the same capability in both maps. Product behavior remains governed by +[the implementation spec](../doc/SPEC-implementation.md); a map cannot grant +authority or redefine a permission denial as success. + +## Access contract + +Every business operation needs both an API and a usable agent entry point for an +actor authorized to perform it. A dedicated tool is optional when REST, the CLI, +an assigned MCP client, or native `search_api` / `call_api` already provides the +operation. Record which agent surfaces actually have that path; an installed CLI +or optional MCP package cannot be assumed available to every native/remote run. + +Track these independently: + +| Dimension | Values and meaning | +| --- | --- | +| API | `present`, `missing`, `not-applicable`, or `unreviewed`. Use exact methods/paths; distinguish protocols from REST. | +| Agent access | `available`, `partial`, `missing`, `restricted`, `operator-only`, `not-applicable`, or `unreviewed`. Name the supported surface and actual entry point. | +| Policy | Actor, action/grant, company/resource/ownership scope, responsible-user intersection, run requirements, work modes, and gates relevant to the operation. | +| Evidence | `source-only`, `verified`, `failed`, `blocked`, or `not-run`. Source presence and successful board calls are not agent verification. | +| Review depth | `baseline` records representative operations and known gaps; `operation-reviewed` enumerates the capability's meaningful operations and their individual access contracts. | + +Broad capabilities such as task properties must be split into operations before +they count as operation-reviewed: renaming, metadata edits, assignment, +dependencies, and lifecycle changes can use different tools and permission rules. +An available read path cannot certify a write path. List/get/create/update/delete, +execution/control, credential handling, and resolution are separate where their +authority or transport differs. Do not duplicate request schemas from OpenAPI. + +### Exceptions and restrictions + +Presentation-only state, static developer fixtures, and pre-start/local operator +work may use `not-applicable` for a domain API, with a concrete reason and the +existing local path. When a capability combines shared data with presentation, +split the operations: browser recents do not exempt resource lookup from API +coverage. Promoting local state to a shared feature requires revisiting the entry. + +A board-only endpoint is `restricted` for agent identity, not an automatic +exception or a missing API. Cite the enforced policy and record whether the +agent can request the authorized human's action and observe its result. An +unresolved delegation question remains in **Gaps**. Company access, a job title, +a personal assistant's OAuth grant, or an accepted interaction does not grant +board identity. Keep budget, approval, secret and execution authority intact. + +Check actual route/service authorization and production tool admission. OpenAPI +actor labels and scenario/evaluation tool declarations are supporting metadata; +record disagreements rather than using them as proof of access. Native API +fallback restrictions, tool field/scope limits, and rollout settings are part of +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 +sub-feature. Each capability contains these fields: + +- **Review:** `baseline` or `operation-reviewed`. +- **API:** presence state and exact operation IDs, or a reasoned exception. +- **Agent access:** availability state and concrete entry points by surface. +- **Policy:** relevant permission and runtime boundaries, with source references. +- **Evidence:** evidence state, reviewed commit and sources or executed proof. +- **Verification:** allowed/denied assertions and observable result; record what + has actually run separately from the proposed recipe. +- **Gaps:** missing APIs/paths, discovery drift, unreviewed operations or policy + decisions; use `none` only for the enumerated scope that was reviewed. + +For an operation-reviewed capability, use H3 backticked operation IDs and repeat +API, Agent access, Policy, Evidence, Verification and Gaps for each operation. +Use small operation names such as `create`, `update`, `read`, or `run-now`. +The enclosing capability has `Review: operation-reviewed` only after its +meaningful operations have been enumerated. The following excerpt shows one +operation; include the others before using that review label: + +```markdown +## `definition` + +Review: `operation-reviewed`. + +### `create` + +API: `present` — POST /api/companies/{companyId}/routines. +Agent access: `partial` — agent REST and CLI routine create; default native +mutation binding missing, and call_api blocks routine mutations. +Policy: same company; assigneeAgentId must be the calling agent; cite the +routine authorization and native API policy sources. +Evidence: `source-only` — reviewed commit and source links; no live proof. +Verification: `not-run` — create an owned routine; reject assignment to another +agent; inspect saved configuration, attribution and retry behavior. +Gaps: default native create path; verify using the real permitted agent context. +``` + +## Keeping the maps synchronized + +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 +change may update the companion without rewriting unchanged user instructions. + +[maintain-verification-skill](../.agents/skills/maintain-verification-skill/SKILL.md) +owns reconciliation of both maps. It follows changed source and authorization, +checks real agent reachability, and records product gaps without implementing +them during a maintenance pass. The creation skill uses this structure. +[verify-paperclip](../.agents/skills/verify-paperclip/SKILL.md) consumes the relevant +recipes and reports evidence/drift; map editing belongs to maintenance. + +Run the structural check after map changes: + +```sh +node scripts/check-maps.mjs +``` + +It checks paired areas/IDs, indexes, 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. + +For live access proof, use Paperclip's existing API/runner/MCP fixtures or an owned +isolated instance. Use the actual agent identity, target and work mode. Assert the +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. diff --git a/maps/agent-access-map/README.md b/maps/agent-access-map/README.md new file mode 100644 index 00000000000..9b8a94ab47e --- /dev/null +++ b/maps/agent-access-map/README.md @@ -0,0 +1,69 @@ +# Paperclip agent access map + +This map accompanies the [feature map](../feature-map/README.md). It records APIs, +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. + +## Areas + +| 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 | + +## Using an entry + +Read its Policy and Gaps before selecting an agent path. Native fallback, legacy +REST/CLI, stdio MCP and a personal assistant connection can have different +authority and availability. Use a real admitted production binding; a scenario +declaration is not an installed tool. A `restricted` entry records current +enforcement and leaves any unresolved delegation decision visible. + +For API catalog disagreements, follow the route/service authorization and record +discovery drift. For `not-applicable`, retain the concrete exception and local +path. Split shared business operations from client-only presentation. + +Use `maintain-verification-skill` to reconcile changed source and both maps. +Use `verify-paperclip` and existing API/runner/MCP fixtures to collect the +permitted-agent and denial evidence; report blocked/not-run coverage honestly. +Run `node scripts/check-maps.mjs` after editing. The structural check does not +certify permissions, API catalog coverage, tool admission or live behavior. diff --git a/maps/agent-access-map/access.md b/maps/agent-access-map/access.md new file mode 100644 index 00000000000..4382be3416c --- /dev/null +++ b/maps/agent-access-map/access.md @@ -0,0 +1,136 @@ +# Login, invitations, and access — agent access + +Product map: [Login, invitations, and access](../feature-map/access.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `login` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/auth/get-session`. +- `POST /api/bootstrap/claim`. + +Agent access: `restricted` — Agent authenticates with its own issued bearer; board login +uses human/client auth. + +Policy: Company access plus action-specific grants; instance administration requires a +board administrator. + +Evidence: `source-only` — [implementation](../../server/src/routes/access.ts#L3018) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: An agent identity is not a board login or board claim; explicit delegation is a +product-policy decision. + +## `invitations` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/invites`. +- `POST /api/invites/{token}/accept`. + +Agent access: `partial` — REST with invite permission; CLI access; native call_api +blocks invite credentials. + +Policy: Company access plus action-specific grants; instance administration requires a +board administrator. + +Evidence: `source-only` — [implementation](../../server/src/routes/access.ts#L3018) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Invite creation has an agent permission branch. Human joining and agent onboarding +are different operations. + +## `membership` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/members`. +- `PATCH /api/companies/{companyId}/members/{memberId}/permissions`. + +Agent access: `partial` — REST with the specific company permission; native fallback for +unrestricted operations. + +Policy: Company access plus action-specific grants; instance administration requires a +board administrator. + +Evidence: `source-only` — [implementation](../../server/src/routes/access.ts#L3018) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Company membership APIs include agent grants; instance-admin user operations stay +board-only. + +## `resources` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}`. +- `GET /api/projects/{id}`. + +Agent access: `available` — REST or scoped task/project tools. + +Policy: Company access plus action-specific grants; instance administration requires a +board administrator. + +Evidence: `source-only` — [implementation](../../server/src/routes/access.ts#L3018) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Company/resource authorization is implemented; a negative test must cover private +resources and another company. + +## `cli-auth` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/cli-auth/challenges`. +- `POST /api/cli-auth/revoke-current`. + +Agent access: `restricted` — Board CLI authorization; agents use issued agent +credentials. + +Policy: Company access plus action-specific grants; instance administration requires a +board administrator. + +Evidence: `source-only` — [implementation](../../server/src/routes/access.ts#L3018) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: CLI board login/revocation cannot be counted as agent self-authentication. diff --git a/maps/agent-access-map/activity.md b/maps/agent-access-map/activity.md new file mode 100644 index 00000000000..b5d2041289c --- /dev/null +++ b/maps/agent-access-map/activity.md @@ -0,0 +1,129 @@ +# Dashboards, activity, and audit trails — agent access + +Product map: [Dashboards, activity, and audit trails](../feature-map/activity.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `overview` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/dashboard`. + +Agent access: `available` — REST / native call_api / CLI dashboard. + +Policy: Same company plus visibility/audit/cost/run permissions where the route requires +them. + +Evidence: `source-only` — [implementation](../../server/src/routes/activity.ts#L224) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Dashboard data is accessible; live-work rendering and event streaming are separate +surfaces. + +## `activity` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/activity`. + +Agent access: `available` — REST / native call_api / CLI activity. + +Policy: Same company plus visibility/audit/cost/run permissions where the route requires +them. + +Evidence: `source-only` — [implementation](../../server/src/routes/activity.ts#L224) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Audit export and raw activity creation have extra restrictions; do not equate them +with activity reading. + +## `runs` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/heartbeat-runs`. +- `GET /api/heartbeat-runs/{runId}/events`. + +Agent access: `available` — REST / native call_api / CLI run. + +Policy: Same company plus visibility/audit/cost/run permissions where the route requires +them. + +Evidence: `source-only` — [implementation](../../server/src/routes/activity.ts#L224) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Telemetry/run visibility is checked independently from seeing the source task. + +## `routine-audit` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/routines/{id}/runs`. + +Agent access: `available` — REST / native call_api / CLI routine runs. + +Policy: Same company plus visibility/audit/cost/run permissions where the route requires +them. + +Evidence: `source-only` — [implementation](../../server/src/routes/activity.ts#L224) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Routine execution history is distinct from configuration revisions and scheduling +changes. + +## `timeline` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/timeline`. + +Agent access: `available` — REST / native call_api. + +Policy: Same company plus visibility/audit/cost/run permissions where the route requires +them. + +Evidence: `source-only` — [implementation](../../server/src/routes/activity.ts#L224) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: API exists; no dedicated timeline tool is necessary for this requirement. diff --git a/maps/agent-access-map/agent-chat.md b/maps/agent-access-map/agent-chat.md new file mode 100644 index 00000000000..e38bd25bee6 --- /dev/null +++ b/maps/agent-access-map/agent-chat.md @@ -0,0 +1,113 @@ +# Agent conversations and project handoff — agent access + +Product map: [Agent conversations and project handoff](../feature-map/agent-chat.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `discovery` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/chats`. +- `GET /api/companies/{companyId}/chats/{agentRef}`. + +Agent access: `restricted` — Board-user REST; the responding agent gets its assigned +conversation context. + +Policy: Conversation discovery/creation requires a board user and the Agent Chat gate; +task access follows task visibility. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L18077) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Agents cannot enumerate or create another person's standing chats. Detail route is +missing from the generated API catalog. + +## `history` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/comments`. +- `POST /api/issues/{id}/comments`. + +Agent access: `partial` — Assigned conversation task tools / REST for eligible task +history and replies. + +Policy: Conversation discovery/creation requires a board user and the Agent Chat gate; +task access follows task visibility. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L18077) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agent responses are supported; creating the person's chat and impersonating their +messages are different actions. + +## `handoff` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/projects`. +- `POST /api/companies/{companyId}/issues`. + +Agent access: `available` — Native list_projects/create_project/create_task; project MCP +tools; REST. + +Policy: Conversation discovery/creation requires a board user and the Agent Chat gate; +task access follows task visibility. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L18077) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agent handoff is implemented; execution readiness, assignment permission, and +repository access still apply. + +## `conference-room` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/board/chat/stream`. + +Agent access: `partial` — Existing SSE client in local_trusted mode with the +experimental gate. + +Policy: Conversation discovery/creation requires a board user and the Agent Chat gate; +task access follows task visibility. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L18077) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Not callable through generic REST tooling: protocol and deployment constraints +apply. This route is not guarded by assertBoard, so its intended agent policy needs +clarification. diff --git a/maps/agent-access-map/agents.md b/maps/agent-access-map/agents.md new file mode 100644 index 00000000000..46c3ee462a2 --- /dev/null +++ b/maps/agent-access-map/agents.md @@ -0,0 +1,140 @@ +# Hiring, agent configuration, and organization — agent access + +Product map: [Hiring, agent configuration, and organization](../feature-map/agents.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `hire` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/agent-hires`. +- `POST /api/companies/{companyId}/agents`. + +Agent access: `partial` — Native hire_agent; REST / CLI agent; runtime inheritance for +native hires. + +Policy: Agent creation/configuration uses action grants, resource policies and change +consent; some controls require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L1395) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Identity/persona hiring works. Operator account login and sensitive +adapter/environment configuration are separate guarded actions. + +## `instructions` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/agents/{id}/instructions-bundle/file`. +- `PUT /api/agents/{id}/instructions-bundle/file`. + +Agent access: `available` — Native read/update/history/restore instruction tools; REST / +CLI. + +Policy: Agent creation/configuration uses action grants, resource policies and change +consent; some controls require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L1395) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Canonical entry file, revision guard, company boundary, and protected-change +policy apply. + +## `organization` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/org`. +- `PATCH /api/agents/{id}`. + +Agent access: `available` — list_agents/get_agent; native call_api for permitted +configuration fields; REST / CLI. + +Policy: Agent creation/configuration uses action grants, resource policies and change +consent; some controls require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L1395) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Reporting-line changes need configuration authorization; a title alone gives no +authority. + +## `lifecycle` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/agents/{id}/pause`. +- `POST /api/agents/{id}/resume`. +- `POST /api/agents/{id}/terminate`. + +Agent access: `partial` — REST resume under change grant; pause/terminate require board; +native call_api blocks all three. + +Policy: Agent creation/configuration uses action grants, resource policies and change +consent; some controls require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L1395) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Resume is agent-eligible but lacks a default native binding. Pause and termination +are actor-boundary decisions. + +## `built-in` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/built-in-agents/{key}/provision`. + +Agent access: `partial` — REST / native fallback for eligible provisioning; built-in +routine controls require board. + +Policy: Agent creation/configuration uses action grants, resource policies and change +consent; some controls require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L1395) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Provisioning checks agents:create. Enabling/running its built-in routine is not +the same permission path. diff --git a/maps/agent-access-map/app-permissions.md b/maps/agent-access-map/app-permissions.md new file mode 100644 index 00000000000..e6d7f106a87 --- /dev/null +++ b/maps/agent-access-map/app-permissions.md @@ -0,0 +1,132 @@ +# App access, action permissions, and testing — agent access + +Product map: [App access, action permissions, and +testing](../feature-map/app-permissions.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `agent-access` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PUT /api/tool-connections/{connectionId}/installs`. + +Agent access: `restricted` — Board management API; agents use their resulting assigned +app tools. + +Policy: Connection/profile/policy management routes require a board user; tool use +separately evaluates agent grants and action policies. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-access.ts#L517) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Granting access is distinct from using access. No equivalent agent management path +exists in these routes. + +## `action-policy` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-profiles/{profileId}/entries`. + +Agent access: `restricted` — Board management API; agent execution follows +off/ask/allowed. + +Policy: Connection/profile/policy management routes require a board user; tool use +separately evaluates agent grants and action policies. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-access.ts#L517) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: An agent cannot authorize itself by editing the policy. Decide whether any +explicitly delegated administration should be supported. + +## `catalog-change` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-profiles/{profileId}/new-tools/review`. + +Agent access: `restricted` — Board catalog-review API; agents can discover authorized +tools. + +Policy: Connection/profile/policy management routes require a board user; tool use +separately evaluates agent grants and action policies. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-access.ts#L517) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Catalog refresh/review and quarantined-action enablement are management +operations. + +## `test-action` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-connections/{connectionId}/test-calls`. + +Agent access: `restricted` — Board test-as-agent API; agent executes its own assigned +tools normally. + +Policy: Connection/profile/policy management routes require a board user; tool use +separately evaluates agent grants and action policies. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-access.ts#L517) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: A board test performed as an agent is not proof the agent can manage or invoke the +testing endpoint. + +## `account-maintenance` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-connections/{connectionId}/reconnect`. +- `GET /api/tool-connections/{connectionId}/activity`. + +Agent access: `restricted` — Board account management; native +connections_search/connection_request can request human setup. + +Policy: Connection/profile/policy management routes require a board user; tool use +separately evaluates agent grants and action policies. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-access.ts#L517) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Agent requests and continued tool use exist; reconnect/revoke/audit management are +human paths. diff --git a/maps/agent-access-map/budgets-costs.md b/maps/agent-access-map/budgets-costs.md new file mode 100644 index 00000000000..e716ebc9e5b --- /dev/null +++ b/maps/agent-access-map/budgets-costs.md @@ -0,0 +1,108 @@ +# Costs, budgets, and spending controls — agent access + +Product map: [Costs, budgets, and spending controls](../feature-map/budgets-costs.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `cost-reporting` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/costs/summary`. +- `GET /api/companies/{companyId}/costs/by-agent`. + +Agent access: `available` — REST / native call_api / CLI cost. + +Policy: Reading costs uses company/resource cost policy. Budget policies and incident +resolution require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/costs.ts#L346) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Cost visibility applies. Provider accounting imports and quota-window inspection +have additional board gates. + +## `budgets` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/budgets/overview`. +- `POST /api/companies/{companyId}/budgets/policies`. + +Agent access: `restricted` — Agent-readable overview where allowed; board-only +configuration. + +Policy: Reading costs uses company/resource cost policy. Budget policies and incident +resolution require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/costs.ts#L346) at the +reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Read API exists; no agent-write path for budget policies, including agents with +ordinary company access. + +## `incidents` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/budgets/overview`. + +Agent access: `available` — REST / native call_api for allowed visibility. + +Policy: Reading costs uses company/resource cost policy. Budget policies and incident +resolution require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/costs.ts#L346) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Inspection is supported; hard-stop or pause relief does not follow from seeing the +incident. + +## `resolution` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/budget-incidents/{incidentId}/resolve`. + +Agent access: `restricted` — Board resolution API; agent requests the authorized +person's action. + +Policy: Reading costs uses company/resource cost policy. Budget policies and incident +resolution require a board actor. + +Evidence: `source-only` — [implementation](../../server/src/routes/costs.ts#L346) at the +reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: A governance-policy decision is needed before delegating budget increases or +incident resolution. diff --git a/maps/agent-access-map/cases.md b/maps/agent-access-map/cases.md new file mode 100644 index 00000000000..b0dc7215b95 --- /dev/null +++ b/maps/agent-access-map/cases.md @@ -0,0 +1,108 @@ +# Cases and structured work records — agent access + +Product map: [Cases and structured work records](../feature-map/cases.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `browse` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/cases`. + +Agent access: `available` — REST / native call_api; agent cases reference. + +Policy: enableCases gate; company/case/task boundaries, active run where required, +source trust, and checked-out mutation ownership. + +Evidence: `source-only` — [implementation](../../server/src/routes/cases.ts#L592) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: No dedicated production list_cases binding is required because the REST fallback +exists. + +## `structure` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/cases`. +- `PATCH /api/cases/{id}`. + +Agent access: `available` — REST / native call_api; parentCaseId and JSON fields. + +Policy: enableCases gate; company/case/task boundaries, active run where required, +source trust, and checked-out mutation ownership. + +Evidence: `source-only` — [implementation](../../server/src/routes/cases.ts#L592) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Structured case data is supported; grouping/rendering is presentation, not a new +endpoint requirement. + +## `history` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/cases/{id}/events`. +- `GET /api/cases/{id}/documents/{key}/revisions`. + +Agent access: `available` — REST / native call_api. + +Policy: enableCases gate; company/case/task boundaries, active run where required, +source trust, and checked-out mutation ownership. + +Evidence: `source-only` — [implementation](../../server/src/routes/cases.ts#L592) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Source-backed access only; case visibility and document locks still apply. + +## `task-links` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/cases/{id}/links`. +- `GET /api/issues/{issueId}/cases`. + +Agent access: `available` — REST / native call_api. + +Policy: enableCases gate; company/case/task boundaries, active run where required, +source trust, and checked-out mutation ownership. + +Evidence: `source-only` — [implementation](../../server/src/routes/cases.ts#L592) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Case/task association exists; source trust and issue visibility must be tested +with agent credentials. diff --git a/maps/agent-access-map/chat-channels.md b/maps/agent-access-map/chat-channels.md new file mode 100644 index 00000000000..4aeeccdcd8a --- /dev/null +++ b/maps/agent-access-map/chat-channels.md @@ -0,0 +1,132 @@ +# External chat and email conversations — agent access + +Product map: [External chat and email conversations](../feature-map/chat-channels.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `providers` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/chat-endpoints`. + +Agent access: `restricted` — Board setup APIs; native connection request can ask for +setup. + +Policy: Endpoint management/identity linking requires a board user; delivery is +server-owned and agent tools use scoped assignments. + +Evidence: `source-only` — [implementation](../../server/src/routes/chat-channels.ts#L75) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Provider installation and account enrollment are not available to an ordinary +agent actor. + +## `identity` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/chat-identity-links/confirm`. + +Agent access: `restricted` — Human identity-link flow. + +Policy: Endpoint management/identity linking requires a board user; delivery is +server-owned and agent tools use scoped assignments. + +Evidence: `source-only` — [implementation](../../server/src/routes/chat-channels.ts#L75) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: No impersonation path; native call_api additionally blocks identity-link +operations. + +## `conversation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/chat-endpoints/{endpointId}/conversations/{conversationId}/publications`. + +Agent access: `partial` — Assigned-agent reply pipeline; native completion; provider +tools where assigned. + +Policy: Endpoint management/identity linking requires a board user; delivery is +server-owned and agent tools use scoped assignments. + +Evidence: `source-only` — [implementation](../../server/src/routes/chat-channels.ts#L75) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Normal agent replies work through server delivery. Explicit endpoint publication +APIs are board management paths. + +## `attachments` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/attachments`. +- `POST /api/companies/{companyId}/issues/{issueId}/attachments`. + +Agent access: `partial` — Native register_deliverable / attachment tools when admitted; +agent REST; server-owned delivery. + +Policy: Endpoint management/identity linking requires a board user; delivery is +server-owned and agent tools use scoped assignments. + +Evidence: `source-only` — [implementation](../../server/src/routes/chat-channels.ts#L75) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Uploading/registering is supported. Provider delivery status and board replay are +separate operations. + +## `lifecycle` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/chat-endpoints/{endpointId}/activity`. +- `PATCH /api/chat-endpoints/{endpointId}`. + +Agent access: `restricted` — Board lifecycle APIs; agent requests repair when blocked. + +Policy: Endpoint management/identity linking requires a board user; delivery is +server-owned and agent tools use scoped assignments. + +Evidence: `source-only` — [implementation](../../server/src/routes/chat-channels.ts#L75) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Activity/repair/replay/disable use board endpoint access, not the agent's ability +to reply. diff --git a/maps/agent-access-map/cli-operations.md b/maps/agent-access-map/cli-operations.md new file mode 100644 index 00000000000..3513fe1593d --- /dev/null +++ b/maps/agent-access-map/cli-operations.md @@ -0,0 +1,134 @@ +# CLI, API clients, and local worktrees — agent access + +Product map: [CLI, API clients, and local worktrees](../feature-map/cli-operations.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `context` + +Review: `baseline`. + +API: `not-applicable` — Local CLI configuration has no matching domain REST resource; +explicitly classify local operator configuration. + +Agent access: `operator-only` — CLI context/profile options and issued agent +environment. + +Policy: CLI preserves the selected bearer identity and run header; installing a CLI does +not grant board rights. + +Evidence: `source-only` — [implementation](../../cli/src/commands/client/common.ts#L49) +at the reviewed commit above. + +Verification: `not-run` — exercise the listed local workflow in an authorized, owned +operator environment. Verify its isolation and result; do not count local machine +authority as company-agent API access. + +Gaps: Local CLI configuration has no matching domain REST resource; explicitly classify +local operator configuration. + +## `domain-commands` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/agents/me`. +- `GET /api/companies/{companyId}/issues`. + +Agent access: `available` — CLI client commands with agent bearer; REST and native +tools. + +Policy: CLI preserves the selected bearer identity and run header; installing a CLI does +not grant board rights. + +Evidence: `source-only` — [implementation](../../cli/src/commands/client/common.ts#L49) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Each command reuses API authorization; a command listed in help is not necessarily +allowed to this agent. + +## `outputs` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PUT /api/issues/{id}/documents/{key}`. +- `POST /api/issues/{id}/work-products`. + +Agent access: `available` — CLI issue/asset/skill commands; REST; native +document/deliverable tools. + +Policy: CLI preserves the selected bearer identity and run header; installing a CLI does +not grant board rights. + +Evidence: `source-only` — [implementation](../../cli/src/commands/client/common.ts#L49) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Binary transfers, document versions and work-product registration need distinct +assertions. + +## `run-controls` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/heartbeat-runs/{runId}`. +- `POST /api/agents/{id}/heartbeat/invoke`. + +Agent access: `partial` — CLI run/agent commands; read API; board-only +invocation/control routes. + +Policy: CLI preserves the selected bearer identity and run header; installing a CLI does +not grant board rights. + +Evidence: `source-only` — [implementation](../../cli/src/commands/client/common.ts#L49) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agent credentials can read eligible runs. Operator invocation/cancellation must +not be counted as ordinary agent access. + +## `worktree-instances` + +Review: `baseline`. + +API: `not-applicable` — Local checkout and pre-start provisioning use local tools, not +company REST authorization. No new runtime is needed. + +Agent access: `operator-only` — CLI worktree/test-drive/dev service commands on an +authorized owned checkout. + +Policy: CLI preserves the selected bearer identity and run header; installing a CLI does +not grant board rights. + +Evidence: `source-only` — [implementation](../../cli/src/commands/client/common.ts#L49) +at the reviewed commit above. + +Verification: `not-run` — exercise the listed local workflow in an authorized, owned +operator environment. Verify its isolation and result; do not count local machine +authority as company-agent API access. + +Gaps: Local checkout and pre-start provisioning use local tools, not company REST +authorization. No new runtime is needed. diff --git a/maps/agent-access-map/companies.md b/maps/agent-access-map/companies.md new file mode 100644 index 00000000000..0366a4cbf4e --- /dev/null +++ b/maps/agent-access-map/companies.md @@ -0,0 +1,115 @@ +# Companies and portability — agent access + +Product map: [Companies and portability](../feature-map/companies.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `selection` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}`. +- `GET /api/companies`. +- `POST /api/companies`. + +Agent access: `partial` — Agent reads its bound company; CLI context chooses it; board +lists/creates companies. + +Policy: Same-company CEO or board for identity/import operations; list/create/archive +convenience endpoint is board-gated. + +Evidence: `source-only` — [implementation](../../server/src/routes/companies.ts#L1245) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: A worker cannot enumerate/create companies via its company agent key. Browser +selection is local state. + +## `identity` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/companies/{companyId}`. +- `PATCH /api/companies/{companyId}/branding`. + +Agent access: `available` — Same-company CEO REST / native call_api / CLI company. + +Policy: Same-company CEO or board for identity/import operations; list/create/archive +convenience endpoint is board-gated. + +Evidence: `source-only` — [implementation](../../server/src/routes/companies.ts#L1245) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: The CEO restriction is a real policy, not a missing API; ordinary employees need +denial evidence. + +## `archive` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/archive`. +- `PATCH /api/companies/{companyId}`. + +Agent access: `partial` — Board archive endpoint; CEO company PATCH can express status +changes. + +Policy: Same-company CEO or board for identity/import operations; list/create/archive +convenience endpoint is board-gated. + +Evidence: `source-only` — [implementation](../../server/src/routes/companies.ts#L1245) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Convenience archive and general company PATCH have different authorization. Review +equivalence rather than declaring all archival human-only. + +## `portability` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/exports`. +- `POST /api/companies/{companyId}/imports/preview`. +- `POST /api/companies/{companyId}/imports/apply`. + +Agent access: `partial` — CEO REST / CLI company; native export restricted, eligible +same-company import uses fallback. + +Policy: Same-company CEO or board for identity/import operations; list/create/archive +convenience endpoint is board-gated. + +Evidence: `source-only` — [implementation](../../server/src/routes/companies.ts#L1245) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Secure exports lack a default native binding; new-company/ZIP import flows have +different board and transport constraints. diff --git a/maps/agent-access-map/connection-setup.md b/maps/agent-access-map/connection-setup.md new file mode 100644 index 00000000000..99e430698db --- /dev/null +++ b/maps/agent-access-map/connection-setup.md @@ -0,0 +1,207 @@ +# Connection setup — agent access + +Product map: [Connection setup](../feature-map/connection-setup.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `catalog` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /runtime-tools/connections/search`. + +Agent access: `available` — Native connections_search / run-bound runtime-tools MCP. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Runtime tool broker searches available services without granting connection +administration. + +## `identity-and-access` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/tools/connections`. + +Agent access: `restricted` — Board setup API plus agent connection_request. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Selecting account ownership/eligible agents is management; an agent can request +the intended connection. + +## `credentials` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/agents/me/connections/{connectionId}/start-authorization`. + +Agent access: `partial` — Scoped start-authorization/request flow; human provider login. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: An initiation endpoint exists; it is not authorization to complete the person's +credential flow. + +## `handoff` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/connection-intents/{interactionId}/complete`. + +Agent access: `restricted` — Addressed-user completion; server wakes the agent with +updated access. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: OAuth/callback and addressed-user checks are deliberate separate boundaries. + +## `draft-recovery` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/connection-intents/{interactionId}/phase`. +- `POST /api/tool-connections/{connectionId}/reconnect`. + +Agent access: `restricted` — Human setup/resume APIs; agent request state and +continuation. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Board setup recovery exists. Browser-only navigation state is not automatically an +agent API gap. + +## `task-request` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /runtime-tools/connections/request`. + +Agent access: `available` — Native connection_request / run-bound runtime-tools MCP. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: This is the existing agent bridge for human-required setup; do not invent a second +approval system. + +## `channel-setup` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/chat-endpoints`. + +Agent access: `restricted` — Board channel management; agent requests required setup. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Provider endpoint, represented agent and linked sender are operator choices today. + +## `failure` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-connections/{connectionId}/health-check`. + +Agent access: `partial` — Agent observes connection tool errors; board repair APIs. + +Policy: Setup and credentials belong to the addressed authorized human; active-run tools +can search/request access. + +Evidence: `source-only` — +[implementation](../../server/src/routes/connection-intents.ts#L130) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Error reporting and human repair exist; no generic agent permission to reconnect +accounts. diff --git a/maps/agent-access-map/developer-labs.md b/maps/agent-access-map/developer-labs.md new file mode 100644 index 00000000000..c8034e1d574 --- /dev/null +++ b/maps/agent-access-map/developer-labs.md @@ -0,0 +1,99 @@ +# Developer previews and diagnostic labs — agent access + +Product map: [Developer previews and diagnostic labs](../feature-map/developer-labs.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `design` + +Review: `baseline`. + +API: `not-applicable` — No domain API required for static component examples; label this +as an explicit exception. + +Agent access: `not-applicable` — Browser/Storybook / existing UI tooling. + +Policy: Synthetic developer fixtures; no persisted company feature or agent authority +represented by the fixture. + +Evidence: `source-only` — [implementation](../../ui/src/App.tsx) at the reviewed commit +above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: No domain API required for static component examples; label this as an explicit +exception. + +## `interaction-labs` + +Review: `baseline`. + +API: `not-applicable` — A synthetic card's API parity belongs to the real feature, not +to a new lab API. + +Agent access: `not-applicable` — Browser fixture plus the corresponding real interaction +API in its owning area. + +Policy: Synthetic developer fixtures; no persisted company feature or agent authority +represented by the fixture. + +Evidence: `source-only` — [implementation](../../ui/src/App.tsx) at the reviewed commit +above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: A synthetic card's API parity belongs to the real feature, not to a new lab API. + +## `performance` + +Review: `baseline`. + +API: `not-applicable` — There is no domain REST action for scrolling a static fixture; +capture browser evidence separately. + +Agent access: `not-applicable` — Browser performance fixture and measurement tooling. + +Policy: Synthetic developer fixtures; no persisted company feature or agent authority +represented by the fixture. + +Evidence: `source-only` — [implementation](../../ui/src/App.tsx) at the reviewed commit +above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: There is no domain REST action for scrolling a static fixture; capture browser +evidence separately. + +## `route-gates` + +Review: `baseline`. + +API: `not-applicable` — Route registration and feature gates are not interchangeable; no +universal developer-only gate exists. + +Agent access: `not-applicable` — Build/route inspection; relevant instance +feature-setting API for actual gates. + +Policy: Synthetic developer fixtures; no persisted company feature or agent authority +represented by the fixture. + +Evidence: `source-only` — [implementation](../../ui/src/App.tsx) at the reviewed commit +above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: Route registration and feature gates are not interchangeable; no universal +developer-only gate exists. diff --git a/maps/agent-access-map/documents-artifacts.md b/maps/agent-access-map/documents-artifacts.md new file mode 100644 index 00000000000..afa3297a1dc --- /dev/null +++ b/maps/agent-access-map/documents-artifacts.md @@ -0,0 +1,139 @@ +# Documents, attachments, and work products — agent access + +Product map: [Documents, attachments, and work +products](../feature-map/documents-artifacts.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `documents` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/documents`. +- `PUT /api/issues/{id}/documents/{key}`. +- `POST /api/issues/{id}/documents/{key}/revisions/{revisionId}/restore`. + +Agent access: `available` — Native list/read/write documents; other-task bridge; REST / +CLI / MCP. + +Policy: Task/resource visibility, mutation/checkout ownership, revision/lock guards and +permitted deliverable context. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L10299) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Supported. Native helpers focus on the active task; generic API or explicit +other-task tools cover additional scope. + +## `annotations` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/documents/{key}/annotations`. +- `PATCH /api/issues/{id}/documents/{key}/annotations/{threadId}`. + +Agent access: `available` — REST / native call_api. + +Policy: Task/resource visibility, mutation/checkout ownership, revision/lock guards and +permitted deliverable context. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L10299) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Annotation operations exist without a special annotation tool; check revision +anchors and resolver authority. + +## `attachments` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/issues/{issueId}/attachments`. +- `GET /api/assets/{assetId}/content`. + +Agent access: `available` — Native register_deliverable and API multipart/binary +support; REST / CLI / MCP transfers. + +Policy: Task/resource visibility, mutation/checkout ownership, revision/lock guards and +permitted deliverable context. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L10299) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native API uploads are bounded; attachment reading has target/provider and +permission conditions. + +## `work-products` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/work-products`. +- `PATCH /api/work-products/{id}`. + +Agent access: `available` — Native register_deliverable for file outputs; REST / native +call_api for metadata. + +Policy: Task/resource visibility, mutation/checkout ownership, revision/lock guards and +permitted deliverable context. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L10299) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: A registered reference does not prove uploaded bytes, external delivery, or +accepted review. + +## `library` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/artifacts`. + +Agent access: `available` — REST / native call_api. + +Policy: Task/resource visibility, mutation/checkout ownership, revision/lock guards and +permitted deliverable context. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L10299) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Library search/filter uses the artifact API; no new tool needed merely to mirror +the UI. diff --git a/maps/agent-access-map/execution-environments.md b/maps/agent-access-map/execution-environments.md new file mode 100644 index 00000000000..74860af970f --- /dev/null +++ b/maps/agent-access-map/execution-environments.md @@ -0,0 +1,132 @@ +# Local, SSH, and sandbox environments — agent access + +Product map: [Local, SSH, and sandbox +environments](../feature-map/execution-environments.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `configuration` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/environments`. +- `POST /api/companies/{companyId}/environments`. + +Agent access: `restricted` — Board read/admin management REST / CLI environment. + +Policy: Environment management is instance administrator/board; permitted assignment +uses agent/project policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/environments.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: API exists; an agent cannot use instance environment management as an ordinary +company actor. + +## `capabilities` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/environments/capabilities`. + +Agent access: `partial` — Board environment capabilities endpoint; native run gets +server-selected runtime context. + +Policy: Environment management is instance administrator/board; permitted assignment +uses agent/project policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/environments.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Endpoint discovery and already-bound run capabilities differ; decide whether a +safe agent-readable capability listing is desired. + +## `probe` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/environments/{id}/probe`. +- `POST /api/companies/{companyId}/environments/probe-config`. + +Agent access: `restricted` — Board/admin probes / CLI environment. + +Policy: Environment management is instance administrator/board; permitted assignment +uses agent/project policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/environments.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Reachability probes are not granted by an agent's right to execute assigned work. + +## `assignment` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/agents/{id}`. +- `PATCH /api/projects/{id}`. + +Agent access: `partial` — Permitted agent/project REST / native fallback, subject to +protected configuration policy. + +Policy: Environment management is instance administrator/board; permitted assignment +uses agent/project policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/environments.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Choosing among permitted targets differs from creating/configuring host targets; +test authorized and denied selection. + +## `images` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/environments/{environmentId}/custom-image-setup-sessions`. + +Agent access: `restricted` — Board/admin image APIs and existing terminal protocol. + +Policy: Environment management is instance administrator/board; permitted assignment +uses agent/project policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/environments.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: No default agent custom-image administration/terminal path; this is a policy +decision before adding a tool. diff --git a/maps/agent-access-map/gateways-profiles.md b/maps/agent-access-map/gateways-profiles.md new file mode 100644 index 00000000000..de326b65acf --- /dev/null +++ b/maps/agent-access-map/gateways-profiles.md @@ -0,0 +1,131 @@ +# Tool gateways and access profiles — agent access + +Product map: [Tool gateways and access profiles](../feature-map/gateways-profiles.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `gateway` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/tools/gateways`. + +Agent access: `restricted` — Board tools:admin REST; CLI connections/configuration where +supported. + +Policy: Named gateway/profile administration and credentials are board tools:admin; +agent sessions/tool use use separate scoped authority. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-gateway.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: No agent named-gateway management path; assigned tool use exists separately. + +## `profiles` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/tools/profiles`. +- `PATCH /api/tool-profiles/{profileId}`. + +Agent access: `restricted` — Board management REST; agent receives effective tool +assignment. + +Policy: Named gateway/profile administration and credentials are board tools:admin; +agent sessions/tool use use separate scoped authority. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-gateway.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Agent access to tools does not permit profile editing. + +## `client-connect` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/tool-gateway/gateways/{gatewayId}/mcp`. +- `POST /api/tool-gateway/sessions`. + +Agent access: `partial` — Existing scoped MCP client/session flow; assigned native app +tools. + +Policy: Named gateway/profile administration and credentials are board tools:admin; +agent sessions/tool use use separate scoped authority. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-gateway.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agent tool consumption exists. Copying/managing the endpoint and its client +credentials remain management operations. + +## `tokens` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-gateway/gateways/{gatewayId}/tokens`. +- `POST /api/tool-gateway/gateway-tokens/{tokenId}/revoke`. + +Agent access: `restricted` — Board tools:admin token management. + +Policy: Named gateway/profile administration and credentials are board tools:admin; +agent sessions/tool use use separate scoped authority. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-gateway.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Native call_api blocks credential management; a grant to use an app does not +create gateway-token authority. + +## `activity` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/tool-gateway/audit`. + +Agent access: `restricted` — Board tools:view_audit; agent receives its own tool +receipts/errors. + +Policy: Named gateway/profile administration and credentials are board tools:admin; +agent sessions/tool use use separate scoped authority. + +Evidence: `source-only` — [implementation](../../server/src/routes/tool-gateway.ts#L353) +at the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Audit management API exists but broad audit visibility is not an agent use-path +guarantee. diff --git a/maps/agent-access-map/goals.md b/maps/agent-access-map/goals.md new file mode 100644 index 00000000000..2bf3f977bff --- /dev/null +++ b/maps/agent-access-map/goals.md @@ -0,0 +1,87 @@ +# Goals and work alignment — agent access + +Product map: [Goals and work alignment](../feature-map/goals.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `hierarchy` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/goals`. +- `POST /api/companies/{companyId}/goals`. +- `PATCH /api/goals/{id}`. + +Agent access: `available` — REST / native call_api / CLI goal / MCP read helpers. + +Policy: Same-company access; related project/task assignments have their own resource +permissions. + +Evidence: `source-only` — [implementation](../../server/src/routes/goals.ts#L14) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Real REST path exists. Scenario list_goals declarations are not evidence of a +production native binding. + +## `alignment` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/projects/{id}`. +- `PATCH /api/issues/{id}`. + +Agent access: `available` — REST / native call_api for permitted non-lifecycle fields. + +Policy: Same-company access; related project/task assignments have their own resource +permissions. + +Evidence: `source-only` — [implementation](../../server/src/routes/goals.ts#L14) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Goal association is data access, separate from completing or reassigning the task. + +## `navigation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/goals/{id}`. +- `GET /api/projects/{id}`. +- `GET /api/issues/{id}`. + +Agent access: `available` — REST and task/project/goal read tools; links returned as +context. + +Policy: Same-company access; related project/task assignments have their own resource +permissions. + +Evidence: `source-only` — [implementation](../../server/src/routes/goals.ts#L14) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Navigation renders records already exposed by APIs; no separate click-navigation +API is required. diff --git a/maps/agent-access-map/inbox-search.md b/maps/agent-access-map/inbox-search.md new file mode 100644 index 00000000000..2c079231dd9 --- /dev/null +++ b/maps/agent-access-map/inbox-search.md @@ -0,0 +1,112 @@ +# Inbox, decisions, and search — agent access + +Product map: [Inbox, decisions, and search](../feature-map/inbox-search.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `views` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/agents/me/inbox-lite`. +- `GET /api/agents/me/inbox/mine`. +- `GET /api/companies/{companyId}/issues`. + +Agent access: `partial` — REST / native call_api; MCP inbox/task search. + +Policy: Own agent context; responsible-user inbox policy and explicit opt-in/grants for +cross-user archive; decision policy separately. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L3952) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agent inbox and Mine support exist; board attention/unread/dismissal aggregation +is a separate user-only surface. + +## `triage` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/inbox-archive`. +- `DELETE /api/issues/{id}/inbox-archive`. + +Agent access: `partial` — REST / native call_api; existing garden-inbox workflow. + +Policy: Own agent context; responsible-user inbox policy and explicit opt-in/grants for +cross-user archive; decision policy separately. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L3952) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Archive has an agent-aware responsible-user policy. Personal read/unread/dismissal +does not have equivalent agent semantics everywhere. + +## `decisions` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/decision-queues`. +- `GET /api/companies/{companyId}/decision-queues/{key}/items`. + +Agent access: `partial` — REST / native call_api under decision queue authorization. + +Policy: Own agent context; responsible-user inbox policy and explicit opt-in/grants for +cross-user archive; decision policy separately. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L3952) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Queue browsing/managing may be allowed; governed approval decisions still have +separate board/resolver boundaries. + +## `search` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/search`. +- `GET /api/companies/{companyId}/issues`. + +Agent access: `available` — Native search_tasks for tasks; REST / native call_api for +broader search. + +Policy: Own agent context; responsible-user inbox policy and explicit opt-in/grants for +cross-user archive; decision policy separately. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L3952) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: General company search and dedicated task search are different result sets; use +the appropriate one. diff --git a/maps/agent-access-map/instance-operations.md b/maps/agent-access-map/instance-operations.md new file mode 100644 index 00000000000..d51cccf323f --- /dev/null +++ b/maps/agent-access-map/instance-operations.md @@ -0,0 +1,130 @@ +# Installation, configuration, updates, and backups — agent access + +Product map: [Installation, configuration, updates, and +backups](../feature-map/instance-operations.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `install-update` + +Review: `baseline`. + +API: `not-applicable` — No uniform company REST updater API. Treat pre-start +installation as an operator exception or design an explicit delegated operator API. + +Agent access: `operator-only` — Existing CLI install/update/rollback commands. + +Policy: Local machine operator and instance-administrator authority; distinct from +company-scoped agent keys. + +Evidence: `source-only` — [implementation](../../cli/src/index.ts#L91) at the reviewed +commit above. + +Verification: `not-run` — exercise the listed local workflow in an authorized, owned +operator environment. Verify its isolation and result; do not count local machine +authority as company-agent API access. + +Gaps: No uniform company REST updater API. Treat pre-start installation as an operator +exception or design an explicit delegated operator API. + +## `server-service` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/health`. + +Agent access: `operator-only` — Existing CLI service/dev controls; health REST; owned +workspace services have separate agent APIs. + +Policy: Local machine operator and instance-administrator authority; distinct from +company-scoped agent keys. + +Evidence: `source-only` — [implementation](../../cli/src/index.ts#L91) at the reviewed +commit above. + +Verification: `not-run` — exercise the listed local workflow in an authorized, owned +operator environment. Verify its isolation and result; do not count local machine +authority as company-agent API access. + +Gaps: Instance start/stop and task workspace start/stop are different capabilities. +Local service control is not agent company authority. + +## `configuration` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/instance/settings`. +- `PATCH /api/instance/settings`. + +Agent access: `restricted` — Board/admin instance settings; CLI configure/env; local +configuration files. + +Policy: Local machine operator and instance-administrator authority; distinct from +company-scoped agent keys. + +Evidence: `source-only` — [implementation](../../cli/src/index.ts#L91) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Settings APIs cover parts of configuration; pre-start database/binding/storage +configuration is local operator tooling. + +## `diagnostics` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/health`. + +Agent access: `partial` — REST health plus local CLI doctor. + +Policy: Local machine operator and instance-administrator authority; distinct from +company-scoped agent keys. + +Evidence: `source-only` — [implementation](../../cli/src/index.ts#L91) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Health is an API; full local doctor/repair inspects host configuration and is not +equivalent to that response. + +## `backup` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/instance/database-backups`. + +Agent access: `restricted` — Board/admin backup API; local CLI db:backup; restore into +an authorized separate target. + +Policy: Local machine operator and instance-administrator authority; distinct from +company-scoped agent keys. + +Evidence: `source-only` — [implementation](../../cli/src/index.ts#L91) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: API creation exists. Restore/lifecycle are operator workflows rather than ordinary +company agent capabilities. diff --git a/maps/agent-access-map/navigation-preferences.md b/maps/agent-access-map/navigation-preferences.md new file mode 100644 index 00000000000..e5693a33b17 --- /dev/null +++ b/maps/agent-access-map/navigation-preferences.md @@ -0,0 +1,138 @@ +# Navigation, profile, and announcements — agent access + +Product map: [Navigation, profile, and +announcements](../feature-map/navigation-preferences.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `navigation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/projects`. +- `GET /api/companies/{companyId}/resource-memberships/me`. + +Agent access: `partial` — Resource APIs plus user-specific stars; browser-local recents. + +Policy: Persisted user preferences require board user context; resource reads still +apply company visibility. + +Evidence: `source-only` — +[implementation](../../server/src/routes/sidebar-preferences.ts#L8) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Underlying resources have APIs; recents are client-local, and personal starring +needs its own identity policy. + +## `preferences` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/sidebar-preferences/me`. +- `PUT /api/sidebar-preferences/me`. + +Agent access: `restricted` — Board-user preference API; browser section collapse. + +Policy: Persisted user preferences require board user context; resource reads still +apply company visibility. + +Evidence: `source-only` — +[implementation](../../server/src/routes/sidebar-preferences.ts#L8) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Catalog metadata says board_or_agent, but requireBoardUserId rejects agents. +Collapse is in-memory; global collapse is disabled. + +## `profile` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/users/{userSlug}/profile`. +- `PATCH /api/auth/profile`. + +Agent access: `partial` — Agent can read eligible company profile; changing personal +identity requires board user. + +Policy: Persisted user preferences require board user context; resource reads still +apply company visibility. + +Evidence: `source-only` — +[implementation](../../server/src/routes/sidebar-preferences.ts#L8) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Reading another visible user's profile and editing a person's identity are +distinct permission paths. + +## `announcements` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/announcements/current`. +- `POST /api/announcements/{id}/dismiss`. + +Agent access: `restricted` — Board-user announcement API. + +Policy: Persisted user preferences require board user context; resource reads still +apply company visibility. + +Evidence: `source-only` — +[implementation](../../server/src/routes/sidebar-preferences.ts#L8) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: User-specific instance-wide dismissal has no agent delegation path today. + +## `fallbacks` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}`. +- `GET /api/projects/{id}`. + +Agent access: `partial` — API not-found/access semantics; browser router redirects. + +Policy: Persisted user preferences require board user context; resource reads still +apply company visibility. + +Evidence: `source-only` — +[implementation](../../server/src/routes/sidebar-preferences.ts#L8) at the reviewed +commit above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: Record lookup exists. Route redirects/fallback presentation do not need a separate +domain API. diff --git a/maps/agent-access-map/onboarding.md b/maps/agent-access-map/onboarding.md new file mode 100644 index 00000000000..f4eb025f50c --- /dev/null +++ b/maps/agent-access-map/onboarding.md @@ -0,0 +1,136 @@ +# Onboarding and first work — agent access + +Product map: [Onboarding and first work](../feature-map/onboarding.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `instance` + +Review: `baseline`. + +API: `not-applicable` — Bootstrapping an instance cannot depend solely on an API served +by that not-yet-running instance. + +Agent access: `operator-only` — Existing CLI onboard/run/doctor / test-drive. + +Policy: Instance setup is operator work; company creation is board; agent creation/task +creation retain their individual permissions. + +Evidence: `source-only` — +[implementation](../../ui/src/components/OnboardingWizard.tsx#L279) at the reviewed +commit above. + +Verification: `not-run` — exercise the listed local workflow in an authorized, owned +operator environment. Verify its isolation and result; do not count local machine +authority as company-agent API access. + +Gaps: Bootstrapping an instance cannot depend solely on an API served by that +not-yet-running instance. + +## `company` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies`. +- `POST /api/companies/{companyId}/agents`. + +Agent access: `partial` — Board company creation; authorized in-company agent hiring +API. + +Policy: Instance setup is operator work; company creation is board; agent creation/task +creation retain their individual permissions. + +Evidence: `source-only` — +[implementation](../../ui/src/components/OnboardingWizard.tsx#L279) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: API building blocks exist; an ordinary agent cannot create its parent company with +a company key. + +## `adapter` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/adapters/{type}/models`. +- `POST /api/companies/{companyId}/adapters/{type}/test-environment`. + +Agent access: `partial` — Permitted agent/model API; operator +provider-account/environment setup. + +Policy: Instance setup is operator work; company creation is board; agent creation/task +creation retain their individual permissions. + +Evidence: `source-only` — +[implementation](../../ui/src/components/OnboardingWizard.tsx#L279) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Account authorization, environment administration and model selection need +separate checks. + +## `first-task` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/issues`. + +Agent access: `available` — Native create_task / agent REST / CLI issue. + +Policy: Instance setup is operator work; company creation is board; agent creation/task +creation retain their individual permissions. + +Evidence: `source-only` — +[implementation](../../ui/src/components/OnboardingWizard.tsx#L279) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Task creation is agent-accessible where permitted; scheduling/readiness does not +follow from successful creation. + +## `resume` + +Review: `baseline`. + +API: `not-applicable` — No server onboarding-draft API for this browser-local state; +classify explicitly or intentionally make it a cross-client product feature. + +Agent access: `not-applicable` — Browser localStorage wizard draft; persisted resources +use their domain APIs. + +Policy: Instance setup is operator work; company creation is board; agent creation/task +creation retain their individual permissions. + +Evidence: `source-only` — +[implementation](../../ui/src/components/OnboardingWizard.tsx#L279) at the reviewed +commit above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: No server onboarding-draft API for this browser-local state; classify explicitly +or intentionally make it a cross-client product feature. diff --git a/maps/agent-access-map/pipelines.md b/maps/agent-access-map/pipelines.md new file mode 100644 index 00000000000..b33ca8ce805 --- /dev/null +++ b/maps/agent-access-map/pipelines.md @@ -0,0 +1,109 @@ +# Pipelines, review queues, and learnings — agent access + +Product map: [Pipelines, review queues, and learnings](../feature-map/pipelines.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `stages` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/pipelines/{pipelineId}/stages`. +- `PATCH /api/pipelines/{pipelineId}/stages/{stageId}`. + +Agent access: `available` — REST / native call_api / CLI pipelines where supported. + +Policy: Company access, active agent run for mutations, case/issue source trust and +ownership, and review audience. + +Evidence: `source-only` — [implementation](../../server/src/routes/pipelines.ts#L265) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Configuration paths exist. Generic fallback blocks case automation execution +paths; do not conflate configuration and dispatch. + +## `items` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/pipelines/{pipelineId}/cases`. +- `POST /api/pipelines/{pipelineId}/cases`. + +Agent access: `available` — REST / native call_api / CLI pipelines. + +Policy: Company access, active agent run for mutations, case/issue source trust and +ownership, and review audience. + +Evidence: `source-only` — [implementation](../../server/src/routes/pipelines.ts#L265) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agents need run ID on mutations; task-linked changes also check issue +mutation/checkout ownership. + +## `review` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/review-cases`. +- `POST /api/cases/{caseId}/review`. + +Agent access: `available` — REST / native call_api / CLI pipeline case review. + +Policy: Company access, active agent run for mutations, case/issue source trust and +ownership, and review audience. + +Evidence: `source-only` — [implementation](../../server/src/routes/pipelines.ts#L265) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Review policy and actor ownership still apply; existence of the endpoint is not +blanket review authority. + +## `learnings` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/case-events`. + +Agent access: `available` — REST / native call_api / CLI case events. + +Policy: Company access, active agent run for mutations, case/issue source trust and +ownership, and review audience. + +Evidence: `source-only` — [implementation](../../server/src/routes/pipelines.ts#L265) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Learning view is a filtered case-event projection; no separate learning API is +necessary. diff --git a/maps/agent-access-map/plugins.md b/maps/agent-access-map/plugins.md new file mode 100644 index 00000000000..2f81f2062e9 --- /dev/null +++ b/maps/agent-access-map/plugins.md @@ -0,0 +1,107 @@ +# Plugins and contributed product surfaces — agent access + +Product map: [Plugins and contributed product surfaces](../feature-map/plugins.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `installation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/plugins/install`. + +Agent access: `restricted` — Instance-admin REST / CLI plugin. + +Policy: Instance plugin management requires board/admin; declared tools and scoped APIs +apply their own company/agent policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/plugins.ts#L965) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: No ordinary agent install path; installing executable plugin code is an explicit +authority decision. + +## `configuration` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/plugins/{pluginId}/config`. +- `POST /api/plugins/{pluginId}/config`. + +Agent access: `restricted` — Board read/admin write; CLI plugin. + +Policy: Instance plugin management requires board/admin; declared tools and scoped APIs +apply their own company/agent policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/plugins.ts#L965) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Company-scoped configuration value does not turn the instance management route +into an agent route. + +## `contributions` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/plugins/tools`. +- `POST /api/plugins/tools/execute`. + +Agent access: `partial` — Agent REST plus assigned native/gateway plugin tools and +scoped plugin APIs. + +Policy: Instance plugin management requires board/admin; declared tools and scoped APIs +apply their own company/agent policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/plugins.ts#L965) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Actual plugin tool use exists; a contributed UI route alone does not prove that +plugin's API/tool coverage. + +## `lifecycle` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/plugins/{pluginId}/enable`. +- `POST /api/plugins/{pluginId}/disable`. + +Agent access: `restricted` — Instance-admin REST / CLI plugin; dev watcher for reload. + +Policy: Instance plugin management requires board/admin; declared tools and scoped APIs +apply their own company/agent policy. + +Evidence: `source-only` — [implementation](../../server/src/routes/plugins.ts#L965) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Disable/remove and development reload are management workflows with no default +company agent access. diff --git a/maps/agent-access-map/projects.md b/maps/agent-access-map/projects.md new file mode 100644 index 00000000000..bdec3cf2aa3 --- /dev/null +++ b/maps/agent-access-map/projects.md @@ -0,0 +1,113 @@ +# Projects and repositories — agent access + +Product map: [Projects and repositories](../feature-map/projects.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `lifecycle` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/projects`. +- `PATCH /api/projects/{id}`. +- `DELETE /api/projects/{id}`. + +Agent access: `available` — Native create_project/list_projects; REST / CLI / MCP. + +Policy: Company/project visibility, protected configuration/runtime policies; some +repository/privacy management requires board. + +Evidence: `source-only` — [implementation](../../server/src/routes/projects.ts#L278) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Actual data operations exist; project discovery and private-resource permissions +still apply. + +## `task-context` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/issues`. +- `POST /api/companies/{companyId}/issues`. + +Agent access: `available` — Native create_task/search_tasks; REST / CLI / MCP. + +Policy: Company/project visibility, protected configuration/runtime policies; some +repository/privacy management requires board. + +Evidence: `source-only` — [implementation](../../server/src/routes/projects.ts#L278) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Use explicit project context; task creation, assignment, and execution remain +separate checks. + +## `repositories` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/project-repositories`. +- `PUT /api/projects/{id}/repositories`. + +Agent access: `partial` — Native list_project_repositories/create_project for initial +selection; board-only replacement API. + +Policy: Company/project visibility, protected configuration/runtime policies; some +repository/privacy management requires board. + +Evidence: `source-only` — [implementation](../../server/src/routes/projects.ts#L278) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Authorized initial selection works. Replacement of repositories on an existing +project hard-requires board and needs a delegation decision. + +## `defaults` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/projects/{id}`. +- `GET /api/projects/{id}/workspaces`. + +Agent access: `partial` — REST / native call_api for permitted fields; CLI +project/workspace. + +Policy: Company/project visibility, protected configuration/runtime policies; some +repository/privacy management requires board. + +Evidence: `source-only` — [implementation](../../server/src/routes/projects.ts#L278) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Description/goal/target selection exist; host workspace command mutation is denied +to agents and budget policy is board-managed. diff --git a/maps/agent-access-map/questions-and-approvals.md b/maps/agent-access-map/questions-and-approvals.md new file mode 100644 index 00000000000..7ed7d2de128 --- /dev/null +++ b/maps/agent-access-map/questions-and-approvals.md @@ -0,0 +1,212 @@ +# Questions and approvals — agent access + +Product map: [Questions and approvals](../feature-map/questions-and-approvals.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `questions` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/interactions`. +- `POST /api/issues/{id}/interactions/{interactionId}/respond`. + +Agent access: `partial` — Native request_human_input; REST / MCP forms; authorized +responder endpoint. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agent creates questions. It cannot fabricate a human answer; answering follows +resolver policy. + +## `dismiss-and-reopen` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/interactions`. + +Agent access: `partial` — Persisted question API plus browser card state. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: Presentation dismissal/reopening does not resolve the question and does not +require a new mutation API. + +## `confirmations` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/interactions`. +- `POST /api/issues/{id}/interactions/{interactionId}/resolve-from-comment`. + +Agent access: `partial` — Native request_human_input and call_api resolve-from-comment; +authorized REST resolver. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Conversational confirmation is supported under resolver policy; generic +acceptance/response controls remain restricted. + +## `plan-review` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PUT /api/issues/{id}/documents/{key}`. +- `POST /api/issues/{id}/interactions`. + +Agent access: `partial` — Native write_document/request_human_input; explicit review +recipient. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Plan revision and confirmation work. Accepting as a human is not a generic agent +capability. + +## `audience` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/interactions`. + +Agent access: `available` — API resolver checks; assigned review context/resolve_review +for a native review run. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Audience is a permission boundary to test, not an endpoint that creates new +authority. + +## `governance` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/approvals`. +- `POST /api/approvals/{id}/approve`. +- `POST /api/approvals/{id}/reject`. + +Agent access: `restricted` — Agent REST/MCP can request/read/comment/resubmit; formal +approve/reject require board. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Scenario decide_approval does not establish a production agent approval path. +Preserve explicit approver authority. + +## `tool-review` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/tool-gateway/action-requests/{id}/approve`. +- `POST /api/tool-gateway/action-requests/{id}/decline`. + +Agent access: `restricted` — Agent invokes assigned ask-policy tool; board approval +executes stored request. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: The request/continuation path exists. Agent cannot grant itself once/always-allow +scope via generic API. + +## `continuation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/interactions`. +- `GET /api/heartbeat-runs/{runId}`. + +Agent access: `available` — Server delivery and resumed assigned agent context. + +Policy: Current task/run and named audience/resolver policy; governed approval decisions +require board independently of an ordinary interaction. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16638) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Continuation is server-owned; prove exactly one wake/no duplicate action after +resolution with existing integration fixtures. diff --git a/maps/agent-access-map/recovery.md b/maps/agent-access-map/recovery.md new file mode 100644 index 00000000000..a6a12a3f1c0 --- /dev/null +++ b/maps/agent-access-map/recovery.md @@ -0,0 +1,207 @@ +# Recovery — agent access + +Product map: [Recovery](../feature-map/recovery.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `diagnosis` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/diagnostics/blockers`. +- `GET /api/issues/{id}/recovery-actions`. + +Agent access: `available` — REST / native call_api; CLI issue diagnostics. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Diagnostics expose recorded cause and boundaries; source-backed reading does not +prove successful recovery. + +## `bounded-continuation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/recovery-actions/resolve`. + +Agent access: `partial` — Eligible agent REST / CLI; native generic mutation restricted. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Underlying route has agent checks; no corresponding default native recovery +mutation tool is advertised. + +## `source-action` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/recovery-actions/resolve`. + +Agent access: `partial` — Eligible agent REST / CLI; source-bound recovery state. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Need operation-level eligibility and a real native binding for permitted recovery +actions; do not route around lifecycle authority. + +## `exhaustion` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/recovery-actions`. +- `GET /api/heartbeat-runs/{runId}`. + +Agent access: `partial` — REST / native call_api reads; operator escalation flow. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Reading exhaustion is supported. Continuing past the recorded gate requires the +specified owner/action. + +## `workspace` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/recovery-actions/retry-workspace-export`. +- `POST /api/execution-workspaces/{id}/reconcile-branch`. + +Agent access: `restricted` — Board/runtime management APIs; agent reads diagnosis and +performs permitted workspace work. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Export retry/reconciliation APIs exist but require board. Native generic +execution-control mutations are also blocked. + +## `unknown-outcome` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/chat-endpoints/{endpointId}/publications/{publicationId}/resolve`. + +Agent access: `restricted` — Board provider-outcome resolution; agent may inspect +assigned provider tools. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Uncertain-side-effect resolution is operator/source-specific; do not replay to +obtain apparent parity. + +## `user-continuation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/comments`. + +Agent access: `partial` — User comment API and server-owned wake reconsideration; native +agent consumes bound wake. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Receiving the continuation is supported; impersonating a saved user message or +retry control is not. + +## `reconnect` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/events/ws`. +- `GET /api/issues/{id}`. + +Agent access: `partial` — Existing event protocol; REST refresh of persisted task state. + +Policy: Task/run visibility, run ownership and source/action policy; workspace export +retry and some operator controls require board. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L9478) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Streaming reconnect needs its protocol client. Polling/read APIs remain available; +replay is not proof of a fresh successful action. diff --git a/maps/agent-access-map/routines.md b/maps/agent-access-map/routines.md new file mode 100644 index 00000000000..bb3ec03599a --- /dev/null +++ b/maps/agent-access-map/routines.md @@ -0,0 +1,135 @@ +# Routines, schedules, and triggers — agent access + +Product map: [Routines, schedules, and triggers](../feature-map/routines.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `definition` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/routines`. +- `PATCH /api/routines/{id}`. + +Agent access: `partial` — Agent REST / CLI routine create/update; optional installed MCP +generic request. + +Policy: Agents may read company routines but only create/manage routines assigned to +themselves; trigger secrets need secure handling. + +Evidence: `source-only` — [implementation](../../server/src/routes/routines.ts#L99) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native call_api rejects routine mutation; manage_routine is scenario-only/unbound. +Agent REST is implemented. + +## `triggers` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/routines/{id}/triggers`. +- `PATCH /api/routine-triggers/{id}`. + +Agent access: `partial` — Owned-routine agent REST / CLI routine trigger commands. + +Policy: Agents may read company routines but only create/manage routines assigned to +themselves; trigger secrets need secure handling. + +Evidence: `source-only` — [implementation](../../server/src/routes/routines.ts#L99) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: No production default native trigger-management binding. Webhook creation/rotation +also returns credential material. + +## `run-now` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/routines/{id}/run`. + +Agent access: `partial` — Owned-routine agent REST / CLI routine run. + +Policy: Agents may read company routines but only create/manage routines assigned to +themselves; trigger secrets need secure handling. + +Evidence: `source-only` — [implementation](../../server/src/routes/routines.ts#L99) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: A scheduled/waiting native agent cannot use call_api for this eligible operation; +a real control binding is missing. + +## `history` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/routines/{id}/runs`. +- `GET /api/routines/{id}/revisions`. + +Agent access: `available` — REST / native call_api / CLI routine. + +Policy: Agents may read company routines but only create/manage routines assigned to +themselves; trigger secrets need secure handling. + +Evidence: `source-only` — [implementation](../../server/src/routes/routines.ts#L99) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Runs are readable in company scope; configuration revision access checks routine +ownership for agents. + +## `management` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/routines/{id}`. + +Agent access: `partial` — Owned-routine agent REST / CLI; normal native fallback can +manage separate folder metadata where permitted. + +Policy: Agents may read company routines but only create/manage routines assigned to +themselves; trigger secrets need secure handling. + +Evidence: `source-only` — [implementation](../../server/src/routes/routines.ts#L99) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Pause/archive routine mutation lacks a production native binding. Plugin-managed +routine rules remain separate. diff --git a/maps/agent-access-map/runs-adapters.md b/maps/agent-access-map/runs-adapters.md new file mode 100644 index 00000000000..bd2f509c545 --- /dev/null +++ b/maps/agent-access-map/runs-adapters.md @@ -0,0 +1,111 @@ +# Runs, harnesses, and model accounts — agent access + +Product map: [Runs, harnesses, and model accounts](../feature-map/runs-adapters.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `availability` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/adapters`. +- `GET /api/companies/{companyId}/adapters/{type}/models`. + +Agent access: `partial` — Agent company-model API and bound runtime context; board +adapter/account inventories. + +Policy: Run/cost visibility and agent configuration policy; adapter installation/account +login/session control require board/admin. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L6608) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Raw instance adapter listing requires board, while company model discovery exists +for eligible agents. + +## `validation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/adapters/{type}/test-environment`. + +Agent access: `partial` — Permitted agent-creation validation path / REST / CLI; +operator account login. + +Policy: Run/cost visibility and agent configuration policy; adapter installation/account +login/session control require board/admin. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L6608) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Environment test path checks creation/configuration policy; missing provider auth +must use its owner setup flow. + +## `runs` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/heartbeat-runs/{runId}`. +- `GET /api/heartbeat-runs/{runId}/log`. + +Agent access: `available` — REST / native call_api / CLI run. + +Policy: Run/cost visibility and agent configuration policy; adapter installation/account +login/session control require board/admin. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L6608) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Provider trace reveals/downloads require instance-admin and cannot be counted as +ordinary run output access. + +## `session` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/agents/{id}/runtime-state/reset-session`. +- `GET /api/agents/{id}/task-sessions`. + +Agent access: `restricted` — Board session controls; native server-owned session +continuation. + +Policy: Run/cost visibility and agent configuration policy; adapter installation/account +login/session control require board/admin. + +Evidence: `source-only` — [implementation](../../server/src/routes/agents.ts#L6608) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Execution context reset is not a permitted generic native API mutation or an +ordinary agent management path. diff --git a/maps/agent-access-map/secrets.md b/maps/agent-access-map/secrets.md new file mode 100644 index 00000000000..083c56da74c --- /dev/null +++ b/maps/agent-access-map/secrets.md @@ -0,0 +1,138 @@ +# Secrets, personal credentials, and proposals — agent access + +Product map: [Secrets, personal credentials, and proposals](../feature-map/secrets.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `company-secrets` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/secrets/catalog`. +- `POST /api/companies/{companyId}/secrets`. + +Agent access: `partial` — Agent metadata catalog; board secret administration; agent +secret proposal API. + +Policy: Board secret administration, active-run/self/report proposal policy, and scoped +secret broker bindings; personal secret values belong to their user. + +Evidence: `source-only` — [implementation](../../server/src/routes/secrets.ts#L194) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Metadata and requesting a change exist; generic native API blocks secret +management/value transport. + +## `user-secrets` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/me/user-secrets`. +- `POST /api/companies/{companyId}/me/user-secrets`. + +Agent access: `restricted` — Current board user's personal-secret API; agent receives +only authorized run binding. + +Policy: Board secret administration, active-run/self/report proposal policy, and scoped +secret broker bindings; personal secret values belong to their user. + +Evidence: `source-only` — [implementation](../../server/src/routes/secrets.ts#L194) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Agent cannot edit a person's private credential value through their ordinary agent +key. + +## `proposals` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/agents/me/secret-proposals`. +- `GET /api/agents/me/secret-proposals`. + +Agent access: `partial` — Active-run agent REST with redaction; board +approval/rejection. + +Policy: Board secret administration, active-run/self/report proposal policy, and scoped +secret broker bindings; personal secret values belong to their user. + +Evidence: `source-only` — [implementation](../../server/src/routes/secrets.ts#L194) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native call_api blocks secret-proposals and no dedicated production proposal tool +is in its default authority set. + +## `vault-import` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/secrets/remote-import/preview`. +- `POST /api/companies/{companyId}/secrets/remote-import`. + +Agent access: `restricted` — Board authorized vault import API / CLI provider +operations. + +Policy: Board secret administration, active-run/self/report proposal policy, and scoped +secret broker bindings; personal secret values belong to their user. + +Evidence: `source-only` — [implementation](../../server/src/routes/secrets.ts#L194) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Vault import is not implied by having a secret binding or the ability to propose a +secret. + +## `runtime-delivery` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/agents/me/secrets`. +- `POST /api/agents/me/secrets/{key}/value`. + +Agent access: `partial` — Authorized environment/broker delivery; eligible legacy agent +REST access. + +Policy: Board secret administration, active-run/self/report proposal policy, and scoped +secret broker bindings; personal secret values belong to their user. + +Evidence: `source-only` — [implementation](../../server/src/routes/secrets.ts#L194) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native metadata reads exist; value call is blocked and scenario read_secret_value +is unbound. Do not add raw secret-returning fallback tools. diff --git a/maps/agent-access-map/skills.md b/maps/agent-access-map/skills.md new file mode 100644 index 00000000000..b4ce67184c8 --- /dev/null +++ b/maps/agent-access-map/skills.md @@ -0,0 +1,141 @@ +# Skill discovery, authoring, and policy — agent access + +Product map: [Skill discovery, authoring, and policy](../feature-map/skills.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `discovery` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/skills`. +- `POST /api/companies/{companyId}/skills/import`. + +Agent access: `available` — REST / native call_api / CLI skills and sources. + +Policy: Company skill policy by action/resource plus platform invariants; test execution +additionally requires task-assignment authority. + +Evidence: `source-only` — +[implementation](../../server/src/routes/company-skills.ts#L208) at the reviewed commit +above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Installation/import is governed by company skill policy, not inferred from an +agent's role name. + +## `authoring` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/skills`. +- `PATCH /api/companies/{companyId}/skills/{skillId}/files`. + +Agent access: `available` — Native create_skill/update_skill for single-file operations; +REST for other files/metadata. + +Policy: Company skill policy by action/resource plus platform invariants; test execution +additionally requires task-assignment authority. + +Evidence: `source-only` — +[implementation](../../server/src/routes/company-skills.ts#L208) at the reviewed commit +above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Writable/fork policy and expected version apply. Native helpers intentionally +support a narrower shape than full API. + +## `versions` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/skills/{skillId}/versions`. + +Agent access: `available` — REST / native call_api / CLI skills. + +Policy: Company skill policy by action/resource plus platform invariants; test execution +additionally requires task-assignment authority. + +Evidence: `source-only` — +[implementation](../../server/src/routes/company-skills.ts#L208) at the reviewed commit +above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Revision metadata has an API; pinned execution skill versions and installed latest +are distinct. + +## `policy` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PUT /api/companies/{companyId}/skill-policy`. +- `POST /api/agents/{id}/skills/sync`. + +Agent access: `partial` — REST / native call_api under users:manage_permissions or +target configuration policy. + +Policy: Company skill policy by action/resource plus platform invariants; test execution +additionally requires task-assignment authority. + +Evidence: `source-only` — +[implementation](../../server/src/routes/company-skills.ts#L208) at the reviewed commit +above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Policy administration has an explicit agent grant branch; assigning agent skills +also checks the target's config authority. + +## `testing` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/skills/{skillId}/test-runs`. + +Agent access: `partial` — Permitted agent REST; native read fallback for history; no +dedicated CLI test command found. + +Policy: Company skill policy by action/resource plus platform invariants; test execution +additionally requires task-assignment authority. + +Evidence: `source-only` — +[implementation](../../server/src/routes/company-skills.ts#L208) at the reviewed commit +above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native call_api rejects test-run creation/control while the route can authorize +agents. No default native orchestration binding. diff --git a/maps/agent-access-map/status-cards.md b/maps/agent-access-map/status-cards.md new file mode 100644 index 00000000000..ef2dbf42b66 --- /dev/null +++ b/maps/agent-access-map/status-cards.md @@ -0,0 +1,110 @@ +# Status cards and refreshed summaries — agent access + +Product map: [Status cards and refreshed summaries](../feature-map/status-cards.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `authoring` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/status-cards`. +- `PATCH /api/status-cards/{id}`. + +Agent access: `available` — REST / native call_api. + +Policy: Feature gate, tasks:assign decision; agents manage only cards they authored; +compiler/summarizer has extra bound-task checks. + +Evidence: `source-only` — [implementation](../../server/src/routes/status-cards.ts#L32) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Real agent create/update permission branch exists; not inherently a board-only +feature. + +## `generation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/status-cards/{id}/recompile`. +- `POST /api/status-cards/{id}/refresh`. + +Agent access: `available` — REST / native call_api for authorized own card. + +Policy: Feature gate, tasks:assign decision; agents manage only cards they authored; +compiler/summarizer has extra bound-task checks. + +Evidence: `source-only` — [implementation](../../server/src/routes/status-cards.ts#L32) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Execution result must be checked. Agent-authored prompt length and tasks:assign +limits apply. + +## `inspection` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/status-cards/{id}`. +- `GET /api/status-cards/{id}/summary-revisions`. +- `GET /api/status-cards/{id}/dry-run`. + +Agent access: `available` — REST / native call_api. + +Policy: Feature gate, tasks:assign decision; agents manage only cards they authored; +compiler/summarizer has extra bound-task checks. + +Evidence: `source-only` — [implementation](../../server/src/routes/status-cards.ts#L32) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Read/history/debug APIs exist; a rendered compiling state is not evidence of +successful generation. + +## `archive` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/status-cards/{id}`. + +Agent access: `available` — REST / native call_api under own-card management policy. + +Policy: Feature gate, tasks:assign decision; agents manage only cards they authored; +compiler/summarizer has extra bound-task checks. + +Evidence: `source-only` — [implementation](../../server/src/routes/status-cards.ts#L32) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Archive/restore is represented by card state, separate from delete; check exact +allowed status transition. diff --git a/maps/agent-access-map/steering.md b/maps/agent-access-map/steering.md new file mode 100644 index 00000000000..0b872acd931 --- /dev/null +++ b/maps/agent-access-map/steering.md @@ -0,0 +1,180 @@ +# Steering and queued messages — agent access + +Product map: [Steering and queued messages](../feature-map/steering.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `queue` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/queued-comments`. + +Agent access: `partial` — REST / native call_api for visible queue; server-owned queue +admission. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Agents can read eligible queue state; sending/steering the person's queued +messages requires separate authority. + +## `edit-order-discard` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/issues/{id}/queued-comments/{commentId}`. +- `PUT /api/issues/{id}/queued-comments/order`. +- `DELETE /api/issues/{id}/queued-comments/{commentId}`. + +Agent access: `restricted` — Board-user queue mutation API. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: No agent user-message edit/reorder/discard path; explicit delegated-user policy +needed before granting one. + +## `steer` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/queued-comments/{commentId}/steer`. + +Agent access: `restricted` — Board-user execution control API; agent receives eligible +new run/wake. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Generic native API blocks this execution control; no authority to impersonate the +steering user. + +## `interrupt` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/queued-comments/interrupt`. +- `POST /api/heartbeat-runs/{runId}/cancel`. + +Agent access: `restricted` — Board-user interruption/cancel API. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Explicit operator action is distinct from an agent yielding/blocking its own turn. + +## `stop-and-pause` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/tree-holds`. +- `POST /api/agents/{id}/pause`. + +Agent access: `restricted` — Board control APIs; agent paperclip_finish/paperclip_block +for its own turn. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Task-tree/agent pause and confirmed stop need policy-preserving authority; no +generic agent management path. + +## `drafts` + +Review: `baseline`. + +API: `not-applicable` — No shared server draft resource for this presentation state; +cross-client drafts would be a deliberate new capability. + +Agent access: `not-applicable` — Browser-local task composer draft / submission state. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — use the product recipe for the local/developer surface. Verify +listed shared-resource reads separately; local presentation alone is not agent API +evidence. + +Gaps: No shared server draft resource for this presentation state; cross-client drafts +would be a deliberate new capability. + +## `approval-queue` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/interactions`. +- `GET /api/issues/{id}/queued-comments`. + +Agent access: `partial` — Agent can inspect authorized persisted interactions; server +continuation/queue delivery. + +Policy: Queue inspection follows task visibility; queued user-message mutation and run +cancellation require a board actor/user. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts#L16166) at +the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Resolving as a human and controlling queued wakes is separate from seeing the +approval response. diff --git a/maps/agent-access-map/task-coordination.md b/maps/agent-access-map/task-coordination.md new file mode 100644 index 00000000000..c32d5849d2c --- /dev/null +++ b/maps/agent-access-map/task-coordination.md @@ -0,0 +1,114 @@ +# Delegation, dependencies, and signoff — agent access + +Product map: [Delegation, dependencies, and +signoff](../feature-map/task-coordination.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `delegation` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/issues`. + +Agent access: `available` — Native create_task/reassign_task; REST / CLI / MCP. + +Policy: Task visibility/mutation, task-assignment and ownership policy; review audience +independent; tree controls board-only. + +Evidence: `source-only` — +[implementation](../../server/src/routes/issue-tree-control.ts#L95) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Parent/child and provenance paths exist; same-company assignment does not remove +protected task/resource policy. + +## `dependencies` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/issues/{id}`. + +Agent access: `available` — Native set_dependencies for current task; agent REST under +mutation/checkout policy. + +Policy: Task visibility/mutation, task-assignment and ownership policy; review audience +independent; tree controls board-only. + +Evidence: `source-only` — +[implementation](../../server/src/routes/issue-tree-control.ts#L95) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Generic native PATCH rejects blockedByIssueIds so use its real dedicated tool. + +## `signoff` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/issues/{id}`. +- `POST /api/issues/{id}/interactions`. + +Agent access: `partial` — Native paperclip_finish/paperclip_block and assigned +resolve_review; legacy agent REST disposition. + +Policy: Task visibility/mutation, task-assignment and ownership policy; review audience +independent; tree controls board-only. + +Evidence: `source-only` — +[implementation](../../server/src/routes/issue-tree-control.ts#L95) at the reviewed +commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Review policy determines final completion; formal board approval is a different +boundary. + +## `tree-control` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/tree-control/preview`. +- `POST /api/issues/{id}/tree-holds`. +- `POST /api/issues/{id}/tree-holds/{holdId}/release`. + +Agent access: `restricted` — Board-only task-tree APIs. + +Policy: Task visibility/mutation, task-assignment and ownership policy; review audience +independent; tree controls board-only. + +Evidence: `source-only` — +[implementation](../../server/src/routes/issue-tree-control.ts#L95) at the reviewed +commit above. + +Verification: `not-run` — assert the documented agent denial with an owned test fixture; +verify any listed agent request/result path separately. A delegated operation needs its +own policy and access review. + +Gaps: Even reads/state/preview require board. There is no agent tree-control path just +from company/task permissions. diff --git a/maps/agent-access-map/tasks.md b/maps/agent-access-map/tasks.md new file mode 100644 index 00000000000..d0ccdbc978c --- /dev/null +++ b/maps/agent-access-map/tasks.md @@ -0,0 +1,136 @@ +# Task creation and lifecycle — agent access + +Product map: [Task creation and lifecycle](../feature-map/tasks.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `create` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/issues`. + +Agent access: `available` — Native create_task; REST / CLI / MCP. + +Policy: Company/task visibility, assignment/change policy, active-run checkout ownership +and lifecycle rules. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Creation is implemented; agent/user assignment and attachments may need +narrower/different APIs. + +## `organize` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/companies/{companyId}/issues`. + +Agent access: `available` — Native search_tasks; REST / CLI; UI grouping/navigation +state separately. + +Policy: Company/task visibility, assignment/change policy, active-run checkout ownership +and lifecycle rules. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Search/filter API exists; sorting/grouping/presentation defaults are not +necessarily shared server preferences. + +## `properties` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/issues/{id}`. +- `PUT /api/issues/{id}/title`. + +Agent access: `partial` — Native set_task_title/reassign_task/set_dependencies; fallback +for permitted non-lifecycle fields; REST. + +Policy: Company/task visibility, assignment/change policy, active-run checkout ownership +and lifecycle rules. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native fallback blocks status/assignment/dependency policy fields. Dedicated tools +differ in scope and supported fields. + +## `discussion` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/issues/{id}/comments`. +- `POST /api/companies/{companyId}/issues/{issueId}/attachments`. + +Agent access: `available` — Native report_progress/comment_on_task/register_deliverable; +REST / CLI / MCP. + +Policy: Company/task visibility, assignment/change policy, active-run checkout ownership +and lifecycle rules. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Other-task comments and active-task progress have separate scopes; explicit +reopen/interrupt is not a generic comment capability. + +## `completion` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/issues/{id}`. + +Agent access: `available` — Native paperclip_finish/paperclip_block through runner +protocol; legacy agent REST disposition. + +Policy: Company/task visibility, assignment/change policy, active-run checkout ownership +and lifecycle rules. + +Evidence: `source-only` — [implementation](../../server/src/routes/issues.ts) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Server governs whether a reported result becomes done/review/blocked. A generic +lifecycle PATCH is intentionally rejected for native runs. diff --git a/maps/agent-access-map/teams.md b/maps/agent-access-map/teams.md new file mode 100644 index 00000000000..600e463eca6 --- /dev/null +++ b/maps/agent-access-map/teams.md @@ -0,0 +1,108 @@ +# Team packages and catalog installation — agent access + +Product map: [Team packages and catalog installation](../feature-map/teams.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `discovery` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/teams/catalog`. +- `GET /api/teams/catalog/{catalogId}`. + +Agent access: `available` — REST / native call_api / CLI teams. + +Policy: Authenticated catalog browsing; same-company preview; agent install requires +agents:create grant or canCreateAgents. + +Evidence: `source-only` — [implementation](../../server/src/routes/teams-catalog.ts#L36) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Team browsing exists even though there is no dedicated teams product screen. + +## `preview` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/teams/catalog/{catalogId}/preview`. + +Agent access: `available` — REST / native call_api / CLI teams preview. + +Policy: Authenticated catalog browsing; same-company preview; agent install requires +agents:create grant or canCreateAgents. + +Evidence: `source-only` — [implementation](../../server/src/routes/teams-catalog.ts#L36) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Preview does not install a team; its audit write should not be mistaken for agent +execution proof. + +## `install` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/teams/catalog/{catalogId}/install`. + +Agent access: `available` — Authorized agent REST / native call_api / CLI teams install. + +Policy: Authenticated catalog browsing; same-company preview; agent install requires +agents:create grant or canCreateAgents. + +Evidence: `source-only` — [implementation](../../server/src/routes/teams-catalog.ts#L36) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Actual agent permission branch exists. Resulting agents/accounts/workspaces may +still need operator setup. + +## `configuration` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/companies/{companyId}/teams/catalog/{catalogId}/preview`. +- `POST /api/companies/{companyId}/teams/catalog/{catalogId}/install`. + +Agent access: `partial` — Team package variables/options via REST/CLI; resulting +resources use their own APIs. + +Policy: Authenticated catalog browsing; same-company preview; agent install requires +agents:create grant or canCreateAgents. + +Evidence: `source-only` — [implementation](../../server/src/routes/teams-catalog.ts#L36) +at the reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: There is no independent generic team-edit resource; distinguish package options +from installed agent/project configuration. diff --git a/maps/agent-access-map/workspaces.md b/maps/agent-access-map/workspaces.md new file mode 100644 index 00000000000..5804821580c --- /dev/null +++ b/maps/agent-access-map/workspaces.md @@ -0,0 +1,144 @@ +# Execution workspaces, services, and files — agent access + +Product map: [Execution workspaces, services, and files](../feature-map/workspaces.md). + +Review date: 2026-10-12. Source commit: `f981fa3cc10cb8663a87dec60345fbff46d54d0a`. + +This is a source-reviewed baseline of representative operations and known gaps. +Each capability needs operation-level review before its entire scope can be +qualified. No live agent execution is claimed. Follow the [map contract](../README.md) +for format, permission checks, evidence and maintenance. + +## `binding` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{id}/heartbeat-context`. +- `GET /api/execution-workspaces/{id}`. + +Agent access: `available` — Native get_task_context / REST / CLI / MCP workspace read. + +Policy: Company/project/workspace visibility and runtime authority; active run, trust +preset and task ownership where required. + +Evidence: `source-only` — +[implementation](../../server/src/routes/workspace-runtime-service-authz.ts#L76) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Run/task context identifies its actual realized workspace; record existence is not +a running service. + +## `provisioning` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/execution-workspaces/{id}`. +- `GET /api/execution-workspaces/{id}/workspace-operations`. + +Agent access: `partial` — REST / native call_api reads; task/project assignment triggers +server provisioning. + +Policy: Company/project/workspace visibility and runtime authority; active run, trust +preset and task ownership where required. + +Evidence: `source-only` — +[implementation](../../server/src/routes/workspace-runtime-service-authz.ts#L76) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Observing readiness exists. Creating host commands or arbitrary provision targets +is a separate protected operation. + +## `services` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `POST /api/execution-workspaces/{id}/runtime-services/{action}`. + +Agent access: `partial` — Authorized agent REST / CLI workspace runtime-service / +existing stdio MCP controls. + +Policy: Company/project/workspace visibility and runtime authority; active run, trust +preset and task ownership where required. + +Evidence: `source-only` — +[implementation](../../server/src/routes/workspace-runtime-service-authz.ts#L76) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Native call_api blocks runtime-service mutation; control_workspace_service is not +in the production authority set. Optional MCP availability must be recorded. + +## `files-git` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `GET /api/issues/{issueId}/file-resources/content`. +- `GET /api/issues/{issueId}/file-resources/list`. + +Agent access: `partial` — Authorized workspace filesystem tools; Dot workspace bridge +when enabled; board file-resource HTTP UI. + +Policy: Company/project/workspace visibility and runtime authority; active run, trust +preset and task ownership where required. + +Evidence: `source-only` — +[implementation](../../server/src/routes/workspace-runtime-service-authz.ts#L76) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Files panel HTTP requires board. Agents can use their admitted workspace file +tools; remote/Dot scope and Git command availability differ. + +## `closure` + +Review: `baseline`. + +API: `present` — representative operation IDs: + +- `PATCH /api/execution-workspaces/{id}`. +- `GET /api/execution-workspaces/{id}/close-readiness`. +- `POST /api/execution-workspaces/{id}/reconcile-branch`. + +Agent access: `partial` — REST / native fallback for permitted update; CLI workspace; +reconcile-branch requires board. + +Policy: Company/project/workspace visibility and runtime authority; active run, trust +preset and task ownership where required. + +Evidence: `source-only` — +[implementation](../../server/src/routes/workspace-runtime-service-authz.ts#L76) at the +reviewed commit above. + +Verification: `not-run` — exercise a listed permitted operation with actual agent +credentials/run context; inspect its result and applicable persistence/attribution. +Assert the relevant denied actor, owner, company or mode from Policy. Review the +remaining operations before qualifying the whole capability. + +Gaps: Closure/readiness exists; not every workspace can be reopened, and branch +reconciliation has a board boundary. diff --git a/feature-map/README.md b/maps/feature-map/README.md similarity index 87% rename from feature-map/README.md rename to maps/feature-map/README.md index 623b4617465..0ac2ab9a5b9 100644 --- a/feature-map/README.md +++ b/maps/feature-map/README.md @@ -3,7 +3,11 @@ Start here when reproducing a user-facing bug, verifying a change, or deciding which surfaces a fix must cover. Each recipe describes what a person can do, where they can do it, the expected result, and the evidence needed to verify it. -Product behavior is still governed by [the implementation spec](../doc/SPEC-implementation.md). +Product behavior is still governed by [the implementation spec](../../doc/SPEC-implementation.md). + +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 @@ -94,7 +98,7 @@ fixture integration. Record executed results separately from the map. ## Before driving a journey -1. Use this checkout's [isolated test drive](../doc/DEVELOPING.md#one-command-isolated-manual-test-drive) +1. Use this checkout's [isolated test drive](../../doc/DEVELOPING.md#one-command-isolated-manual-test-drive) for manual product checks. It creates a temporary instance and prints its URL and data directory. Do not guess that a server on port 3100 belongs to you. 2. Record the commit, URL, company, login role, relevant experimental settings, @@ -114,11 +118,11 @@ fixture integration. Record executed results separately from the map. evidence; creating state through the API does not prove the creation UI. For agent-driven acceptance work, start with the -[Paperclip verification skill](../.agents/skills/verify-paperclip/SKILL.md) for an +[Paperclip verification skill](../../.agents/skills/verify-paperclip/SKILL.md) for an isolated launch, ownership/readiness checks, browser driving, evidence, and cleanup. It uses this directory as its feature map. The existing -[dev-workspace run/verify skill](../.agents/skills/paperclip-dev-workspace-run-verify-fix/SKILL.md) -and [evaluation skill](../.agents/skills/paperclip-evals/SKILL.md) describe runtime +[dev-workspace run/verify skill](../../.agents/skills/paperclip-dev-workspace-run-verify-fix/SKILL.md) +and [evaluation skill](../../.agents/skills/paperclip-evals/SKILL.md) describe runtime ownership and evidence handling. Reuse them; this map introduces no environment launcher, credentials, scheduled job, or second test framework. @@ -134,7 +138,7 @@ A fix is verified across its affected surfaces only when each has evidence or an explicit reason it does not apply. Shared code alone does not prove parity. Keep product regressions visible; do not change the recipe to bless a failure. For Paperclip-assigned work, attach evidence through the -[artifact workflow](../doc/AGENT-ARTIFACTS.md). +[artifact workflow](../../doc/AGENT-ARTIFACTS.md). ## Inventory and remaining depth @@ -148,8 +152,8 @@ 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. +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, @@ -159,13 +163,17 @@ can include capabilities that do not add a page file. ## Maintaining the reference -The map is documentation only. It adds no CI checks, automatic journey execution, -or required inventory updates for future pull requests. +The map documents user journeys. It does not execute them automatically; +`coverage.json` records 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. Maintenance is optional and review-based. +helps explain the current product. 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: @@ -176,7 +184,7 @@ Each recipe starts with an H1 and a user-visible description, then exactly: 4. **Gotchas** — misleading look-alikes, feature gates, and invalid evidence. New or updated entries follow -[Poteto's feature-map examples](../.agents/skills/create-verification-skill/references/feature-map-example/). +[Poteto's feature-map examples](../../.agents/skills/create-verification-skill/references/feature-map-example). Existing entries with a `Driving it` heading can adopt the named harness when their recipes are updated. The original format was inspired by [Omnigent's feature map](https://github.com/omnigent-ai/omnigent/tree/91acfbbb59f6fc210ff95a9e9428aadd62e06582/feature-map). diff --git a/feature-map/access.md b/maps/feature-map/access.md similarity index 78% rename from feature-map/access.md rename to maps/feature-map/access.md index 5d61c99ad2e..7bfed7126ee 100644 --- a/feature-map/access.md +++ b/maps/feature-map/access.md @@ -2,7 +2,9 @@ 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. -Implementation: [auth page](../ui/src/pages/Auth.tsx), [company members](../ui/src/pages/CompanyAccess.tsx), [invitation](../ui/src/pages/InviteLanding.tsx). +Implementation: [auth page](../../ui/src/pages/Auth.tsx), [company members](../../ui/src/pages/CompanyAccess.tsx), [invitation](../../ui/src/pages/InviteLanding.tsx). + +Agent access: [companion](../agent-access-map/access.md). ## Sub-features @@ -35,19 +37,19 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). For ### `login` -Automated: [auth UI](../ui/src/pages/Auth.test.tsx) and [session routes](../server/src/__tests__/auth-session-route.test.ts) cover their respective layers. +Automated: [auth UI](../../ui/src/pages/Auth.test.tsx) and [session routes](../../server/src/__tests__/auth-session-route.test.ts) cover their respective layers. Manual: Sign in, reload a company deep link, sign out, and revisit it. Confirm the browser requests authentication rather than showing cached company data. Test an invalid claim separately on disposable state. ### `invite-members` -Automated: [member UI](../ui/src/pages/CompanyAccess.test.tsx) and [invite replay](../server/src/__tests__/invite-accept-replay.test.ts) provide component and route evidence. +Automated: [member UI](../../ui/src/pages/CompanyAccess.test.tsx) and [invite replay](../../server/src/__tests__/invite-accept-replay.test.ts) provide component and route evidence. Manual: Accept an invite as the intended user, inspect the resulting company and permissions, then reuse and expire disposable invites. Change a member permission, reload as that member, and verify a denied operation on another company remains denied. ### `cli-authorization` -Automated: [board auth client](../cli/src/__tests__/board-auth.test.ts) and [token commands](../cli/src/__tests__/token.test.ts) cover the client contracts. +Automated: [board auth client](../../cli/src/__tests__/board-auth.test.ts) and [token commands](../../cli/src/__tests__/token.test.ts) cover the client contracts. Manual: Authorize the intended CLI context, make a read-only company request, then revoke its token and retry. Verify failure is explicit and does not silently fall back to another identity. diff --git a/feature-map/activity.md b/maps/feature-map/activity.md similarity index 75% rename from feature-map/activity.md rename to maps/feature-map/activity.md index fea542d988a..0a80901ddfa 100644 --- a/feature-map/activity.md +++ b/maps/feature-map/activity.md @@ -2,7 +2,9 @@ People inspect company health, recent activity, run history, and routine activity, then follow evidence back to the task or agent responsible. -Implementation: [dashboard](../ui/src/pages/Dashboard.tsx), [live dashboard](../ui/src/pages/DashboardLive.tsx), [audit hub](../ui/src/pages/audit/AuditHub.tsx). +Implementation: [dashboard](../../ui/src/pages/Dashboard.tsx), [live dashboard](../../ui/src/pages/DashboardLive.tsx), [audit hub](../../ui/src/pages/audit/AuditHub.tsx). + +Agent access: [companion](../agent-access-map/activity.md). ## Sub-features @@ -28,13 +30,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Prep ### `dashboard` -Automated: [dashboard service](../server/src/__tests__/dashboard-service.test.ts) covers server aggregation; [dashboard helpers](../ui/src/pages/Dashboard.test.ts) is narrower UI helper coverage. +Automated: [dashboard service](../../server/src/__tests__/dashboard-service.test.ts) covers server aggregation; [dashboard helpers](../../ui/src/pages/Dashboard.test.ts) is narrower UI helper coverage. Manual: Compare the dashboard with the known fixture tasks and runs. Start and finish a small task, refresh/reload, and verify the summary changes and links reach the right records. Exercise empty data and a failed fetch. ### `activity-audit` -Automated: [activity service](../server/src/__tests__/activity-service.test.ts), [audit runs](../ui/src/pages/audit/AuditRuns.test.tsx), and [routine audit](../ui/src/pages/audit/RoutineAuditActivity.test.tsx) cover these separate data/host layers. +Automated: [activity service](../../server/src/__tests__/activity-service.test.ts), [audit runs](../../ui/src/pages/audit/AuditRuns.test.tsx), and [routine audit](../../ui/src/pages/audit/RoutineAuditActivity.test.tsx) cover these separate data/host layers. Manual: Find a known mutation by actor/resource and a known run by status. Change filters, load more, and follow the source links. Reload the chosen view and verify no company leakage or duplicate events. Inspect a routine run from its audit entry. diff --git a/feature-map/agent-chat.md b/maps/feature-map/agent-chat.md similarity index 77% rename from feature-map/agent-chat.md rename to maps/feature-map/agent-chat.md index e53725def70..7152588c2fc 100644 --- a/feature-map/agent-chat.md +++ b/maps/feature-map/agent-chat.md @@ -2,7 +2,9 @@ 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. -Implementation: [agent chat](../ui/src/pages/AgentChat.tsx), [chat landing](../ui/src/pages/AgentChats.tsx), [conference room](../ui/src/pages/BoardChat.tsx). +Implementation: [agent chat](../../ui/src/pages/AgentChat.tsx), [chat landing](../../ui/src/pages/AgentChats.tsx), [conference room](../../ui/src/pages/BoardChat.tsx). + +Agent access: [companion](../agent-access-map/agent-chat.md). ## Sub-features @@ -31,7 +33,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Enab ### `agent-conversation` -Automated: [chat landing](../ui/src/pages/AgentChats.test.tsx) checks recent-chat routing; [conversation service](../server/src/__tests__/agent-conversations.test.ts) covers persisted conversation behavior. +Automated: [chat landing](../../ui/src/pages/AgentChats.test.tsx) checks recent-chat routing; [conversation service](../../server/src/__tests__/agent-conversations.test.ts) covers persisted conversation behavior. Manual: Start a conversation, send a recognizable request, and inspect its reply. Navigate away and reopen the same history. Use `/new` for a fresh session within @@ -40,13 +42,13 @@ inaccessible saved conversation; verify no cross-user or cross-company history a ### `project-handoff` -Automated: [chat project tools](../server/src/__tests__/chat-project-tools.test.ts) checks tool contracts; live model choice and UI handoff require a manual run. +Automated: [chat project tools](../../server/src/__tests__/chat-project-tools.test.ts) checks tool contracts; live model choice and UI handoff require a manual run. Manual: Ask the configured agent to create bounded project work, inspect the proposed/created target, and open the resulting task. Verify the request context and intended project survived and the task produces a useful output. ### `conference-room` -Automated: [board chat gate](../server/src/__tests__/board-chat-route-feature-flag.test.ts) proves route gating, not a live conversation. +Automated: [board chat gate](../../server/src/__tests__/board-chat-route-feature-flag.test.ts) proves route gating, not a live conversation. Preconditions for this entry point: `local_trusted` mode and an installed, authenticated `claude` CLI, in addition to the Conference Room flag. These are diff --git a/feature-map/agents.md b/maps/feature-map/agents.md similarity index 76% rename from feature-map/agents.md rename to maps/feature-map/agents.md index 021505b41c0..673d7c45982 100644 --- a/feature-map/agents.md +++ b/maps/feature-map/agents.md @@ -2,7 +2,9 @@ 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. -Implementation: [hiring](../ui/src/pages/NewAgent.tsx), [configuration](../ui/src/components/AgentConfigForm.tsx), [organization](../ui/src/pages/OrgChart.tsx). +Implementation: [hiring](../../ui/src/pages/NewAgent.tsx), [configuration](../../ui/src/components/AgentConfigForm.tsx), [organization](../../ui/src/pages/OrgChart.tsx). + +Agent access: [companion](../agent-access-map/agents.md). ## Sub-features @@ -33,7 +35,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `hire-agent` -Automated: [new agent page](../ui/src/pages/NewAgent.test.tsx) and [configuration form](../ui/src/components/AgentConfigForm.render.test.tsx) cover mocked UI behavior. +Automated: [new agent page](../../ui/src/pages/NewAgent.test.tsx) and [configuration form](../../ui/src/components/AgentConfigForm.render.test.tsx) cover mocked UI behavior. Manual: Hire an agent with a distinct name and role. Complete any required approval, reload the roster, and open its configuration. Confirm manager, adapter, and model persisted; run a small task to prove execution readiness. @@ -44,13 +46,13 @@ from the hiring picker; API fixture creation does not prove this UI journey. ### `agent-configuration` -Automated: [instruction service](../server/src/__tests__/agent-instructions-service.test.ts) and [instruction revisions](../server/src/__tests__/agent-instruction-revisions.test.ts) cover file/revision contracts. +Automated: [instruction service](../../server/src/__tests__/agent-instructions-service.test.ts) and [instruction revisions](../../server/src/__tests__/agent-instruction-revisions.test.ts) cover file/revision contracts. Manual: Save a harmless instruction edit, reload, and verify its revision and effect in the next eligible run. Pause and resume the disposable agent; confirm pause prevents new work and does not erase previous runs. ### `organization` -Automated: [org chart](../ui/src/pages/OrgChart.test.tsx) is component evidence. Built-in setup also has [configuration modal tests](../ui/src/components/ConfigureBuiltInAgentModal.test.tsx). +Automated: [org chart](../../ui/src/pages/OrgChart.test.tsx) is component evidence. Built-in setup also has [configuration modal tests](../../ui/src/components/ConfigureBuiltInAgentModal.test.tsx). Manual: Inspect a manager and report, change the relationship through the offered controls, and reload both views. Exercise a rejected invalid relationship. Configure a built-in agent and verify it retains its required identity and restrictions. diff --git a/feature-map/app-permissions.md b/maps/feature-map/app-permissions.md similarity index 76% rename from feature-map/app-permissions.md rename to maps/feature-map/app-permissions.md index fd8a825c51f..7726294d328 100644 --- a/feature-map/app-permissions.md +++ b/maps/feature-map/app-permissions.md @@ -2,7 +2,9 @@ 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. -Implementation: [app detail](../ui/src/pages/apps/AppDetail.tsx), [permissions](../ui/src/pages/apps/app-detail/PermissionsPanel.tsx), [activity](../ui/src/pages/apps/app-detail/ActivityPanel.tsx). +Implementation: [app detail](../../ui/src/pages/apps/AppDetail.tsx), [permissions](../../ui/src/pages/apps/app-detail/PermissionsPanel.tsx), [activity](../../ui/src/pages/apps/app-detail/ActivityPanel.tsx). + +Agent access: [companion](../agent-access-map/app-permissions.md). ## Sub-features @@ -28,13 +30,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Prep ### `permissions` -Automated: [app detail](../ui/src/pages/apps/AppDetail.test.tsx) covers agent/action controls, quarantined actions, and navigation using mocked requests. +Automated: [app detail](../../ui/src/pages/apps/AppDetail.test.tsx) covers agent/action controls, quarantined actions, and navigation using mocked requests. Manual: Grant one agent access, leave another excluded, and exercise off, ask, and allowed states for a harmless action. Reload between changes. Verify actual denied calls stay denied and ask-first creates a decision rather than executing early. ### `test-and-maintain` -Automated: [app detail tests](../ui/src/pages/apps/AppDetail.test.tsx) cover test-dialog/UI contracts. Real provider execution and revocation require the selected provider’s live check. +Automated: [app detail tests](../../ui/src/pages/apps/AppDetail.test.tsx) cover test-dialog/UI contracts. Real provider execution and revocation require the selected provider’s live check. Manual: Run a read-only action with explicit inputs and inspect returned data and activity. Refresh discovery and review new actions. Revoke or disconnect only the disposable credential, then verify subsequent use fails with an actionable reconnect state. diff --git a/feature-map/budgets-costs.md b/maps/feature-map/budgets-costs.md similarity index 79% rename from feature-map/budgets-costs.md rename to maps/feature-map/budgets-costs.md index cd0bb3b2b99..2c7fed9149e 100644 --- a/feature-map/budgets-costs.md +++ b/maps/feature-map/budgets-costs.md @@ -2,7 +2,9 @@ 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. -Implementation: [costs and budget host](../ui/src/pages/Costs.tsx), [audit hub](../ui/src/pages/audit/AuditHub.tsx). +Implementation: [costs and budget host](../../ui/src/pages/Costs.tsx), [audit hub](../../ui/src/pages/audit/AuditHub.tsx). + +Agent access: [companion](../agent-access-map/budgets-costs.md). ## Sub-features @@ -27,7 +29,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `cost-overview` -Automated: [costs service](../server/src/__tests__/costs-service.test.ts) covers cost contracts; [embedded costs UI](../ui/src/pages/Costs.test.tsx) has narrow Audit-host coverage. +Automated: [costs service](../../server/src/__tests__/costs-service.test.ts) covers cost contracts; [embedded costs UI](../../ui/src/pages/Costs.test.tsx) has narrow Audit-host coverage. Manual: Inspect a known fixture run and reconcile recorded spend with the chosen period and resource. Switch the report period/company and inspect the **By @@ -36,7 +38,7 @@ or unavailable cost data without treating missing data as zero spend. ### `budget-enforcement` -Automated: [budget service](../server/src/__tests__/budgets-service.test.ts) exercises soft incidents, hard stops, scope, and valid budget raises. +Automated: [budget service](../../server/src/__tests__/budgets-service.test.ts) exercises soft incidents, hard stops, scope, and valid budget raises. Manual: Create a small fixture budget, cross its threshold with synthetic recorded spend, and verify the warning or hard-stop state. Attempt new work and confirm it is gated. Raise the correct budget through an authorized action and verify eligible continuation without clearing unrelated manual pauses. diff --git a/feature-map/cases.md b/maps/feature-map/cases.md similarity index 78% rename from feature-map/cases.md rename to maps/feature-map/cases.md index f1c12ccb7a0..a36ad4b9c13 100644 --- a/feature-map/cases.md +++ b/maps/feature-map/cases.md @@ -2,7 +2,9 @@ The cases experiment exposes structured records with types, fields, parent/child relationships, activity, revisions, and related task work. -Implementation: [case list](../ui/src/pages/Cases.tsx), [case detail](../ui/src/pages/CaseDetail.tsx). +Implementation: [case list](../../ui/src/pages/Cases.tsx), [case detail](../../ui/src/pages/CaseDetail.tsx). + +Agent access: [companion](../agent-access-map/cases.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Enab ### `case-list` -Automated: [case list](../ui/src/pages/Cases.test.tsx) covers filters, persisted view state, and keyboard/tree behavior with mocked data. +Automated: [case list](../../ui/src/pages/Cases.test.tsx) covers filters, persisted view state, and keyboard/tree behavior with mocked data. Manual: Search for a child, verify its parent context remains understandable, change filters/grouping/columns, and reload. Open the record by keyboard and direct link. Include empty results and terminal records. ### `case-record` -Automated: [case routes](../server/src/__tests__/cases-routes.test.ts) covers API behavior; [case fields](../ui/src/components/CaseFieldsPanel.test.tsx) covers field UI separately. +Automated: [case routes](../../server/src/__tests__/cases-routes.test.ts) covers API behavior; [case fields](../../ui/src/components/CaseFieldsPanel.test.tsx) covers field UI separately. Manual: Change status or labels, reload, inspect activity, and follow child/task links. Edit a case document and inspect its document revisions separately. diff --git a/feature-map/chat-channels.md b/maps/feature-map/chat-channels.md similarity index 79% rename from feature-map/chat-channels.md rename to maps/feature-map/chat-channels.md index 071e53c1867..4a6a55efc2f 100644 --- a/feature-map/chat-channels.md +++ b/maps/feature-map/chat-channels.md @@ -2,7 +2,9 @@ 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. -Implementation: [endpoint setup](../ui/src/pages/apps/chat/ChatEndpointSetup.tsx), [endpoint detail](../ui/src/pages/apps/chat/ChatEndpointDetail.tsx), [email setup](../ui/src/pages/apps/chat/EmailEndpointSetup.tsx). +Implementation: [endpoint setup](../../ui/src/pages/apps/chat/ChatEndpointSetup.tsx), [endpoint detail](../../ui/src/pages/apps/chat/ChatEndpointDetail.tsx), [email setup](../../ui/src/pages/apps/chat/EmailEndpointSetup.tsx). + +Agent access: [companion](../agent-access-map/chat-channels.md). ## Sub-features @@ -32,13 +34,13 @@ Setup is covered in [connection setup](./connection-setup.md). ### `external-thread` -Automated: [channel integration](../server/src/__tests__/chat-channels.integration.test.ts) uses provider fixtures; it does not prove a live Slack, Discord, Teams, Telegram, GitHub, email, or Photon delivery. +Automated: [channel integration](../../server/src/__tests__/chat-channels.integration.test.ts) uses provider fixtures; it does not prove a live Slack, Discord, Teams, Telegram, GitHub, email, or Photon delivery. Manual: For each supported provider being changed, send a unique message, verify the intended agent/company receives it, and inspect the actual external reply in the original thread. Repeat with an unlinked/unauthorized sender, duplicate inbound delivery, and one supported attachment. Record provider-specific results separately. ### `endpoint-management` -Automated: [channel integration](../server/src/__tests__/chat-channels.integration.test.ts) covers shared endpoint/delivery behavior; live credential repair and provider ownership remain manual checks. +Automated: [channel integration](../../server/src/__tests__/chat-channels.integration.test.ts) covers shared endpoint/delivery behavior; live credential repair and provider ownership remain manual checks. Manual: Inspect the bound agent and identity, recent activity, and delivery failure details. Repair a disposable credential, retry a safe message when offered, and verify exactly one external reply. Disable the endpoint and confirm new traffic is not silently processed. diff --git a/feature-map/cli-operations.md b/maps/feature-map/cli-operations.md similarity index 77% rename from feature-map/cli-operations.md rename to maps/feature-map/cli-operations.md index b9d77696af9..e3ddaeb6e38 100644 --- a/feature-map/cli-operations.md +++ b/maps/feature-map/cli-operations.md @@ -2,7 +2,9 @@ Operators and agents can work through explicit CLI/API context, manage domain resources, inspect runs, and create isolated local worktree instances for development. -Implementation: [command registry](../cli/src/index.ts), [client context](../cli/src/commands/client/context.ts), [worktree commands](../cli/src/commands/worktree.ts). +Implementation: [command registry](../../cli/src/index.ts), [client context](../../cli/src/commands/client/context.ts), [worktree commands](../../cli/src/commands/worktree.ts). + +Agent access: [companion](../agent-access-map/cli-operations.md). ## Sub-features @@ -37,19 +39,19 @@ even when a profile stores a company. A persona label is not authentication proo ### `client-context` -Automated: [context](../cli/src/__tests__/context.test.ts), [HTTP client](../cli/src/__tests__/http.test.ts), and [operations parity](../cli/src/__tests__/operations-parity.test.ts) cover client contracts, not every live endpoint. +Automated: [context](../../cli/src/__tests__/context.test.ts), [HTTP client](../../cli/src/__tests__/http.test.ts), and [operations parity](../../cli/src/__tests__/operations-parity.test.ts) cover client contracts, not every live endpoint. Manual: Inspect the selected context and identity, list the disposable company’s resources, create a harmless task through the supported command, and verify it in the browser. Exercise an invalid token and wrong-company resource. Inspect JSON output and nonzero errors rather than only printed success text. ### `subresources-and-runs` -Automated: [issue subresources](../cli/src/__tests__/issue-subresources.test.ts) and [asset/skill parity](../cli/src/__tests__/admin-asset-skill-parity.test.ts) cover command/API contracts. +Automated: [issue subresources](../../cli/src/__tests__/issue-subresources.test.ts) and [asset/skill parity](../../cli/src/__tests__/admin-asset-skill-parity.test.ts) cover command/API contracts. Manual: Write a small task document or attach a fixture using the supported command, open it in the UI, and compare contents. Invoke eligible test work, inspect the resulting run ID/status/output, and verify denial when the actor lacks permission. ### `worktree-instance` -Automated: [worktree commands](../cli/src/__tests__/worktree.test.ts) and [test drive](../cli/src/__tests__/test-drive.test.ts) cover isolation/setup contracts. +Automated: [worktree commands](../../cli/src/__tests__/worktree.test.ts) and [test drive](../../cli/src/__tests__/test-drive.test.ts) cover isolation/setup contracts. Manual: Initialize an owned disposable worktree instance, inspect its printed paths and ports, verify health and login, and confirm any seed data belongs to the intended source. Stop and clean up only that instance; inspect preserved work before deleting any checkout. diff --git a/feature-map/companies.md b/maps/feature-map/companies.md similarity index 76% rename from feature-map/companies.md rename to maps/feature-map/companies.md index 585a0588a1a..0740c974556 100644 --- a/feature-map/companies.md +++ b/maps/feature-map/companies.md @@ -2,7 +2,9 @@ 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. -Implementation: [companies](../ui/src/pages/Companies.tsx), [settings](../ui/src/pages/CompanySettings.tsx), [import](../ui/src/pages/CompanyImport.tsx), [export](../ui/src/pages/CompanyExport.tsx). +Implementation: [companies](../../ui/src/pages/Companies.tsx), [settings](../../ui/src/pages/CompanySettings.tsx), [import](../../ui/src/pages/CompanyImport.tsx), [export](../../ui/src/pages/CompanyExport.tsx). + +Agent access: [companion](../agent-access-map/companies.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `company-switcher` -Automated: [company list](../ui/src/pages/Companies.test.tsx) and [archive UI](../ui/src/pages/CompanySettingsArchive.test.tsx) cover UI behavior with mocks. +Automated: [company list](../../ui/src/pages/Companies.test.tsx) and [archive UI](../../ui/src/pages/CompanySettingsArchive.test.tsx) cover UI behavior with mocks. Manual: Create or select a company, rename it, and reload. Switch to the second company and back; verify tasks, agents, and settings follow the selection. Archive the disposable company and verify its visibility and offered restoration path. ### `package-transfer` -Automated: [portability routes](../server/src/__tests__/company-portability-routes.test.ts) and [CLI import/export](../cli/src/__tests__/company-import-export-e2e.test.ts) cover package and command behavior, not every external Git host. +Automated: [portability routes](../../server/src/__tests__/company-portability-routes.test.ts) and [CLI import/export](../../cli/src/__tests__/company-import-export-e2e.test.ts) cover package and command behavior, not every external Git host. Manual: Export a small company, inspect the package preview, and import into a disposable target. Verify counts, references, conflict choices, and agent configuration. Run one imported task after supplying its required local credentials. Confirm source company data is unchanged. diff --git a/feature-map/connection-setup.md b/maps/feature-map/connection-setup.md similarity index 88% rename from feature-map/connection-setup.md rename to maps/feature-map/connection-setup.md index de51d3c6b7d..808f7d952ce 100644 --- a/feature-map/connection-setup.md +++ b/maps/feature-map/connection-setup.md @@ -5,6 +5,8 @@ setup from either Apps or a task that needs access. A saved draft, a completed provider login, a usable connection, and a resumed task are separate checkpoints. Chat channels additionally require an endpoint and linked sender identity. +Agent access: [companion](../agent-access-map/connection-setup.md). + ## Sub-features - `catalog`: find a provider, inspect its available methods, and open setup; @@ -63,16 +65,16 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Choose a disposable provider account/resource and record its auth method, deployment mode, account ownership, and access selection. For live setup, use the provider's documented prerequisites in the -[connector playbook](../doc/connections/CONNECTOR-PLAYBOOK.md). Automated fixtures +[connector playbook](../../doc/connections/CONNECTOR-PLAYBOOK.md). Automated fixtures do not establish OAuth registration, public callbacks, or production provider access. ### `apps-catalog` -Automated: [Browse](../ui/src/pages/apps/Browse.test.tsx), -[unconnected app](../ui/src/pages/apps/AppNotConnected.test.tsx), and -[AppsConnect](../ui/src/pages/apps/AppsConnect.test.tsx) cover catalog entry, +Automated: [Browse](../../ui/src/pages/apps/Browse.test.tsx), +[unconnected app](../../ui/src/pages/apps/AppNotConnected.test.tsx), and +[AppsConnect](../../ui/src/pages/apps/AppsConnect.test.tsx) cover catalog entry, access selection, provider-specific method choices, and setup failures with -mocked APIs. [Connection intents](../tests/e2e/connection-intents.spec.ts) +mocked APIs. [Connection intents](../../tests/e2e/connection-intents.spec.ts) drives store and task setup against one fake provider through a useful continuation: ```sh @@ -99,7 +101,7 @@ Test no-auth and authenticated endpoints separately; never infer one from the ot ### `task-request` -Automated: [interaction card](../ui/src/components/IssueThreadInteractionCard.test.tsx) +Automated: [interaction card](../../ui/src/components/IssueThreadInteractionCard.test.tsx) checks addressed-user controls. AppsConnect tests cover page/dialog parity, task-bound OAuth, popup handoff, and verifying a saved connection before closing. The connection-intents browser suite above exercises fixture-backed continuation. @@ -114,7 +116,7 @@ task does not grant the right to resolve the request. Automated: AppsConnect tests cover exact-draft resume, declined OAuth, reconnect lookup failure/retry, response-lost creation, archived connection revival, and -saved account reuse. [App detail](../ui/src/pages/apps/AppDetail.test.tsx) covers +saved account reuse. [App detail](../../ui/src/pages/apps/AppDetail.test.tsx) covers the connection host. These tests do not complete a real provider login. Manual: leave setup through its footer, reload Apps, choose Finish setup, and @@ -124,10 +126,10 @@ action afterwards. Count connections before/after to catch accidental duplicates ### `chat-channel` -Automated: [setup routing](../ui/src/pages/apps/chat/ChatEndpointSetup.routing.test.tsx), -[saved setup state](../ui/src/pages/apps/chat/ChatEndpointSetup.state.test.ts), -[email setup](../ui/src/pages/apps/chat/EmailEndpointSetup.test.tsx), and -[identity confirmation](../ui/src/pages/apps/chat/ChatIdentityConfirm.test.tsx) +Automated: [setup routing](../../ui/src/pages/apps/chat/ChatEndpointSetup.routing.test.tsx), +[saved setup state](../../ui/src/pages/apps/chat/ChatEndpointSetup.state.test.ts), +[email setup](../../ui/src/pages/apps/chat/EmailEndpointSetup.test.tsx), and +[identity confirmation](../../ui/src/pages/apps/chat/ChatIdentityConfirm.test.tsx) cover shared UI logic with fixtures. Provider-specific live setup is not implied. Manual: complete setup for one named provider, reload endpoint settings, link diff --git a/feature-map/coverage.json b/maps/feature-map/coverage.json similarity index 100% rename from feature-map/coverage.json rename to maps/feature-map/coverage.json diff --git a/feature-map/developer-labs.md b/maps/feature-map/developer-labs.md similarity index 76% rename from feature-map/developer-labs.md rename to maps/feature-map/developer-labs.md index 41c24ed1dbb..f2cdeb607d1 100644 --- a/feature-map/developer-labs.md +++ b/maps/feature-map/developer-labs.md @@ -2,7 +2,9 @@ Contributors can inspect design examples, interaction labs, and performance fixtures. These are development surfaces and do not count as production feature verification. -Implementation: [route registration](../ui/src/App.tsx), [design guide](../ui/src/pages/DesignGuide.tsx), [long-thread fixture](../ui/src/pages/IssueChatLongThreadPerf.tsx). +Implementation: [route registration](../../ui/src/App.tsx), [design guide](../../ui/src/pages/DesignGuide.tsx), [long-thread fixture](../../ui/src/pages/IssueChatLongThreadPerf.tsx). + +Agent access: [companion](../agent-access-map/developer-labs.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `preview-lab` -Automated: [onboarding variant](../ui/src/components/OnboardingWizardVariant.test.tsx) is an example component contract. There is no claim of full automated acceptance coverage for every lab page. +Automated: [onboarding variant](../../ui/src/components/OnboardingWizardVariant.test.tsx) is an example component contract. There is no claim of full automated acceptance coverage for every lab page. Manual: Open the specific fixture state, inspect controls and layout, then repeat the affected interaction in the actual product host. Report fixture results separately from persisted task/company results. ### `performance-fixture` -Automated: [task thread component](../ui/src/components/IssueChatThread.test.tsx) does not establish a performance budget. Timing/scroll measurements need a dedicated browser run. +Automated: [task thread component](../../ui/src/components/IssueChatThread.test.tsx) does not establish a performance budget. Timing/scroll measurements need a dedicated browser run. Manual: Record browser/build/data size, exercise scrolling and rendering in the long-thread fixture, and retain timing or trace evidence. Its composer is diff --git a/feature-map/documents-artifacts.md b/maps/feature-map/documents-artifacts.md similarity index 71% rename from feature-map/documents-artifacts.md rename to maps/feature-map/documents-artifacts.md index e445c9cddb1..c3ae6f1c3cd 100644 --- a/feature-map/documents-artifacts.md +++ b/maps/feature-map/documents-artifacts.md @@ -2,7 +2,9 @@ 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. -Implementation: [task documents](../ui/src/components/IssueDocumentsSection.tsx), [artifact library](../ui/src/pages/Artifacts.tsx), [document panel](../ui/src/components/task-side-panel/TaskDocumentPanel.tsx). +Implementation: [task documents](../../ui/src/components/IssueDocumentsSection.tsx), [artifact library](../../ui/src/pages/Artifacts.tsx), [document panel](../../ui/src/components/task-side-panel/TaskDocumentPanel.tsx). + +Agent access: [companion](../agent-access-map/documents-artifacts.md). ## Sub-features @@ -35,13 +37,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `task-document` -Automated: [documents service](../server/src/__tests__/documents-service.test.ts), [annotations](../server/src/__tests__/document-annotations-service.test.ts), and [revision restore](../server/src/__tests__/issue-document-restore-routes.test.ts) cover server contracts. +Automated: [documents service](../../server/src/__tests__/documents-service.test.ts), [annotations](../../server/src/__tests__/document-annotations-service.test.ts), and [revision restore](../../server/src/__tests__/issue-document-restore-routes.test.ts) cover server contracts. Manual: Edit a paragraph, save, reload, and compare revisions. Add an annotation to a specific selection and inspect it after another edit. Resolve it through the supported action. Restore a disposable revision and confirm the new current document and history agree. ### `task-output` -Automated: [attachment routes](../server/src/__tests__/issue-attachment-routes.test.ts) and [work products](../server/src/__tests__/work-products.test.ts) cover data/access behavior; [artifact arrival browser suite](../tests/e2e/artifact-tab-arrival.spec.ts) targets arrival. [Artifact uploads](../tests/e2e/artifact-uploads.spec.ts) drives file selection/drop, filename collisions, retry, and preservation of paused/unassigned tasks. +Automated: [attachment routes](../../server/src/__tests__/issue-attachment-routes.test.ts) and [work products](../../server/src/__tests__/work-products.test.ts) cover data/access behavior; [artifact arrival browser suite](../../tests/e2e/artifact-tab-arrival.spec.ts) targets arrival. [Artifact uploads](../../tests/e2e/artifact-uploads.spec.ts) drives file selection/drop, filename collisions, retry, and preservation of paused/unassigned tasks. Manual: Upload a small Markdown file and CSV through Artifacts. Markdown becomes a versioned task document; other files become attachments. Read the document, @@ -53,7 +55,7 @@ Test an inaccessible user/company and explicit missing workspace-only resources. ### `artifact-library` -Automated: [artifact page](../ui/src/pages/Artifacts.test.tsx) covers grouping, search requests, and pagination using mocks. +Automated: [artifact page](../../ui/src/pages/Artifacts.test.tsx) covers grouping, search requests, and pagination using mocks. Manual: Find the task’s output through search and grouping, open its stack, page through results, and reload a direct stack link. Confirm the same file/content appears as from the task. diff --git a/feature-map/execution-environments.md b/maps/feature-map/execution-environments.md similarity index 76% rename from feature-map/execution-environments.md rename to maps/feature-map/execution-environments.md index df145e17d3e..bb1fa10d78f 100644 --- a/feature-map/execution-environments.md +++ b/maps/feature-map/execution-environments.md @@ -2,7 +2,9 @@ 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. -Implementation: [environment settings](../ui/src/pages/CompanyEnvironments.tsx), [environment runtime](../server/src/services/environment-runtime.ts). +Implementation: [environment settings](../../ui/src/pages/CompanyEnvironments.tsx), [environment runtime](../../server/src/services/environment-runtime.ts). + +Agent access: [companion](../agent-access-map/execution-environments.md). ## Sub-features @@ -32,7 +34,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `environment-settings` -Automated: [environment UI](../ui/src/pages/CompanyEnvironments.test.tsx), [driver configuration UI](../ui/src/pages/CompanySettings.test.tsx), and [environment service](../server/src/__tests__/environment-service.test.ts) cover configuration behavior. +Automated: [environment UI](../../ui/src/pages/CompanyEnvironments.test.tsx), [driver configuration UI](../../ui/src/pages/CompanySettings.test.tsx), and [environment service](../../server/src/__tests__/environment-service.test.ts) cover configuration behavior. Manual: Save a disposable target, reload it, and run its available probe. Verify both success and missing-credential/reachability errors identify the target. Confirm unavailable providers are not offered as working run targets. @@ -42,7 +44,7 @@ execution. Remote-driver probes and a real bounded run need their own evidence. ### `remote-execution` -Automated: [execution target](../server/src/__tests__/environment-execution-target.test.ts) and [custom images](../server/src/__tests__/environment-custom-images-service.test.ts) cover contracts; [SSH live test](../server/src/__tests__/environment-live-ssh.test.ts) requires its own external setup. +Automated: [execution target](../../server/src/__tests__/environment-execution-target.test.ts) and [custom images](../../server/src/__tests__/environment-custom-images-service.test.ts) cover contracts; [SSH live test](../../server/src/__tests__/environment-live-ssh.test.ts) requires its own external setup. Manual: Run a bounded command in the intended target, inspect its output and workspace, and verify execution did not silently fall back to the server host. For custom-image changes, build/probe the disposable image before assigning it. Inspect cleanup and shutdown after the run. diff --git a/feature-map/gateways-profiles.md b/maps/feature-map/gateways-profiles.md similarity index 74% rename from feature-map/gateways-profiles.md rename to maps/feature-map/gateways-profiles.md index e00b5a03ac3..de5f4b58e9d 100644 --- a/feature-map/gateways-profiles.md +++ b/maps/feature-map/gateways-profiles.md @@ -2,7 +2,9 @@ Administrators expose selected tools through gateways and reusable access profiles, connect clients, manage tokens, and inspect gateway activity. -Implementation: [gateways](../ui/src/pages/apps/gateways/GatewaysList.tsx), [gateway detail](../ui/src/pages/apps/gateways/GatewayDetail.tsx), [profiles](../ui/src/pages/tools/profiles/ProfileWizard.tsx). +Implementation: [gateways](../../ui/src/pages/apps/gateways/GatewaysList.tsx), [gateway detail](../../ui/src/pages/apps/gateways/GatewayDetail.tsx), [profiles](../../ui/src/pages/tools/profiles/ProfileWizard.tsx). + +Agent access: [companion](../agent-access-map/gateways-profiles.md). ## Sub-features @@ -33,13 +35,13 @@ endpoint authorization independently of whether the admin UI is visible. ### `gateway-client` -Automated: [gateway service](../server/src/__tests__/tool-gateway-service.test.ts), [connect client dialog](../ui/src/pages/apps/gateways/ConnectClientDialog.test.tsx), and [token panel](../ui/src/pages/apps/gateways/panels/TokensPanel.test.tsx) cover service/UI contracts. +Automated: [gateway service](../../server/src/__tests__/tool-gateway-service.test.ts), [connect client dialog](../../ui/src/pages/apps/gateways/ConnectClientDialog.test.tsx), and [token panel](../../ui/src/pages/apps/gateways/panels/TokensPanel.test.tsx) cover service/UI contracts. Manual: Create a disposable gateway with one harmless tool, connect a client using its provided configuration, discover/call that tool, and inspect activity. Revoke the client token and confirm the same call fails. Test a tool outside the allowed set. ### `access-profile` -Automated: [profile wizard](../ui/src/pages/tools/profiles/ProfileWizard.test.tsx) and [profile detail](../ui/src/pages/tools/profiles/ProfileDetail.test.tsx) cover component behavior with mocks. +Automated: [profile wizard](../../ui/src/pages/tools/profiles/ProfileWizard.test.tsx) and [profile detail](../../ui/src/pages/tools/profiles/ProfileDetail.test.tsx) cover component behavior with mocks. Manual: Create a bounded profile, choose its offered tools and options, save or resume its draft, and reload the detail. Apply/connect it through the offered flow and inspect the actual client-visible tool set. Verify cancellation and invalid selections retain an understandable draft. diff --git a/feature-map/goals.md b/maps/feature-map/goals.md similarity index 73% rename from feature-map/goals.md rename to maps/feature-map/goals.md index 1e83cf608e3..44322e7fbe3 100644 --- a/feature-map/goals.md +++ b/maps/feature-map/goals.md @@ -2,7 +2,9 @@ People define company and lower-level goals and connect projects and tasks to the outcome they serve. -Implementation: [goals](../ui/src/pages/Goals.tsx), [goal detail](../ui/src/pages/GoalDetail.tsx). +Implementation: [goals](../../ui/src/pages/Goals.tsx), [goal detail](../../ui/src/pages/GoalDetail.tsx). + +Agent access: [companion](../agent-access-map/goals.md). ## Sub-features @@ -26,7 +28,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Prep ### `goal-detail` -Automated: [project-goal validation](../server/src/__tests__/project-goal-validation.test.ts) covers relationship validation; [goal detail control](../ui/src/pages/GoalDetail.test.tsx) only tests the properties toggle, not the whole creation journey. +Automated: [project-goal validation](../../server/src/__tests__/project-goal-validation.test.ts) covers relationship validation; [goal detail control](../../ui/src/pages/GoalDetail.test.tsx) only tests the properties toggle, not the whole creation journey. Manual: Choose **Add Goal/New Goal**, enter **Goal title**, select the level, and create a parent. Open it and choose **Sub Goal** to create a child with the @@ -37,7 +39,7 @@ and verify a cross-company or invalid relationship is rejected. ### `task-goal-context` -Automated: [task goal routes](../server/src/__tests__/issues-goal-context-routes.test.ts) and [goal fallback](../server/src/__tests__/issue-goal-fallback.test.ts) cover the server rules. +Automated: [task goal routes](../../server/src/__tests__/issues-goal-context-routes.test.ts) and [goal fallback](../../server/src/__tests__/issue-goal-fallback.test.ts) cover the server rules. Manual: Compare a task with an explicit goal to one relying on project context. Change the allowed association, reload, and verify the displayed/injected context follows the documented server rule rather than retaining an unrelated goal. diff --git a/feature-map/inbox-search.md b/maps/feature-map/inbox-search.md similarity index 68% rename from feature-map/inbox-search.md rename to maps/feature-map/inbox-search.md index cdcaab7f44c..ac3570b5c38 100644 --- a/feature-map/inbox-search.md +++ b/maps/feature-map/inbox-search.md @@ -2,7 +2,9 @@ People find work that needs their attention, distinguish unread activity from required decisions, archive handled items, and search across the company. -Implementation: [inbox](../ui/src/pages/Inbox.tsx), [decisions](../ui/src/pages/WhatNeedsMe.tsx), [search](../ui/src/pages/Search.tsx). +Implementation: [inbox](../../ui/src/pages/Inbox.tsx), [decisions](../../ui/src/pages/WhatNeedsMe.tsx), [search](../../ui/src/pages/Search.tsx). + +Agent access: [companion](../agent-access-map/inbox-search.md). ## Sub-features @@ -31,26 +33,26 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Seed ### `inbox` -Automated: [archive routes](../server/src/__tests__/inbox-archive-routes.test.ts) cover server mutations. [Task-list helpers](../ui/src/pages/Issues.test.tsx) cover search URLs, pagination, and presentation constants; they do not render the combined Inbox/Tasks page. Reading, archiving, and navigating that page remain manual checks. +Automated: [archive routes](../../server/src/__tests__/inbox-archive-routes.test.ts) cover server mutations. [Task-list helpers](../../ui/src/pages/Issues.test.tsx) cover search URLs, pagination, and presentation constants; they do not render the combined Inbox/Tasks page. Reading, archiving, and navigating that page remain manual checks. Manual: Read an unread task, return to Unread, archive a handled item, and reload. Verify personal triage state changes while task status stays correct. Switch users and companies to check isolation. ### `decisions` -Automated: [decision queues](../server/src/__tests__/decision-queues-routes.test.ts) covers route behavior. End-to-end queue-to-source navigation is manual. +Automated: [decision queues](../../server/src/__tests__/decision-queues-routes.test.ts) covers route behavior. End-to-end queue-to-source navigation is manual. Manual: Open a pending decision, follow its source, resolve it through the supported control, and reload the queue. Confirm it retires only after the decision persisted and unrelated pending items remain. ### `search` -Automated: [search page](../ui/src/pages/Search.test.tsx) and [company search service](../server/src/__tests__/company-search-service.test.ts) cover UI and server search separately. +Automated: [search page](../../ui/src/pages/Search.test.tsx) and [company search service](../../server/src/__tests__/company-search-service.test.ts) cover UI and server search separately. Manual: Search a unique task title and content phrase, open the result, and compare the actual record. Test filters, no results, and a second company. Verify stale results do not expose inaccessible data. ## Gotchas - Combined Inbox/Tasks requires both `enableCombinedInboxTasks` and - `enableStreamlinedUi`. [Standalone Inbox tests](../ui/src/pages/Inbox.test.tsx) + `enableStreamlinedUi`. [Standalone Inbox tests](../../ui/src/pages/Inbox.test.tsx) render archive/read controls and toolbars; this is not live multi-user evidence. - Personal archival is not task cancellation or completion. diff --git a/feature-map/instance-operations.md b/maps/feature-map/instance-operations.md similarity index 78% rename from feature-map/instance-operations.md rename to maps/feature-map/instance-operations.md index bb1c572621b..0e02f78a36d 100644 --- a/feature-map/instance-operations.md +++ b/maps/feature-map/instance-operations.md @@ -2,7 +2,9 @@ An operator can install and run Paperclip, diagnose the instance, configure supported deployment settings, manage its service, and produce a recoverable database backup. -Implementation: [CLI entry point](../cli/src/index.ts), [instance settings](../ui/src/pages/InstanceExperimentalSettings.tsx), [backup command](../cli/src/commands/db-backup.ts). +Implementation: [CLI entry point](../../cli/src/index.ts), [instance settings](../../ui/src/pages/InstanceExperimentalSettings.tsx), [backup command](../../cli/src/commands/db-backup.ts). + +Agent access: [companion](../agent-access-map/instance-operations.md). ## Sub-features @@ -28,13 +30,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `operator-cli` -Automated: [doctor](../cli/src/__tests__/doctor.test.ts), [update command](../cli/src/__tests__/update-command.test.ts), and [service manager](../cli/src/__tests__/service-manager.test.ts) cover command contracts. +Automated: [doctor](../../cli/src/__tests__/doctor.test.ts), [update command](../../cli/src/__tests__/update-command.test.ts), and [service manager](../../cli/src/__tests__/service-manager.test.ts) cover command contracts. Manual: Inspect the selected installation/channel and configuration, start the isolated instance, confirm health and browser access, then stop that instance. For update changes, use the dry-run/check path first and verify installed version and rollback state on an owned disposable installation. ### `settings-backup` -Automated: [experimental settings](../ui/src/pages/InstanceExperimentalSettings.test.tsx) and [database backup routes](../server/src/__tests__/instance-database-backups-routes.test.ts) cover their UI/API contracts. +Automated: [experimental settings](../../ui/src/pages/InstanceExperimentalSettings.test.tsx) and [database backup routes](../../server/src/__tests__/instance-database-backups-routes.test.ts) cover their UI/API contracts. Manual: Change a harmless experimental setting, reload, and confirm the affected route honors it. Back up a disposable instance, inspect the reported file and metadata, and restore using the documented procedure into a second isolated target. Verify a known record after restoration. diff --git a/feature-map/navigation-preferences.md b/maps/feature-map/navigation-preferences.md similarity index 77% rename from feature-map/navigation-preferences.md rename to maps/feature-map/navigation-preferences.md index 7d957567dbc..bb2490483c4 100644 --- a/feature-map/navigation-preferences.md +++ b/maps/feature-map/navigation-preferences.md @@ -2,7 +2,9 @@ People organize their sidebar, move between company resources, maintain their profile, and dismiss product announcements with the correct persistence and identity scope. -Implementation: [sidebar](../ui/src/components/Sidebar.tsx), [profile](../ui/src/pages/ProfileSettings.tsx), [announcements](../ui/src/components/AnnouncementWell.tsx). +Implementation: [sidebar](../../ui/src/components/Sidebar.tsx), [profile](../../ui/src/pages/ProfileSettings.tsx), [announcements](../../ui/src/components/AnnouncementWell.tsx). + +Agent access: [companion](../agent-access-map/navigation-preferences.md). ## Sub-features @@ -28,7 +30,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `sidebar-deep-links` -Automated: [sidebar](../ui/src/components/Sidebar.test.tsx) and [sidebar preference routes](../server/src/__tests__/sidebar-preferences-routes.test.ts) cover UI/server behavior. +Automated: [sidebar](../../ui/src/components/Sidebar.test.tsx) and [sidebar preference routes](../../server/src/__tests__/sidebar-preferences-routes.test.ts) cover UI/server behavior. Manual: Star and reorder supported resources, collapse a section, navigate and reload. Switch company/user and inspect the intended preference scope. Open an unavailable resource and a legacy route; verify clear fallback or correct redirect without leaking another company’s state. @@ -39,7 +41,7 @@ ordering are saved server-side. Local-trusted mode does not prove two-user isola ### `profile-announcements` -Automated: [profile page](../ui/src/pages/ProfileSettings.test.tsx), [announcement hook](../ui/src/hooks/useAnnouncement.test.tsx), and [announcement routes](../server/src/__tests__/announcements-routes.test.ts) cover separate UI/persistence layers. +Automated: [profile page](../../ui/src/pages/ProfileSettings.test.tsx), [announcement hook](../../ui/src/hooks/useAnnouncement.test.tsx), and [announcement routes](../../server/src/__tests__/announcements-routes.test.ts) cover separate UI/persistence layers. Manual: Change a disposable user’s display details, reload, and inspect an attributed profile link. Dismiss a fixture announcement, switch companies, and verify it remains dismissed for that user; check another user still has their own dismissal state. diff --git a/feature-map/onboarding.md b/maps/feature-map/onboarding.md similarity index 79% rename from feature-map/onboarding.md rename to maps/feature-map/onboarding.md index a49cbb0f01b..ecfaeefaaef 100644 --- a/feature-map/onboarding.md +++ b/maps/feature-map/onboarding.md @@ -2,7 +2,9 @@ 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. -Implementation: [web wizard](../ui/src/components/OnboardingWizard.tsx), [CLI setup](../cli/src/commands/onboard.ts). +Implementation: [web wizard](../../ui/src/components/OnboardingWizard.tsx), [CLI setup](../../cli/src/commands/onboard.ts). + +Agent access: [companion](../agent-access-map/onboarding.md). ## Sub-features @@ -31,10 +33,10 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `web-wizard` -Automated: [wizard tests](../ui/src/components/OnboardingWizard.test.tsx) cover mocked wizard behavior; [onboarding browser suite](../tests/e2e/onboarding.spec.ts) supplies its own test environment. Live model execution is a separate check. +Automated: [wizard tests](../../ui/src/components/OnboardingWizard.test.tsx) cover mocked wizard behavior; [onboarding browser suite](../../tests/e2e/onboarding.spec.ts) supplies its own test environment. Live model execution is a separate check. - **Create company and resume.** Start a fresh empty instance and run doctor using - the [verification skill](../.agents/skills/verify-paperclip/SKILL.md). Run + the [verification skill](../../.agents/skills/verify-paperclip/SKILL.md). Run `node .agents/skills/verify-paperclip/scripts/onboarding-smoke.mjs --evidence-dir "$VERIFY_EVIDENCE_DIR"`. The helper opens `/onboarding` in a fresh self-hosted instance, enters a unique name in `e.g. Northwind Labs`, and chooses `Continue`. The agent-name field must @@ -50,7 +52,7 @@ or explicit authentication gate. Reload both company and task. ### `cli-setup` -Automated: [CLI onboarding](../cli/src/__tests__/onboard.test.ts) and [isolated test drive](../cli/src/__tests__/test-drive.test.ts) cover their setup contracts; they do not establish that every model account is usable. +Automated: [CLI onboarding](../../cli/src/__tests__/onboard.test.ts) and [isolated test drive](../../cli/src/__tests__/test-drive.test.ts) cover their setup contracts; they do not establish that every model account is usable. Manual: Run setup in the disposable directory, open the URL it prints, and confirm the instance identity and company. Restart using that same configuration and verify saved state. Exercise an unavailable adapter and confirm an actionable error. diff --git a/feature-map/pipelines.md b/maps/feature-map/pipelines.md similarity index 77% rename from feature-map/pipelines.md rename to maps/feature-map/pipelines.md index efd59e34048..a8f7780796a 100644 --- a/feature-map/pipelines.md +++ b/maps/feature-map/pipelines.md @@ -2,7 +2,9 @@ With the pipeline experiment enabled, people move structured work through configured stages, inspect stage automation, review outputs, and retain learning records. -Implementation: [pipeline board and item hosts](../ui/src/pages/Pipelines.tsx), [pipeline configuration](../ui/src/pages/PipelineSettings.tsx). +Implementation: [pipeline board and item hosts](../../ui/src/pages/Pipelines.tsx), [pipeline configuration](../../ui/src/pages/PipelineSettings.tsx). + +Agent access: [companion](../agent-access-map/pipelines.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Enab ### `pipeline-board` -Automated: [pipeline UI helpers](../ui/src/pages/Pipelines.test.tsx) cover grouping and presentation helpers; [pipeline service](../server/src/__tests__/pipelines-service.test.ts) covers service behavior. +Automated: [pipeline UI helpers](../../ui/src/pages/Pipelines.test.tsx) cover grouping and presentation helpers; [pipeline service](../../server/src/__tests__/pipelines-service.test.ts) covers service behavior. Manual: Configure stages and a harmless automation, add an item, and inspect its stage. Follow its task/work references and observe the resulting transition. Reload grouping and settings; verify rejected or failed transitions leave the item in an intelligible state. ### `item-review-learning` -Automated: [pipeline tutorial browser suite](../tests/e2e/pipelines-tutorial-flow.spec.ts) targets a fixture journey; it does not qualify arbitrary stage automation or learning quality. +Automated: [pipeline tutorial browser suite](../../tests/e2e/pipelines-tutorial-flow.spec.ts) targets a fixture journey; it does not qualify arbitrary stage automation or learning quality. Manual: Open a pending review, inspect its source output and revision, accept or reject, and verify the persisted stage outcome. Follow a learning record to its source context and confirm it belongs to the intended pipeline/company. diff --git a/feature-map/plugins.md b/maps/feature-map/plugins.md similarity index 78% rename from feature-map/plugins.md rename to maps/feature-map/plugins.md index 4c6788cdd7b..839f2a5e26e 100644 --- a/feature-map/plugins.md +++ b/maps/feature-map/plugins.md @@ -2,7 +2,9 @@ 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. -Implementation: [plugin manager](../ui/src/pages/PluginManager.tsx), [plugin settings](../ui/src/pages/PluginSettings.tsx), [plugin page](../ui/src/pages/PluginPage.tsx). +Implementation: [plugin manager](../../ui/src/pages/PluginManager.tsx), [plugin settings](../../ui/src/pages/PluginSettings.tsx), [plugin page](../../ui/src/pages/PluginPage.tsx). + +Agent access: [companion](../agent-access-map/plugins.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `plugin-administration` -Automated: [install authorization](../server/src/__tests__/plugin-install-route-security.test.ts) and [plugin settings](../ui/src/pages/PluginSettings.test.tsx) cover route/UI contracts. +Automated: [install authorization](../../server/src/__tests__/plugin-install-route-security.test.ts) and [plugin settings](../../ui/src/pages/PluginSettings.test.tsx) cover route/UI contracts. Manual: Install the fixture, supply its configuration, activate it, and inspect status. Save an invalid configuration and verify a useful error. Disable/remove the disposable plugin and check its tools and managed resources no longer behave as active. ### `plugin-contribution` -Automated: [static plugin UI](../server/src/__tests__/plugin-ui-static.test.ts) and [company settings contribution](../ui/src/pages/CompanySettingsPluginPage.test.tsx) cover serving/host behavior. +Automated: [static plugin UI](../../server/src/__tests__/plugin-ui-static.test.ts) and [company settings contribution](../../ui/src/pages/CompanySettingsPluginPage.test.tsx) cover serving/host behavior. Manual: Open the contributed page by navigation and cold deep link, perform a harmless plugin action, and inspect its real outcome. Switch company and test an actor without the capability. Reload with the plugin unavailable and verify the host reports that state. diff --git a/feature-map/projects.md b/maps/feature-map/projects.md similarity index 80% rename from feature-map/projects.md rename to maps/feature-map/projects.md index ff2cb3c2539..0ed3470073f 100644 --- a/feature-map/projects.md +++ b/maps/feature-map/projects.md @@ -2,7 +2,9 @@ People group tasks into projects, attach goals and repositories, and configure the context and defaults used by project work. -Implementation: [project list](../ui/src/pages/Projects.tsx), [project detail](../ui/src/pages/ProjectDetail.tsx). +Implementation: [project list](../../ui/src/pages/Projects.tsx), [project detail](../../ui/src/pages/ProjectDetail.tsx). + +Agent access: [companion](../agent-access-map/projects.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `project-list` -Automated: [projects UI](../ui/src/pages/Projects.test.tsx) and [project detail](../ui/src/pages/ProjectDetail.test.tsx) are component tests. +Automated: [projects UI](../../ui/src/pages/Projects.test.tsx) and [project detail](../../ui/src/pages/ProjectDetail.test.tsx) are component tests. Manual: Create a project, add a task from its view, and reload. Verify the task belongs to that project, list counts are plausible, and links preserve company scope. Archive only the disposable project and inspect list/task behavior. ### `repository-settings` -Automated: [repository persistence](../server/src/__tests__/project-repositories-persistence.test.ts) and [repository browser suite](../tests/e2e/project-repositories.spec.ts) cover configured repository workflows. +Automated: [repository persistence](../../server/src/__tests__/project-repositories-persistence.test.ts) and [repository browser suite](../../tests/e2e/project-repositories.spec.ts) cover configured repository workflows. Manual: Attach a small repository, save, and create a project task. Inspect the actual checkout/revision used by its run. Test an invalid repository and missing credentials without treating a saved URL as a working workspace. diff --git a/feature-map/questions-and-approvals.md b/maps/feature-map/questions-and-approvals.md similarity index 84% rename from feature-map/questions-and-approvals.md rename to maps/feature-map/questions-and-approvals.md index 32b611d3211..4ecf303f2aa 100644 --- a/feature-map/questions-and-approvals.md +++ b/maps/feature-map/questions-and-approvals.md @@ -5,6 +5,8 @@ history. A question, plan confirmation, governance approval, and app-tool review can look similar but have different authority and continuation rules. Each decision must stay attached to its original request and survive reload. +Agent access: [companion](../agent-access-map/questions-and-approvals.md). + ## Sub-features - `questions`: single-choice, multiple-choice, custom, and free-text answers; @@ -78,11 +80,11 @@ a component fixture alone cannot prove live response delivery. ### `task-thread` -Automated: [interaction cards](../ui/src/components/IssueThreadInteractionCard.test.tsx), -[paged task cards](../ui/src/components/task-chat/TaskChatInteractionCard.test.tsx), -and [task thread](../ui/src/components/TaskChatThread.test.tsx) cover form, -receipt, and dismissal behavior. [Resolution routes](../server/src/__tests__/issue-thread-interaction-routes.test.ts) -and [response delivery](../server/src/__tests__/question-response-delivery.test.ts) +Automated: [interaction cards](../../ui/src/components/IssueThreadInteractionCard.test.tsx), +[paged task cards](../../ui/src/components/task-chat/TaskChatInteractionCard.test.tsx), +and [task thread](../../ui/src/components/TaskChatThread.test.tsx) cover form, +receipt, and dismissal behavior. [Resolution routes](../../server/src/__tests__/issue-thread-interaction-routes.test.ts) +and [response delivery](../../server/src/__tests__/question-response-delivery.test.ts) cover authority and durable continuation. Run a targeted set with: ```sh @@ -99,7 +101,7 @@ before trying the old approval, then review the current revision. ### `agent-chat` -Automated: the [task thread suite](../ui/src/components/TaskChatThread.test.tsx) +Automated: the [task thread suite](../../ui/src/components/TaskChatThread.test.tsx) parameterizes unanswered-question history for conversation mode on and off. This proves component parity, not a model's plan handoff. @@ -109,7 +111,7 @@ history remains and the conversation does not close as a completed task. ### `attention` -Automated: [attention resolver](../ui/src/components/AttentionInteractionResolver.test.tsx) +Automated: [attention resolver](../../ui/src/components/AttentionInteractionResolver.test.tsx) covers preparing-request refresh without accepting it. The resolution-route tests above cover the API, not every Decisions or Inbox navigation path. @@ -121,8 +123,8 @@ manual coverage gap. ### `board-approval` -Automated: [approval service](../server/src/__tests__/approvals-service.test.ts) -and [idempotency routes](../server/src/__tests__/approval-routes-idempotency.test.ts) +Automated: [approval service](../../server/src/__tests__/approvals-service.test.ts) +and [idempotency routes](../../server/src/__tests__/approval-routes-idempotency.test.ts) cover persistence and duplicate decisions. They do not drive the approval pages. Manual: create disposable formal approval requests; approve one from the list, @@ -132,7 +134,7 @@ the recorded decision and its governed effect, not just a success toast. ### `app-review` -Automated: [connection reviews](../tests/e2e/connection-reviews.spec.ts) drives +Automated: [connection reviews](../../tests/e2e/connection-reviews.spec.ts) drives task/queue synchronization, approve, decline, remembered permission, provider failure, and restart with a scripted process agent and local MCP provider: @@ -144,11 +146,11 @@ Manual: dismiss and reopen a review, decide it from each entry point using fresh requests, and inspect the continuation's useful result. Always allow must show its scope; a future action with changed arguments should obey the saved rule. Provider failure must remain an approved decision with a failed execution. -Real provider and model checks follow [Task reviews](../doc/connections/TASK-REVIEWS.md#verification-workflows). +Real provider and model checks follow [Task reviews](../../doc/connections/TASK-REVIEWS.md#verification-workflows). ### `skill-test` -Automated: [read-only interaction contract](../server/src/__tests__/issue-thread-interaction-routes.test.ts) +Automated: [read-only interaction contract](../../server/src/__tests__/issue-thread-interaction-routes.test.ts) checks that fetching interactions does not mutate them. Shared card suites cover rendering. Neither proves the complete Skill Studio host or its permission matrix. @@ -159,9 +161,9 @@ referenced unit tests. ### `external-channel` -Automated: [chat question forms](../server/src/services/chat-question-forms.test.ts), -[Discord forms](../server/src/services/chat-discord-question-forms.test.ts), -and [interaction publications](../server/src/__tests__/chat-interaction-publications.test.ts) +Automated: [chat question forms](../../server/src/services/chat-question-forms.test.ts), +[Discord forms](../../server/src/services/chat-discord-question-forms.test.ts), +and [interaction publications](../../server/src/__tests__/chat-interaction-publications.test.ts) cover serialization and delivery logic with fixtures. Manual: use a disposable provider conversation, answer as the linked sender, diff --git a/feature-map/recovery.md b/maps/feature-map/recovery.md similarity index 87% rename from feature-map/recovery.md rename to maps/feature-map/recovery.md index 3e8a8564678..0236b1e4dec 100644 --- a/feature-map/recovery.md +++ b/maps/feature-map/recovery.md @@ -5,6 +5,8 @@ continuation is available. Recovery retains task context and ownership, honors pause and budget gates, and distinguishes confirmed failure from an uncertain external outcome. A retry acknowledgement alone is not proof that work resumed. +Agent access: [companion](../agent-access-map/recovery.md). + ## Sub-features - `diagnosis`: a task/run exposes the recorded cause, evidence, owner, attempt @@ -68,12 +70,12 @@ to get a failure screen. Use the existing deterministic recovery suite first. ### `source-task` -Automated: [recovery actions](../server/src/__tests__/issue-recovery-actions.test.ts) +Automated: [recovery actions](../../server/src/__tests__/issue-recovery-actions.test.ts) covers source scoping, bounded attempts, operator stops, quota monitoring, ownership, stale action retirement, and continuation deduplication. -[Recovery cards](../ui/src/components/IssueRecoveryActionCard.test.tsx) cover +[Recovery cards](../../ui/src/components/IssueRecoveryActionCard.test.tsx) cover diagnosis, retry progress, exhaustion, and action availability. The fixture-backed -[execution-recovery journeys](../tests/e2e/execution-recovery/recovery.spec.ts) +[execution-recovery journeys](../../tests/e2e/execution-recovery/recovery.spec.ts) start their own test-drive instances and exercise safe, uncertain, restart, manager-lineage, and legacy-unknown paths: @@ -90,7 +92,7 @@ history remains. A fixture pass does not qualify every live harness/provider. ### `run-detail` -Automated: [run workspace recovery](../ui/src/components/RunWorkspaceRecoverySurface.test.tsx) +Automated: [run workspace recovery](../../ui/src/components/RunWorkspaceRecoverySurface.test.tsx) tests this host; it is component coverage, not an end-to-end repair. Manual: prepare a failed run with error code `workspace_validation_failed`, a @@ -105,10 +107,10 @@ gap. ### `operator-retry` -Automated: [disposition notices](../ui/src/components/DispositionRecoveryNotice.test.tsx) +Automated: [disposition notices](../../ui/src/components/DispositionRecoveryNotice.test.tsx) tests pending/error/gated states and waiting for the real retry acknowledgement. The recovery-card suite covers workspace divergence, reissue, reconcile, and -confirmation. [Workspace export](../ui/src/components/WorkspaceExportRecovery.test.tsx) +confirmation. [Workspace export](../../ui/src/components/WorkspaceExportRecovery.test.tsx) covers its separate repair surface. Manual: reproduce an exhausted disposable action. Click once, verify pending @@ -120,10 +122,10 @@ action paths. A changed card label is insufficient proof of workspace integrity. ### `post-stop-message` -Automated: [legacy continuation](../server/src/services/recovery/legacy-continuation.test.ts), -[queue routes](../server/src/__tests__/issue-queued-comments-routes.test.ts), and -[native restart recovery](../server/src/services/native-runtime/native-restart-recovery.test.ts) -cover their respective recovery paths. [Legacy failure continuation](../tests/e2e/legacy-failure-continuation.spec.ts) +Automated: [legacy continuation](../../server/src/services/recovery/legacy-continuation.test.ts), +[queue routes](../../server/src/__tests__/issue-queued-comments-routes.test.ts), and +[native restart recovery](../../server/src/services/native-runtime/native-restart-recovery.test.ts) +cover their respective recovery paths. [Legacy failure continuation](../../tests/e2e/legacy-failure-continuation.spec.ts) adds a browser journey; it is not native runtime proof. Manual: stop a disposable run, submit a distinguishable follow-up, and observe @@ -134,7 +136,7 @@ outcomes, inspect the provider before authorizing another operation. ### `browser-reconnect` -Automated: [live-update recovery](../ui/src/context/LiveUpdatesProvider.recovery.test.tsx) +Automated: [live-update recovery](../../ui/src/context/LiveUpdatesProvider.recovery.test.tsx) covers client transport recovery with mocks. It does not prove runner restart. Manual: go offline during a disposable run, let the server reach a new state, @@ -155,5 +157,5 @@ only. Separately inspect the underlying execution if it is still stuck. silently trigger recovery that fights the user's instruction. - Source inspection and mocked component tests do not qualify real server restart continuity. Use the appropriate runtime suite for that claim. -- See [execution semantics](../doc/execution-semantics.md) for the governing +- See [execution semantics](../../doc/execution-semantics.md) for the governing recovery contract and [steering](./steering.md) for saved follow-ups. diff --git a/feature-map/routines.md b/maps/feature-map/routines.md similarity index 73% rename from feature-map/routines.md rename to maps/feature-map/routines.md index 99e437da265..621fd21bca6 100644 --- a/feature-map/routines.md +++ b/maps/feature-map/routines.md @@ -2,7 +2,9 @@ Operators define repeatable work, configure its inputs and triggers, run it on demand or automatically, and inspect the execution history and resulting tasks. -Implementation: [routine list](../ui/src/pages/Routines.tsx), [routine detail](../ui/src/pages/RoutineDetail.tsx), [trigger editor](../ui/src/components/routine-triggers/TriggerWizard.tsx). +Implementation: [routine list](../../ui/src/pages/Routines.tsx), [routine detail](../../ui/src/pages/RoutineDetail.tsx), [trigger editor](../../ui/src/components/routine-triggers/TriggerWizard.tsx). + +Agent access: [companion](../agent-access-map/routines.md). ## Sub-features @@ -29,7 +31,7 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `routine-editor` -Automated: [routine detail helper](../ui/src/pages/RoutineDetail.test.tsx) tests project-selector options, not the rendered editor. [Routine service](../server/src/__tests__/routines-service.test.ts) covers server contracts. Saving and running through the editor remain manual checks. +Automated: [routine detail helper](../../ui/src/pages/RoutineDetail.test.tsx) tests project-selector options, not the rendered editor. [Routine service](../../server/src/__tests__/routines-service.test.ts) covers server contracts. Saving and running through the editor remain manual checks. Manual: Save an agent, request, project, and a required variable. Reload and inspect the saved definition. Run now with a distinguishable input, follow the resulting task, and verify its output and history entry. Check a missing required input. @@ -40,7 +42,7 @@ complete the generated task or establish a useful task output. ### `trigger-history` -Automated: [trigger wizard](../ui/src/components/routine-triggers/TriggerWizard.test.tsx) is component coverage; [routine integration](../server/src/__tests__/routines-e2e.test.ts) is server integration rather than a provider-wide browser proof. +Automated: [trigger wizard](../../ui/src/components/routine-triggers/TriggerWizard.test.tsx) is component coverage; [routine integration](../../server/src/__tests__/routines-e2e.test.ts) is server integration rather than a provider-wide browser proof. Manual: Set a near-term disposable schedule or authorized test webhook, verify one eligible execution and its source trigger, then disable it and confirm further invocations stop. Inspect a failed execution without losing its history. Remove the temporary trigger after testing. diff --git a/feature-map/runs-adapters.md b/maps/feature-map/runs-adapters.md similarity index 76% rename from feature-map/runs-adapters.md rename to maps/feature-map/runs-adapters.md index 93651b8fd89..bec86d34f2c 100644 --- a/feature-map/runs-adapters.md +++ b/maps/feature-map/runs-adapters.md @@ -2,7 +2,9 @@ Operators choose an agent harness and model account, inspect execution history and transcripts, and distinguish a working configuration from a successful task result. -Implementation: [adapter manager](../ui/src/pages/AdapterManager.tsx), [run host](../ui/src/pages/AgentDetail.tsx), [configuration](../ui/src/components/AgentConfigForm.tsx). +Implementation: [adapter manager](../../ui/src/pages/AdapterManager.tsx), [run host](../../ui/src/pages/AgentDetail.tsx), [configuration](../../ui/src/components/AgentConfigForm.tsx). + +Agent access: [companion](../agent-access-map/runs-adapters.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Reco ### `adapter-setup` -Automated: [adapter validation routes](../server/src/__tests__/agent-adapter-validation-routes.test.ts) and [model refresh](../server/src/__tests__/adapter-model-refresh-routes.test.ts) cover server behavior. +Automated: [adapter validation routes](../../server/src/__tests__/agent-adapter-validation-routes.test.ts) and [model refresh](../../server/src/__tests__/adapter-model-refresh-routes.test.ts) cover server behavior. Manual: Select the intended adapter and account, refresh model choices, and run its environment test. Save, reload, then execute a small task. Repeat with a deliberately unavailable account and verify the failure remains visible. ### `run-history` -Automated: [live run routes](../server/src/__tests__/agent-live-run-routes.test.ts) and [run event sequencing](../server/src/__tests__/heartbeat-run-event-sequencing.test.ts) cover run data contracts. +Automated: [live run routes](../../server/src/__tests__/agent-live-run-routes.test.ts) and [run event sequencing](../../server/src/__tests__/heartbeat-run-event-sequencing.test.ts) cover run data contracts. Manual: Start a disposable task, open its running transcript, and follow it to a terminal outcome. Reload and compare task/run IDs, status, output, and cost. Verify a failed run remains distinguishable from a completed run with useful output. diff --git a/feature-map/secrets.md b/maps/feature-map/secrets.md similarity index 75% rename from feature-map/secrets.md rename to maps/feature-map/secrets.md index d9d6d42ff26..34082ab4ba9 100644 --- a/feature-map/secrets.md +++ b/maps/feature-map/secrets.md @@ -2,7 +2,9 @@ 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. -Implementation: [secrets page](../ui/src/pages/Secrets.tsx), [personal secrets](../ui/src/pages/secrets/MyUserSecretsTab.tsx), [proposals](../ui/src/pages/secrets/ProposalsTab.tsx). +Implementation: [secrets page](../../ui/src/pages/Secrets.tsx), [personal secrets](../../ui/src/pages/secrets/MyUserSecretsTab.tsx), [proposals](../../ui/src/pages/secrets/ProposalsTab.tsx). + +Agent access: [companion](../agent-access-map/secrets.md). ## Sub-features @@ -28,13 +30,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `secret-management` -Automated: [secrets service](../server/src/__tests__/secrets-service.test.ts) and [user ownership](../server/src/__tests__/secrets-service-user-secret-owner-scoped.test.ts) cover storage/access contracts. +Automated: [secrets service](../../server/src/__tests__/secrets-service.test.ts) and [user ownership](../../server/src/__tests__/secrets-service-user-secret-owner-scoped.test.ts) cover storage/access contracts. Manual: Create a dummy secret reference, bind it through a supported field, and verify its use in a harmless run without logging the value. Update it and reload. Switch users and confirm personal values remain owner-scoped and missing credentials produce an actionable state. ### `proposal-import` -Automated: [proposal routes](../server/src/__tests__/secret-proposals-routes.test.ts) and [vault import dialog](../ui/src/pages/secrets/ImportFromVaultDialog.test.tsx) cover route/UI layers; a real vault integration needs live validation. +Automated: [proposal routes](../../server/src/__tests__/secret-proposals-routes.test.ts) and [vault import dialog](../../ui/src/pages/secrets/ImportFromVaultDialog.test.tsx) cover route/UI layers; a real vault integration needs live validation. Manual: Review a dummy proposal, reject one and accept another, then inspect the resulting reference state and history. Preview a vault import, select only disposable entries, and verify imported references and denied-access errors after reload. diff --git a/feature-map/skills.md b/maps/feature-map/skills.md similarity index 76% rename from feature-map/skills.md rename to maps/feature-map/skills.md index ed289935fef..4085f690090 100644 --- a/feature-map/skills.md +++ b/maps/feature-map/skills.md @@ -2,7 +2,9 @@ Operators discover or import skills, author and test them in Skill Studio, manage source versions, and decide which agents may use them. -Implementation: [skill library](../ui/src/pages/CompanySkills.tsx), [studio](../ui/src/pages/SkillStudio.tsx), [sources](../ui/src/pages/SkillSources.tsx), [agent skills](../ui/src/pages/agent-skills/AgentSkillsTab.tsx). +Implementation: [skill library](../../ui/src/pages/CompanySkills.tsx), [studio](../../ui/src/pages/SkillStudio.tsx), [sources](../../ui/src/pages/SkillSources.tsx), [agent skills](../../ui/src/pages/agent-skills/AgentSkillsTab.tsx). + +Agent access: [companion](../agent-access-map/skills.md). ## Sub-features @@ -35,19 +37,19 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `library-sources` -Automated: [library UI](../ui/src/pages/CompanySkills.test.tsx) and [source service](../server/src/__tests__/skill-sources.test.ts) cover their respective layers. +Automated: [library UI](../../ui/src/pages/CompanySkills.test.tsx) and [source service](../../server/src/__tests__/skill-sources.test.ts) cover their respective layers. Manual: Install a fixture, locate it in Installed, inspect its source and files, and reload. Import a source update and compare versions before accepting it. Check a source requiring unavailable repository access and verify the failure is explicit. ### `studio` -Automated: [Studio](../ui/src/pages/SkillStudio.test.tsx) covers UI behavior; model-driven skill testing remains a separate manual result. +Automated: [Studio](../../ui/src/pages/SkillStudio.test.tsx) covers UI behavior; model-driven skill testing remains a separate manual result. Manual: Create or fork a disposable skill, edit instructions, save, and reload. Run a bounded test, respond to any question, and inspect the output. Verify the saved version matches what was tested and failed saves retain the draft. ### `agent-enablement` -Automated: [policy service](../server/src/__tests__/company-skill-policy-service.test.ts) and [agent skills state](../ui/src/pages/agent-skills/AgentSkillsTab.test.ts) cover policy/state contracts. +Automated: [policy service](../../server/src/__tests__/company-skill-policy-service.test.ts) and [agent skills state](../../ui/src/pages/agent-skills/AgentSkillsTab.test.ts) cover policy/state contracts. Manual: Enable the skill for one test agent and leave another without access. Run a small task on each, inspect the available skill context, then change the release/policy and verify the next eligible run uses the intended version. diff --git a/feature-map/status-cards.md b/maps/feature-map/status-cards.md similarity index 74% rename from feature-map/status-cards.md rename to maps/feature-map/status-cards.md index ec0b2b240c4..c91082da6b6 100644 --- a/feature-map/status-cards.md +++ b/maps/feature-map/status-cards.md @@ -2,7 +2,9 @@ The status-card experiment turns a saved prompt/query into an inspectable summary of watched work, with refresh history, configuration, and archive/restore controls. -Implementation: [status page](../ui/src/pages/StatusCards/index.tsx), [card detail](../ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx). +Implementation: [status page](../../ui/src/pages/StatusCards/index.tsx), [card detail](../../ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx). + +Agent access: [companion](../agent-access-map/status-cards.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Enab ### `status-board` -Automated: [status-card service/routes](../server/src/__tests__/status-cards.test.ts) covers gated lifecycle and generation contracts; [tile UI](../ui/src/pages/StatusCards/StatusCardTile.test.tsx) covers rendering. +Automated: [status-card service/routes](../../server/src/__tests__/status-cards.test.ts) covers gated lifecycle and generation contracts; [tile UI](../../ui/src/pages/StatusCards/StatusCardTile.test.tsx) covers rendering. Manual: Create a bounded card, inspect its generation task, and wait for a saved summary. Change a watched task, refresh, and verify both the summary and update history reflect the source change. Exercise a failed generation and confirm it is not presented as fresh. ### `card-settings` -Automated: [settings form](../ui/src/pages/StatusCards/StatusCardSettingsForm.test.tsx) and [update engine](../server/src/__tests__/status-card-update-engine.test.ts) cover separate UI/engine layers. +Automated: [settings form](../../ui/src/pages/StatusCards/StatusCardSettingsForm.test.tsx) and [update engine](../../server/src/__tests__/status-card-update-engine.test.ts) cover separate UI/engine layers. Manual: Change a disposable card’s prompt or summarizer, run the offered rebuild/refresh, and inspect the resulting query and summary. Archive and restore it, reload its direct link, and check the actual new generation outcome. diff --git a/feature-map/steering.md b/maps/feature-map/steering.md similarity index 87% rename from feature-map/steering.md rename to maps/feature-map/steering.md index 02d1cfa91bc..8366f9614d9 100644 --- a/feature-map/steering.md +++ b/maps/feature-map/steering.md @@ -5,6 +5,8 @@ not been consumed, and choose when to steer or interrupt. Stopping a run and pausing a task are separate controls. The UI must preserve the message, explain why it is waiting, and only claim delivery after an authoritative acknowledgement. +Agent access: [companion](../agent-access-map/steering.md). + ## Sub-features - `queue`: a busy task saves follow-ups and shows their order and wait reason. @@ -57,11 +59,11 @@ unsupported steering without treating an absent capability as a product failure. ### `task-composer` -Automated: [queued-message UI](../ui/src/components/task-chat/TaskChatQueuedMessages.test.tsx) +Automated: [queued-message UI](../../ui/src/components/task-chat/TaskChatQueuedMessages.test.tsx) covers order, failure restoration, unavailable steering, stale revisions, and -discard acknowledgements. [Queue routes](../server/src/__tests__/issue-queued-comments-routes.test.ts) +discard acknowledgements. [Queue routes](../../server/src/__tests__/issue-queued-comments-routes.test.ts) cover durable ordering, authorization, steering acknowledgements, interrupt -recovery, and concurrent dispatch. [Composer](../ui/src/components/task-chat/TaskChatComposer.test.tsx) +recovery, and concurrent dispatch. [Composer](../../ui/src/components/task-chat/TaskChatComposer.test.tsx) covers drafts and uncertain saves. ```sh @@ -69,9 +71,9 @@ pnpm exec vitest run ui/src/components/task-chat/TaskChatQueuedMessages.test.tsx ``` Automated stop coverage is separate: -[composer stop](../tests/e2e/composer-stop.spec.ts) with -[its configuration](../tests/e2e/playwright-composer-stop.config.ts) and -[ACP stop/continuation](../tests/e2e/acp-stop-continuation.spec.ts). Inspect their +[composer stop](../../tests/e2e/composer-stop.spec.ts) with +[its configuration](../../tests/e2e/playwright-composer-stop.config.ts) and +[ACP stop/continuation](../../tests/e2e/acp-stop-continuation.spec.ts). Inspect their fixture and opt-in prerequisites; skipped native cases are not native proof. Manual: queue three distinguishable messages. Edit one, reorder them, reload, @@ -86,7 +88,7 @@ when available; the named component tests do not prove every host integration. ### `agent-chat` -Automated: [agent chat sessions](../tests/e2e/agent-chat-sessions.spec.ts) covers +Automated: [agent chat sessions](../../tests/e2e/agent-chat-sessions.spec.ts) covers persistent conversation/session behavior with deterministic harness fixtures; shared composer tests cover the controls. These do not qualify live steering for every harness. @@ -100,7 +102,7 @@ when the change touches delivery. ### `request-response` -Automated: [response delivery](../server/src/__tests__/question-response-delivery.test.ts) +Automated: [response delivery](../../server/src/__tests__/question-response-delivery.test.ts) proves queueing/coalescing and retry-safe receipts. The queue-route suite tests separate comment and approval queues, explicit steering, and fresh-session restrictions on plan approvals. @@ -113,7 +115,7 @@ approval outcome through an ordinary queued-message editor. ### `external-channel` -Automated: [chat interaction arbitration](../server/src/services/chat-interaction-arbitration.test.ts) +Automated: [chat interaction arbitration](../../server/src/services/chat-interaction-arbitration.test.ts) covers backend arbitration with simulated requests. It is not a provider UI test. Manual: send two distinguishable messages through one disposable linked diff --git a/feature-map/task-coordination.md b/maps/feature-map/task-coordination.md similarity index 75% rename from feature-map/task-coordination.md rename to maps/feature-map/task-coordination.md index 609c86dc9f8..aff32dc01d1 100644 --- a/feature-map/task-coordination.md +++ b/maps/feature-map/task-coordination.md @@ -2,7 +2,9 @@ A larger task can coordinate child work, dependencies, reviewers, and execution controls while preserving a clear owner and a traceable completion decision. -Implementation: [task thread](../ui/src/pages/IssueDetail.tsx), [execution policy](../server/src/services/issues.ts). +Implementation: [task thread](../../ui/src/pages/IssueDetail.tsx), [execution policy](../../server/src/services/issues.ts). + +Agent access: [companion](../agent-access-map/task-coordination.md). ## Sub-features @@ -31,13 +33,13 @@ creates a hold; it does not change task statuses to a paused status. ### `task-relationships` -Automated: [dependency wakeups](../server/src/__tests__/issue-dependency-wakeups-routes.test.ts) checks server behavior; visual relationship navigation remains a manual check. +Automated: [dependency wakeups](../../server/src/__tests__/issue-dependency-wakeups-routes.test.ts) checks server behavior; visual relationship navigation remains a manual check. Manual: Block one task on another, finish the prerequisite, and observe the dependent task’s eligible continuation. Follow parent/child links back to the source request. Verify no duplicate run or false parent completion occurs. ### `review-and-controls` -Automated: [execution policy](../server/src/__tests__/issue-execution-policy.test.ts), [tree control](../server/src/__tests__/issue-tree-control-service.test.ts), and [signoff browser suite](../tests/e2e/signoff-policy.spec.ts) target these layers. A linked suite is not a claim that its current run is green. +Automated: [execution policy](../../server/src/__tests__/issue-execution-policy.test.ts), [tree control](../../server/src/__tests__/issue-tree-control-service.test.ts), and [signoff browser suite](../../tests/e2e/signoff-policy.spec.ts) target these layers. A linked suite is not a claim that its current run is green. Manual: Complete implementation under a review-required policy and confirm it waits for the required review outcome. Exercise rejection and later approval. Pause the parent while child work is pending, then verify resumption respects budget and ownership gates. diff --git a/feature-map/tasks.md b/maps/feature-map/tasks.md similarity index 76% rename from feature-map/tasks.md rename to maps/feature-map/tasks.md index b32039dbdd6..19eb631af3c 100644 --- a/feature-map/tasks.md +++ b/maps/feature-map/tasks.md @@ -2,7 +2,9 @@ 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. -Implementation: [new task](../ui/src/components/NewIssueDialog.tsx), [task list](../ui/src/pages/Issues.tsx), [task detail](../ui/src/pages/IssueDetail.tsx). +Implementation: [new task](../../ui/src/components/NewIssueDialog.tsx), [task list](../../ui/src/pages/Issues.tsx), [task detail](../../ui/src/pages/IssueDetail.tsx). + +Agent access: [companion](../agent-access-map/tasks.md). ## Sub-features @@ -35,7 +37,7 @@ whether a real or simulated harness handles execution. ### `new-task` -Automated: [creation dialog](../ui/src/components/NewIssueDialog.test.tsx) is component coverage with mocked requests. +Automated: [creation dialog](../../ui/src/components/NewIssueDialog.test.tsx) is component coverage with mocked requests. Manual: Create a uniquely named task with an agent and project. Open its resulting link and reload. Confirm text, attachment, assignment, and project persisted, and verify execution started only when the task and agent are eligible. @@ -45,13 +47,13 @@ Use a human/unassigned task to verify persistence without invoking a model. ### `task-list` -Automated: [task-list helpers](../ui/src/pages/Issues.test.tsx) cover search URLs, pagination, deduplication, and presentation constants. The suite does not render the page or exercise filtering, grouping, opening a task, and returning; those interactions still need a running-browser check. +Automated: [task-list helpers](../../ui/src/pages/Issues.test.tsx) cover search URLs, pagination, deduplication, and presentation constants. The suite does not render the page or exercise filtering, grouping, opening a task, and returning; those interactions still need a running-browser check. Manual: Filter by status and assignee, change grouping/sort, open a task, and return. Verify the correct records and selected view survive navigation and reload. Include an empty result and a failed request. ### `task-detail` -Automated: [task detail](../ui/src/pages/IssueDetail.test.tsx) covers component behavior, while [issue service](../server/src/__tests__/issues-service.test.ts) covers server contracts. +Automated: [task detail](../../ui/src/pages/IssueDetail.test.tsx) covers component behavior, while [issue service](../../server/src/__tests__/issues-service.test.ts) covers server contracts. Manual: Add a comment and edit authorized properties. Reload and verify history, actor, and values. Complete a disposable task and inspect its deliverable; reopen through an available action and confirm the next execution follows current policy. diff --git a/feature-map/teams.md b/maps/feature-map/teams.md similarity index 80% rename from feature-map/teams.md rename to maps/feature-map/teams.md index f5822ab4645..c3ecdecbd4a 100644 --- a/feature-map/teams.md +++ b/maps/feature-map/teams.md @@ -2,7 +2,9 @@ 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. -Implementation: [CLI teams](../cli/src/commands/client/teams.ts), [catalog components](../ui/src/pages/TeamCatalog.tsx). +Implementation: [CLI teams](../../cli/src/commands/client/teams.ts), [catalog components](../../ui/src/pages/TeamCatalog.tsx). + +Agent access: [companion](../agent-access-map/teams.md). ## Sub-features @@ -27,13 +29,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Use ### `catalog-cli` -Automated: [team commands](../cli/src/__tests__/teams.test.ts) and [catalog service](../server/src/__tests__/teams-catalog-service.test.ts) cover command and service contracts. +Automated: [team commands](../../cli/src/__tests__/teams.test.ts) and [catalog service](../../server/src/__tests__/teams-catalog-service.test.ts) cover command and service contracts. Manual: List an entry, preview its proposed agents and resources, install it into the disposable company, and inspect each created resource. Run a small task after configuring accounts. Retry preview/install as supported and inspect duplicate/conflict behavior. ### `catalog-components` -Automated: [catalog component](../ui/src/pages/TeamCatalog.test.tsx) and [install hook](../ui/src/pages/useInstallTeamCatalogEntry.test.tsx) cover preview and install UI logic with mocks. +Automated: [catalog component](../../ui/src/pages/TeamCatalog.test.tsx) and [install hook](../../ui/src/pages/useInstallTeamCatalogEntry.test.tsx) cover preview and install UI logic with mocks. Manual: When changing or mounting these components, exercise preview, manager/source options, cancellation, failed install, and success. Follow created agents in the actual company. Record whether this was a component harness or a real product entry point. diff --git a/feature-map/workspaces.md b/maps/feature-map/workspaces.md similarity index 77% rename from feature-map/workspaces.md rename to maps/feature-map/workspaces.md index acf92476222..786f5f4d8ef 100644 --- a/feature-map/workspaces.md +++ b/maps/feature-map/workspaces.md @@ -2,7 +2,9 @@ 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. -Implementation: [workspace list](../ui/src/pages/Workspaces.tsx), [execution workspace](../ui/src/pages/ExecutionWorkspaceDetail.tsx), [project workspace](../ui/src/pages/ProjectWorkspaceDetail.tsx). +Implementation: [workspace list](../../ui/src/pages/Workspaces.tsx), [execution workspace](../../ui/src/pages/ExecutionWorkspaceDetail.tsx), [project workspace](../../ui/src/pages/ProjectWorkspaceDetail.tsx). + +Agent access: [companion](../agent-access-map/workspaces.md). ## Sub-features @@ -28,13 +30,13 @@ Preconditions: follow the [baseline](./README.md#before-driving-a-journey). Enab ### `task-workspace` -Automated: [workspace card](../ui/src/components/IssueWorkspaceCard.test.tsx) and [task binding](../server/src/__tests__/issue-runtime-workspace-binding.test.ts) cover host/binding contracts. +Automated: [workspace card](../../ui/src/components/IssueWorkspaceCard.test.tsx) and [task binding](../../server/src/__tests__/issue-runtime-workspace-binding.test.ts) cover host/binding contracts. Manual: Run a task that writes a small file, follow the bound workspace, and inspect the file and revision. Reload and verify links still refer to the same workspace, not another checkout or a stale run. ### `workspace-management` -Automated: [workspace detail](../ui/src/pages/ExecutionWorkspaceDetail.test.tsx) and [runtime service](../server/src/__tests__/workspace-runtime.test.ts) cover UI and runtime contracts separately. +Automated: [workspace detail](../../ui/src/pages/ExecutionWorkspaceDetail.test.tsx) and [runtime service](../../server/src/__tests__/workspace-runtime.test.ts) cover UI and runtime contracts separately. Manual: Provision a disposable workspace, wait for readiness, start an available service, open its endpoint, and inspect a real response and logs. Stop it and verify it actually stops. Exercise close/reopen only after inspecting pending changes and active runs. diff --git a/scripts/check-maps.mjs b/scripts/check-maps.mjs new file mode 100644 index 00000000000..9aef27c5d32 --- /dev/null +++ b/scripts/check-maps.mjs @@ -0,0 +1,131 @@ +#!/usr/bin/env node +import { existsSync, readFileSync, readdirSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const scriptPath = fileURLToPath(import.meta.url); +const defaultRoot = path.resolve(path.dirname(scriptPath), ".."); +const fields = ["API", "Agent access", "Policy", "Evidence", "Verification", "Gaps"]; +const values = { + Review: ["baseline", "operation-reviewed"], + API: ["present", "missing", "not-applicable", "unreviewed"], + "Agent access": ["available", "partial", "missing", "restricted", "operator-only", "not-applicable", "unreviewed"], + Evidence: ["source-only", "verified", "failed", "blocked", "not-run"], + Verification: ["passed", "failed", "blocked", "not-run"], +}; + +function withoutExamples(text) { + return text.replace(/^(`{3,}|~{3,})[^\n]*\n[\s\S]*?^\1\s*$/gm, ""); +} + +function sections(text, level) { + const pattern = new RegExp("^" + "#".repeat(level) + " `([^`]+)`[^\\n]*$", "gm"); + const matches = [...text.matchAll(pattern)]; + return matches.map((match, index) => ({ + id: match[1], + body: text.slice(match.index + match[0].length, matches[index + 1]?.index ?? text.length), + })); +} + +export function checkMaps(repoRoot = defaultRoot) { + const errors = []; + const featureRoot = path.join(repoRoot, "maps/feature-map"); + const agentRoot = path.join(repoRoot, "maps/agent-access-map"); + const fail = (file, message) => errors.push(`${path.relative(repoRoot, file)}: ${message}`); + function read(file) { + if (!existsSync(file)) { fail(file, "missing file"); return ""; } + return withoutExamples(readFileSync(file, "utf8")); + } + function files(dir) { + if (!existsSync(dir)) { fail(dir, "missing map directory"); return []; } + return readdirSync(dir).filter((name) => name.endsWith(".md") && name !== "README.md").sort(); + } + function unique(ids, file, label) { + const seen = new Set(); + for (const id of ids) { + if (seen.has(id)) fail(file, `duplicate ${label}: ${id}`); + seen.add(id); + } + } + function links(file, text) { + for (const match of text.matchAll(/\]\(([^)\n]+)\)/g)) { + const target = match[1].replace(/^<|>$/g, ""); + if (/^(?:[a-z][a-z\d+.-]*:|#)/i.test(target)) continue; + if (target.startsWith("/")) { fail(file, `use a relative map reference: ${target}`); continue; } + let local; + try { local = decodeURIComponent(target.split(/[?#]/, 1)[0]); } + catch { fail(file, `invalid local reference: ${target}`); continue; } + if (!existsSync(path.resolve(path.dirname(file), local))) fail(file, `broken local reference: ${target}`); + } + } + function field(file, body, name) { + const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const match = body.match(new RegExp(`^${escaped}:[ \\t]*(\\S[^\\n]*)$`, "m")); + if (!match) { fail(file, `missing ${name} field`); return null; } + if (!values[name]) return null; + const state = match[1].match(/^`([^`]+)`/); + if (!state || !values[name].includes(state[1])) { fail(file, `invalid ${name} state`); return null; } + if (["not-applicable", "restricted", "operator-only"].includes(state[1]) && !match[1].slice(state[0].length).replace(/[\s—–:.-]/g, "")) { + fail(file, `${name} ${state[1]} needs a reason or path`); + } + return state[1]; + } + function accessRecord(file, body) { + const states = Object.fromEntries(fields.map((name) => [name, field(file, body, name)])); + if (states.Evidence === "verified" && states.Verification !== "passed") { + fail(file, "verified evidence requires a passed verification record"); + } + const api = body.split(/^API:/m)[1]?.split(/^(?:Agent access|Policy|Evidence|Verification|Gaps):/m)[0] ?? ""; + if (states.API === "present" && !/\b(?:GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS) \/[^\s`]+/.test(api)) { + fail(file, "present API needs an exact method/path example"); + } + } + + const productFiles = files(featureRoot); + const agentFiles = files(agentRoot); + const indexes = [read(path.join(featureRoot, "README.md")), read(path.join(agentRoot, "README.md"))]; + let capabilities = 0; + for (const name of new Set([...productFiles, ...agentFiles])) { + const productFile = path.join(featureRoot, name); + const agentFile = path.join(agentRoot, name); + const product = read(productFile); + const agent = read(agentFile); + const subfeatures = product.split(/^## Sub-features\s*$/m)[1]?.split(/^## /m)[0] ?? ""; + const ids = [...subfeatures.matchAll(/^- `([^`]+)`:/gm)].map((match) => match[1]); + if (!ids.length) fail(productFile, "missing stable sub-feature IDs"); + unique(ids, productFile, "capability"); + const entries = sections(agent, 2); + unique(entries.map((entry) => entry.id), agentFile, "capability"); + for (const id of ids) if (!entries.some((entry) => entry.id === id)) fail(agentFile, `missing capability: ${id}`); + for (const entry of entries) { + if (!ids.includes(entry.id)) fail(agentFile, `orphan capability: ${entry.id}`); + const review = field(agentFile, entry.body, "Review"); + if (review === "operation-reviewed") { + const operations = sections(entry.body, 3); + if (!operations.length) fail(agentFile, `operation-reviewed capability ${entry.id} has no operations`); + unique(operations.map((operation) => operation.id), agentFile, "operation"); + for (const operation of operations) accessRecord(agentFile, operation.body); + } else accessRecord(agentFile, entry.body); + } + 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; + } + for (const file of [path.join(repoRoot, "maps/README.md"), path.join(featureRoot, "README.md"), path.join(agentRoot, "README.md")]) links(file, read(file)); + return { errors, areas: productFiles.length, capabilities }; +} + +if (process.argv[1] && path.resolve(process.argv[1]) === scriptPath) { + const result = checkMaps(); + for (const error of result.errors) console.error(error); + if (result.errors.length) process.exitCode = 1; + else console.log(`Maps aligned: ${result.areas} areas, ${result.capabilities} capability IDs; references and contract fields valid. Structural checks only.`); +} diff --git a/scripts/check-maps.test.mjs b/scripts/check-maps.test.mjs new file mode 100644 index 00000000000..aae6e43aff8 --- /dev/null +++ b/scripts/check-maps.test.mjs @@ -0,0 +1,89 @@ +import assert from "node:assert/strict"; +import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { checkMaps } from "./check-maps.mjs"; + +const record = `API: \`present\` — POST /api/example. +Agent access: \`partial\` — agent REST; native binding missing. +Policy: same company and calling owner. +Evidence: \`source-only\` — implementation inspected. +Verification: \`not-run\` — assert permitted owner and denied other company. +Gaps: native mutation path. +`; + +function fixture(t) { + const root = mkdtempSync(path.join(os.tmpdir(), "paperclip-map-contract-")); + t.after(() => rmSync(root, { recursive: true, force: true })); + for (const dir of ["maps/feature-map", "maps/agent-access-map"]) mkdirSync(path.join(root, dir), { recursive: true }); + const product = path.join(root, "maps/feature-map/example.md"); + 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(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 }; +} + +test("paired source-only records pass without being promoted to live proof", (t) => { + const { root } = fixture(t); + assert.deepEqual(checkMaps(root), { errors: [], areas: 1, capabilities: 1 }); +}); + +test("a product area cannot lose its companion", (t) => { + const { root, agent } = fixture(t); + rmSync(agent); + assert.ok(checkMaps(root).errors.some((error) => error.includes("missing file"))); +}); + +test("renaming a capability on one side reports missing and orphan IDs", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8").replace("## `create`", "## `update`")); + const result = checkMaps(root); + assert.ok(result.errors.some((error) => error.includes("missing capability: create"))); + assert.ok(result.errors.some((error) => error.includes("orphan capability: update"))); +}); + +test("duplicate IDs cannot disguise the missing capability", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8") + `\n## \`create\`\n\nReview: \`baseline\`.\n\n${record}`); + assert.ok(checkMaps(root).errors.some((error) => error.includes("duplicate capability: create"))); +}); + +test("a moved or deleted source reference is reported", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8") + "\n[Source](../../server/deleted.ts#L12)\n"); + assert.ok(checkMaps(root).errors.some((error) => error.includes("broken local reference"))); +}); + +test("every reviewed operation needs its own access fields", (t) => { + const { root, agent } = fixture(t); + const text = readFileSync(agent, "utf8").replace("Review: `baseline`.", "Review: `operation-reviewed`.\n\n### `create`"); + writeFileSync(agent, text + `\n### \`update\`\n\n${record.replace(/^API:.*\n/m, "")}`); + assert.ok(checkMaps(root).errors.some((error) => error.includes("missing API field"))); +}); + +test("verified evidence cannot coexist with verification not run", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8").replace("Evidence: `source-only`", "Evidence: `verified`")); + assert.ok(checkMaps(root).errors.some((error) => error.includes("verified evidence requires a passed verification record"))); +}); + +test("an exception needs its reason rather than an empty exemption label", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8").replace(/^API:.*$/m, "API: `not-applicable`.")); + assert.ok(checkMaps(root).errors.some((error) => error.includes("not-applicable needs a reason"))); +}); + +test("API presence needs a concrete method and path", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8").replace("POST /api/example", "see the backend")); + assert.ok(checkMaps(root).errors.some((error) => error.includes("present API needs an exact method/path"))); +}); + +test("an empty policy cannot borrow the next field's content", (t) => { + const { root, agent } = fixture(t); + writeFileSync(agent, readFileSync(agent, "utf8").replace(/^Policy:.*$/m, "Policy:\n")); + assert.ok(checkMaps(root).errors.some((error) => error.includes("missing Policy field"))); +});