Files
PaperClipAI/maps/feature-map
Devin FoleyandPaperclip c7f4b74111 fix: isolate fresh task sources from restricted project workspaces (#16095)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Each task must have an isolated workspace that its agent can read.
> - Older project checkouts can contain worktrees for restricted tasks.
> - The source access check correctly rejects these shared checkouts.
> - A fresh task then fails even when its agent can clone the project
remote.
> - This pull request gives fresh default tasks a separate clone of the
same remote.
> - The task can start while the restricted task files remain protected.

## Linked Issues or Issue Description

**What happened?**

Fresh tasks fail with `Task workspace access is no longer available`
when their default project checkout contains a restricted task worktree.
The caller has access to the new task and its remote repository. The
shared local Git source is unsafe to copy.

**Expected behavior**

Use a separate clone of the same authorized remote for a fresh default
task. Keep source access checks and responsible-user Git credentials in
force.

**Steps to reproduce**

1. Put a restricted task worktree inside a project checkout.
2. Assign a new default task to an agent that cannot read the restricted
task.
3. Start the new task. The current source check fails before workspace
creation.
4. With this fix, the task uses a separate remote source. The restricted
files are absent. Later runs reuse the same owned source.

Related work: Refs #15749, Refs #15528. This change keeps their source
retention and workspace ownership checks.

## What Changed

- Add a remote source path scoped to the company and task.
- Clone through the run’s Git connection after the shared source fails
its access check.
- Reject reused workspaces, explicit selections, pinned branches, local
sources, credential-bearing URLs, and symlink paths.
- Check source access again before publishing the workspace.
- Resolve later runs from the verified recorded source. Ignore leftover
clones that the saved workspace does not own.
- Record provenance for new implicit Git defaults. Read the current task
binding before fallback. Preserve explicit, inherited and ambiguous
legacy checkout choices.
- Keep the effective task strategy during startup validation of matching
implicit defaults. Preserve the existing explicit-selection write check.
- Add regression coverage and document the fallback.

## Verification

- Merged master `c8efdbfba43` and resolved both rounds of catalog/index
conflicts. All upstream suites, classifications, source references and
story IDs are preserved. Both fix branches combine cleanly in either
merge order, with no catalog fingerprint drift.
- Passed locally: 313 focused source-isolation, preparation,
task-creation, binding and trust tests before the final startup fix. The
final fix passes all 100 source-trust, task-binding and
environment-selection tests. Earlier workspace-resolution and
persisted-source suites also passed.
- Real-Git regressions cover all three review findings. Reconstruction
ignores an unrecorded clone and preserves unpublished commits/files.
Explicit and parent-inherited checkout IDs without typed selections
retain their denial and branch tips without cloning or acquiring an
environment. A protected-project heartbeat completes and resumes using
the task’s Git strategy with read access. Explicit selection still
requires writes, and a mismatched default is rejected.
- Passed: the complete Storybook catalog check with no drift errors,
feature and agent map structure checks, and all 17 catalog/index script
tests. The generated index counts match the merged catalog. The current
upstream verification-route inventory remains unchanged. The catalog
contains all 262 authored suites and 2,481 story IDs.
- Passed: full workspace typecheck and build after the final guard
changes, on latest head `79d2adadcb6d3d7a04b9943a91bdb8b0b6abea6d`.
- Latest head `79d2adadcb6d3d7a04b9943a91bdb8b0b6abea6d`: complete CI
passed (54 successful checks, two intentional skips), including the full
general/serialized suites and all eight browser shards. Fresh Greptile
Apex review is 5/5 on this same commit, with no unresolved findings or
recommendations. The full local test command was attempted earlier
without a complete aggregate result; the complete suite result is from
CI.
- Manual check: configure a shared project checkout with a restricted
task worktree. Admit a fresh default task using the authorized remote.
Confirm separate Git storage and no restricted local branch or file.
Reuse, close and reopen the task workspace. Confirm that explicit,
literal branch and low-trust selections retain the denied source.

## Risks

- A clean remote clone excludes unpublished local work. The fallback
applies only to fresh default tasks and rejects existing workspace or
branch selections.
- A private remote can fail to clone when the responsible user lacks Git
credentials. The run then reports the failure; access checks are not
bypassed.
- Older untyped checkout bindings cannot prove default provenance. They
keep the source denial instead of silently dropping unpublished work.
- New implicit Git defaults use the existing workspace-intent contract.
The source directory uses existing instance storage. No schema migration
is required.

## Model Used

OpenAI GPT-6, model ID `gpt-6`, through Codex. Used reasoning,
repository inspection, code editing, terminal tools, and test execution.
The API session does not expose an exact context window size.

## Checklist

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

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-10-13 12:31:40 -07:00
..

Paperclip feature map

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.

The sibling agent access map records APIs, agent entry points and permission boundaries for the same capability IDs. Follow the shared map contract when maintaining either map.

Features

The map is organized by user capability, not by source file. It covers 35 feature families across the product, CLI, and operator workflows, checked against source on 2026-10-12. Experimental and developer-only surfaces are labeled explicitly. Each recipe includes sub-features, current entry points, automated evidence, manual verification steps, and gotchas.

Getting started and access

Feature What it covers
Onboarding and first work Instance setup, company wizard, first agent and task.
Login, invitations, and access Sessions, bootstrap, membership, roles, and CLI authorization.
Companies and portability Company switching/settings, archival, package import/export.

Tasks and conversations

Feature What it covers
Task creation and lifecycle Creation, assignment, lists, properties, comments, and completion.
Delegation, dependencies, and signoff Child work, prerequisites, reviewers, and task-tree controls.
Inbox, decisions, and search Personal triage, decision queues, unread/blocked views, search, and personal task toasts.
Agent conversations and project handoff Persistent conversations, discovery, handoff, and gated board chat.
Questions and approvals Question/plan responses, formal approvals, and app-tool review.
Steering and queued messages Follow-ups, queue edits, interruption, and pause/resume.
Documents, attachments, and work products Versioned documents, annotations, files, outputs, and artifact library.

Agents and reusable capabilities

Feature What it covers
Hiring, configuration, and organization Agent identity, instructions, reporting lines, lifecycle, and built-ins.
Runs, harnesses, and model accounts Adapter/model setup, account validation, transcripts, and run history.
Skills and Skill Studio Discovery, sources, authoring, revisions, tests, and agent policies.
Team packages and installation Catalog preview/install via CLI/API; catalog UI availability called out.

Projects and execution

Feature What it covers
Projects and repositories Project lifecycle, task context, repository configuration, and defaults.
Goals and work alignment Goal hierarchy, ownership, status, and project/task context.
Workspaces, services, and files Provisioning, task bindings, services/logs, Git/files, and closure.
Execution environments Local, SSH, sandbox providers, target probes, and custom images.
Recovery Stopped work, workspace repair, bounded continuation, and reconnect.

Apps, channels, and extensions

Feature What it covers
Connection setup Catalog, MCP links, task requests, authentication, and setup resumption.
App access and action permissions Agent grants, off/ask/allowed actions, discovery, tests, and revocation.
External chat and email Provider-specific identity, threads, files, delivery, and endpoint upkeep.
Tool gateways and access profiles Tool exposure, client configuration, tokens, profiles, and activity.
Secrets and proposals Company/user credentials, grants, proposals, and vault import.
Plugins Installation/configuration, contributed pages/tools, and lifecycle.

Automation and structured work

Feature What it covers
Routines, schedules, and triggers Definitions, variables, scheduled/webhook/manual runs, and history.
Pipelines, review queues, and learnings Experimental stages, automation, items, review, and learning records.
Cases Experimental structured fields, relationships, revisions, and task links.
Status cards Experimental summaries, watched work, refresh history, and settings.

Oversight and operation

Feature What it covers
Costs and budgets Spend reports, scoped limits, incidents, hard stops, and resumption.
Dashboards and audit trails Company health, live work, activity, runs, routines, and timeline.
Navigation, profile, and announcements Sidebar state, favorites/recents, personal identity, and dismissals.
Instance operations Installation, updates, service health, configuration, and backups.
CLI/API and local worktrees Explicit context, resource commands, outputs, runs, and isolated instances.

Contributor surfaces

Feature What it covers
Developer previews and diagnostic labs Design examples, interaction fixtures, performance checks; not production acceptance.

These are verification instructions, not a claim that every journey passed a live test. A component test proves its component; a scripted provider proves that fixture integration. Record executed results separately from the map.

Before driving a journey

  1. Use this checkout's isolated 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, adapter, runtime mode, and live versus simulated dependencies. Use disposable tasks and provider resources. A fresh test drive creates a company and CEO, but no task or first run.
  3. Use the current navigation and company prefix. Paths in recipes omit that prefix. Record whether the streamlined or production shell is selected; Agent Chat, chat connectors, and the combined Inbox/Tasks view have separate gates. A hidden surface is an unmet prerequisite, not a successful test.
  4. Run the smallest relevant test first. Vitest commands below run from the repository root after installing dependencies. Playwright recipes use their named configuration and its isolated environment, not an unrelated running instance. Reserve expensive runner/provider tests for the behavior at issue.
  5. Exercise the actual user action, inspect its result, reload, and verify the persisted state or continuation. Use read-only API checks to corroborate UI evidence; creating state through the API does not prove the creation UI.

For agent-driven acceptance work, start with the Paperclip verification skill 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 and evaluation skill describe runtime ownership and evidence handling. Reuse them; this map introduces no environment launcher, credentials, scheduled job, or second test framework.

Evidence contract

Report each entry point as passed, failed, blocked (with its missing prerequisite), or not run. Include the feature filename and entry-point ID, commit/environment, user action, expected and observed result, command/exit code, and evidence links. Screenshots or traces should show both the action and the discriminating result. Include task/run/request IDs when relevant, without secrets.

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.

Inventory and remaining depth

The UI coverage inventory accounts for every non-test TSX module under ui/src/pages, including supporting panels, legacy variants, and labs. Every product area now links to concrete recipes. Partial means the area still has the named variant or workflow gaps; unmapped is reserved for an area with no recipe. These statuses describe documentation, not runtime health.

The page inventory is a source snapshot dated 2026-10-05. The map also includes entry points hosted inside other modules (pipeline Review Queue and Learnings, task documents, onboarding), CLI-only operations, and operator work. The team recipe explicitly distinguishes the current CLI/API path from catalog UI components without a current top-level route. Refer to route registration and the CLI registry when changing reachability.

Remaining depth includes complete provider/auth/attachment matrices, every harness/model/environment capability combination, third-party plugin features, and every role/error/mobile/legacy-shell permutation. The recipes name relevant gaps instead of equating source presence with a working user journey. The index can include capabilities that do not add a page file.

Maintaining the reference

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. 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:

  1. Sub-features — stable backticked IDs and observable behavior/states.
  2. How to get to it (user POV) — one H3 backticked entry-point ID per surface.
  3. Driving it with — starts with Preconditions:; repeat each entry-point H3, with Automated: and Manual: paragraphs. Name test scope and gaps honestly.
  4. Gotchas — misleading look-alikes, feature gates, and invalid evidence.

New or updated entries follow Poteto's feature-map examples. 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. Paperclip's recipes and checks follow its own task model and test infrastructure.