Repository navigation
v6.2.0
Your turn. 6.2 gives every act only a person can do one page, one shape and one road back to the
work that waits on it. A sign-in, a code, a secret, a payment, a permission the AI lacks, a decision,
an errand at the machine: each is an item on Your turn (#/turn) that says why only a person fits it,
carries a guide to follow and a proof the console checks, so I've done this — check comes back
passed, or sent back with exactly what to redo, and no session can pass its own. A permission ask is
answered by a grant with a scope and an end — this call, this phase, this plan, this repository or
always — that the server applies, audits and can revoke, beside a never list no door lowers. An owner
key, a passkey, lets a console tell its owner's press from any other door's. The console keeps the
page current by itself, and the approval, gate, question and errand cards elsewhere draw the item and
link to it. The free tree stays MIT. Nothing a 6.1 plan says stops working — what moved under people's
feet is below.
Migration
- Update the console's scripts and the plugin together.
PE_APIis 2, and a run refuses to start
when the console's and the skill's stamps do not meet, naming the half to update. A 6.1
phase-outcome.shtakes none of a person's turn's new flags and never exits 4. - A person's turn carries a reason. A
needs-human --stepdeclaration says why only a person fits
it —--why, one of ten reasons, held to what its kind allows — and one that names none is given its
kind's default, marked inferred, so an older skill copy and--actkeep working. A plan's
- **Human step:**bullet gainswhy:,effort:,unblocks:andguide:; a bullet with nowhy:
draws the advisory F40, never a gate. - A step needs a proof. A step with no
--proof, no--proof-wordsand no answer for a result is
refused (exit 2); name--proof-type attestto take the person's word. - Exit 4 is the guard's.
phase-outcome.shexits 4 when a declaration asks a person for what the
AI could do itself — apermissionorreservedreason whose every guide command the run's own
policy allows, areachwith no--tried— or a permission block cites no wall the console
recorded (G5). Read 4 as "run it yourself", never as a malformed call;--triedis the answer when
running it failed. - "Done — continue" is I've done this — check. A person errand is an
operator-actitem, and its
row's action, like every check button, reads I've done this — check. A check now comes back with a
verdict — passed, rejected with exactly what to redo, or needs-info — rather than "landed or not",
and a probe that misses leaves the itemreturned, where it used to readnotified. - The
secret-entryfield is gone. The console never takes a secret:checkrefuses a body that
carries one, and the item names where the value goes instead — the keychain itemphase-console-<id>
on macOS, a 0600 file elsewhere, or the item's owncredential:place. #/approveredirects.#/approveand#/approve?step=<id>land on Your turn (#/turn,
#/turn/<id>) in one hop, so a bookmark keeps working; a push opens#/turn/<id>.- A grant has a scope and an end. The approval card's Allow with remember, the widen card's Allow
and a standing card's one-time allow are grants now —call(spent on use),phase(until it
settles, 24 hours at most),plan,repository(a new policy layer between the plan's file and the
machine's) oralways— each a row ingrants.ndjsonsaying exactly what it changed, and a revoke
undoes exactly that. The widen card no longer strikes a rule from the plan for good. A grant below
plan scope lowers the rule in that run's settings until it ends, and for that long the CLI's own list
does not hold the rule with the console dead. - What an owner key changes for a script that presses the console. Nothing until a key is enrolled:
a console with none behaves as before, and/api/state.ownerDoorreadsunenrolled. Once one is,
an authority press from a script, the CLI, a browser with no key, a phone beyond its low and medium
answers or a session's token is answered 202{requested: true}— recorded on its item as "asked by
— confirm?" and pressed only when the owner confirms — so a script reads 202 as waiting for
the owner, never as done. What the plan's manifest already allows still executes through any door.
byin a body is only a label: the door a request proves is recorded aspressDoor, and a request
carrying a session's token presses no authority route its plan'spermission.destructiverow does
not name (403,owner.door-refused). - A turn's push names its buttons by kind: Open and I did it for an act, Allow and Deny for
a low or medium permission at its narrowest scope, Open and Deny for a high or never one, Open
for a decision. Quiet hours are one setting, the device's: at the first boot a console-wide
reminderQuietwindow moves onto every subscribed device that has none of its own, and is dropped. - For readers of the vocabularies: a person's turn has an eighteenth kind,
permission, and eleven
states withreturnedanddeclined;viewer/shared/turn-model.js(twinscripts/turn.env),
viewer/shared/guide-grammar.jsandviewer/shared/door-model.jsare new owners; the push catalogue
has a twentieth category,granted. git send-packandgit http-pushare walled likegit push(control-tower phase 141): two
default deny rules, the same on every profile. A plan that publishes through either names the rule in
itspermission.destructiverow, as it namesgit push.- A guide line may not hold an invisible or direction-changing character (control-tower phase 141):
a control character, a zero-width space, a bidi embedding, override or isolate, a word joiner or a
byte-order mark refuses the guide at that line, and a link holding one is not openable. The joiners
and the direction marks (U+200C–U+200F) stay, so a Persian guide reads as before.
Added
- The docs say what 6.2 adds, in English and Persian (control-tower phase 140). The help sheet's
Your turn guide is rewritten around the page — its six sections, why only you, the guide, the check
and its verdicts, your other moves, the phone — and Permissions says what a grant is (its five
scopes, its risk tiers, its end, the ledger and the revoke), names the never list and the three
publishing asks auto-grant never answers (git push,gh pr create,gh pr merge; it said two),
and gives the owner key a section that ends with what the key is not: a process running as you that
deliberately rewrites the console's own files can forge anything below the owner key, and can replace
the key registry itself; the console walls the paths a session takes and makes every grant visible,
and it is not a boundary against your own account. The tower, mobile, notifications and reference
guides, README, USAGE and the console's README follow, each with its Persian twin, section for
section. For sessions,references/turn.mdis new — the reasons with an example each, the guide's
grammar and the plan's**Guide language:**line, a template per kind, the proof types, the guard's
seven rules and how to answer each, a permission block, the answer's road back,handledand the
doors — and SKILL.md's rule names the five things a session does: give the reason, write the guide
in the plan's language, state the proof in words, never ask for what it can do itself, and record
what it handled; a denied tool is declared, never routed around, and the console is never pressed.
skill-sync.test.tsandguide-coverage.test.tshold each against the code it describes. - A decision names its
## Decisionsrow (control-tower phase 140, the deferral phase 133 left).
phase-outcome.sh … needs-human --step decisiontakes--decision-key KEY: the person's answer is
written to the plan's decisions table throughdecisions.shbefore the session is resumed with it.
Any other kind, or a key outside the manifest, is refused (exit 2). - The old cards move in (control-tower phase 139, closes #216). Nothing draws a person's ask in a
shape of its own any more: the approval queue, its question card, the gate card and the errand card
each draw the ITEM — one row, the kind's mark, the title, ONE primary pressed exactly as the server
spelled it, and Open on Your turn (#/turn/<id>), where everything else is one press away. A
low or medium permission's row grants in one press; a high or never one, or a choice of options,
opens the page. A gate no run is asked about keeps the plan's own Approve (gate-status.md). The
Needs-you bay keeps runs: each strip's one action is its oldest item's primary, the loose rows and
Coming up moved to the page, and one line links there with its counts; Your turn (n) in the
situation line counts items (an errand and its step are one) and opens the page. The launch door lists the run's items — the
pre-cleared shown done, Do it now opening an item a launch before this one raised — and a plan
step markedauto-open: hostnow OPENS at launch, on the machine, behind--allow-terminalor
--allow-agent, anhttp/httpslink only, once the door has shown it whole (the launch sends
back exactly the links it showed); a session's step never does. Aphysicalitem with a link
shows it for the phone. Not doing this is a person's no; the dead Dismiss fetcher
is gone. A broker card's
Allow that a keyed console turns into an owner request is toasted "asked of the owner", never "done". - Grants and owner keys on the screen (control-tower phase 138, closes #215). A permission item on
Your turn is answered in one press on its own card: "Raised because the AI lacks permission to …",
the command, why the phase needs it, the wall and its rule, then the scopes the item's wall allows as
ONE control — This call, This phase, This plan, This repository, Always — each saying what
it covers and when it ends, with the chosen scope's risk beside Grant, I'll do it myself and
Deny. A low or medium grant is one press. A high one shows what it reaches, asks for the rule typed
back, and on a console with an owner key waits for a touch of the key inside the last five minutes;
with no key the card says so and the typed rule alone grants it. A never item offers no Grant: why,
and the manual path as a guide. The server's answer wins — a 400{rule, blast}replaces the card's
preview with its own blast radius, and a 202{requested}is said to wait for the owner, never as
done. A request another door made on an item reads "asked by … — confirm?", with Confirm and
Refuse for the owner. Grant every low-risk ask grants every open low-risk ask, each for this call
or this phase, in one press. Settings ▸ Permissions gains Grants — every grant with what it
allowed, how far, who gave it through which door, when, until when, the item that asked and exactly
what it changed, with Revoke and Revoke all — and Owner keys: the first key enrolled through
the linkphase-console owner enrollprints (it now opens#/settings/permissions?enrol=<token>),
later ones in this browser or through a link for another device, each listed with where and when it
was made and last used and removed once asked; sign in, touch again and lock; which presses need the
key, read from the door table; and on an IP address, the same page atlocalhost. - Your turn — the page, the card and the guide (control-tower phase 137, closes #214).
#/turn,
titled Your turn and lighting Runs, is where every act only a person can do is listed: the round
that read it and its one-sentence headline, then six sections in a fixed order — Do now, Needs
one detail from you, Coming up, Being checked, Done (the day's settled items, the ledger's
older ones beneath) and Handled by the AI — each item one card that explains the task exactly: why
only you can do it, the plan, phase and run it belongs to, what it unblocks with a countdown, the
effort, then its guide as stations on a line (each step's tick kept in your browser), every command
copyable two ways — as it is, and behind!for your own Claude Code session — and never run by the
page, a link's whole address shown before it opens, If it goes wrong, how it will be checked, and
ONE primary action chosen by its kind and state (the kind's own opener, I've done this — check,
Send my answer, or a permission item's Grant), then Not doing this, I can't, Snooze, Ask
and Attach. A check that sends it back says Back to you, the attempt and exactly what to redo;
after the third miss the item asks how it ends — rewrite the guide, hand it back, or accept it on
your word. A decision is answered on its card: its options as cards, the recommended one marked,
each consequence, and a note. Every datum is within two presses, the raw record included. Filters
(plan, run, kind, reason, risk) and the search live in the address; Export downloads the open
items as one Markdown document and Print prints the same. A guide carries its language — a
Persian one is drawn right to left, its commands, refs and numbers left to right — and the Markdown
component's code blocks now carry a copy button anddir="ltr"everywhere, the help sheet included.
#/approveand#/approve?step=<id>land on it in one hop; a push opens#/turn/<id>; the palette
opens it. The check button reads I've done this — check everywhere. The
page is a lazy chunk (check-distfinds it bydata-turn-page); first paint is 189.5 KB of 190. - Rounds, and what the AI handled (control-tower phase 136, closes #213). Your turn is kept up to
date by the console itself: a ROUND — one pass of the human-step clock (a minute) and of every run's
journal line, debounced two seconds — ends the grants that ran out, sends the reminders that are
due, withdraws an item nobody needs, expires a window that closed, withdraws an item a live grant now
covers and resumes its waiters, escalates an item returnedturnEscalateAftertimes that never
escalated, brings an upcoming act due with its ONE push, and reads the open proofs the console owns
(a console's raise —credential:<id>included — on its back-off) and proves one that landed. A
round that changed the turn raisesGET /api/turn'sround.nand sends ONE server-sent event,
turn; a quiet round changes nothing. The headline is composed by RULES — how many need you now,
the oldest, how long it has waited and what it holds; how many are being checked; how many are
coming up; how many were handled since you last looked (GET /api/turn?seen=<ISO>) — never by a
model. Handled by the AI is a new ledger,handled.ndjson(a retention sink): what the guard
refused to ask (G4, G5), what the rule table allowed (ONE row per rule per phase, with a count —
452 auto-grants are one row), relay answers by rule, the ladder's recoveries, each linked to the
journal line that says it, and a session's ownphase-outcome.sh <slug> <N> handled --what … [--note …] [--link …]— never an outcome, its links held to a commit, a pull request, an issue or a
journal line, the secret screen on every field. A session writes a file of its own beside the
ledger,handled-sessions.ndjson, and every line of it reads as the session's whatever it claims:
a session can never speak as the guard or the rule table. The round's proof pass never runs a
cmd:orunit:proof, and what the round resumes goes through the console's own door, never a
person's, and only where--allow-runallows it.
GET /api/turn/:idexplains one item.
phase_console_turn_rounds_totalandphase_console_turn_handled_totalcount them. - The scoped grant: applied by the server, audited, revocable — and a never list (control-tower
phase 149, closes #212). A permission item is answered with ONE press — a grant for this call, this
phase, this plan, this repository or always — that the console applies itself (server/permissions/ grants.ts).callis one use, kept in the ledger and spent on use;phaselives until its phase
settles, 24 hours at most;planis the plan's policy file;repositoryis a new policy layer between
the plan's file and the machine's, for every plan of this console;alwaysis the machine's file.
Below plan scope the console's hook enforces the grant for exactly that lane, rule and (forcall)
call — never a sibling lane, never after the phase settled, never a neighbouring rule — and the run's
settings carry the rule lowered for that run only, raised again once it ends. Risk comes from
GRANT_RISK: low and medium are one press; high needs the rule typed back, shows its blast radius
and, with an owner key, the owner door touched within five minutes; the never list offers no grant
through any door; a capability is granted at the machine only, never from another device. The waiting session resumes by itself — "The operator granted
<rule>for until — run it again" — a held hook call is answered at no cost, and an
open item a later grant covers withdraws itself. Every grant is a row ingrants.ndjson(a retention
sink): who, which door, the item, the wall, the rule, the scope, the end and exactly what it changed,
journalled (policy.grant-applied,policy.grant-ended) and announced in a twentieth push category,
granted.GET /api/permissions/grantslists them; a revoke undoes exactly what the row says
(POST /api/permissions/grants/:id/revoke,…/revoke-all,phase-console grants list|revoke|revoke-all).
The approval card's Allow with remember, the widen card's Allow and a standing card's one-time
allow are grants now — nothing else writes a rule on a person's behalf. The engine fails closed: it
reads the owner key itself, and a high grant whose press did not prove a fresh owner touch is refused
— a card's Allow included, whichever door answered it, and a confirmed request, which is pressed again
with the confirmer's own touch and priced by the item it reaches. Acallgrant covers no other item,
and under a lifted push wall a push passes only by an allow-list: an abbreviated flag (--force-w),
configuration before the verb (-c), a forcing refspec, an option that runs a program
(--receive-pack), arguments fed byxargs, or a command, verb or option the shell has yet to
expand is a forced push. Git is found in any case (GIT,git PUSH) and as a verb's own program
(git-push); a here-string a shell runs is read like its-c; a line that defines an alias and
names a push is refused — and a commit message's here-doc stays data. An escape a program decodes
(\x2d), a value the line assigns and then runs, and a push glued to an expansion ("$G"push)
read as forced too, as does a command the line leaves unread beside a push named anywhere on it
(P="git push"; $P --force). - An owner key: a passkey for what carries risk (control-tower phase 148, closes #208). A person can
now prove a press is theirs.phase-console owner enrollprints a one-time link, good for ten
minutes, that enrols a passkey at the machine — WebAuthn verified by hand withnode:crypto, no new
dependency: attestationnone, ES256 or EdDSA, user verification required, a single-use challenge
good for five minutes, the origin and relying party taken from the request's own host (localhost
or an https host the console serves; an IP is refused with the hint to openlocalhost), and a
signature counter that never goes back. The key's sign-in opens a twelve-hour owner session (a
256-bitHttpOnly,SameSite=Strictcookie,__Host-on https, of which only the hash is kept);
a high-risk press needs the key touched within five minutes;phase-console owner lockends every
session, andowner statussays whether the console isunenrolled,enrolledorunlocked(so
does/api/state.ownerDoor). A later key, and a removal, happen only inside an owner session, and
every change is journalled, pushed to every subscribed device and kept in the bell for a week. Once
a console has a key, an authority press through any other door — a script, the CLI, a browser with
no key, a phone beyond its low and medium answers, a session's token — is recorded as a
request (202): shown on its item, or as a decision of its own, as "asked by — confirm?",
and pressed through the owner's door only when the owner confirms it. What the plan's manifest
already allows still executes. A console with no key behaves exactly as before. The registry
(owner-doors.json), the sessions and the requests are 0600 and hold no secret. - Permission asks: every wall the AI meets reaches a person (control-tower phase 135, contributes to
#212). Each wall a session meets is recorded on its lane — a deny rule and every guard of this
console's own hook, and the CLI's own refusal: a tool outside the allow list, an MCP tool not
granted, the CLI's copy of a deny rule — and a refused landing push is a capability that is off. A
blocked --needs permissiondeclaration that cites one raises ONEpermissionitem in Your turn,
saying "raised because the AI lacks permission X to do Y" with the command, the phase, why it was
needed, the wall and its risk tier; one that cites nothing recorded is refused at the door, exit 4
— "nothing refused this — run it" (G5). The widen rung's card and the approval broker's ask ARE this
item: its Grant is what exists today, labelled as what it is (the broker's Allow, once or
remembered; the widen's permanent plan strike). Every item also offers Deny — the session is told
"denied — do not retry; find another way inside the plan or say what remains" — and I'll do it
myself, which turns it into your own act whose guide is the command and whose I've done this
resumes the session (POST /api/human-steps/:id/deny,…/convert). The risk table is total over
wall × rule family × scope: a forced or deleting push, the host family (sudo,shutdown,
reboot,mkfs,dd), every guard, a protected path and a secret's value are never — no grant
through any door; the item says why and gives the manual path. An App that is not installed, a
sandbox or network wall and a protected path raise their own kinds of item; the classifier's denial
is explained with the rule you could add to your own settings, which the console never writes.
The scoped grant that answers an item is phase 149's. - The check: probes, a checking session, verdicts, attempts (control-tower phase 134, #211). A
person's I've done this — check now gets a verdict — passed, rejected with exactly what to redo, or
needs-info — instead of "landed or not". A command's proof is read at once and a miss says what it
read; a proof only words can state is read by a short read-only checking session for that one item
(at most 12 turns, $0.50 and five minutes;sonnetatlowby default, Settings ▸ Automation),
whose verdict is parsed from its last fenced block and never invented. Each attempt keeps its
evidence and its verdict; a returned item tells the person once what to redo and resumes nothing;
a pass resumes every waiting session once, saying what was proven and what the check read. Three
rejections escalate once, with three ways out — rewrite the guide (…/rewrite), I can't, or the
owner's Accept anyway (…/override, the one route that writes a verdict, recorded as unverified).
No session and no agent can mark its own item passed: a judgement passes only on what the person
sent for that attempt (a note or a piece of evidence), and an attest, an override or a rewrite counts
only through a person's door. New metrics:
phase_console_turn_checks_total,phase_console_turn_check_usd_total. - The owner's moves, and the answer's road back to the session (control-tower phase 133, #210).
Beside I've done this — check, Snooze and I can't do this, a person can now answer a decision
(POST /api/human-steps/:id/answer {option?, note?}— one of its options, a note, or both), decline
an item that allows it with a reason (…/decline, the newdeclinedending — Withdrawn stays the
console's own word), ask a question about it (…/ask), and attach evidence (…/evidence— a note,
an image or a file: 160 KB a piece, six an attempt, screened for secrets, kept 0600 by content hash
inturn-evidence/and swept by its retention sink, never pushed or journalled). Each answer goes
back to the waiting session as ONE resume per waiter that the console composes — "The operator
answered<option>: ", "The operator declined: . Do not ask again; …" — carrying any
question the person asked; an answer that names a## Decisionskey is written to the plan's
decisions table throughdecisions.shfirst.answeranddeclineare authority presses, so no
session's door can make them. - Every source feeds the turn: one list, one done path, one announcer (control-tower phase 132,
#209). Everything that asks a person for an act passes ONE door,raiseTurn
(viewer/server/turn/index.ts, the only caller ofdeclareHumanStep), and reads back as ONE list:
GET /api/turnanswers{round, headline, groups, handled, counts}— every inbox row that asks a
person for an act, folded into one item per thing to do and grouped Do now · Needs one detail
from you · Coming up · Being checked · Done. Every such inbox row carries aturnview
(viewer/server/turn/fold.ts): which item, which record holds it — the human-step ledger, or the
row's own for an approval card, a gate, a held plan, a QA ask, a live relay question or a
person-check — its kind, reason and proof type. Health, lock, ruling, policy and message rows stay
in the bell; issue drafts are one line linking to Repo ▸ Issues. - A person errand IS an
operator-actitem: its row's action is I've done this — check on that
item, and "Done — continue" checks the same item, so a step the person did endsproven— the
reminder clock no longer withdraws a step its phase resumed past asdismissed. One turn is
announced once: the item's push, one tag per item, the reminders under that tag. - A credential the preflight finds missing raises a
secret-entryitem whose proof is the new watch
schemecredential:<id>—gh,claude,env:NAME,keychain:SERVICE,file:PATH, read by
presence and never by value — and an MCP server it cannot reach underrequireanmcp-loginitem.
A relayed question the console will not answer by rule raises adecisionitem that keeps its
options, the one marked(Recommended)recommended. - The owner door: who pressed is known (control-tower phase 131, #208). Every request has ONE
door, decided by what it can prove and never by what its body says: a session's run token is
session; a login the--remoteproxy verified, or a signed lock-screen action, isdevice;
anything else islocal(viewer/shared/door-model.jsPRESS_DOORS, read by
viewer/server/owner/door.ts). Every press records it aspressDoorbesideby, which is now only
a label — a script that saysby: operatoris recordedlocal. The door × authority verb × risk
table (DOOR_MAY,doorMay) says what each door may do, in two modes: with no owner key — every
console until the owner keys arrive —localpresses what it could before, and/api/statesays
ownerDoor: 'unenrolled'. AUTHORITY_ROUTESnames every authority route — new rows for the relay's answer, a presented plan,
Delegate, remembering a ruling, the preferences and the lock-screen action — and is held both
ways: a route that presses an authority method without a row fails the suite, naming its line. A
plan'spermission.destructiverow can name a route-only press asConsole(<press>).- Your turn speaks one language (control-tower phase 130, #207). A person's task now says WHY only
a person fits it — one of ten reasons (permission,identity,secret,money,legal,
decision,physical,reach,third-party,reserved), held to what its kind allows — carries a
full guide (a why paragraph, numbered steps each with an optional command, expected result, warning
and link, and "If it goes wrong"; 20 steps and 24 KB at most, http(s) links only, every line through
the secret screen) and a proof a person can read.viewer/shared/turn-model.js(twin
scripts/turn.env) owns the reasons, the proof types (probe,answer,judgement,attest,
grant), the verdicts, the grant scopes, risk tiers and states, the page's groups, the handled
sources and the walls;viewer/shared/guide-grammar.jsis the one guide parser. - The human step grows to eighteen kinds and eleven states: the kind
permission(a wall the AI
met, ended by a grant or a denial) and the statesreturned(a check sent it back) anddeclined
(the person's own "not doing this"). Each state, verdict, risk tier and grant state has a status row. phase-outcome.sh … needs-human --stepgains--why,--guide(with--lang),--effort,--due,
--unblocks,--proof-type,--proof-words,--option(with--recommendedand
--allow-decline),--windowand--tried; the plan bullet gainswhy:,effort:,unblocks:and
guide:, and--human-stepsprints them.PE_APIis 2.- The guard at the door (G1–G7), at the declaration's pre-check and again at ingest: a reason the
kind allows; a proof unless the answer is the result (attestonly by name); a declared
permission,reservedorreachreason is refused with exit 4 when the AI could do the act
itself — every command its guide asks for is one the run's own policy allows, or areachwith no
--tried— and an act a rule stops becomes apermissionitem naming the wall; the same item
declared by another lane is ONE item with another waiter, every waiter resumed when it is proven.
Changed
- A
secret-entrystep no longer takes the secret (control-tower phase 133).checkrefuses a body
that carries one, naming where the value goes instead — the keychain itemphase-console-<id>on
macOS, a 0600 file elsewhere, or the item's owncredential:place — and the check finds it there by
name. The step card's secret field is gone; it says where the value goes. - A step needs a proof (G2): a
needs-human --stepwith no--proof, no--proof-wordsand no
answer for a result is refused (exit 2) — name--proof-type attestto take the person's word. A
step that names no--whyis given its kind's default, marked inferred, so an older skill copy and
--actkeep working. The ledger writes version-2 lines and reads version-1 lines with defaults. - An
operator-actlights the halt family of its reason; with none, a decision. - F40 (
human-step-no-why, advisory): a plan bullet with nowhy:. - A request carrying a session's token presses no authority route the plan's
permission.destructiverow does not name: it is refused 403 before any route runs, logged
owner.door-refused. - A manual gate's person test is a door, not a User-Agent:
ownerordevice, andlocalon a
console with no owner key — where the approval says so. A session's door is refused whatever its
User-Agent. (A process outside a session could already clear one withgate-approve.shin a
terminal.) bin/btwnames itself, so its ask is recordedvia: cli.
Fixed
- "The release phases" in a
permission.destructiverow names them (#250). A row that allows a
publishing act "in the release phases", alone or beside numbered phases, read the numbers alone, so
every release phase'sgh pr createwent to a person's card although the plan allowed it. The console
now resolves the release phases from the plan's graph — each phase whose title opens with Release —
and answers that card itself, with a journal line; a qualifier it cannot resolve still narrows the
allowance and never widens it. - An approval card's evidence is the asking lane's (control-tower phase 135, OD-17): the working
tree and the verification it shows are read from the lane that asked — its own checkout and its own
record — never the console's root or another plan's run. - A word in a pattern is not a deny rule's name (control-tower phase 135):
matchedDenyRule, which
the relay asks directly, read the raw words of every line and namedBash(shutdown:*)for a task
subject that said "shutdown"; it now looks inside a wrapper only where the classifier does. - A refused call's journal line never holds a secret the call carried (control-tower phase 141,
#217, found by the tower rehearsal's planted secrets): everyphase.tool-deniedline — the forge
guard's, a deny rule's, the gate guard's, the push carve-out's and the poll loop's — keeps its command
through the wall's own redacting reader, so anAuthorization: Bearer …header no longer reached the
run's journal; andredactSecretsreads a JSON"password": "…"as it readspassword=…. - An answered item no longer leaves its run parked (control-tower phase 141, found by the tower
rehearsal): when a person's answer resumed the session and it finished its phase, the run stayed
parked — its next phase never boarded, and converge leaves a run a person pressed. A resume that leaves
the run parked with no halt now continues it, as a landed proof's resume always did, under the same
guards (autoContinueRecovery,--allow-run, no live runner, no fleet hold).