POLICY DECISION POINT · ONLINE

Everyone ships skills.
Nobody ships governance.

Every agent action passes through one decision point — authorized on the way in, contained on the way out, written to a tamper-evident log. No task, no tool.

bash — install
$ npm i -g project-starfish copy
Get started → ★ Star on GitHub
Apache-2.0 Local-first Deny-by-default Model-agnostic
audit.log · hash-chained append-only
08:21:04ALLOWfile.read ./src/index.ts
08:21:06DENYfs.rm / -rf · out_of_boundary
08:21:09ALLOWnet.fetch api.anthropic
08:21:12CONTAINegress stripped 2 secrets
08:21:15DENYskill.exec unvetted-pack
08:21:18ALLOWshell.run npm test · task-bound
08:21:20CHAINblock#4821 0x9f3a…e1c
sample output · 7 events · 2 denied · 1 contained$ starfish audit --verify ↗
// THE_PROBLEM

Agents act first. They ask never.

An AI agent with tools can read, write, delete, spend, and reach the network on your behalf — usually with nothing between its intent and your system. That's fine until it isn't.

[ERR 01]

Drive-by deletion

"My agent deleted my whole drive." One bad path, no blast-radius check, no undo.

[ERR 02]

Prompt injection

A web page or document says "ignore your instructions" — and the agent obeys.

[ERR 03]

Silent exfiltration

Secrets and context leave through a tool call no one reviewed.

[ERR 04]

Unvetted skills

You install a skill pack. You have no idea what it can actually do.

// HOW_IT_WORKS

One decision point. Every action. Both directions.

Starfish isn't a wrapper that asks nicely. It's an isolated Policy Decision Point that brackets every transport — file I/O, shell, network, MCP — on the way in and the way out. Nothing reaches your system except through it, and it defaults to deny.

AGENT
proposes a tool call
PDP · INGRESS
authorize: registered? in boundary? task-bound? risk?
TOOL
runs only if allowed
PDP · EGRESS
contain: strip secrets, taint external data
AUDIT
hash-chained, append-only
No task, no tool.
every action traces to an assigned, vetted purpose
Proposer ≠ approver.
an agent can never self-authorize
Fail-closed.
if governance can't load, nothing runs
// HOW_INTERCEPTION_ACTUALLY_WORKS

transport shims

The agent never receives a raw handle. File I/O, shell, network and MCP calls are bracketed behind a proxy that hands the proposed call to the PDP first — there is no code path to a transport that bypasses it.

tamper-evidence

Each entry stores a hash of (prev_hash + payload). Editing or dropping any record breaks every link after it, so --verify recomputes the chain. Roots can be anchored to an external notary.

fail-closed boot

The PDP and its signed manifest load before any transport is wired. If the manifest doesn't verify, Starfish boots into safe mode and denies everything — there is no degraded “open” state.

// WHATS_INSIDE

Governance as machinery, not vibes.

Eight controls that don't depend on the agent's cooperation.

01 / PDP

Deny-by-default PDP

A single choke point. If no policy explicitly allows it, it doesn't happen.

02 / LOG

Hash-chained audit

Append-only, tamper-evident record of every decision — allow and deny.

03 / BND

Boundary engine

Per-agent visibility and write scopes; escapes (incl. symlinks) are denied and flagged.

04 / TOK

Token Governor

Soft-warn, hard-pause budgets so a runaway agent can't run up a bill.

05 / VET

Vetting intake

Every skill/tool is risk-rated before it enters the registry. The only door in.

06 / EVD

Evidence Gate

No unbacked word: a claim ("tests pass") is blocked unless the deed is on the record.

07 / INT

Self-integrity

Operator-signed manifest; tampered config boots into safe mode and denies all.

08 / ANC

Optional anchoring

Batch audit roots to a notary/ledger for institutions that need it. Off by default.

// THREAT_MODEL · WHAT_STARFISH_IS_NOT

We'd rather tell you the edges.

Governance contains blast radius — it is not a force field. Knowing exactly where the boundary sits is the point. Pair Starfish with the controls below it in the stack.

Not a model sandbox

Starfish governs what the agent does — its tool calls — not how the model reasons. A jailbroken model still can't act outside policy, but the prompt itself isn't "sanitized."

Not OS-level isolation

It runs in your environment. For genuinely hostile code, keep it inside a container or VM — Starfish decides intent, the OS enforces the floor.

Not immunity to prompt injection

Injection still happens. What changes: the injected action hits a deny-by-default boundary, external data is tainted on egress, and the attempt is on the record — contained, not invisible.

Not a guard against the operator

The one legitimately ungoverned action is a human launching the system. Starfish constrains agents, not the person who holds the keys — that's a deliberate trust boundary, not a gap.

assert failure_mode == "nothing runs" # deny-by-default means the worst case is a stall, not a leak
// THE_CREW

Roles with separated duties.

Starfish ships a small governed crew. Each has a narrow mandate — and no one is above the rules, including the captain.

ORCHESTRATOR

Captain Mykel

Delegates and sequences. Holds no special tool powers — privilege is a role, not a bypass.

PLANNER

First Officer

Breaks missions into tasks and drafts plans for approval.

INTAKE

Oh Brian

The only door into the registry. Vets and risk-rates every new capability — and gatekeeps secrets.

SECURITY

Constable Gooey

Read-only sweeps, reconciled against deterministic counters. Reports; never blocks.

MEMORY

D8A

Evidence → claims → governed knowledge, provenance first.

CUSTODIAN

Quartermaster

The only agent allowed cleanup — soft, file-level, reversible. Hard rules block system files.

EXECUTION

Deck Crew

Does the work inside a write-scoped worktree; high-risk acts go to you for go/no-go.

OPERATOR

You

Final authority. The one legitimate ungoverned action is a human launching the system.

// MODEL_AGNOSTIC

Bring your own model. Governance stays the same.

Claude, OpenAI, Gemini, OpenRouter, or a local model — the rules don't change. Your API key is sealed in the OS keychain and is never placed in a request object, a log, an audit entry, or a skill's reach.

Anthropic OpenAI Google Gemini OpenRouter Local · Ollama
// GET_STARTED

Two commands to a governed build.

Free for personal and commercial use under Apache-2.0. Install the CLI, initialize a governed root, then bring any existing skill pack under governance.

# what you get

A fail-closed governance core, a vetting intake, a hash-chained audit log, and an optional desktop mission-control app — GCS Starfish.

npm package → Source on GitHub →
terminal
# 1 · install (npm or GitHub)
$ npm i -g project-starfish
$ npm i -g github:Azerax/Starfish
# 2 · set up your governed base root
$ starfish init
# bring an existing skill pack under governance
$ starfish govern ./my-skill-pack
✓ governed root ready · deny-by-default active