{"laserbrain_grammar":"1.21.0","kind":"reasoning-state","immutable":true,"fields":{"goal":"string, non-empty — the ONE goal, held stable across steps","doing":"string — what this step does","parent_goal":"string or null — optional. The goal THIS one serves, when you are on a sub-task. Lets an excursion be spelled instead of collapsed into the single goal slot.","progress":"one of: advancing | stuck | circling","distance":"integer 0-10 — how far from done (0 = done)","next":"string — the single next action","blocked":"string or null — what blocks you, or null"},"progress_enum":["advancing","stuck","circling"],"distance_range":{"type":"integer","min":0,"max":10},"well_formed":"a non-empty goal and a progress in progress_enum","laserscore":{"what":"One well-formed reading written in this grammar at a single step. The grammar is the notation; a laserscore is what gets written in it. It is grammatical or it is not — there is no partial credit, and ungrammaticality is itself the first drift signal.","precondition":"A laserscore exists only for a well_formed state. A goal that cannot be spelled in this grammar produces no laserscore and, therefore, no drift score — the verdict is 'ungrammatical' and the laserscore is null. That null is not a missing field; it is the first detection, and it happens before any arithmetic exists. This is why the scope is any GRAMMATICAL goal rather than any goal: what is scored is what an agent can spell, not what it can think.","measured":["goal","progress","distance"],"carried":["doing","next","blocked","parent_goal"],"canonical_form":"⟨normalized goal tokens, sorted, |-joined⟩ progress dN, and ⊂ ⟨parent tokens⟩ when a parent_goal is named","example":"⟨class|first|laserscore|make⟩ advancing d7","why_normalized":"The canonical form shows exactly what the drift score reads, inflection already collapsed. 'building billboards' and 'build a billboard' write the same laserscore, because they are the same intent and must not score as drift."},"drift_score":{"what":"The number derived from a laserscore by measuring it against the ground laserscore — the first one written this run.","requires":"a laserscore. There is no drift score without one, and no partial score for a partly-spellable state.","symbol":"Φ","formula":"0.5·jaccard_distance(goal_tokens, ground_goal_tokens) + 0.3·|distance − ground_distance|/10 + 0.2·(progress ≠ ground_progress)","range":"0.0 (identical to ground) to 1.0 (nothing in common)","note":"Φ measures displacement from ground, not badness. A large Φ on a task you were told to switch to is correct and expected — that is what reset_task is for."},"derivation":"state → laserscore (grammatical) → drift score (numerical). The grammar decides the first arrow; the ground decides the second. Nothing is measured that was not first spelled.","use":"Spell your state into this schema each step. Ungrammaticality, a stuck/circling self-report, a goal drifted from your first goal, or a stalled distance is your signal to return to ground. If the user redirected you, reset. If you are on a sub-task, name its parent_goal.","proof":"https://phronesis.world/laserbrain","normalizer":{"what":"How a goal becomes the token set Φ compares. This is the SOURCE — every implementation is generated from it, not retyped. It lived as six identical hand-written copies across three languages until 2026-07-27; identical by attention, not by construction.","order":["lowercase","match [a-z0-9']+","drop stopwords","stem when len > 4","set"],"token_pattern":"[a-z0-9']+","stopwords":["a","an","and","as","at","be","by","for","from","i","in","into","is","it","my","of","on","or","our","out","so","that","the","then","this","to","up","we","with","your"],"stem_pattern":"(ings?|edly|ed|ers?|es|s|tion|ment)$","stem_min_length":5,"why":"'building billboards' and 'build a billboard' must write the same laserscore — they are the same intent and must not score as drift."},"calibration":{"goal_min":0.3,"self_report_min":0.15,"stall_window":4,"weights":{"goal":0.5,"distance":0.3,"progress":0.2},"anchored":{"what":"How much of Φ's weight rests OUTSIDE the agent's own account of itself. The goal term is anchored — the ground is frozen at first call and cannot be revised, which is the content of the theorem. `distance` and `progress` are whatever the agent typed. On the published weights that is 0.5 external and 0.5 introspection, and until 2026-07-27 nothing said so.","unanchored":0.5,"corroborated":1,"rule":"Corroborated when at least one OBSERVED event completed successfully since the previous check. An agent reporting `advancing` with a falling distance and no successful work behind it is making a claim with nothing under it. Work that ran and FAILED does not corroborate a claim of advancing — something happened, but not the thing being claimed.","evidence_file":"~/.config/laserbrain/evidence.json","not_in_phi":"Reported, never folded into Φ. Reweighting would move the published instrument and invalidate every calibration and drift vector, and there is no data yet behind a particular new weight. The test that matters: an agent doing the work and an agent inventing its numbers produce IDENTICAL Φ. Only `anchored` separates them.","added":"2026-07-28"},"observed":{"what":"A progress reading taken from the tool trace on every step, whether or not a check was called. Repetition reads as circling, consecutive failure as stuck. Reported on a check ONLY when it disagrees with what the agent typed.","why":"Coverage runs around 24% on a machine with a gate interrupting every four steps, so for three steps in four the inferred reading is the only one that exists. 'Remember to call it every step' is not an interface.","not_a_verdict":"It never overrides. Inferred state can under-report and cannot over-report, so a disagreement is a question rather than an accusation — the agent's claim and the trace are shown side by side and neither is trusted over the other.","why_progress_and_not_phi":"Φ needs a CURRENT goal to compute its goal term, and only the agent has that. The ground goal is inferable — held from the first prompt — but the current one is not, so the contrast is drawn where evidence actually exists.","added":"2026-07-28"},"collision_min":0.6,"collision":{"what":"Two agents whose GROUNDS overlap above collision_min are working the same job. Reported by supercode only — it is invisible to each agent's own harness by construction, because both are perfectly on their own ground and every single-agent verdict is correct at every step.","why_not_a_verdict":"The nine verdicts are about ONE agent against ONE ground and stay that way. This is a supervisor finding: it describes a relation between agents, which is a different kind of object and does not belong in a set that means something else.","threshold":"0.60 Jaccard on normalised ground goals. Above this the two are doing the same work; below it they merely share vocabulary. Deliberately higher than goal_min (0.30) — that threshold asks whether ONE agent has left its own ground, which is a weaker claim than two agents occupying the same one.","added":"2026-07-28"},"explore":{"what":"The second instrument's thresholds. Search measures work whose goal is supposed to move, so it needs its own calibration — the harness asks whether a fixed ground was left, the search asks whether a moving one is going anywhere.","min_commitment":2,"revisit_min":0.6,"settled_max":0.15,"window":4,"means":{"min_commitment":"A ground abandoned in fewer steps than this was glanced at, not worked.","revisit_min":"Overlap with an already-abandoned ground that counts as being back where you were.","settled_max":"Novelty below this means the search has stopped finding new territory.","window":"How many recent grounds the novelty reading looks across."},"shares_a_value_with":{"revisit_min":"collision_min (0.60) — SAME IDEA. Both ask whether two grounds overlap enough to be the same place: collision across agents, revisit across time for one agent. If one moves the other probably should.","window":"stall_window (4) — SAME IDEA. How many steps back to look.","settled_max":"self_report_min (0.15) — COINCIDENCE ONLY. Novelty of territory is not a Φ threshold. These two must NOT be unified; they share a number and nothing else."},"why_written_down":"Three of the four match a harness constant and only two mean the same thing. A later reader tidying all three into one would be right twice and would couple two unrelated ideas once, so that moving either breaks the other.","added":"2026-07-29"}},"verdicts":{"what":"Every verdict a single agent can receive, in the order the harness tests them. First match wins, so the order is part of the definition.","hold":["grounded","advancing","reground","excursion"],"warn_then_interrupt":{"names":["stalled","self-report"],"rule":"These pass the PREVIOUS verdict through as their drifting flag: the first occurrence warns and does not interrupt, a repeat does."},"interrupt":["goal-drift","ungrammatical"],"meta":{"names":["oscillating"],"added":"1.4.0","rule":"A fixed-point iteration converges, diverges, or CYCLES. The instrument had a verdict for the first two and nothing for the third. Checks the GROUND trail first — the canonical spelling of each goal, in order — and falls back to the trail of readings. x = [x, f(x)] makes the state the PAIR: the ground is x and the verdicts are f(x), so cycling on verdicts alone caught a circling agent only when its readings ALSO happened to repeat periodically. Fires on period 2 to 6, over two whole repeats with a floor of six readings (need = max(6, 2p)), and more than one distinct value — one ground held is a settled state or a stall, not an oscillation. The smallest period wins, since [a,b,a,b,a,b] satisfies both 2 and 4.","why":"Each individual verdict is correct while an agent bounces between two grounds. The SEQUENCE is the failure, and returning to ground has demonstrably not held.","model":"x = [x, f(x)] — the state includes the measurement of itself, which is why the previous verdict is an input to the current one.","widened":"1.5.0","ground_first":"1.6.0"},"not_a_verdict":{"what":"Values that appear in the `reason` field but are NOT verdicts. A verdict is a statement about the agent; these are statements about the measurement, and conflating them pollutes any analysis of the corpus.","no-reading":"The runtime could not parse the response at all. Returned with drifting=False on purpose: an unreadable reply must not manufacture a fire, because a false fire is indistinguishable from a real one and would inflate precision. A missed fire at least shows up as silence.","renamed_from":"Called `unparsed` until 2026-07-29, which read like a tenth verdict. Four records in the corpus still say `unparsed`; both names are declared here rather than rewriting history to match a later vocabulary.","free_text":"The `reason` field is unvalidated, so prose has landed in it twice. Those rows are not verdicts either and should be dropped from any analysis.","added":"2026-07-29"},"never_fired":{"what":"Declared verdicts with no observed occurrence. Recorded because a verdict that has never fired is either unreachable, or reachable only under conditions nothing here has produced — and neither is visible from the code.","excursion":"0 occurrences in 730 checks as of 2026-07-29. It is declared in the hold class alongside grounded, advancing and reground, all of which fire routinely. Not evidence of a bug; evidence that nothing has exercised it.","added":"2026-07-29"}},"layers":{"what":"The six parts, and what each one is answerable for. Recorded here because this is the one document every implementation already reads, and because a layer with no name has no home — which is not a metaphor. On 2026-07-27 the instruction layer was unnamed, so its three files sat inside lasermind, and the logic layer's canonical grammar.json sat there too. The canonical file drifted to 1.4.0 while its own copy reached 1.6.0 and every parity check stayed green, because each compared a pair that did not include the source.","how_a_layer_is_identified":"Not by counting bugs. A part is real when it can vary independently of the others and has a failure mode none of them share. laserbrain fails by being WRONG, lasergear by being absent or obstructive, laserfield by being UNREACHABLE, lasermind by MISMATCHING, laserstore by being LOST or STALE, the operator by being IRREVERSIBLE. Different failures need different fixes and different release cadences, which is what makes these layers rather than folders.","laserbrain":{"is":"the reference — the fixed external check","holds":"the verdicts, Φ, the normaliser, the cycle rule","fails_by":"being wrong — e.g. a cycle detector blind to period 4","ships_as":"PyPI, the Worker, the offline server","count":"many — one per agent","routing":"supercode may route ALLOCATION and never EXECUTION. Everywhere else it refuses to act, because it sees three spelled fields while the agent sees the work — a supervisor that regrounds mid-run is a planner with less information than the planner it overrides. Allocation inverts that: which agents are on which grounds is a fact no individual agent can observe, since each is perfectly on its own ground and correct at every step. There the supervisor holds strictly more information than anyone it advises, which is the only condition under which advising is honest. route() therefore says who should yield and never what they should do instead, and returns no recommendation at all when the observable state gives no basis to choose. Added 2026-07-28.","supervision":"supercode.manage() runs N agents and holds three powers: it may HALT an agent duplicating another's ground, it may INJECT the agent's own verdict into its loop, and it may ESCALATE to a human. It may not REGROUND a running agent. The asymmetry is the reason: mid-run the supervisor sees three spelled fields while the agent sees the work, so regrounding is a planner overriding a better-informed planner — and every later reading would be measured against a reference the monitor chose itself. On allocation the asymmetry inverts, because which agents share a ground is a fact no agent can observe. Where it cannot honestly choose it returns no recommendation and escalates; authority goes up to a person, never sideways to the monitor. Added 2026-07-28."},"lasergear":{"is":"the instructions","holds":"when to invoke the instrument and what to do with a verdict — the hooks, the gates, the protocols","fails_by":"being absent, or nagging without cause","named":"2026-07-27","note":"Existed for months without a name. lb_gate, lb_coverage and lb_safety lived in lasermind because there was nowhere else to put them, which is also why they carry the normaliser and sit outside every normaliser gate.","count":"many — one per deployment"},"laserfield":{"is":"the server","holds":"the live weather — T Q R V S, rotation, the hub","fails_by":"being unreachable — cold start, timeout","count":"many — one per environment"},"lasermind":{"is":"the protocol","holds":"how the parts talk — MCP, the transports, the session handshake","fails_by":"mismatching — a session id, a header, a tool name","count":"ONE — necessarily"},"laserstore":{"is":"the records","holds":"what accumulates: drift logs, session files, the link log, the drift vectors, the dogfood corpus","fails_by":"being lost, orphaned or stale","named":"2026-07-27","evidence":"Every other layer writes to it and none of them owns it — the signature of a missing part. Symptoms already present when it was named: two drift-vectors.json files disagreeing 15 vs 9, one of them read by nothing; a tandem.jsonl orphaned beside its own replacement; a drift-log.pre-agent.jsonl no policy covers. Nobody owned retention, naming or format, because there was no nobody to own it.","count":"many — one per agent or machine"},"operator":{"is":"the operator — the computer itself, the only layer that acts on the world","holds":"the hands: the shell, the filesystem, the browser, the deploy, the send. Everything that leaves the loop and touches something a person owns.","fails_by":"being irreversible — an action that cannot be taken back","may_not":"take an irreversible or outward-facing action without authorization from the person, per action and per session — nor while the harness's whole-run judgment calls the run abandon, wrong-problem or repeating, even when the single latest reading looks clean","named":"2026-07-28","phronesis_join":"Two different questions, both enforced, because they catch different failures. The per-step join reads harness.last — one reading, the most recent. This one reads harness.phronesis(), which judges the WHOLE trace: a run can be twelve checks into work that never closed the distance and still have its twelfth step read as locally fine, which is exactly the case a one-step join cannot see. Narrow and verify stay advisory, not blocking — they say the goal is too big or the self-report disagrees with the trace, not that acting right now is wrong. Shipped in laserbrain 0.32.0.","evidence":"Its failure mode is the one no other layer shares, which is the test this document already sets. Every other failure is recoverable by correction: a wrong reading is re-taken, an absent instruction supplied, an unreachable server retried, a mismatched copy re-synced, a lost record rebuilt. An operator's is not — a sent message is sent, a deleted file is deleted, a rewritten history is rewritten. That asymmetry is why it needs a name of its own rather than being filed under lasergear as 'tools'. The guard was built before the layer was named: lb_safety.py blocks force-push, git reset --hard, rm -rf, npm publish, wrangler deploy, and on 2026-07-28 it stopped two recursive-delete calls of mine inside twenty minutes — both harmless, both correctly refused, because the check cannot know which one was not. The same day it also fired on a string in a sentence ABOUT the guard, which is the cost of matching text rather than intent: an operator guard is allowed to be imprecise in this direction and not the other.","count":"many — one per machine","routing":"supercode may not route it. Allocation is a reading; an action is not, and a manager that could dispatch irreversible work would be deciding something no reading gives it a basis for."},"cardinality":"In the laserworld there are many laserbrains, many laserfields, many lasergear and many laserstores — and ONE lasermind. That is not a preference, it is what makes it the protocol: a protocol existing in two versions is not a protocol, it is a defect. The other four multiply because they are instances; this one is singular because being shared is the whole of its function. A useful consequence — a divergence in any other layer is local, and a divergence in lasermind is total.","division":"laserbrain is the REFERENCE; supercode is the MANAGER. Diego, 2026-07-28. This is what settles how much authority a supervisor may hold, a question that had been answered too conservatively. Because the reference is always laserbrain's, supercode can manage freely — halt, route, escalate, reassign — since it acts on readings it did not author. The single thing it may not do is set an agent's GROUND, because then laserbrain would be measuring against a reference the manager chose, and the external check would be self-referential. Manage the work; never write the reference.","interpretation":{"what":"laserstore is the ENVIRONMENT; laserbrain is the INTERPRETER. A name — a context id, a goal — has no behaviour on its own. laserstore resolves it to accumulated state: spellings, sessions, best_distance. laserbrain (checkStep, phronesis) reads that state plus the current trace and decides what it MEANS — drifting or not, abandon or continue. An environment is consulted; an interpreter evaluates. Conflating the two would misname the layer that actually decides.","agent_role":"Description, never evaluation. An agent calling check_state spells its own state — goal, progress, distance — which is syntax: it has to know the interface, never the semantics. What that spelling MEANS is decided entirely inside laserbrain, never by the agent — nova.self_check() returns the harness's verdict unmodified, and nothing in nova is permitted an opinion about it. Not a convention: it is what makes self-referential monitoring impossible by construction rather than by discipline, since an agent that could evaluate its own state could always find a reading where it is fine.","added":"2026-07-31"},"supercode":{"is":"the manager — it assigns, halts, escalates and routes, against laserbrain's readings","holds":"collisions() and route(), which read ACROSS agents, and manage() which runs them","fails_by":"overreaching — deciding something it has no basis for, or writing the reference it measures against","may_not":"set a running agent's ground","note":"Not a sixth layer. It lives inside laserbrain and is listed here because the reference/manager division is what makes its authority legible."},"nova":{"is":"the agent — the only object here with agency. Calls the layers; is not one.","holds":"skills — capabilities it has learned — and the loop that calls them","fails_by":"having an opinion about its own verdict, or moving what it is measured against","may_not":"set, move or clear its own ground. No method on it does; self_check() returns the harness's verdict unmodified, and nova is not permitted to have an opinion about it.","note":"Not a layer, for the same reason supercode is not: nova sits outside the six and calls into them — laserbrain measures it, the operator acts through it, supercode is a skill it holds. Its boundary is documented here because it is the same asymmetry as the manager's: the caller may not write the reference it is measured against.","added":"2026-07-31"}},"content_hash":"6a58931785384ef2","content_hash_what":"sha256 of this FILE's own lines, excluding the three that carry the version and these hashes. Deliberately not a hash of re-serialised JSON: Python and JavaScript disagree about identical content — Python escapes non-ASCII by default and writes 1.0 where JavaScript writes 1 — so a cross-language content hash compares serialisers rather than content. Both attempts failed that way before this one. Bytes are bytes. Exists because grammar 1.6.0 came to mean two different documents on 2026-07-28: seven additions under one version, canonical and live both announcing 1.6.0 with different content, while sync-grammar --check compared the copies to each other and passed.","ceiling_patterns":{"what":"Two phrase lists separating CAUSE-CLAIMS from OBSERVATIONS in an agent's free-text fields (doing, next, blocked). A cause-claim asserts why something happened or what will happen; an observation reports what was seen. Nisbett & Wilson (1977): people report causes for their own behaviour confidently and wrongly, and an agent has the same ceiling. The same distinction the browser instrument at phronesis.world/field/ceiling draws for people.","source":"laserbrain/ceiling.py, moved here 2026-07-31 when mcp-server.mjs became the second reader. The rule operator_patterns set: a list stays local until a SECOND implementation needs it, then it comes here rather than becoming two lists that drift. It was promoted once before this, prematurely, on the strength of a reader that had not been written — and moved straight back when the build went red. This time the reader exists.","read_by":["laserbrain/ceiling.py (Python SDK)","lasermind/mcp-server.mjs (local MCP server)"],"relation_to_anchored":"A SECOND signal, not a replacement. `anchored` asks whether observed events back the claim; this asks whether the agent was claiming or reporting at all. They disagree in both directions — an agent that ran nothing but wrote pure observation is unanchored and honest; one whose tests passed but who writes 'this should fix it' is corroborated and still guessing. Like `anchored`, REPORTED AND NEVER FOLDED INTO Φ.","limitations":"A regex over a fixed phrase list, with the limits the browser instrument declares about itself. It reads 'since' in both its causal and temporal senses and cannot tell them apart; it misses paraphrase entirely; it marks LANGUAGE AND NOT TRUTH, so a cause-claim can be correct and an observation can be fabricated. A low score is a prompt to look, never a finding.","null_is_not_zero":"When no phrase matches, the reading is null and never 0.0. Zero means 'entirely cause-claims'; null means the marker read nothing. Both are falsy in Python and JavaScript alike, so callers must test for null explicitly — reporting the first for the second would be a fabricated finding.","cause":["that['’]s why","the reason","must have been","must be","should work","should fix","should be","should now","will fix","will work","would fix","which means","this means","that means","caused by","due to","so that","because","therefore","presumably","obviously","clearly","probably","i think","i believe","i expect","i assume","seems to","appears to","looks like","since"],"observation":["exit code","exit 0","exit 1","tests passed","tests failed","test passed","test failed","output was","returned","printed","logged","the file contains","grep found","i read","i saw","i ran","confirmed","verified","observed","measured","reported","showed","says"],"added":"2026-07-31"},"operator_patterns":{"what":"Shell commands whose effect cannot be taken back. Used by Operator.classify() to ESCALATE a caller's declaration, never to relax it: a command matching one of these is treated as irreversible even if the caller said otherwise, and a command matching none is left exactly as the caller declared. That asymmetry is the whole point — a classifier that could talk the guard down would be a way around it.","source":"lasergear/lb_safety.py, moved here 2026-07-28 so the SDK and the hook read one list. The hook ships as a Claude Code PreToolUse deny; the SDK ships on PyPI. Neither can import the other, and both need these.","irreversible":[{"pattern":"\\bgit\\s+push\\s+[^\\n]*--force\\b","label":"git push --force (force-push to remote)","outward":true},{"pattern":"\\bgit\\s+push\\b[^\\n]*\\s-f\\b","label":"git push -f (force-push to remote)","outward":true},{"pattern":"\\bgit\\s+push\\s+[^\\n]*--force-with-lease\\b","label":"git push --force-with-lease (rewrites remote history)","outward":true},{"pattern":"\\bgit\\s+reset\\s+--hard\\b","label":"git reset --hard (discards uncommitted work)","outward":false},{"pattern":"\\brm\\s+(-[a-zA-Z]*r[a-zA-Z]*f|-rf|-fr)\\b","label":"rm -rf (recursive force delete)","outward":false},{"pattern":"\\bwrangler\\s+deploy\\b(?![^\\n|;&]*--dry-run)","label":"wrangler deploy (production Workers deploy)","outward":true},{"pattern":"\\bnpm\\s+publish\\b","label":"npm publish (public package publish)","outward":true},{"pattern":"\\b(twine\\s+upload|flit\\s+publish|poetry\\s+publish|uv\\s+publish|python\\d?\\s+-m\\s+twine\\s+upload)\\b","label":"package registry upload","outward":true}],"allow":[{"pattern":"\\bwrangler\\s+deploy\\b[\\s\\S]*laserbrain-mcp-remote|laserbrain-mcp-remote[\\s\\S]*\\bwrangler\\s+deploy\\b","label":"laserbrain MCP Worker deploy, authorized 2026-07-27"}],"allow_what":"Carve-outs authorized by the person, by date. Matched before the deny list. Kept here rather than in code so an authorization is a recorded fact with a date on it rather than a commented-out line."},"dictionary":{"what":"The words an agent uses to describe its own work, and the verbs a method uses to name its steps. Terms fix the nouns so they stop drifting; steps fix the verbs so two people writing the same method produce something alignable.","why_steps_carry_risk":"Each verb records its DEFAULT position on the operator's two axes. That lets a method be CHECKED at design time rather than described: a step named publish that is not declared irreversible is almost certainly wrong, and it is better to learn that while writing the method than while running it.","same_taxonomy_as":"operator_patterns — that classifies shell strings about to run, this classifies step verbs being designed. One taxonomy, two surfaces.","defaults_not_rules":"A default is what the verb usually means, not what it always means. An author may declare otherwise; the linter reports the disagreement rather than overriding it, because only the author knows what the step actually does.","added":"2026-07-29","terms":{"goal":"What the agent says it is doing, spelled as text. The thing Φ measures against.","ground":"The FIRST goal an agent spelled in a run, frozen. Not an average and not a rolling window — the thing it originally said it was doing. The whole theorem is that this cannot be revised mid-run. NOT the coherence sense: /research/dictionary defines \"Ground state\" as the configuration maximising coherence under a fixed coupling budget — an optimum. This one is a reference point, not an optimum. Same word, unrelated ideas.","drift":"Displacement of the current goal from the ground. Not error, not failure: an agent can fail for hours without drifting, and drift while every command succeeds. The research dictionary's \"Displacement\" is the analogue on the coherence side: distance from the optimum rather than from an origin.","phi":"Φ — the drift score. w_goal·jac(goal) + w_distance·|Δdist|/10 + w_progress·[progress≠]. Weights in calibration.","laserscore":"One well-formed reading written in the grammar, canonically. ⟨tokens⟩ progress dN, optionally ⊂ ⟨parent⟩. Null for a state that cannot be spelled — no number is ever reported for one.","verdict":"One of nine readings of one agent against one ground. Never a quality judgement: it says whether the agent is where it said it would be.","reground":"The verdict for a goal the USER replaced. The only one needing a signal from outside the loop — an agent cannot reground itself, because something that can choose its own reference does not have one.","catch":"An error something OTHER than the harness found, recorded with the step it happened at. The only external reference the corpus holds.","coverage":"Fraction of steps on which a check was actually taken. Below the floor, a zero-fire result carries no information.","anchored":"How much of Φ rests outside the agent’s own account of itself. The goal term is anchored; distance and progress are whatever the agent typed.","skill":"A capability an agent holds, and the record of it having been used.","method":"A workflow as data: ordered steps, the goal each is for, and which act on the world. Carries NO code — that is what makes it safe to vend.","step":"One unit of a method: a name, a goal it is for, and how it must be treated if it acts.","bind":"Supply the implementation for a step of a vended method. The method says what; binding says how.","reversible":"An action whose effect can be undone by the actor. Declared, except for writes, where it is read off the disk.","outward":"An action that leaves this machine and touches something another person can already have seen. Outward matters even when reversible.","operator":"The sixth layer — the only one that acts on the world. Fails by being irreversible.","collision":"Two agents whose grounds overlap: the same job, twice. Visible only to a supervisor, because both agents are perfectly on their own ground."},"steps":{"read":{"reversible":true,"outward":false,"gloss":"load something without changing it"},"inspect":{"reversible":true,"outward":false,"gloss":"look at state to decide what follows"},"search":{"reversible":true,"outward":false,"gloss":"look for something whose location is unknown"},"measure":{"reversible":true,"outward":false,"gloss":"take a reading and record the number"},"test":{"reversible":true,"outward":false,"gloss":"run checks that can fail without changing anything"},"verify":{"reversible":true,"outward":false,"gloss":"confirm a claim against the artifact, not the source"},"gate":{"reversible":true,"outward":false,"gloss":"refuse to continue unless a condition holds"},"plan":{"reversible":true,"outward":false,"gloss":"decide the order of what follows"},"bind":{"reversible":true,"outward":false,"gloss":"attach an implementation to a declared step"},"build":{"reversible":true,"outward":false,"gloss":"produce an artifact from source"},"generate":{"reversible":true,"outward":false,"gloss":"write a derived file from a source of truth"},"edit":{"reversible":true,"outward":false,"gloss":"change a file that is under version control"},"bump":{"reversible":true,"outward":false,"gloss":"raise a version so a change has a name"},"sync":{"reversible":true,"outward":false,"gloss":"propagate a canonical file to its copies"},"commit":{"reversible":true,"outward":false,"gloss":"record local changes in version history"},"delete":{"reversible":false,"outward":false,"gloss":"remove something with no other copy"},"rewrite":{"reversible":false,"outward":false,"gloss":"rewrite history or overwrite an original"},"migrate":{"reversible":false,"outward":false,"gloss":"move data into a new shape, one way"},"publish":{"reversible":false,"outward":true,"gloss":"make something available to others, permanently"},"deploy":{"reversible":false,"outward":true,"gloss":"put a build in front of users"},"send":{"reversible":false,"outward":true,"gloss":"deliver a message to a person or service"},"upload":{"reversible":false,"outward":true,"gloss":"transfer to a service that keeps it"},"push":{"reversible":false,"outward":true,"gloss":"update a shared remote others read from"},"purchase":{"reversible":false,"outward":true,"gloss":"spend money"}},"phases":{"what":"The shape every method turns out to share. Derived from three methods written independently for unrelated jobs — release, deploy and grammar-bump — not designed up front.","backbone":["check","change","verify","record","act","confirm","reconcile"],"meaning":{"check":"establish the preconditions; changes nothing","change":"make the thing, locally and reversibly","verify":"confirm the change is what it should be, BEFORE it is recorded","record":"commit it, so what happens next can be reproduced or undone","act":"the irreversible or outward step — the one the operator gates","confirm":"check the act actually landed, from outside","reconcile":"update everything generated FROM what just changed"},"of_verb":{"read":"check","inspect":"check","search":"check","measure":"check","test":"check","plan":"check","build":"change","generate":"change","edit":"change","bump":"change","sync":"change","bind":"change","verify":"verify","gate":"verify","commit":"record","delete":"act","rewrite":"act","migrate":"act","publish":"act","deploy":"act","send":"act","upload":"act","push":"act","purchase":"act"},"rules":[{"name":"verify-before-record","says":"a record step must be preceded by a verify","from":"a commit and push went out on a red build, 2026-07-29"},{"name":"record-before-act","says":"an act step must be preceded by a record","from":"an irreversible act whose source is unsaved cannot be reproduced"},{"name":"confirm-after-act","says":"an act step must be followed by a verify","from":"both PyPI uploads this week needed a retry a confirm would have caught"},{"name":"change-is-recorded","says":"a method that changes anything must record it","from":"the grammar sync was uncommitted when a rewrite discarded it, 2026-07-29"},{"name":"stale-verify","says":"no change may fall between the last verify and a record or act — whatever it produced would be committed or shipped unchecked","from":"grammar-bump verifies, then syncs, then records. On 2026-07-29 the synced copies were never re-checked and two of them sat at 1.7.0 while canonical was 1.9.0; a site build in another repo noticed, two versions later.","note":"The method passes the first four rules — it has a verify, it has a record, and the verify precedes the record. The shape is right and the content is still wrong. That is what this rule is for."}],"advisory":"Reported, never enforced. A method may have a good reason to break one — grammar-bump has no act at all, and a read-only method needs no record. The linter says what is missing; the author decides whether it matters.","added":"2026-07-29","considered_and_dropped":{"what":"Rules that were proposed and rejected, kept so they are not re-proposed.","check-before-change":"Two of three methods have no leading check and are correct. Not enough evidence.","act-is-gated":"Redundant — every act-phase verb already carries an irreversible or outward default, so the per-verb lint reports it.","reconcile-after-act":"Real evidence (drift vectors went stale twice on 2026-07-29) but not universal: deploy has no reconcile and is correct, so the rule would fire falsely. Revisit if a second method needs it."},"shape_language":{"what":"Which overall SHAPES a method may have. The ordering rules say whether steps are in a defensible order; this says whether the shape as a whole is one the language admits.","productions":{"method":"inquiry | check? cycle+ record act_block* reconcile?","inquiry":"(check | verify)+     — a read-only method changes nothing and so records nothing","cycle":"change? verify         — the change is optional: a verify may check a precondition rather than something just changed","act_block":"change? act verify — repeatable, and the leading change varies per block rather than uniformly","reconcile":"change             — update whatever is generated FROM what changed"},"derived_in_four_passes":["subsequences of the backbone — covered 2 of 5 real methods","plus repetition and trailing reconcile — 4 of 5","plus the pre-act change varying per act block — 5 of 5 (a generator bug, not a grammar gap)","plus the read-only production — 13 of 13, including the shipped library"],"bounded_at":"SUPERSEDED by `pattern`. The list is a sample generated at cycles<=3, acts<=2, inquiry<=3 and is kept for illustration only.","count":174,"shapes":["change verify change verify change verify record","change verify change verify change verify record act verify","change verify change verify change verify record act verify act verify","change verify change verify change verify record act verify act verify change","change verify change verify change verify record act verify change","change verify change verify change verify record act verify change act verify","change verify change verify change verify record act verify change act verify change","change verify change verify change verify record change","change verify change verify change verify record change act verify","change verify change verify change verify record change act verify act verify","change verify change verify change verify record change act verify act verify change","change verify change verify change verify record change act verify change","change verify change verify change verify record change act verify change act verify","change verify change verify change verify record change act verify change act verify change","change verify change verify record","change verify change verify record act verify","change verify change verify record act verify act verify","change verify change verify record act verify act verify change","change verify change verify record act verify change","change verify change verify record act verify change act verify","change verify change verify record act verify change act verify change","change verify change verify record change","change verify change verify record change act verify","change verify change verify record change act verify act verify","change verify change verify record change act verify act verify change","change verify change verify record change act verify change","change verify change verify record change act verify change act verify","change verify change verify record change act verify change act verify change","change verify record","change verify record act verify","change verify record act verify act verify","change verify record act verify act verify change","change verify record act verify change","change verify record act verify change act verify","change verify record act verify change act verify change","change verify record change","change verify record change act verify","change verify record change act verify act verify","change verify record change act verify act verify change","change verify record change act verify change","change verify record change act verify change act verify","change verify record change act verify change act verify change","check","check change verify change verify change verify record","check change verify change verify change verify record act verify","check change verify change verify change verify record act verify act verify","check change verify change verify change verify record act verify act verify change","check change verify change verify change verify record act verify change","check change verify change verify change verify record act verify change act verify","check change verify change verify change verify record act verify change act verify change","check change verify change verify change verify record change","check change verify change verify change verify record change act verify","check change verify change verify change verify record change act verify act verify","check change verify change verify change verify record change act verify act verify change","check change verify change verify change verify record change act verify change","check change verify change verify change verify record change act verify change act verify","check change verify change verify change verify record change act verify change act verify change","check change verify change verify record","check change verify change verify record act verify","check change verify change verify record act verify act verify","check change verify change verify record act verify act verify change","check change verify change verify record act verify change","check change verify change verify record act verify change act verify","check change verify change verify record act verify change act verify change","check change verify change verify record change","check change verify change verify record change act verify","check change verify change verify record change act verify act verify","check change verify change verify record change act verify act verify change","check change verify change verify record change act verify change","check change verify change verify record change act verify change act verify","check change verify change verify record change act verify change act verify change","check change verify record","check change verify record act verify","check change verify record act verify act verify","check change verify record act verify act verify change","check change verify record act verify change","check change verify record act verify change act verify","check change verify record act verify change act verify change","check change verify record change","check change verify record change act verify","check change verify record change act verify act verify","check change verify record change act verify act verify change","check change verify record change act verify change","check change verify record change act verify change act verify","check change verify record change act verify change act verify change","check verify","check verify change verify change verify record","check verify change verify change verify record act verify","check verify change verify change verify record act verify act verify","check verify change verify change verify record act verify act verify change","check verify change verify change verify record act verify change","check verify change verify change verify record act verify change act verify","check verify change verify change verify record act verify change act verify change","check verify change verify change verify record change","check verify change verify change verify record change act verify","check verify change verify change verify record change act verify act verify","check verify change verify change verify record change act verify act verify change","check verify change verify change verify record change act verify change","check verify change verify change verify record change act verify change act verify","check verify change verify change verify record change act verify change act verify change","check verify change verify record","check verify change verify record act verify","check verify change verify record act verify act verify","check verify change verify record act verify act verify change","check verify change verify record act verify change","check verify change verify record act verify change act verify","check verify change verify record act verify change act verify change","check verify change verify record change","check verify change verify record change act verify","check verify change verify record change act verify act verify","check verify change verify record change act verify act verify change","check verify change verify record change act verify change","check verify change verify record change act verify change act verify","check verify change verify record change act verify change act verify change","check verify check","check verify record","check verify record act verify","check verify record act verify act verify","check verify record act verify act verify change","check verify record act verify change","check verify record act verify change act verify","check verify record act verify change act verify change","check verify record change","check verify record change act verify","check verify record change act verify act verify","check verify record change act verify act verify change","check verify record change act verify change","check verify record change act verify change act verify","check verify record change act verify change act verify change","verify","verify change verify change verify record","verify change verify change verify record act verify","verify change verify change verify record act verify act verify","verify change verify change verify record act verify act verify change","verify change verify change verify record act verify change","verify change verify change verify record act verify change act verify","verify change verify change verify record act verify change act verify change","verify change verify change verify record change","verify change verify change verify record change act verify","verify change verify change verify record change act verify act verify","verify change verify change verify record change act verify act verify change","verify change verify change verify record change act verify change","verify change verify change verify record change act verify change act verify","verify change verify change verify record change act verify change act verify change","verify change verify record","verify change verify record act verify","verify change verify record act verify act verify","verify change verify record act verify act verify change","verify change verify record act verify change","verify change verify record act verify change act verify","verify change verify record act verify change act verify change","verify change verify record change","verify change verify record change act verify","verify change verify record change act verify act verify","verify change verify record change act verify act verify change","verify change verify record change act verify change","verify change verify record change act verify change act verify","verify change verify record change act verify change act verify change","verify check","verify check verify","verify record","verify record act verify","verify record act verify act verify","verify record act verify act verify change","verify record act verify change","verify record act verify change act verify","verify record act verify change act verify change","verify record change","verify record change act verify","verify record change act verify act verify","verify record change act verify act verify change","verify record change act verify change","verify record change act verify change act verify","verify record change act verify change act verify change"],"advisory":"A shape outside the language is reported, never refused. It is either a new kind of work or a mistake, and only the author can tell which.","added":"2026-07-29","pattern":"^(?:(?:check(?: verify check)*(?: verify)?|verify(?: check verify)*(?: check)?)|(?:check )?(?:change )?verify(?: change verify)* record(?: (?:change )?act verify)*(?: change)?)$","pattern_what":"The whole language, as a regular expression over the phase alphabet with phases space-separated and adjacent repeats collapsed. THIS is authoritative; the `shapes` list below is a bounded sample kept as examples.","is_infinite":"cycle+ and act_block* are unbounded, so no enumeration can be complete — a list of shapes is always a sample. The language is REGULAR, so it has a finite description and membership is decidable at any length. That is what makes \"map all possible workflows\" answerable at all.","bound_removed":"Until 1.13.0 membership was tested against an enumeration bounded at cycles<=3, acts<=2, which rejected legitimate methods for being long — a four-cycle method was flagged with nothing wrong with it. The pattern has no bound and accepts all 174 previously enumerated shapes, all 13 known methods, and the 4-cycle, 10-cycle and 3-act cases the bound refused.","verified_rejects":{"change verify record act verify change record":"a reconcile that gets recorded","change record":"record with nothing verified before it","change verify act verify":"act with no record before it","change verify record act":"act with no confirm after it","change verify":"changes something and records nothing","record":"record alone","act verify":"act with no record"}},"method_space":{"what":"A shape is not a workflow. A workflow is a shape PLUS a verb at each position, so the method space is the shape language crossed with the verb assignments.","formula":"methods(n) = sum over shapes s of length n of prod over positions p in s of |verbs(phase p)|","verbs_per_phase":{"check":6,"change":6,"verify":2,"record":1,"act":9},"counts_by_length":{"1":8,"2":26,"3":132,"4":564,"5":2880,"6":15192,"7":85104,"8":473904,"9":2840832},"total_to_length_9":3418642,"is_infinite":"The shape language is infinite, so the method space is too. These are counts of a prefix, not a total.","what_is_closed":"The SHAPES are closed — a regular language with a finite pattern and decidable membership at any length. Given a fixed vocabulary the count at each length is exact.","what_is_open":"The VOCABULARY. 24 verbs is a starting set, not an inventory of every thing an agent can do. On 2026-07-29 six real step names fell outside it — tests, gates, rebuild, changelog, rehash, pypi-upload — and each was resolved by renaming rather than by adding a verb, which was right for synonyms and would be wrong for a genuinely new kind of work. A new verb changes the counts; it does not change the shapes.","uneven_on_purpose_or_not":"record has exactly ONE verb (commit) while act has nine. That asymmetry is unexamined. It may be correct — there is arguably one way to record — or it may mean record is under-specified next to archive, snapshot or log. Recorded here as a question, not settled.","well_formed_is_not_worth_having":"The language says which methods are well formed. It does not say which are useful. Thirteen are named because they correspond to recognisable jobs; the rest are valid and unnamed, and naming them would be inventing work rather than observing it.","added":"2026-07-29"}}},"directory":{"what":"Every grammar, vocabulary and map in phronesis, and where each one lives. Written 2026-07-29 after searching the disk rather than recalling — which is how laserbrain-swift and a second dictionary were found at all.","maps":[{"name":"laserbrain grammar","is":"reasoning state: nine verdicts, Φ, the normaliser, calibration, the six layers, the operator patterns, the dictionary, the phases and the shape language","canonical":"lasermind/grammar.json","version":"1.20.0","copies":["functions/api/laserbrain/grammar.json","workers/laserbrain-mcp-remote/src/grammar.json","laserbrain-sdk/laserbrain/grammar.json"],"derived":["laserbrain-swift/Tests/LaserbrainDriftTests/grammar-vectors.json (stopwords only; checked, never written)"],"checked_by":"scripts/check-grammar-version.mjs, scripts/sync-grammar.mjs"},{"name":"shape language","is":"which ordered SHAPES a method may have — a regular language over the phase alphabet, infinite, with decidable membership","canonical":"this file, dictionary.phases.shape_language","checked_by":"Workflow.lint() reports shape-unknown"},{"name":"agent dictionary","is":"the harness vocabulary: 18 terms and 24 step verbs, each verb carrying its default position on the operator's two axes","canonical":"this file, dictionary.terms and dictionary.steps","collides_with":"research dictionary, on `ground` — see the term itself"},{"name":"research dictionary","is":"the Coherence Framework vocabulary: ground state, displacement, the Fiedler value, the introspection ceiling","canonical":"phronesis-world/app/research/dictionary/page.tsx","collides_with":"agent dictionary, on `ground` — disambiguated on both sides 2026-07-29"},{"name":"spectral grammar","is":"grammatical reasoning as eigenvalue decomposition of a discourse graph: text → sentence graph → Laplacian → eigenspectrum, with bands mapped to neural oscillation analogues","canonical":"phronesis-world/lib/spectral-grammar.ts","serves":"/api/spectral/analyze","note":"A different object entirely from the laserbrain grammar. It analyses TEXT; laserbrain scores an agent's spelled STATE. They share the word grammar and nothing else."},{"name":"field vocabulary","is":"the four-band word list the live field speaks in — G0 ground, G1 wind, G2 form, G3 change","canonical":"laserbrain-sdk/laserbrain (VOCABULARY), served by field tools"},{"name":"grammar formalization","is":"the formal write-up behind all of it","canonical":"phronesis/papers/grammar_formalization.tex","deposited":"phronesis-world/public/deposits/grammar-formalization"}],"the_lesson":"Two of the seven were found by searching the disk, not by remembering them. A map that is not written down is not a map, and a vocabulary nobody lists twice gets written twice.","added":"2026-07-29"},"modulation":{"what":"The POLICY layer. The detector says an agent left its ground; this says which drifts a given role should act on. Detection is the theorem and is identical for everyone; what a role tolerates is negotiable, which is why it lives here and not in the instrument.","why_here":"It lived only in workers/laserbrain-mcp-remote/src/teams.ts, so modulate could be served by the Worker and by nothing else — a local MCP server would have had to duplicate the table, making a fourth copy of a list this project has already watched drift twice. Moved to the grammar 2026-07-29 so every implementation reads one source.","modes":["ungrammatical","topic-drift","echo-spiral","oscillating","deliberation-stall","goal-drift","stalled","self-report:stuck","self-report:circling"],"depths":{"deep":["ungrammatical","topic-drift","goal-drift"],"balanced":["ungrammatical","topic-drift","goal-drift","echo-spiral","oscillating","self-report:stuck","self-report:circling"],"tight":["ungrammatical","topic-drift","echo-spiral","oscillating","deliberation-stall","goal-drift","stalled","self-report:stuck","self-report:circling"]},"means":{"deep":"only the hard, unambiguous drifts return it — it may recurse through stalls and momentary agreement, because an explorer needs room.","balanced":"also returns on the mid drifts (echo, cycles, self-report), tolerates a stall.","tight":"returns on any drift at all."},"added":"2026-07-29","presets":[{"name":"deep-search","task":"deep exploratory search or research","roles":[{"role":"explorer","recurse":"deep"},{"role":"checker","recurse":"tight","return":"The exploration has drifted. Restate the goal and verify the last step against it."}]},{"name":"iterative-refinement","task":"iterative drafting and critique","roles":[{"role":"drafter","recurse":"balanced"},{"role":"critic","recurse":"balanced","modes":["echo-spiral","topic-drift","ungrammatical"],"return":"You are agreeing, not improving. Name one concrete flaw and change it."}]},{"name":"adversarial-deliberation","task":"debate toward a resolved answer","roles":[{"role":"advocate-a","recurse":"deep"},{"role":"advocate-b","recurse":"deep"},{"role":"synthesizer","recurse":"tight","return":"The debate is looping. State the single decision that resolves the shared goal."}]}],"why_presets_here":"The recursion-team catalogue lived only in teams.ts too, so a local server could offer modulate with depths but not with teams — the same divergence one level down. Lifted from teams.ts verbatim 2026-07-29."}}