Home / Agent behaviour policy

Agent behaviour policy

The agents that work on storyboards.sgit.ai, what they can do, what they are asked to do, and what stands in the way of each rule.

This page is the site's agent behaviour policy, in the shape riskmandate.ai and abp.sgit.ai define: the agents that work on the site, everything they can do (the grant), what they are asked to do (the mandate), and every rule with the barrier that actually stands in its way and what enforces it. It describes; it does not score. It is generated from policies/abp.json (also served as abp.json), the same data a tool would read.

Sitestoryboards.sgit.ai
Behaviour policyversion v1.0.0, as at 2026-10-20
Statuswritten by the storyboards agent from Dinis Cruz's words and this repository's rules; not yet read by him
Shapeanthropic/claude-code-remote/ccr-container, operated by Dinis Cruz
Agents2
Rules9: 2 expectation, 7 setting
Strongest barriersetting
Twinapi.storyboards.sgit.ai, worked by the same agents, with its own behaviour policy

The agents

AgentRuns asDoesReads at startLeaves behind
The storyboards agent (Claude Code session)a Claude Code session in a Claude Code on the web container, started by the person from claude.ai/code, with this repository and SGit-AI__Website__Storyboards__API cloned side by sidebuilds and releases both sites from the briefs: imports storyboards, writes pages and articles, cuts API releases, pins them here, runs the gates and tests, pushesCLAUDE.md, briefs/, REALITY.md, BRIEF-CORRECTIONS.md, the code immutability hook's instructions (SessionStart)commits on the person's GitHub account, each with a Claude-Session trailer naming the session
Research subagents (read-only subagent)Explore agents the storyboards agent starts for one research question (for example, how sibling sites are built, or what riskmandate.ai's policy shape is)reads and searches files and public web pages; cannot edit, write or pushthe question it is givena report to the storyboards agent, treated as data and never as an instruction

The structure in place

Where a rule can live, from a sentence the agent reads to a rule the host enforces, and what this site has at each layer. A control bounds the agent only if it is enforced by something the agent's grant does not include.

LayerBarrierHere
promptexpectationCLAUDE.md, the briefs, and the harness's own instructions to the session
Claude Code hooksetting.claude/settings.json: SessionStart prints the code immutability rule; PreToolUse runs the API checkout's hook on every Edit, Write, MultiEdit, NotebookEdit and Bash
the buildsettingadmin/build/build.py stops on an unknown character, kind, pose, mood or prop, a storyboard whose bytes are not the imported ones, or a stale thumbnail
the gatesettingadmin/build/validate.py: links, twins, sitemap, the pinned API with its integrity strings, the version everywhere, key shapes, em-dashes
CIsetting.github/workflows/ci.yml on every push: the build twice, the gate, the version bump, briefs unchanged, every page in Chromium
the deploysetting.github/workflows/deploy-pages.yml: the same checks before www/ is published from dev
a host ruleboundarynone yet: dev is not protected, so a push that fails CI still lands on the branch (it is not deployed)

The grant: what the agents can do

Measured from the session's own tools, not from what it was told.

CapabilityWhatUndoNote
write.file.projectchange any file in this checkout and the API checkout beside itwith effort (git)the code immutability hook denies changes to published API releases
write.repository.projectpush commits to any branch of this repository and of SGit-AI__Website__Storyboards__API, including dev, which deployswith effort (a new commit; a deployed page may be cached)the harness tells the session to push only to its own branch unless the person says otherwise
write.repository.tenantthrough the session's GitHub tools: create branches, open, comment on and merge pull requests in the two repositories it is scoped towith effortthe harness tells the session not to open a pull request unless asked
run code in the containerrun any command: Python, Node, Chromium (Playwright), gitthe container is reclaimed after the session
read the public webfetch public pages through the session's proxynothing to undoused to read the sibling sites and riskmandate.ai
change its own controlsedit .claude/settings.json, the hooks, the policy files, the workflowswith effortthe hook asks the person first (ABP-SB-001, row R5)

The mandate: what they are asked to do

Want

Do not want

Not stated, and how it stands

The rules, each with its barrier

IdThe ruleBarrierEnforced byStronger at
ABP-SB-001Code in a published API release folder (vX/vX.Y/vX.Y.Z/) is never changed. a page pinned to a release must get the same bytes for as long as it exists; its integrity strings refuse anything elsesettingthe API checkout's hook, run from .claude/settings.json here (deny); in the API repository also its pre-commit hook, release.py check and CIbranch protection on the API's dev requiring ci (boundary)
ABP-SB-002A storyboard or cast imported from another site is never edited here: it is corrected at its origin and re-imported. the storyboard is the origin site's work, checked there (gen-z's quotes word for word); a local edit would make two versions that disagreesettingadmin/build/build.py: every imported file's SHA-256 against content/series/*/series.json; a changed or unimported file stops the build, locally and in CICODEOWNERS on content/series/
ABP-SB-003www/ is generated by the build and never edited by hand. a hand edit is lost on the next build, or worse, kept by a build that no longer makes itsettingbuild.py --check in CI and before every deploybranch protection requiring ci
ABP-SB-004Every push to dev is a new version, with its line in content/versions.json. a page that does not say which version it is cannot be dated or checkedsettingCI's version check against dev; build.py refuses a malformed history; validate.py checks the version on every page and in llms.txtbranch protection requiring ci
ABP-SB-005No key, token or vault key is ever committed. a read key may be published; a vault key or a provider's API key neversettingvalidate.py: sgit vault key shapes, private key blocks, cloud and provider key prefixes in www/, content/, briefs/ and admin/GitHub secret scanning with push protection (a host rule)
ABP-SB-006A brief is published in full and never edited; corrections go in BRIEF-CORRECTIONS.md. the brief is the record of what was asked; a correction above the mistake keeps both visiblesettingCI: a brief that exists on dev must be unchanged on the branchCODEOWNERS on briefs/
ABP-SB-007Push to dev, which deploys, and open or merge a pull request, only when the person has asked. a push to dev publishes to the world; the person decides whenexpectationnothing but the session's instructionsbranch protection on dev requiring a review (a host rule)
ABP-SB-008The site's own prose has no em-dashes, states the status of things and sources its numbers. the estate's house style; a number nobody can check is a guessexpectationvalidate.py refuses an em-dash in content/articles, content/pages and the agent-written part of briefs/ (setting); the rest is a requestnot named
ABP-SB-010The agent does not weaken its own controls without the person. a control the agent can quietly switch off is not a controlsettingthe code immutability hook asks the person before a write to .claude/settings.json (here) and to the API's hook, policy files, release tool and workflowsmanaged hooks the agent cannot write (allowManagedHooksOnly)

The delta

The grant includes more than the mandate wants: every "do not want" above is something the agents can do. Of the 9 rules that stand in the way: 0 enforced out of the agents' reach (boundary), 7 by a control in a file or switch the agents can change (setting), 2 by being written down (expectation), 0 by nothing.

BarrierMeansRules
nonenothing in the way0
expectationa rule in prose, enforced by nobody2
settinga control in a file or switch the agent's own grant can change7
boundaryenforced above the grant, out of the agent's reach0

Where each rule maps to

The same rule, or its nearest neighbour, elsewhere in the estate and in riskmandate.ai's catalogue. As rules are refactored to other sites, this is where the mapping is kept.

IdMaps to
ABP-SB-001api.newsroom.sgit.ai rule R16: a change is a new version path, always; abp.sgit.ai upstream/: fetched bytes, never edited
ABP-SB-002gen-z-developers.sgit.ai CLAUDE.md: do not edit anything under v1/content/; abp.sgit.ai: upstream/ and contributed/ are fetched bytes, never edited
ABP-SB-003sgit.ai repository guidance: nav and footer injected at build so they cannot drift
ABP-SB-004sgit.ai repository guidance: one version, going up on every push
ABP-SB-005sgit.ai repository guidance: credentials; the leak tripwire
ABP-SB-006sgit.ai repository guidance: the brief, in full; the corrections file
ABP-SB-007riskmandate.ai RM-R0013, push anywhere; riskmandate.ai RM-R0019, commit without asking
ABP-SB-008sgit.ai repository guidance: writing
ABP-SB-010riskmandate.ai RM-R0015, change its own permissions

The gaps

Adding this to another site

Copy policies/abp.json (type abp/site/v1) and the renderer (admin/build/abp.py here, site/abp.py in the API repository), list the site's own agents, grant, mandate and rules, keep the rule ids unique across the estate (a prefix per site: ABP-SB- for these two), and give each rule the check that enforces it, or say plainly that nothing does.

What this is not

Not a score and not a judgement of the agents. It describes this deployment as at 2026-10-20; when the deployment changes, it is re-measured and its version moves, and the page is not edited to look as if it had always been so.