Skip to content

Projects: a canvas per agent, inherited features, a setup banner, and multi-agent scans - #112

Merged
architsharm merged 8 commits into
mainfrom
claude/laughing-cray-82for5
Oct 16, 2026
Merged

architsharm merged 8 commits into
mainfrom
claude/laughing-cray-82for5

Conversation

@architsharm

Copy link
Copy Markdown
Owner

What this changes

The dashboard is now organised around projects, one per AI agent. Each one opens on a canvas of its guardrails and tools. Without this, a team could not tell which agent was governed by which settings, had no guided next step after connecting one, and a multi-agent repo was proposed as one agent with every tool pooled together.

  • Projects and canvas. /app/agents becomes /app/projects, and old links redirect. A scope switcher moves between the whole workspace and one project. The map is calmer: tools collapse into a single node until expanded.
  • Features, inherited. The workspace Features page sets protections and checks for every project. Each project's Features view shows each row as "Inherited from the workspace" or "Changed here", with Reset to go back to the workspace setting.
    • A project can always be stricter than the workspace.
    • A project can lower a protection only where the workspace ticks "Projects may lower". A few core rules can never be lowered per project.
    • Checks can be switched either way per project, and the gateway applies the project's choice on every request.
  • Setup banner. Every page shows only the next missing step.
    • In a project: add it if proposed, send its first request (with a ready test request, and the banner clears by itself when the request arrives), allow its tools, then turn blocking on after seeing what last week's traffic would have stopped.
    • With all projects in view: the workspace's own next setup step.
  • Multi-agent scans. The scanner statically reads agents and their hand-offs for the OpenAI Agents SDK (handoffs, as_tool), LangGraph, CrewAI, AutoGen and Google ADK.
    • Several agents in a repo become one proposed project each, with its own tools. They are grouped on the Proposed tab with Add all (POST /api/agents/{id}/approve-system).
    • The hand-offs are stored as declared lineage edges, using a new lineage_edges.kind column added by a migration. Each canvas draws its sub-agents, and its parents, before any traffic.
    • A repo with a single agent is proposed as before.

Checks

  • ruff check and ruff format --check pass.
  • pytest -q: the affected areas pass (apps, platform, capabilities/discovery, frameworks, repo, core). Four tests fail in this dev container on main as well (tests/capabilities/detection, tests/frameworks/autoguard). They are environment failures, not from this change; CI will confirm.
  • scripts/gen/api_routes.py --check passes (Appendix C regenerated).
  • scripts/gen/docs_reference.py --check passes.
  • scripts/check/claims.py --check passes.
  • scripts/check/plugins.py passes.
  • Vendored wheels in api/vendor/ and demo/redteam-live-lang/vendor/ rebuilt.
  • Tests added: multi-agent scan (21), multi-agent proposals, project features and the gateway applying them, setup banner. Dashboard: 120 vitest tests and tsc pass.

Anything a reviewer should know

  • Tool names and privacy. agentfox scan --submit to a server still never sends tool names; the docstring contract on to_submission_payload is unchanged. Projects created that way show tools once they are called or granted. A local agentfox up passes tool_names=True, because the data stays on the machine, and a connected repo is read server-side. Both record each agent's tools.
  • Migrations. Two migrations land together: agent_detector_settings, then lineage_edges.kind chained after it.
  • Lowering is opt-in. Lowering a protection per project is off until the workspace allows it for that protection.
  • Local dev quirk. The Add and Add all redirects go to localhost rather than the browsing host. The existing Add button behaves the same way, so this is not introduced here.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc


Generated by Claude Code

Agents are projects now. The sidebar opens with a project switcher (like
Figma's file switcher): in a project it shows only that project's pages
(Canvas, Activity, Access, Issues, Approvals, Settings); All projects keeps
the workspace pages (Home, Projects, Observe, Issues, Policies, Approvals,
Test, Reports).

The project page is four views instead of seven tabs. The canvas is the
guardrail map with an inspector beside it: what is selected, or the project
at a glance when nothing is (traffic, open issues, guardrails that fired
most, owner, tools, rules at every step). Overview, Map and Rules fold into
it and into Activity.

The map shows shape before detail: more than six tools are one Tools node
until expanded, then at most six groups and six tools of an open group,
each with a +N more node that opens the full list in the inspector. Step
and tool nodes carry one line each.

/app/agents/* and /docs/app/agents/* redirect to projects, /app/map to the
project's canvas, and old ?tab= links open the matching view. Approvals can
be filtered to one project.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
Features: one place for the switches a developer reaches for, at the
workspace and per project. Protections (prompt attacks, personal data,
secrets, harmful content, off-task actions, unsupported answers, insecure
code) and checks (detectors) are set for every project on /app/features.
Each project's Features view shows what it inherits and what it changed,
with Reset to go back. A project can always be stricter; it can be lower
only where the workspace lets projects lower that protection, and never
for a protected rule, the hierarchy's existing rule. Setting a project to
the workspace's value removes its copy, so later workspace changes reach it.

Checks can now be switched per project in either direction: a new
agent_detector_settings table, read by the enforcer per call, so the
override is enforced, not only shown. The canvas shows the project's own
checks.

Setup banner: one line at the top of every page, sized to the next missing
step. In a project: proposed by a scan (add it), no traffic yet (a test
request with its slug, and it clears itself when the first request
arrives), no tool permissions, or only watching (what blocking would have
stopped last week, then turn blocking on). Otherwise the workspace's: no
agents, nothing received, or the next setup step. A new
GET /api/agents/{slug}/setup computes the project's steps live.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
…the setup banner

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
The scanner reads agents and how they hand work to each other, statically,
for the OpenAI Agents SDK (handoffs, as_tool), LangGraph (react agents,
graph nodes, supervisors), CrewAI (crews and members), AutoGen (group
chats) and Google ADK (sub_agents). A scan that finds several proposes one
project per agent, with its own tools, and records the hand-offs between
them as declared lineage edges, so the canvas draws the system (sub-agents
and the parent that calls a project) before any traffic. A repo with one
agent is proposed as before.

The Proposed list groups a system under its orchestrator with Add all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
Brings in one proposed project per agent for multi-agent systems, with the
hand-offs between them drawn on each canvas before any traffic, and Add all
on the Proposed list. Resolved against the projects rename (links, labels,
docs), drew sub-agents and parents alongside the collapsed Tools node, and
chained the lineage_edges.kind migration after agent_detector_settings.

On top of the merge:
- agentfox up recording into a local database now gives each agent its own
  tool names, so its project shows its tools before traffic. A scan
  submitted to a server still never names tools.
- The scan summary reads "triage uses knowledge as a tool".
- A proposed project's header says Proposed, not Active and Unregistered.
- Rebuilt the vendored wheels for the src changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
A draft project's header said Active and Unregistered; it now says Proposed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc
@vercel

vercel Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
guardrails-api Ready Ready Preview Oct 16, 2026 3:00pm UTC
guardrails-dashboard Ready Ready Preview Oct 16, 2026 3:00pm UTC
guardrails-redteam-lang Ready Ready Preview Oct 16, 2026 3:00pm UTC

The old Overview tab's pieces that the canvas left out:
- Activity opens with the requests chart over the chosen range (a window opens
  its runs) and the four counts against the range before, with sparklines.
- The canvas inspector has a Lineage section: the blast radius, and Open
  lineage map for everything within two hops.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VBAhZj4HHoV9Kt3Dw3Fccc

This branch was successfully deployed

3 active deployments
Preview – guardrails-redteam-lang — e4bf126d Deployed Oct 16, 2026 by vercel[bot]
Preview – guardrails-api — e4bf126d Deployed Oct 16, 2026 by vercel[bot]
Preview – guardrails-dashboard — e4bf126d Deployed Oct 16, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants