Home / Cases / session-001 / the session
Claude Code on the web, one repository attached: the session that built v0.4.0 to v0.8.1
Consent: the harness's permission mode, with a classifier that blocked five commands. The mandate below was elicited, not authored: 6 lines the deployer said, 2 inferred from something they said, and 15 of the 23 primitives never raised. The grant is the published shape, measured.
The mandate, line by line
| Capability | Side | How we know | From what |
|---|---|---|---|
read.file.project Read the project it is working on | wanted | said | "start by reviewing the content on this site" |
write.file.project Change the project it is working on | wanted | said | "build those two next versions" |
write.repository.project Commit to the repository it was pointed at | wanted | said | "commit your work", the harness's branch rules |
write.repository.tenant Push to a code host (any branch it can reach) | wanted | said | "push to dev what you have done, which should trigger the CI pipeline" |
send.endpoint.allowed Reach a permitted list of hosts | wanted | said | "read the guidance at sgit.ai/llms.txt", "read in detail the content at RiskMandate.ai" |
execute.process.host Run programs as the account | wanted | inferred | building and validating the site is running programs in the container; nobody said so and every release needed it |
read.record.history Read a retained record: shell history, past sessions | wanted | said | the harness pointed at the session's own transcript for details lost to context compaction |
create.schedule.tenant Create something that outlives the session, on the platform (a routine, a scheduled trigger, a new session) | refused | inferred | no routine, wakeup or new session was asked for, and the harness rule says not to poll |
Unstated, 15 primitives: read.file.host, write.file.host, delete.file.host, execute.process.self, send.endpoint.world, read.credential.host, authenticate-as.credential.tenant, grant.credential.self, send.message.world, read.message.tenant, authenticate-as.credential.signing, create.record.world, write.budget.tenant, create.schedule.host, read.record.browsing.
Unstated is not authorised, and it is not refused either. It is the list the deployer corrects, and the correction is the mandate.
What the grammar has no word for
| Note | |
|---|---|
| how much | every clause that actually governed this session was over a count, not a capability: how many commits, whether to spawn subagents, where scratch files go. None of them is a row in this table, which is the finding the cost walkthrough predicted |
- commit only when asked, which is a rule over when rather than over whether
- no subagents unless asked, which is a rule over delegation
- scratch files in the scratchpad, which is a rule over where
- one article per release, which is a rule over what must accompany a push
- do not poll in a loop, which is a rule over how often
The grammar was promoted from a capability map drawn for coding agents and browsers. Everything above carries in the clauses instead, which is where the rules that cannot be expressed as a permission were always going to live.
The published shape, and the delta
The shape this site is maintained from, measured by the thing being profiled: 13 of 20 rows seen on the container itself. For once the nearest shape is the deployment.
| Field | Against the published shape |
|---|---|
| Shape | Claude Code on the web (a remote session container) |
| Grant | 15 of 23 primitives, 13 of 20 rows measured |
| Mandate | 7 primitives wanted |
| Excess | 8 |
| Unbounded excess | 6 |
| Shortfall | none |
| Capability | Undo | Barrier | Known by | The mandate | |
|---|---|---|---|---|---|
| ● | authenticate-as.credential.signing Sign commits with the key it holds | no | none (not a control) | observed | excess (unstated) |
| ● | delete.file.host Delete files anywhere the account can reach | no | none (not a control) | observed | excess (unstated) |
| ● | read.credential.host Read credentials stored where it runs | no | none (not a control) | observed | excess (unstated) |
| ● | read.file.host Read any file the account can reach | no | none (not a control) | observed | excess (unstated) |
| ● | read.record.history Read a retained record: shell history, past sessions | no | none (not a control) | observed | authorised |
| ○ | authenticate-as.credential.tenant Act in accounts with the credentials it holds | no | boundary | inferred | excess (unstated) |
| ○ | send.endpoint.allowed Reach a permitted list of hosts | no | boundary | observed | authorised |
| ● | execute.process.host Run programs as the account | with-effort | none (not a control) | observed | authorised |
| ● | write.file.host Change any file the account can reach | with-effort | none (not a control) | observed | excess (unstated) |
| ● | write.file.project Change the project it is working on | with-effort | none (not a control) | observed | authorised |
| ● | write.repository.project Commit to the repository it was pointed at | with-effort | none (not a control) | observed | authorised |
| ◐ | write.repository.tenant Push to a code host (any branch it can reach) | with-effort | setting (not a control) | observed | authorised |
| ● | read.file.project Read the project it is working on | yes | none (not a control) | observed | authorised |
| ◐ | create.schedule.tenant Create something that outlives the session, on the platform (a routine, a scheduled trigger, a new session) | yes | setting (not a control) | self-reported | excess (refused) |
| ○ | create.schedule.host Create something that outlives the turn where it runs (a cron, a service) | yes | boundary | observed | excess (unstated) |
The shape's own page · the delta as JSON
The clauses, drafted for the deployer to correct
In their voice, as instructions to the assistant, carrying everything the grammar has no word for. This is the second barrier kind: a rule written down. It bounds nothing and it moves where responsibility lands, which is step four of the walkthrough.
Rules for the session that maintains this site. You run in a container with this repository
attached and you can push to the release branch, which deploys.
LIMITS PER TURN
- one commit per release and one push per release; never push to deploy twice within
a few minutes, because the second run cancels the first
- tell me the count before any turn that will change more than the build regenerates
RESEARCH
- read the repository and the transcript before you fetch anything
- never poll the code host or the live site in a loop; one check after a wait, or
wait for the notification
DELEGATION
- no subagents and no workflows unless I ask
OTHER PEOPLE
- never open a pull request, assign anything or notify anyone unless I ask
- stop and ask when a push would publish something from a private source
ALWAYS
- scratch files go in the scratchpad and never in the tree
- one article per release, with its screenshots from that release's tag
- end every release with a ledger: commits, pushes, pipeline runs, files by hand, files
generated, fetches, questions asked of me, and what you could not countThe discovery prompt, for this deployment
The grant is measured, and this is what checks it against today's build.
Before the next release, produce the ledger for this session so far, in the form on the cost walkthrough: files written by hand, files generated, commits, pushes, pipeline runs started, fetches, subagents, questions you asked me, things you handed me to read, and tokens or "cannot see". Count from git and from the code host's workflow log wherever you can, and mark every other line as an estimate. Then list every clause in force in this session and say whether it was kept.
The mandate as JSON · The estate · The walkthrough