{
    "version": "https://jsonfeed.org/version/1",
    "title": "beyond10x Blog",
    "home_page_url": "https://beyond10x.github.io/updates/field-notes/",
    "description": "beyond10x Blog",
    "items": [
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.24.0 — the docs say what the tooling does, and a tag cuts its own release | AEP</span><span data-pagefind-meta=\"description\">The site had drifted to the point of misdescribing the repository: since 0.13.0 the code gained 7,805 lines and the website gained three. Plus a release workflow, and a self-test that found a real defect on its first run.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0245-the-docs-catch-up.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0245-the-docs-catch-up.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Since <code>0.13.0</code> this repository gained <strong>7,805 lines</strong> of code and its website gained <strong>three</strong>.\n<code>protocol reverse</code> — four verbs and 2,782 lines — had <strong>no mention anywhere on the site</strong>, and the\nstatus page still opened <em>\"current as of <code>0.10.0-horizons-dogfood-lab</code>\"</em>.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-page-that-was-missing\">The page that was missing<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/#the-page-that-was-missing\" class=\"hash-link\" aria-label=\"Direct link to The page that was missing\" title=\"Direct link to The page that was missing\" translate=\"no\">​</a></h2>\n<p><a class=\"\" href=\"https://beyond10x.github.io/docs/aep/concepts/lifecycles/\">Lifecycles, decided as data</a> — the status ladder is a YAML file decided\nby <code>entity-core</code>, a rung may cost evidence or open on a date, and every write is journalled.</p>\n<p>It also states what that kernel <strong>does not</strong> do, because <em>\"entity runtime\"</em> invites the reading that\nit stores something. It performs <strong>no IO at all</strong> — a scan over its own sources refuses the tokens\nfor filesystem, clock, network and randomness — so <strong>every byte written here is written here</strong>. The\ndependency buys a verdict, not a store.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-rest-of-the-site\">The rest of the site<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/#the-rest-of-the-site\" class=\"hash-link\" aria-label=\"Direct link to The rest of the site\" title=\"Direct link to The rest of the site\" translate=\"no\">​</a></h2>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>page</th><th>now says</th></tr></thead><tbody><tr><td><strong>CLI reference</strong></td><td><code>protocol reverse</code>, plus <code>artifact history</code> and <code>artifact evidence</code></td></tr><tr><td><strong>Where this stands</strong></td><td>current as of <code>0.23.2</code>, with the ladder, the engine's four mechanisms, and adoption from the other end</td></tr><tr><td><strong>Roadmap</strong></td><td>the delivered table ran to <code>0.10.0</code> and now runs to <code>0.24.0</code></td></tr><tr><td><strong>Limitations</strong></td><td>the store <strong>does</strong> have a journal since <code>0.19.0</code>; the contract gap is unchanged and says so</td></tr><tr><td><strong>Vocabulary</strong></td><td>kinds and statuses are open to authors, and why <code>evidence_kinds</code> is closed</td></tr><tr><td><strong>/releases</strong></td><td><strong>one post per release, all 33 of them</strong> — the backported ones marked as written retrospectively, with no invented command output</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_8allq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"counts-each-re-derived-rather-than-copied-forward\">Counts, each re-derived rather than copied forward<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/#counts-each-re-derived-rather-than-copied-forward\" class=\"hash-link\" aria-label=\"Direct link to Counts, each re-derived rather than copied forward\" title=\"Direct link to Counts, each re-derived rather than copied forward\" translate=\"no\">​</a></h2>\n<p>CLI verbs 17 → <strong>20</strong>. Artifact lifecycles 8 → <strong>12</strong>. This repository's own plan 59 → <strong>101</strong>\nartifacts. The document tree 45 → <strong>49</strong> files. The gate ten → <strong>twelve</strong> steps, in five files.</p>\n<p><code>AGENTS.md</code> also still claimed the billing suite runs <strong>27</strong> scenarios where its own guard asserts\n<strong>29</strong> — a count the gap register closed in two places and missed in a third.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-tag-now-cuts-its-own-release\">A tag now cuts its own release<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/#a-tag-now-cuts-its-own-release\" class=\"hash-link\" aria-label=\"Direct link to A tag now cuts its own release\" title=\"Direct link to A tag now cuts its own release\" translate=\"no\">​</a></h2>\n<p><code>.github/workflows/release.yml</code> fires on a version tag, runs <code>ci.yml</code> <strong>itself</strong> — called rather\nthan copied, so a tag cannot ship against a shorter gate than <code>main</code> does — and takes its notes from\nthe tag's own section of the changelog.</p>\n<p>Release notes render as <strong>GFM</strong>, where a single newline becomes a <code>&lt;br&gt;</code>, so a file hard-wrapped at\n100 columns arrives broken after <em>\"added\"</em> and before <em>\"the\"</em>. The file stays wrapped, because that\nis the right shape for something reviewed in a diff, and only the notes are joined.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-self-test-earned-its-place-immediately\">The self-test earned its place immediately<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/#the-self-test-earned-its-place-immediately\" class=\"hash-link\" aria-label=\"Direct link to The self-test earned its place immediately\" title=\"Direct link to The self-test earned its place immediately\" translate=\"no\">​</a></h2>\n<p><code>cargo xtask notes --self-test</code> holds the eight shapes the reflow must not damage, and it runs\n<strong>before</strong> the notes are generated — because the failure it catches is silent, and nobody re-reads a\nrelease they already cut.</p>\n<p>On its first run it failed. <strong>A line ending in two spaces is Markdown asking for a break</strong>, and the\nreflow was ending the paragraph but dropping the two spaces. The break survived only because GFM\nturns a bare newline into <code>&lt;br&gt;</code> — standing on <strong>the exact quirk the reflow exists to remove</strong>.</p>\n<p>The same defect was in the original Python implementation in <code>entity-runtime</code>, whose own self-test\nhad a case for it <strong>asserting the wrong expectation</strong>. Both are fixed.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-docs-catch-up/",
            "title": "0.24.0 — the docs say what the tooling does, and a tag cuts its own release",
            "summary": "The site had drifted to the point of misdescribing the repository: since 0.13.0 the code gained 7,805 lines and the website gained three. Plus a release workflow, and a self-test that found a real defect on its first run.\n",
            "date_modified": "2026-08-26T00:45:30.000Z",
            "tags": [
                "release",
                "docs",
                "ci"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-first-verified-tag/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.23.2 — the first tag this repository has verified | AEP</span><span data-pagefind-meta=\"description\">CI had been red for eleven consecutive releases behind a green local gate, because task check was missing exactly the two jobs CI also ran. One failure arrived through the lockfile with no source change at all.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0118-the-first-verified-tag.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0118-the-first-verified-tag.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>The least comfortable release note here.</p>\n<p><strong>CI had been red for eleven consecutive releases</strong> — every tag from <code>0.13.0</code> to <code>0.23.1</code> — with a\ngreen local gate the whole time.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"two-causes-both-in-the-two-jobs-the-gate-did-not-run\">Two causes, both in the two jobs the gate did not run<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-first-verified-tag/#two-causes-both-in-the-two-jobs-the-gate-did-not-run\" class=\"hash-link\" aria-label=\"Direct link to Two causes, both in the two jobs the gate did not run\" title=\"Direct link to Two causes, both in the two jobs the gate did not run\" translate=\"no\">​</a></h2>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>job</th><th>cause</th></tr></thead><tbody><tr><td><code>MSRV 1.85</code></td><td>a transitive dependency raised <strong>its own</strong> <code>rust-version</code>, so the declared MSRV stopped holding</td></tr><tr><td><code>Website</code></td><td>a markdown link from a documentation page into the repository tree, which the site's build resolves</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_6allq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>The MSRV failure is the instructive one: it arrived <strong>through the lockfile</strong>. <code>idna_adapter@1.2.2</code>\npulled in <code>icu_*@2.3.0</code>, which need rustc 1.88. <strong>No commit of ours touched a line of Rust</strong>, and\nnothing local noticed for eleven releases.</p>\n<p>The fix was to pin <code>idna_adapter</code> to a version that uses <code>unicode-normalization</code> instead — which\nalso drops eight crates from the tree. The alternative was raising the declared MSRV, which would\nhave quietly broken the promise the README makes to anybody building this.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-actual-defect\">The actual defect<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-first-verified-tag/#the-actual-defect\" class=\"hash-link\" aria-label=\"Direct link to The actual defect\" title=\"Direct link to The actual defect\" translate=\"no\">​</a></h2>\n<p><code>task check</code> did not run <code>msrv</code> or <code>website</code>, while <strong>its own description said \"everything CI\nruns\"</strong>.</p>\n<p>That is the whole mechanism by which a red CI survives eleven releases behind a green gate. <strong>A gate\nthat covers less than the gate it claims to be is worse than one that admits its scope</strong> — because\nthe second kind makes you go and look.</p>\n<p>It runs twelve steps now, and this list and the CI workflow are checked against each other whenever\neither changes.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-cut-a-release-for-it\">Why cut a release for it<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-first-verified-tag/#why-cut-a-release-for-it\" class=\"hash-link\" aria-label=\"Direct link to Why cut a release for it\" title=\"Direct link to Why cut a release for it\" translate=\"no\">​</a></h2>\n<p>No behavioural change at all. The tag exists so there is <strong>one commit in the history whose green is\na fact rather than an assumption</strong>, and so every tag after it can be compared to something.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-first-verified-tag/",
            "title": "0.23.2 — the first tag this repository has verified",
            "summary": "CI had been red for eleven consecutive releases behind a green local gate, because task check was missing exactly the two jobs CI also ran. One failure arrived through the lockfile with no source change at all.\n",
            "date_modified": "2026-08-25T23:18:01.000Z",
            "tags": [
                "release",
                "ci"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-pin-says-what-it-links/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.23.1 — the pin says what it links, and the ladder says draft | AEP</span><span data-pagefind-meta=\"description\">Two corrections that are the same mistake in two places: a dependency pin recording a tag two releases behind what exists, and a new ladder starting at drafted — one letter from a built-in.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0055-the-pin-says-what-it-links.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0055-the-pin-says-what-it-links.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>A small release, and both fixes are the same mistake wearing different clothes: <strong>a label that had\ndrifted from the thing it names.</strong></p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-pin\">The pin<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-pin-says-what-it-links/#the-pin\" class=\"hash-link\" aria-label=\"Direct link to The pin\" title=\"Direct link to The pin\" translate=\"no\">​</a></h2>\n<p><code>aep-backend-markdown</code> pinned <code>entity-core</code> at a tag <strong>two releases behind what existed</strong>.</p>\n<p>Nothing this crate links actually moved — the source is byte-identical between the two tags, because\nthe releases in between carried an examples-only change. So this changed no behaviour at all.</p>\n<p>It was still worth fixing, for a reason that is not about this pin: <strong>a pin stale by label is a pin\nnobody trusts to be current by content either.</strong> The next person reading it has to go and check\nwhether the drift matters, every time, which is exactly the work a pin exists to save.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-ladder\">The ladder<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-pin-says-what-it-links/#the-ladder\" class=\"hash-link\" aria-label=\"Direct link to The ladder\" title=\"Direct link to The ladder\" translate=\"no\">​</a></h2>\n<p><code>outbound-claim</code> started at <code>drafted</code>, not <code>draft</code>.</p>\n<p>Every other shipped ladder starts at the built-in <code>draft</code>. An invented rung <strong>one letter from a\nbuilt-in</strong> is a typo wearing a vocabulary's clothes — and it would have been inherited by everybody\nwho copied the file.</p>\n<p>This is the boundary the open vocabulary was designed to hold. <strong>The vocabulary is open to authors,\nnot to near-misses.</strong> A status is accepted because <em>some ladder declares it</em>, never because it\nparses — but a ladder can still declare something its author did not mean to, and the first shipped\nexample doing so is the one that teaches it to everybody else.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-pin-says-what-it-links/",
            "title": "0.23.1 — the pin says what it links, and the ladder says draft",
            "summary": "Two corrections that are the same mistake in two places: a dependency pin recording a tag two releases behind what exists, and a new ladder starting at drafted — one letter from a built-in.\n",
            "date_modified": "2026-08-25T22:55:19.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/a-claim-that-left-the-boundary/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.23.0 — a claim that left the boundary | AEP</span><span data-pagefind-meta=\"description\">Every other ladder here models evidence flowing inward. An outbound claim runs the other way — a number already in a customer's inbox — and sending is not undoable. Added as a YAML file with no Rust change at all, which is what the whole entity-runtime programme was for.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0049-a-claim-that-left-the-boundary.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0049-a-claim-that-left-the-boundary.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Every ladder in this repository models evidence flowing <strong>inward</strong>: something was observed, and an\nartifact's status records what we now know.</p>\n<p>An outbound claim runs the other way. A number in a customer's inbox. A status page saying\n\"resolved\". An availability figure in a renewal deck. Those are assertions that <strong>already left the\nboundary</strong>, and nothing here modelled them.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-ladder\">The ladder<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-claim-that-left-the-boundary/#the-ladder\" class=\"hash-link\" aria-label=\"Direct link to The ladder\" title=\"Direct link to The ladder\" translate=\"no\">​</a></h2>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact lifecycle outbound-claim</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">outbound-claim starts at draft</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  cleared -&gt; sent</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  corrected -&gt; nothing</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  correction-owed -&gt; corrected</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  draft -&gt; cleared</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  sent -&gt; correction-owed, standing</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  standing -&gt; correction-owed</span><br></div></code></pre></div></div>\n<p><strong>Sending is not undoable, and the ladder says so:</strong></p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact move outbound-claim:q3-uptime </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--to</span><span class=\"token command bash language-bash\"> sent</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">outbound-claim:q3-uptime moved cleared -&gt; sent (revision 3)</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact move outbound-claim:q3-uptime </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--to</span><span class=\"token command bash language-bash\"> draft</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">outbound-claim:q3-uptime is sent; an outbound-claim may move to: correction-owed, standing</span><br></div></code></pre></div></div>\n<p>There is no path from <code>sent</code> back to <code>draft</code>. A ladder that allowed one would model retraction as an\n<strong>edit</strong> — the claim would simply stop having been made — and the customer would still have the\nemail.</p>\n<p>So a wrong claim moves <strong>forward</strong>, never back. <code>correction-owed</code>, then <code>corrected</code>, which is a <em>new\noutbound act</em> with its own evidence, costing <strong>two</strong> approvals where the original cost one. <strong>Fixing\na claim costs a second claim.</strong> That is true in the world, and the ladder should not be kinder than\nthe world.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-correction-owed-is-a-rung-and-not-a-flag\">Why <code>correction-owed</code> is a rung and not a flag<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-claim-that-left-the-boundary/#why-correction-owed-is-a-rung-and-not-a-flag\" class=\"hash-link\" aria-label=\"Direct link to why-correction-owed-is-a-rung-and-not-a-flag\" title=\"Direct link to why-correction-owed-is-a-rung-and-not-a-flag\" translate=\"no\">​</a></h2>\n<p>The rung names the state precisely: <strong>sent, known wrong, audience not yet told.</strong></p>\n<p>It is the most expensive state an organisation can be in and the easiest one to leave undocumented,\nbecause nobody wants to write it down. A rung is a column <code>protocol artifact board</code> prints; a flag\nis a field nobody queries.</p>\n<p>It is deliberately <strong>not terminal</strong> and deliberately <strong>not counted as approved</strong> — a claim in\n<code>correction-owed</code> is a live obligation, and anything treating it as finished would let the most\nimportant case disappear from a report.</p>\n<p>There is no <code>retracted</code>. A retraction is itself an outbound claim — <strong>you have to tell somebody</strong> —\nso it is a <code>corrected</code> whose content is a withdrawal, not a rung that quietly makes the original\nstop counting.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-part-that-is-actually-the-headline\">The part that is actually the headline<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-claim-that-left-the-boundary/#the-part-that-is-actually-the-headline\" class=\"hash-link\" aria-label=\"Direct link to The part that is actually the headline\" title=\"Direct link to The part that is actually the headline\" translate=\"no\">​</a></h2>\n<p><strong>A whole new kind of artifact, with six rungs and two evidence requirements, arrived as one YAML\nfile and no Rust change at all.</strong></p>\n<p>That is the sentence the entity-runtime programme was for. Ten releases earlier it would have been a\npull request against this repository, a review, a release, and an upgrade for everybody. Now it is a\nfile you write in your own tree.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/a-claim-that-left-the-boundary/",
            "title": "0.23.0 — a claim that left the boundary",
            "summary": "Every other ladder here models evidence flowing inward. An outbound claim runs the other way — a number already in a customer's inbox — and sending is not undoable. Added as a YAML file with no Rust change at all, which is what the whole entity-runtime programme was for.\n",
            "date_modified": "2026-08-25T22:49:54.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/a-second-transcript-shape/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.22.0 — a second harness, and what it immediately found | AEP</span><span data-pagefind-meta=\"description\">One trace-spec/1 specification now decides two transcript shapes, so harness neutrality stops being a claim with one case behind it. Plus three prose counts re-derived from the commands that print them.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0045-a-second-transcript-shape.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0045-a-second-transcript-shape.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Every behavioural document here is published as <strong>harness-neutral</strong>, and until this release exactly\none transcript adapter existed. So <em>\"neutral\"</em> was a claim with <strong>no second case behind it</strong>.</p>\n<p>A vocabulary tested against one harness is a vocabulary shaped like that harness, and <strong>nobody can\ntell which from the inside</strong>.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-second-case\">The second case<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-second-transcript-shape/#the-second-case\" class=\"hash-link\" aria-label=\"Direct link to The second case\" title=\"Direct link to The second case\" translate=\"no\">​</a></h2>\n<p>A reader for a second transcript shape, so one <code>trace-spec/1</code> specification now decides both. The\nspecification did not change to accommodate it, which is the result the exercise was for.</p>\n<p>Two things stated plainly rather than implied, because the difference matters:</p>\n<ul>\n<li class=\"\">the committed fixtures are <strong>synthetic</strong>, and every place they are used says so;</li>\n<li class=\"\">the <strong>verified</strong> reader for that harness's transcripts lives in\n<a href=\"https://github.com/beyond10x/metaharness\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">metaharness</a>, checked against thousands of real\nrollout files. This one is a <strong>neutrality probe on constructed bytes</strong> — it answers the vocabulary\nquestion and does not claim to read anybody's transcripts in production.</li>\n</ul>\n<p>The claim this release earns is precise: <strong>the vocabulary is neutral.</strong> The <em>driving</em> path still has\nnever met a second harness, and the limitations page says so.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"three-counts-re-derived\">Three counts, re-derived<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-second-transcript-shape/#three-counts-re-derived\" class=\"hash-link\" aria-label=\"Direct link to Three counts, re-derived\" title=\"Direct link to Three counts, re-derived\" translate=\"no\">​</a></h2>\n<p>Three prose literals had drifted from the counts their own gates print. Each was corrected by\n<strong>running the command beside it</strong> rather than by picking the number that looked right:</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>claim</th><th>was</th><th>is</th></tr></thead><tbody><tr><td>billing suite scenarios</td><td>27</td><td><strong>29</strong></td></tr><tr><td>browser boundary claims held</td><td>17</td><td><strong>counted at run time</strong></td></tr><tr><td>revision-pair scenarios</td><td>nine</td><td><strong>ten</strong></td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_callq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>The middle one is the fix worth copying: <code>smoke.mjs</code> now <strong>increments a counter in its own check\nfunction</strong> and prints what it actually checked. It cannot drift again, because there is no second\ncopy of the number to drift from.</p>\n<p>For the first, a new guard reads the count <strong>out of the suite's own source</strong> and fails if the prose\ndisagrees — because correcting two copies without tying them together only resets the clock.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/a-second-transcript-shape/",
            "title": "0.22.0 — a second harness, and what it immediately found",
            "summary": "One trace-spec/1 specification now decides two transcript shapes, so harness neutrality stops being a claim with one case behind it. Plus three prose counts re-derived from the commands that print them.\n",
            "date_modified": "2026-08-25T22:45:27.000Z",
            "tags": [
                "release",
                "trace",
                "portability"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-engines-mechanisms/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.21.0 — four mechanisms the engine and driver were missing | AEP</span><span data-pagefind-meta=\"description\">Evidence names its subject, so a green run for one story can no longer discharge another story's gate. An advisory tier that reports and gates nothing. A circuit breaker on step dependencies. And the driver writes down what a step was not allowed to do.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0025-the-engines-mechanisms.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0025-the-engines-mechanisms.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Four mechanisms, each closing a gap where the rule existed and nothing enforced it.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"evidence-names-its-subject\">Evidence names its subject<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-engines-mechanisms/#evidence-names-its-subject\" class=\"hash-link\" aria-label=\"Direct link to Evidence names its subject\" title=\"Direct link to Evidence names its subject\" translate=\"no\">​</a></h2>\n<p>A record may declare what it is about. If the declared subject does not match the task it is\nsubmitted against, it is refused — <strong>before the record is constructed</strong>, not after.</p>\n<p>In a sentence: <strong>a green test run for one story can no longer discharge a different story's gate.</strong>\nThat was possible before, it was silent, and the audit trail would have looked correct.</p>\n<p>Placing the guard before construction is deliberate. A refused record that got built is a refused\nrecord that can be logged, cached, or passed on by something that did not check the verdict.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"an-advisory-enforcement-tier\">An advisory enforcement tier<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-engines-mechanisms/#an-advisory-enforcement-tier\" class=\"hash-link\" aria-label=\"Direct link to An advisory enforcement tier\" title=\"Direct link to An advisory enforcement tier\" translate=\"no\">​</a></h2>\n<p>A requirement may be declared <strong>advisory</strong>, with an owner and an exit criterion. It is evaluated,\nreported and counted — and it <strong>gates nothing</strong>.</p>\n<p>This exists because the realistic alternative to a soft rule is not a hard rule; it is <strong>prose in a\nwiki</strong>. A team can now measure how often a proposed rule <em>would</em> have fired, on real work, before\nanybody's build turns red.</p>\n<p>The owner and the exit criterion are <strong>required at parse time</strong>, so an advisory requirement cannot\nquietly become permanent through nobody remembering to revisit it. A rule with no exit criterion is\na rule that never graduates and never dies.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"a-dependency-that-keeps-failing-stops-being-called\">A dependency that keeps failing stops being called<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-engines-mechanisms/#a-dependency-that-keeps-failing-stops-being-called\" class=\"hash-link\" aria-label=\"Direct link to A dependency that keeps failing stops being called\" title=\"Direct link to A dependency that keeps failing stops being called\" translate=\"no\">​</a></h2>\n<p>A step map may declare <code>depends_on</code> and a circuit breaker. A repeatedly failing dependency <strong>opens\nthe breaker</strong> instead of being retried, and the run says the breaker is open rather than producing\nthe tenth identical timeout.</p>\n<p>Retry and circuit-breaking had been prose in every step map — which is to say, enforced by whoever\nread it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-driver-writes-what-a-step-was-not-allowed-to-do\">The driver writes what a step was <strong>not</strong> allowed to do<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-engines-mechanisms/#the-driver-writes-what-a-step-was-not-allowed-to-do\" class=\"hash-link\" aria-label=\"Direct link to the-driver-writes-what-a-step-was-not-allowed-to-do\" title=\"Direct link to the-driver-writes-what-a-step-was-not-allowed-to-do\" translate=\"no\">​</a></h2>\n<p>Refusals are emitted as their own <code>trace-spec/1</code> document, with <code>tool.absent</code> expectations. <strong>The\nabsence of a tool call becomes a checkable fact rather than a silence.</strong></p>\n<p>This closes a real hole in reasoning about a governed run: <em>\"the agent did not shell out\"</em> and\n<em>\"the transcript contains no record either way\"</em> look identical in a log, and only one of them is a\nfinding.</p>\n<p>If a run refused nothing, <strong>no document is written at all</strong> — an empty specification is refused by\nthe format itself, and a file asserting nothing is worse than no file.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-engines-mechanisms/",
            "title": "0.21.0 — four mechanisms the engine and driver were missing",
            "summary": "Evidence names its subject, so a green run for one story can no longer discharge another story's gate. An advisory tier that reports and gates nothing. A circuit breaker on step dependencies. And the driver writes down what a step was not allowed to do.\n",
            "date_modified": "2026-08-25T22:25:17.000Z",
            "tags": [
                "release",
                "aep",
                "driver",
                "evidence"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/evidence-names-what-it-is-about/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.20.0 — evidence you record, and provenance for a decision | AEP</span><span data-pagefind-meta=\"description\">protocol artifact evidence records an observation against an artifact so a later move can be decided on it. And a move now separates evidence that was recorded from evidence that was asserted — saying so at the moment it leans on the weaker one.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-26-0003-evidence-names-what-it-is-about.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-26-0003-evidence-names-what-it-is-about.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p><code>0.15.0</code> let a rung cost evidence. This release is how the evidence gets there.</p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact evidence outbound-claim:q3-uptime </span><span class=\"token command bash language-bash punctuation\" style=\"color:#393A34\">\\</span><span class=\"token command bash language-bash\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command bash language-bash\">    </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--kind</span><span class=\"token command bash language-bash\"> approval </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--source</span><span class=\"token command bash language-bash\"> </span><span class=\"token command bash language-bash string\" style=\"color:#e3116c\">\"legal review\"</span><span class=\"token command bash language-bash\"> </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--ref</span><span class=\"token command bash language-bash\"> https://example.invalid/approvals/814</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">outbound-claim:q3-uptime: approval recorded from legal review</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  on hand: approval=1</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact move outbound-claim:q3-uptime </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--to</span><span class=\"token command bash language-bash\"> cleared</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">outbound-claim:q3-uptime moved draft -&gt; cleared (revision 2)</span><br></div></code></pre></div></div>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-record-carries-when-somebody-looked\">The record carries when somebody looked<a href=\"https://beyond10x.github.io/updates/field-notes/aep/evidence-names-what-it-is-about/#the-record-carries-when-somebody-looked\" class=\"hash-link\" aria-label=\"Direct link to The record carries when somebody looked\" title=\"Direct link to The record carries when somebody looked\" translate=\"no\">​</a></h2>\n<p><code>--at</code> defaults to now, <strong>read at the edge</strong> and written into the record — so the observation\ncarries when somebody <em>looked</em>, not when the file was parsed. That is the same <code>observed_at</code> rule\nthe engine has used since <code>0.10.0</code>, now available from the planning side.</p>\n<p><code>--source</code> and <code>--ref</code> are how a record stops being an assertion: <em>where it came from</em> and <em>where to\ngo and look</em>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"provenance-recorded-versus-asserted\">Provenance: recorded versus asserted<a href=\"https://beyond10x.github.io/updates/field-notes/aep/evidence-names-what-it-is-about/#provenance-recorded-versus-asserted\" class=\"hash-link\" aria-label=\"Direct link to Provenance: recorded versus asserted\" title=\"Direct link to Provenance: recorded versus asserted\" translate=\"no\">​</a></h2>\n<p>A move now records the <strong>provenance</strong> of what decided it, separating evidence that was <strong>recorded</strong>\nfrom evidence that was <strong>asserted</strong> at the moment of the move — and <strong>a move leaning on an assertion\nsays so as it happens</strong>.</p>\n<p>The consequence is about a specific future moment: somebody auditing, months later, why a gate\nopened. Without this, both cases look identical in the trail. With it, the weaker claim is visible\n<strong>at the point of decision</strong> — where somebody could still have objected — rather than discoverable\nafterwards, when the only options are accept or unwind.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/evidence-names-what-it-is-about/",
            "title": "0.20.0 — evidence you record, and provenance for a decision",
            "summary": "protocol artifact evidence records an observation against an artifact so a later move can be decided on it. And a move now separates evidence that was recorded from evidence that was asserted — saying so at the moment it leans on the weaker one.\n",
            "date_modified": "2026-08-25T22:03:33.000Z",
            "tags": [
                "release",
                "aep",
                "planning",
                "evidence"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-plan-has-a-history/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.19.0 — the plan has a history | AEP</span><span data-pagefind-meta=\"description\">The markdown store gains an append-only journal, so what happened to an artifact becomes a question you can ask rather than a git log you reconstruct. A corrupt line is skipped and counted, never silently dropped.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-2354-the-plan-has-a-history.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-2354-the-plan-has-a-history.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>The planning store is markdown files in git, so its history was always <em>there</em> — as <code>git log</code>, in a\nform you had to reconstruct. This release makes it a question you can ask.</p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact </span><span class=\"token command bash language-bash function\" style=\"color:#d73a49\">history</span><span class=\"token command bash language-bash\"> outbound-claim:q3-uptime</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">2026-08-26T00:08:16Z  operator  created as draft (revision 1)</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">2026-08-26T00:08:20Z  operator  approval recorded from legal review (https://example.invalid/approvals/814) (revision 1)</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">2026-08-26T00:08:20Z  operator  moved draft -&gt; cleared (revision 2)</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">2026-08-26T00:08:20Z  operator  moved cleared -&gt; sent (revision 3)</span><br></div></code></pre></div></div>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"two-details-are-the-design\">Two details are the design<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-plan-has-a-history/#two-details-are-the-design\" class=\"hash-link\" aria-label=\"Direct link to Two details are the design\" title=\"Direct link to Two details are the design\" translate=\"no\">​</a></h2>\n<p><strong>A corrupt line is skipped <em>and counted</em>.</strong> A history that quietly shortens is worse than one that\nsays it is damaged: the second is a bug report, the first is a wrong answer nobody questions.</p>\n<p><strong>Append-only, and not a cache.</strong> The journal cannot be regenerated from the files — which is\nexactly why it can answer questions the files cannot, such as what an artifact's status was before\nsomebody corrected it. A derived index would lose that on its first rebuild.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-it-does-not-close\">What it does not close<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-plan-has-a-history/#what-it-does-not-close\" class=\"hash-link\" aria-label=\"Direct link to What it does not close\" title=\"Direct link to What it does not close\" translate=\"no\">​</a></h2>\n<p>This is the markdown store's own journal, not the AEP storage contract's. The sixteen conformance\nsuites still do not run against this store, and this release does not move that. Worth saying,\nbecause \"the durable store now has a journal\" reads like it might have.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-plan-has-a-history/",
            "title": "0.19.0 — the plan has a history",
            "summary": "The markdown store gains an append-only journal, so what happened to an artifact becomes a question you can ask rather than a git log you reconstruct. A corrupt line is skipped and counted, never silently dropped.\n",
            "date_modified": "2026-08-25T21:54:35.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-typed-blocker/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.18.0 — the typed blocker, and a vocabulary that says why it is closed | AEP</span><span data-pagefind-meta=\"description\">Two rungs, and the value is entirely in the type: a blocker is typed by what would clear it, so \"blocked\" stops being a label on a card. Plus an audit of every adopter-facing vocabulary — open or closed, and what each closure buys.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-2348-the-typed-blocker.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-2348-the-typed-blocker.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact lifecycle blocker</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">blocker starts at open</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  cleared -&gt; nothing</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  open -&gt; cleared</span><br></div></code></pre></div></div>\n<p>Two rungs. The value is entirely in the <strong>type</strong>: a blocker is <strong>typed by what would clear it</strong>, so\n<em>blocked</em> stops being a label on a card and becomes a statement with a named exit.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-other-half-an-audit-of-what-is-closed\">The other half: an audit of what is closed<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-typed-blocker/#the-other-half-an-audit-of-what-is-closed\" class=\"hash-link\" aria-label=\"Direct link to The other half: an audit of what is closed\" title=\"Direct link to The other half: an audit of what is closed\" translate=\"no\">​</a></h2>\n<p>The same release published an audit of <strong>every adopter-facing vocabulary</strong> — which are open, which\nare closed, and <strong>what each closure buys</strong>.</p>\n<p>Opening a vocabulary is not automatically the better answer. <code>evidence_kinds</code> stays <strong>closed on\npurpose</strong>: an open evidence vocabulary would let a caller invent the kind of proof a gate is asking\nfor. That is not extensibility, it is a hole.</p>\n<p>The output of the audit is not <em>open everything</em>. It is that <strong>no vocabulary is closed by accident,\nand the reason is written where an adopter reads it</strong>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-that-is-a-deliverable\">Why that is a deliverable<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-typed-blocker/#why-that-is-a-deliverable\" class=\"hash-link\" aria-label=\"Direct link to Why that is a deliverable\" title=\"Direct link to Why that is a deliverable\" translate=\"no\">​</a></h2>\n<p>The failure mode it prevents is specific and common. An adopter hits a closed vocabulary, cannot\ntell whether the closure is a decision or an oversight, and either works around it — building\nsomething on a shape that was never intended — or files an issue and waits.</p>\n<p>A table saying <em>closed, and here is what that buys you</em> turns both of those into a one-minute read.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-typed-blocker/",
            "title": "0.18.0 — the typed blocker, and a vocabulary that says why it is closed",
            "summary": "Two rungs, and the value is entirely in the type: a blocker is typed by what would clear it, so \"blocked\" stops being a label on a card. Plus an audit of every adopter-facing vocabulary — open or closed, and what each closure buys.\n",
            "date_modified": "2026-08-25T21:48:17.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/obligation/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.17.0 — obligation, a commitment on a clock nobody here controls | AEP</span><span data-pagefind-meta=\"description\">A second ladder, and the rule attached to it is the point: an obligation must never gate a transition. A missed external deadline is a fact to report, not a permission to withhold.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-2342-obligation.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-2342-obligation.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>An <code>obligation</code> is a commitment on a clock <strong>nobody here controls</strong>: a customer's deadline, a\nregulator's window, a partner's delivery date.</p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact lifecycle obligation</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">obligation starts at open</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  met -&gt; nothing</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  open -&gt; met, slipped</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  slipped -&gt; met</span><br></div></code></pre></div></div>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-rung-that-justifies-the-kind\">The rung that justifies the kind<a href=\"https://beyond10x.github.io/updates/field-notes/aep/obligation/#the-rung-that-justifies-the-kind\" class=\"hash-link\" aria-label=\"Direct link to The rung that justifies the kind\" title=\"Direct link to The rung that justifies the kind\" translate=\"no\">​</a></h2>\n<p><code>slipped</code>. And the rule attached to it is the point of the whole release: <strong>an obligation must never\ngate a transition.</strong></p>\n<p>A missed external deadline is a <strong>fact to report</strong>, not a <strong>permission to withhold</strong>. A tool that\nlet a slipped obligation block your work would have turned somebody else's missed date into your\nblocked pull request — which is both unfair and useless, because you cannot fix it from here.</p>\n<p>This is also why it is a second ladder rather than a widening of the existing status vocabulary.\n<code>slipped</code> on <code>ArtifactStatus</code> would have been available to every kind, and something would\neventually have gated on it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-slipped---met-exists\">Why <code>slipped -&gt; met</code> exists<a href=\"https://beyond10x.github.io/updates/field-notes/aep/obligation/#why-slipped---met-exists\" class=\"hash-link\" aria-label=\"Direct link to why-slipped---met-exists\" title=\"Direct link to why-slipped---met-exists\" translate=\"no\">​</a></h2>\n<p>An obligation you missed and then satisfied is a real and common history. A ladder that made\n<code>slipped</code> terminal would push people to avoid recording it in the first place — and the state you\nmost want recorded is the one nobody wants to write down.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-it-cost-to-add\">What it cost to add<a href=\"https://beyond10x.github.io/updates/field-notes/aep/obligation/#what-it-cost-to-add\" class=\"hash-link\" aria-label=\"Direct link to What it cost to add\" title=\"Direct link to What it cost to add\" translate=\"no\">​</a></h2>\n<p>A YAML file. No Rust change. This is the second kind added that way, and by this point the claim\n<code>0.13.0</code> made has two releases of evidence behind it.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/obligation/",
            "title": "0.17.0 — obligation, a commitment on a clock nobody here controls",
            "summary": "A second ladder, and the rule attached to it is the point: an obligation must never gate a transition. A missed external deadline is a fact to report, not a permission to withhold.\n",
            "date_modified": "2026-08-25T21:42:16.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-open-on-a-date/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.16.0 — a rung may open on a date, and the clock is read at the edge | AEP</span><span data-pagefind-meta=\"description\">Date and duration operators join the condition language, so a rung can be shut until a date arrives. The kernel still has no clock: the instant is read at the edge and passed in, which is what makes a recorded decision re-checkable by somebody who was not there.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-2337-a-rung-may-open-on-a-date.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-2337-a-rung-may-open-on-a-date.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Some rungs should not open yet. A review window. A cooling-off period. A notice period somebody\nagreed to in a contract.</p>\n<p>This release adds <strong>date and duration operators</strong> to the condition language, so a ladder can say so.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-clock-stays-outside\">The clock stays outside<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-open-on-a-date/#the-clock-stays-outside\" class=\"hash-link\" aria-label=\"Direct link to The clock stays outside\" title=\"Direct link to The clock stays outside\" translate=\"no\">​</a></h2>\n<p>The interesting part is where the time comes from. The kernel deciding the move <strong>has no clock at\nall</strong> — reading one is banned by a scan over its own sources. The instant is read <strong>at the edge</strong> and\nhanded in as an argument.</p>\n<p>That is not fastidiousness. It is what makes the same inputs give the same verdict <strong>forever</strong>, so a\ndecision recorded today can be re-checked next year by somebody who was not there, and the answer\ndoes not depend on when they asked.</p>\n<p>A kernel that read its own clock would give different verdicts at different moments for identical\ninputs, and every recorded decision would become unfalsifiable.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"growing-a-language-one-operator-at-a-time\">Growing a language one operator at a time<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-open-on-a-date/#growing-a-language-one-operator-at-a-time\" class=\"hash-link\" aria-label=\"Direct link to Growing a language one operator at a time\" title=\"Direct link to Growing a language one operator at a time\" translate=\"no\">​</a></h2>\n<p>The condition language is data, and the standing rule is that it grows <strong>operator by operator, never\ninto a language</strong>. Two comparison operators over instants is a step; an expression evaluator would\nbe a different product.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-part-that-had-to-be-got-right\">The part that had to be got right<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-open-on-a-date/#the-part-that-had-to-be-got-right\" class=\"hash-link\" aria-label=\"Direct link to The part that had to be got right\" title=\"Direct link to The part that had to be got right\" translate=\"no\">​</a></h2>\n<p>Date <strong>parsing</strong> now lives inside a decision path, which means it has to be <strong>total</strong>. A malformed\ndate is <code>False</code> — not a panic, not a default, not \"probably fine\". Anything that can be reached by a\ngate has to have an answer for every input, including the input nobody expected.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-open-on-a-date/",
            "title": "0.16.0 — a rung may open on a date, and the clock is read at the edge",
            "summary": "Date and duration operators join the condition language, so a rung can be shut until a date arrives. The kernel still has no clock: the instant is read at the edge and passed in, which is what makes a recorded decision re-checkable by somebody who was not there.\n",
            "date_modified": "2026-08-25T21:37:16.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-cost-evidence/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.15.0 — a rung may cost evidence, and the refusal says which kind of no | AEP</span><span data-pagefind-meta=\"description\">A ladder that only says what may follow what models permission, not earning. requires: names what a rung costs, and the refusal distinguishes \"on the ladder and not yet earned\" from \"not on the ladder\" — two sentences that lead to different next actions.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-2258-a-rung-may-cost-evidence.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-2258-a-rung-may-cost-evidence.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p><code>0.13.0</code> made the status ladder data. This is the first release that spends it.</p>\n<p>A ladder that only says <em>what may follow what</em> models <strong>permission</strong>, not <strong>earning</strong>. Anybody could\nmove a story to <code>implemented</code>; the ladder had no opinion about whether anything was implemented.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-a-rung-costs\">What a rung costs<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-cost-evidence/#what-a-rung-costs\" class=\"hash-link\" aria-label=\"Direct link to What a rung costs\" title=\"Direct link to What a rung costs\" translate=\"no\">​</a></h2>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token key atrule\" style=\"color:#00a4db\">requires</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">cleared</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\">   </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">evidence</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> approval</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">at_least</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">1</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">corrected</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">{</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">evidence</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> approval</span><span class=\"token punctuation\" style=\"color:#393A34\">,</span><span class=\"token plain\"> </span><span class=\"token key atrule\" style=\"color:#00a4db\">at_least</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token number\" style=\"color:#36acaa\">2</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">}</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><br></div></code></pre></div></div>\n<p>And the refusal <strong>says which kind of no it is</strong>, which is the whole design:</p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact move outbound-claim:q3-uptime </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--to</span><span class=\"token command bash language-bash\"> cleared</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">outbound-claim:q3-uptime is draft; cleared is on the ladder and not yet earned: reaching cleared</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">needs at least 1 approval record(s). Nothing was presented at $args.evidence.approval</span><br></div></code></pre></div></div>\n<p><em>On the ladder and not yet earned</em> is a different sentence from <em>not on the ladder</em>, and the two\nlead to different next actions. One is \"go and get the approval.\" The other is \"you are trying to do\nsomething this kind of work does not do.\"</p>\n<p>A tool that collapses both into <code>refused</code> has handed you the job of guessing which.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"three-valued-like-everything-else\">Three-valued, like everything else<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-cost-evidence/#three-valued-like-everything-else\" class=\"hash-link\" aria-label=\"Direct link to Three-valued, like everything else\" title=\"Direct link to Three-valued, like everything else\" translate=\"no\">​</a></h2>\n<p>The condition is <code>True</code> / <code>False</code> / <strong><code>Unknown</code></strong>. A rung whose requirement cannot be observed\nrefuses as <code>Unknown</code>, never as <code>False</code>.</p>\n<p><em>Nobody looked</em> is not the same answer as <em>somebody looked and it failed</em>, and neither of them is a\npass.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-it-does-not-do\">What it does not do<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-cost-evidence/#what-it-does-not-do\" class=\"hash-link\" aria-label=\"Direct link to What it does not do\" title=\"Direct link to What it does not do\" translate=\"no\">​</a></h2>\n<p>The shipped <code>story</code> ladder <strong>does not</strong> declare a cost. The mechanism exists; this repository has\nnot yet spent it on its own most-used kind. That is a choice you can now make in your own tree\nwithout waiting for us.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/a-rung-may-cost-evidence/",
            "title": "0.15.0 — a rung may cost evidence, and the refusal says which kind of no",
            "summary": "A ladder that only says what may follow what models permission, not earning. requires: names what a rung costs, and the refusal distinguishes \"on the ladder and not yet earned\" from \"not on the ladder\" — two sentences that lead to different next actions.\n",
            "date_modified": "2026-08-25T20:58:08.000Z",
            "tags": [
                "release",
                "aep",
                "planning",
                "evidence"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.14 — the protocol reads a repository that already exists | AEP</span><span data-pagefind-meta=\"description\">Release 0.14.0 adds protocol reverse: four verbs that point the tooling at a repository written with none of this in mind. Three of the four write nothing, so you can run them against your own code before deciding anything.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-1605-a-repository-that-already-exists.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-1605-a-repository-that-already-exists.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Every worked example on this site starts from documents that already exist. That is the wrong end\nfor anybody deciding whether to adopt: your repository has a README, a test layout, a CI file and\nsix years of git history, and none of it was written with a protocol in mind.</p>\n<p><code>0.14.0</code> adds <code>protocol reverse</code> — four verbs that read what a repository <em>already says about\nitself</em>. <strong>Three of the four write nothing at all</strong>, which is the part that matters when you are\nevaluating a tool you do not trust yet: the worst case is a report you disagree with.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"reverse-scan--what-the-repository-says-about-itself\"><code>reverse scan</code> — what the repository says about itself<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/#reverse-scan--what-the-repository-says-about-itself\" class=\"hash-link\" aria-label=\"Direct link to reverse-scan--what-the-repository-says-about-itself\" title=\"Direct link to reverse-scan--what-the-repository-says-about-itself\" translate=\"no\">​</a></h2>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol reverse scan </span><span class=\"token command bash language-bash builtin class-name\">.</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">aep.reverse-scan/1</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">readme headings: 119</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  README.md:1  aep</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  README.md:19    Two halves, one seam</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  README.md:34    What that looks like</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  README.md:76    Is this for you</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  README.md:89    Where it sits</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  README.md:104    Status</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  ...</span><br></div></code></pre></div></div>\n<p>Headings, declared toolchains, gates, test layout — assembled into an <code>aep.reverse-scan/1</code> bundle\nthat renders as <code>text</code>, <code>yaml</code> or <code>json</code>. Nothing is written.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"reverse-history--what-the-git-history-says\"><code>reverse history</code> — what the git history says<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/#reverse-history--what-the-git-history-says\" class=\"hash-link\" aria-label=\"Direct link to reverse-history--what-the-git-history-says\" title=\"Direct link to reverse-history--what-the-git-history-says\" translate=\"no\">​</a></h2>\n<p>This is the one that surprises people. Run against this repository:</p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol reverse </span><span class=\"token command bash language-bash function\" style=\"color:#d73a49\">history</span><span class=\"token command bash language-bash\"> </span><span class=\"token command bash language-bash builtin class-name\">.</span><span class=\"token command bash language-bash\"> </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--top</span><span class=\"token command bash language-bash\"> </span><span class=\"token command bash language-bash number\" style=\"color:#36acaa\">5</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">aep.reverse-history/1</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">span: 213 commits, 1 author(s), 2026-08-19 -&gt; 2026-08-26</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">tags: 33  [0.23.2, 0.23.1, 0.23.0, 0.22.0, 0.21.0]</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">commit types: feat 95  docs 66  fix 22  chore 18  ci 3  refactor 3  test 3  style 2</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">tickets: 4</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  W4-2  5 commit(s), last 2026-08-24</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  W4-1  3 commit(s), last 2026-08-22</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">reverted: 0</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">stated expiry: 1</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  2026-08-20 87310c3  refactor(conformance): drop the per-suite workaround for colliding identifiers</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">churn: 5</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  CHANGELOG.md  109 commit(s), 1 author(s), last 2026-08-26</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  AGENTS.md  39 commit(s), 1 author(s), last 2026-08-25</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  crates/protocol-cli/src/app.rs  36 commit(s), 1 author(s), last 2026-08-25</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">dormant: 0</span><br></div></code></pre></div></div>\n<p><strong>Churn</strong> is where change concentrates. <strong>Dormant</strong> is what nobody has touched recently — a\ndifferent question from what is untested, and often a more useful one. <strong>Stated expiry</strong> finds\ncommits that said something was temporary, which is the class of comment that outlives its author's\nmemory of it.</p>\n<p><code>--recent</code> sets how many commits count as recent for dormancy; <code>--top</code> sets how many entries each\nranked section reports.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"reverse-openapi--a-specification-you-already-published\"><code>reverse openapi</code> — a specification you already published<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/#reverse-openapi--a-specification-you-already-published\" class=\"hash-link\" aria-label=\"Direct link to reverse-openapi--a-specification-you-already-published\" title=\"Direct link to reverse-openapi--a-specification-you-already-published\" translate=\"no\">​</a></h2>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol reverse openapi openapi.yaml </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--domain</span><span class=\"token command bash language-bash\"> acme.billing</span><br></div></code></pre></div></div>\n<p>Drafts an <code>ess/1</code> domain from an OpenAPI document that already exists. Standard output when <code>--out</code>\nis absent, because a verb that scatters files over a working tree the first time somebody tries it\nis a verb nobody tries twice.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"reverse-init--the-one-that-writes\"><code>reverse init</code> — the one that writes<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/#reverse-init--the-one-that-writes\" class=\"hash-link\" aria-label=\"Direct link to reverse-init--the-one-that-writes\" title=\"Direct link to reverse-init--the-one-that-writes\" translate=\"no\">​</a></h2>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol reverse init </span><span class=\"token command bash language-bash punctuation\" style=\"color:#393A34\">\\</span><span class=\"token command bash language-bash\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command bash language-bash\">    </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--protocols</span><span class=\"token command bash language-bash\"> git+https://github.com/beyond10x/aep</span><span class=\"token command bash language-bash comment\" style=\"color:#999988;font-style:italic\">#&lt;40-hex&gt; \\</span><span class=\"token command bash language-bash\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command bash language-bash\">    </span><span class=\"token command bash language-bash parameter variable\" style=\"color:#36acaa\">--profile</span><span class=\"token command bash language-bash\"> development.standard</span><br></div></code></pre></div></div>\n<p>Writes the <code>project.yaml</code> that makes a repository an adopting project, and resolves the protocol\nsource first unless <code>--no-verify</code> says not to.</p>\n<p><code>--protocols</code> takes a path <strong>or a pinned git locator</strong>, and the pin is not decoration: a governing\ndocument tree that could move under you is a gate whose meaning changes without a commit in your\nrepository.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"where-to-go-next\">Where to go next<a href=\"https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/#where-to-go-next\" class=\"hash-link\" aria-label=\"Direct link to Where to go next\" title=\"Direct link to Where to go next\" translate=\"no\">​</a></h2>\n<p>The walkthrough is\n<a href=\"https://github.com/beyond10x/aep/blob/main/docs/guide/adopting.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">Adopting a repository that already exists</a>,\nand the verb-by-verb tables are in the <a class=\"\" href=\"https://beyond10x.github.io/docs/aep/reference/cli/\">CLI reference</a>.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/a-repository-that-already-exists/",
            "title": "0.14 — the protocol reads a repository that already exists",
            "summary": "Release 0.14.0 adds protocol reverse: four verbs that point the tooling at a repository written with none of this in mind. Three of the four write nothing, so you can run them against your own code before deciding anything.\n",
            "date_modified": "2026-08-25T14:05:51.000Z",
            "tags": [
                "release",
                "aep",
                "adoption"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.13 — the ladder is data | AEP</span><span data-pagefind-meta=\"description\">Release 0.13.0 takes the status ladder every plan item climbs out of Rust and puts it in a YAML file, decided by entity-core — a separate, IO-free kernel. The consequence: modelling a kind of work this repository never anticipated stops needing a pull request here and a release.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-25-1444-the-ladder-is-data.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-25-1444-the-ladder-is-data.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Every plan item in the planning store sits at a <strong>status</strong> and climbs a <strong>ladder</strong>: <code>draft</code> →\n<code>proposed</code> → <code>active</code> → <code>implemented</code> → <code>accepted</code>. Until <code>0.13.0</code> that ladder was a hand-written\nlookup in Rust, and the consequence for anybody using the tool was concrete and annoying: <strong>a team\nwhose work does not fit the shapes we happened to think of had to send a pull request to this\nrepository and wait for a release.</strong></p>\n<p>It is a YAML file now.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-changed\">What changed<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/#what-changed\" class=\"hash-link\" aria-label=\"Direct link to What changed\" title=\"Direct link to What changed\" translate=\"no\">​</a></h2>\n<div class=\"language-yaml codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-yaml codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token comment\" style=\"color:#999988;font-style:italic\"># artifacts/lifecycles/story.yaml</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">kind</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> story</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">initial</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> draft</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token key atrule\" style=\"color:#00a4db\">transitions</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">draft</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\">       </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">proposed</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">proposed</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">active</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">active</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\">      </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">implemented</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">implemented</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\"> </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token plain\">accepted</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\">  </span><span class=\"token key atrule\" style=\"color:#00a4db\">accepted</span><span class=\"token punctuation\" style=\"color:#393A34\">:</span><span class=\"token plain\">    </span><span class=\"token punctuation\" style=\"color:#393A34\">[</span><span class=\"token punctuation\" style=\"color:#393A34\">]</span><br></div></code></pre></div></div>\n<p>Put a <code>&lt;kind&gt;.yaml</code> in your own document tree, point <code>--root</code> at it, and <code>new</code>, <code>move</code>, <code>board</code>,\n<code>lifecycle</code> and <code>validate</code> all understand the kind. No crate changes on either side.</p>\n<div class=\"language-shell-session codeBlockContainer_Ckt0 theme-code-block\" style=\"--prism-color:#393A34;--prism-background-color:#f6f8fa\"><div class=\"codeBlockContent_QJqH\"><pre tabindex=\"0\" class=\"prism-code language-shell-session codeBlock_bY9V thin-scrollbar\" style=\"color:#393A34;background-color:#f6f8fa\"><code class=\"codeBlockLines_e6Vv\"><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token command shell-symbol important\">$</span><span class=\"token command\"> </span><span class=\"token command bash language-bash\">protocol artifact lifecycle blocker</span><span class=\"token plain\"></span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token plain\"></span><span class=\"token output\">blocker starts at open</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  cleared -&gt; nothing</span><br></div><div class=\"token-line\" style=\"color:#393A34\"><span class=\"token output\">  open -&gt; cleared</span><br></div></code></pre></div></div>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"who-decides\">Who decides<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/#who-decides\" class=\"hash-link\" aria-label=\"Direct link to Who decides\" title=\"Direct link to Who decides\" translate=\"no\">​</a></h2>\n<p>Not this repository. <code>crates/plan/aep-backend-markdown/src/kernel.rs</code> hands the definition and the\nattempted move to <a href=\"https://github.com/beyond10x/entity-runtime\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\"><code>entity-core</code></a>, a kernel that lives\nin a separate repository and is taken here as a <strong>git-pinned</strong> dependency.</p>\n<p><code>entity-core</code> is IO-free <strong>by test, not by convention</strong>. A banned-token scan over its own sources\nrefuses the tokens for filesystem, network, clock, process, thread and randomness, and its entire\ndependency list is <code>serde</code> and <code>serde_json</code>. It cannot open a file, read a clock or reach a network.</p>\n<p>It is worth saying what that does <em>not</em> mean, because the phrase \"runtime\" invites the wrong\nreading:</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>entity-core does</th><th>entity-core does <strong>not</strong> do</th></tr></thead><tbody><tr><td>take an entity type as data and answer <em>is this move permitted</em></td><td>store anything — every byte the planning store writes is written here, by <code>aep-backend-markdown</code></td></tr><tr><td>evaluate a rung's conditions against values handed to it</td><td>read a clock — the instant is read at the edge and passed in as an argument</td></tr><tr><td>refuse an undeclared status by name</td><td>know what other artifacts exist, or resolve a reference</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_dallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>The arrow points one way and never back: nothing from this repository appears in a manifest of\n<code>entity-runtime</code>'s, at any version. A kernel that depended on its adopter could be shaped by one,\nand its verdicts would stop being a general answer.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-this-was-safe-to-do\">Why this was safe to do<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/#why-this-was-safe-to-do\" class=\"hash-link\" aria-label=\"Direct link to Why this was safe to do\" title=\"Direct link to Why this was safe to do\" translate=\"no\">​</a></h2>\n<p>Because it is reversible, and that was built before the dependency was taken.</p>\n<p><code>crates/plan/aep-backend-markdown/tests/kernel_equivalence.rs</code> holds the kernel's verdict identical to\nthe hand-written lookup it replaced, across every kind-and-status pair. Delete the module and the\nlookup is still standing behind it. A dependency you cannot undo is a decision somebody else gets to\nmake later.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-vocabulary-is-open-to-authors-not-to-typos\">The vocabulary is open to authors, not to typos<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/#the-vocabulary-is-open-to-authors-not-to-typos\" class=\"hash-link\" aria-label=\"Direct link to The vocabulary is open to authors, not to typos\" title=\"Direct link to The vocabulary is open to authors, not to typos\" translate=\"no\">​</a></h2>\n<p><code>ArtifactKind</code> and <code>ArtifactStatus</code> both gained an <code>Other(String)</code> variant, so a ladder may declare\nrungs nobody here named. It is deliberately <strong>not</strong> open to any string: a status is accepted because\n<em>some ladder declares it</em>, not because it parses.</p>\n<p>That distinction earned its keep two releases later, when a new ladder was written starting at\n<code>drafted</code> — one letter from the built-in <code>draft</code>, a typo wearing a vocabulary's clothes. It was\ncaught and corrected in <code>0.23.1</code>.</p>\n<p>Openness is also not the default answer everywhere. <code>evidence_kinds</code> stays <strong>closed</strong> on purpose: an\nopen evidence vocabulary would let a caller invent the kind of proof a gate is asking for. Which\nvocabularies are open, which are closed, and what each closure buys is written down rather than\ninferred.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-this-bought\">What this bought<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/#what-this-bought\" class=\"hash-link\" aria-label=\"Direct link to What this bought\" title=\"Direct link to What this bought\" translate=\"no\">​</a></h2>\n<p>Everything in the eleven releases after it. A rung that costs evidence, a rung that opens on a date,\nthree new ladders — and, in <code>0.23.0</code>, a whole new kind of artifact added as <strong>a YAML file with no\nRust change at all</strong>, which was the point of the exercise.</p>\n<p>See <a class=\"\" href=\"https://beyond10x.github.io/docs/aep/concepts/lifecycles/\">Lifecycles, decided as data</a> for the full model.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-ladder-is-data/",
            "title": "0.13 — the ladder is data",
            "summary": "Release 0.13.0 takes the status ladder every plan item climbs out of Rust and puts it in a YAML file, decided by entity-core — a separate, IO-free kernel. The consequence: modelling a kind of work this repository never anticipated stops needing a pull request here and a release.\n",
            "date_modified": "2026-08-25T12:44:15.000Z",
            "tags": [
                "release",
                "aep",
                "planning"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">We read 100 agent sessions to find out what the human actually contributes | Agentic Principles</span><span data-pagefind-meta=\"description\">A transcript study of 1,567 human turns in coding-agent sessions, separating the turns that carried information from the turns that only carried permission.</span><span data-pagefind-meta=\"project\">Agentic Principles</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">agentic-principles</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">evaluator</span><span data-pagefind-filter=\"audience\">researcher</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/agentic-principles/blob/777c7fa953dca8d5356ee2c71404275daaa9cdb0/blog/2026-08-25-what-the-operator-actually-contributes.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">blog/2026-08-25-what-the-operator-actually-contributes.md</a> · revision <code class=\"b10x-revision\" title=\"777c7fa953dca8d5356ee2c71404275daaa9cdb0\">777c7fa953dc</code></p>\n</blockquote></div>\n<p>The median instruction given to a coding agent in our sample is <strong>eleven words long</strong> and sets off\n<strong>eight tool calls</strong>. That ratio is the whole economics of agentic work in one line: a very small\namount of human input steering a very large amount of machine work.</p>\n<p>So we went looking for the obvious follow-up question. Of those eleven words — how many mattered?</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-question\">The question<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#the-question\" class=\"hash-link\" aria-label=\"Direct link to The question\" title=\"Direct link to The question\" translate=\"no\">​</a></h2>\n<p>Any team running agents at volume eventually asks where to put the automation boundary. The honest\nversion of the question is uncomfortable: <strong>which of the human's turns carry information the agent\ncould not have obtained, and which are ceremony — permission, nudging, repetition — that a script or\na fixed policy could emit instead?</strong></p>\n<p>We can now answer it with numbers rather than vibes, because agent harnesses record everything.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-we-measured\">What we measured<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#what-we-measured\" class=\"hash-link\" aria-label=\"Direct link to What we measured\" title=\"Direct link to What we measured\" translate=\"no\">​</a></h2>\n<p>We took the 100 most recently active Claude Code sessions from one heavy operator's machine, spanning\ntwelve days and 22 working directories, and rebuilt each one as a sequence of\n<code>human turn → agent operations → outcome</code>.</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>sessions</td><td>100 (18 of them already fully headless)</td></tr><tr><td>human turns</td><td>1,567</td></tr><tr><td>agent messages</td><td>33,327</td></tr><tr><td>tool calls</td><td>33,293</td></tr><tr><td>wall-clock</td><td>673 h elapsed, 222 h with gaps over 5 min removed</td></tr><tr><td>compute</td><td>~$10,200 at API list prices (these ran on a subscription; this is an equivalence, not a bill)</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_aallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>Two things in that table are worth pausing on. Agent messages and tool calls are nearly <strong>1:1</strong> —\nalmost every turn the model takes, it takes an action. And 18 sessions had no human in them at all;\nthat is the automation baseline this operator had already built before anyone measured anything.</p>\n<p><strong>On method.</strong> Counts, costs, latencies and sequence motifs are <em>observed</em> — read directly off the\ntranscripts. The labels on each human turn (intent, motivation, what information it carried, whether\nit could be replaced) are <em>inferred</em> by an LLM classifier over a closed taxonomy, and they are\njudgements, not measurements. We keep the two apart everywhere below, and we spot-checked labels\nagainst raw turn text before trusting them.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-shape-of-a-turn\">The shape of a turn<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#the-shape-of-a-turn\" class=\"hash-link\" aria-label=\"Direct link to The shape of a turn\" title=\"Direct link to The shape of a turn\" translate=\"no\">​</a></h2>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>metric</th><th>value</th></tr></thead><tbody><tr><td>median human turn</td><td>11 words / 65 characters</td></tr><tr><td>turns under 10 words</td><td>44%</td></tr><tr><td>median tool calls triggered</td><td>8</td></tr><tr><td>turns triggering no tool at all</td><td>15%</td></tr><tr><td>turns that interrupted a running agent</td><td>1%</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_eallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>And the number that reframes the problem:</p>\n<blockquote>\n<p>The agent spent <strong>229 hours idle waiting for a human to reply</strong> — <strong>34% of all session wall-clock</strong>.\nMedian wait after the agent stops: <strong>2 minutes</strong>. Ninth decile: <strong>21 minutes</strong>.</p>\n</blockquote>\n<p>A third of the elapsed time of agentic work, in this sample, was the machine waiting for a person to\nread something and type a short reply. That is the cost being paid for whatever the human turns\ncontribute. So: what do they contribute?</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-the-turns-were\">What the turns were<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#what-the-turns-were\" class=\"hash-link\" aria-label=\"Direct link to What the turns were\" title=\"Direct link to What the turns were\" translate=\"no\">​</a></h2>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>intent</th><th>share</th></tr></thead><tbody><tr><td>open new work</td><td>21%</td></tr><tr><td>approve / green-light</td><td>12%</td></tr><tr><td>narrow or expand scope</td><td>9%</td></tr><tr><td>manage the agent itself (context, config, tooling)</td><td>9%</td></tr><tr><td>ask a question</td><td>8%</td></tr><tr><td>correct an agent error</td><td>8%</td></tr><tr><td>supply outside information</td><td>8%</td></tr><tr><td>commit / push / release chores</td><td>6%</td></tr><tr><td>\"keep going\"</td><td>4%</td></tr><tr><td>ask for status</td><td>4%</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_jallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>Then we asked a sharper question of each turn: <em>did it carry anything the agent did not already\nhave?</em></p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>information contributed</th><th>share</th></tr></thead><tbody><tr><td><strong>nothing new</strong></td><td><strong>42%</strong></td></tr><tr><td>a new goal</td><td>16%</td></tr><tr><td>state only a human could see</td><td>12%</td></tr><tr><td>a taste or priority preference</td><td>11%</td></tr><tr><td>a judgement between options the agent had already surfaced</td><td>10%</td></tr><tr><td>domain knowledge the agent lacked</td><td>8%</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_lallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>Nearly half of all human turns added no information to the conversation. Widen it slightly — include\npure approvals, status requests and continuation nudges — and <strong>48% of turns (748 of 1,567) carried\nno new information</strong>, arriving in 355 consecutive runs, the longest of them nine turns deep.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"which-turns-could-be-replaced\">Which turns could be replaced<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#which-turns-could-be-replaced\" class=\"hash-link\" aria-label=\"Direct link to Which turns could be replaced\" title=\"Direct link to Which turns could be replaced\" translate=\"no\">​</a></h2>\n<p>The classifier judged each turn against four options: a deterministic rule could have emitted it, a\nfixed agent policy could have, another AI with context could have, or it genuinely needed the human.</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>replaceable by</th><th>share</th></tr></thead><tbody><tr><td>human only</td><td>44%</td></tr><tr><td>a fixed agent policy</td><td>23%</td></tr><tr><td>a deterministic rule</td><td>20%</td></tr><tr><td>another AI with context</td><td>14%</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_pallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p><strong>43% of human turns could be produced by a rule or a policy.</strong> Not \"eventually\" — from the\ntranscript alone, with the trigger visible.</p>\n<p>The interesting part is <em>which</em> intents concentrate the removable turns:</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>intent</th><th>n</th><th>% a rule or policy could emit</th></tr></thead><tbody><tr><td>manage the agent itself</td><td>136</td><td><strong>73%</strong></td></tr><tr><td>approve / green-light</td><td>190</td><td><strong>61%</strong></td></tr><tr><td>ask a question</td><td>130</td><td>35%</td></tr><tr><td>open new work</td><td>324</td><td>19%</td></tr><tr><td>narrow or expand scope</td><td>145</td><td>8%</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_sallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>Two clusters are almost pure overhead. <strong>Context management</strong> — compacting, clearing, re-orienting the\nagent after it lost the thread — is the agent's own housekeeping, delegated upward to a human who\nnotices before it does. And <strong>approval</strong> is mostly a human saying yes to something they were always\ngoing to say yes to.</p>\n<p>Scope refinement goes the other way: only 8% of those turns reduce to a rule or a policy, and 70%\nwere judged to need the human outright. That is the reassuring half of the result. Deciding <em>what</em>\nand <em>how much</em> survives automation. Deciding <em>whether to proceed with the thing you already asked\nfor</em> does not.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-repair-tax\">The repair tax<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#the-repair-tax\" class=\"hash-link\" aria-label=\"Direct link to The repair tax\" title=\"Direct link to The repair tax\" translate=\"no\">​</a></h2>\n<p><strong>20% of human turns (313) existed only because the agent erred or stopped short.</strong> The dominant\ncause was not wrong answers:</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>friction</th><th>share of turns</th></tr></thead><tbody><tr><td>agent stopped short of the task</td><td>18%</td></tr><tr><td>agent got something wrong</td><td>7%</td></tr><tr><td>missing context</td><td>3%</td></tr><tr><td>tool failure</td><td>3%</td></tr><tr><td>ambiguous instruction</td><td>1%</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_11allq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>Omission outweighs error two and a half to one. The operator's most common corrective act is not \"that's wrong\",\nit is \"you didn't finish\". Tone tracks this: 44% of turns read as terse and pressing, 5% as\nfrustrated.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"does-more-human-involvement-produce-better-outcomes\">Does more human involvement produce better outcomes?<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#does-more-human-involvement-produce-better-outcomes\" class=\"hash-link\" aria-label=\"Direct link to Does more human involvement produce better outcomes?\" title=\"Direct link to Does more human involvement produce better outcomes?\" translate=\"no\">​</a></h2>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>human turns in session</th><th>n</th><th>success</th><th>partial</th><th>abandoned / failed</th><th>open-ended</th></tr></thead><tbody><tr><td>0 (headless)</td><td>18</td><td>10</td><td>–</td><td>6</td><td>2</td></tr><tr><td>1–3</td><td>26</td><td>17</td><td>–</td><td>8</td><td>1</td></tr><tr><td>4–10</td><td>16</td><td>6</td><td>9</td><td>1</td><td>–</td></tr><tr><td>11–30</td><td>21</td><td>6</td><td>13</td><td>2</td><td>–</td></tr><tr><td>31+</td><td>19</td><td><strong>2</strong></td><td><strong>17</strong></td><td>–</td><td>–</td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_14allq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>Sessions with more than thirty human turns finished cleanly twice out of nineteen.</p>\n<p>We are <strong>not</strong> claiming that talking to the agent more makes it worse. The obvious competing\nexplanation is confounding by difficulty: hard, sprawling, poorly specified work attracts both more\nhuman turns and worse outcomes. That explanation is at least as consistent with this table as any\ncausal story, and this study cannot separate them.</p>\n<p>What the table does support is narrower and still useful: <strong>a long human-turn count is an early\ndistress signal</strong>, not a sign of diligence. A session past its twentieth human turn is, empirically,\na session in trouble — and something should notice that and say so.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"from-turns-to-workflows\">From turns to workflows<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#from-turns-to-workflows\" class=\"hash-link\" aria-label=\"Direct link to From turns to workflows\" title=\"Direct link to From turns to workflows\" translate=\"no\">​</a></h2>\n<p>Grouping sessions by the shape of the work gives a small, repeating catalogue: incident\ninvestigation, agent-harness tuning, greenfield scaffolding, refactor sweeps, review-and-gate runs,\nbacklog grooming, multi-agent fan-out, release cuts. Thirteen named archetypes plus a catch-all\ncover all 100 sessions; the six largest named ones cover 63 of them.</p>\n<p>Judged per session, <strong>64 of 100 could run unattended or with a small number of gates</strong>. The gates\nthat survive scrutiny fall into exactly four categories, and they are worth naming because they are\nthe actual specification for a human-in-the-loop design:</p>\n<ol>\n<li class=\"\"><strong>Irreversible writes</strong> — production changes, published artifacts, anything with no undo.</li>\n<li class=\"\"><strong>Outward-facing communication</strong> — a message that goes to a customer or a colleague under someone's name.</li>\n<li class=\"\"><strong>Priority and taste calls</strong> — which of these three defensible options we want.</li>\n<li class=\"\"><strong>Facts from outside the machine</strong> — what a person said, what a dashboard showed, what the device did.</li>\n</ol>\n<p>Everything else in the observed recipes — resolving the trigger, gathering context, running the gate,\nreading the failure, patching, re-running, committing, reporting — appeared in the transcripts as\nmechanical work that a human was narrating rather than performing.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"limitations\">Limitations<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#limitations\" class=\"hash-link\" aria-label=\"Direct link to Limitations\" title=\"Direct link to Limitations\" translate=\"no\">​</a></h2>\n<p>One operator, one harness, twelve days, one machine's habits. The corpus skews toward infrastructure\nand agent-tooling work and contains almost no greenfield product code. The replaceability labels are\nan LLM's opinion about a single turn in context; that classifier does not know what an automated\nreplacement would have cost, or what it would have broken. The outcome-versus-turn-count table is\nconfounded as described. And the analysis of these sessions was itself performed by an agent of the\nsame family as the one under study — which is either efficient or a conflict of interest, depending\non how the next replication goes.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"what-we-would-test-next\">What we would test next<a href=\"https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/#what-we-would-test-next\" class=\"hash-link\" aria-label=\"Direct link to What we would test next\" title=\"Direct link to What we would test next\" translate=\"no\">​</a></h2>\n<p>The cheapest falsification is a <strong>turn-count tripwire</strong>: have the harness announce, at the twentieth\nhuman turn, that this session is now in the population that historically finishes partial, and offer\nto restate the goal from scratch. If outcomes do not move, the distress-signal reading is wrong and\nthe confound was the whole story.</p>\n<p>The second is a <strong>default-approval policy</strong> for the 61% of approvals the classifier called removable:\nstate the intended action with its default, act after a fixed pause unless contradicted, and keep a\nhard stop on the four gate categories above. That converts approval from a blocking request into a\nrevocable one — and reclaims most of a third of the wall-clock.</p>",
            "url": "https://beyond10x.github.io/updates/field-notes/agentic-principles/what-the-operator-actually-contributes/",
            "title": "We read 100 agent sessions to find out what the human actually contributes",
            "summary": "A transcript study of 1,567 human turns in coding-agent sessions, separating the turns that carried information from the turns that only carried permission.",
            "date_modified": "2026-08-25T00:00:00.000Z",
            "tags": [
                "transcripts",
                "automation",
                "human-in-the-loop",
                "measurement"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.12.0 — a workflow declares where a run may write | AEP</span><span data-pagefind-meta=\"description\">A step now declares the files it is handed and the paths it may write, with partial-only as the word that earns the shape. Measured on four live runs rather than asserted — and the toolset stopped a run the prose had only warned about.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-24-1618-where-a-run-may-write.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-24-1618-where-a-run-may-write.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>A workflow step now declares two things it never could: <strong>the files it is given</strong>, and <strong>the paths\nit may write</strong>.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-shape\">The shape<a href=\"https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/#the-shape\" class=\"hash-link\" aria-label=\"Direct link to The shape\" title=\"Direct link to The shape\" translate=\"no\">​</a></h2>\n<p><code>context:</code> names files a run is <strong>handed</strong> rather than has to find. <code>scope:</code> is an ordered list of\npaths and one of three words — <code>allowed</code>, <code>partial-only</code>, <code>denied</code> — <strong>first match wins</strong>, and <strong>the\nlast rule must name <code>**</code></strong>, so a path nobody thought of has an answer rather than a default.</p>\n<p>Requiring the catch-all is the small decision that matters. A default is a policy nobody wrote; a\nrequired final rule is a policy somebody had to type.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"why-partial-only-earns-the-shape\">Why <code>partial-only</code> earns the shape<a href=\"https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/#why-partial-only-earns-the-shape\" class=\"hash-link\" aria-label=\"Direct link to why-partial-only-earns-the-shape\" title=\"Direct link to why-partial-only-earns-the-shape\" translate=\"no\">​</a></h2>\n<p>It is the planning store's own rule. <strong>The CLI owns the frontmatter</strong>, so a body edit is legitimate\nand a whole-file rewrite re-types it by hand.</p>\n<p><strong>No set of operations can express that</strong>, because a file write and a file edit are both writes. So\nthe document speaks <strong>granularity, not identity</strong> — and which of an adapter's operations replace a\nfile whole stays the adapter's own fact.</p>\n<p>The rule already existed, in the driver's <code>store_integrity</code> check, <strong>written in one vendor's tool\nnames</strong> — so every arm but one walked past it for a year. A policy written in one harness's\nvocabulary is a policy that only holds for that harness.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-corpus-stopped-naming-vendors\">The corpus stopped naming vendors<a href=\"https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/#the-corpus-stopped-naming-vendors\" class=\"hash-link\" aria-label=\"Direct link to The corpus stopped naming vendors\" title=\"Direct link to The corpus stopped naming vendors\" translate=\"no\">​</a></h2>\n<p>A call selector now takes a set of tools, an operation set and a subject, so a row meaning <em>\"the\ntest was written before the code\"</em> <strong>decides on any harness</strong> instead of being blind to the one that\nused a differently-named edit verb.</p>\n<p>The three-arm programme became four. The fourth is our own loop, <strong>where there is no decision seam\nat all and the published toolset is the policy</strong>.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"measured-not-asserted\">Measured, not asserted<a href=\"https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/#measured-not-asserted\" class=\"hash-link\" aria-label=\"Direct link to Measured, not asserted\" title=\"Direct link to Measured, not asserted\" translate=\"no\">​</a></h2>\n<p>Four live runs, recorded with their transcript digests:</p>\n<div class=\"b10x-table-wrap\"><table><thead><tr><th>run</th><th>result</th></tr></thead><tbody><tr><td>unscoped</td><td>10 of 11 expectations held; <strong>three artifact files rewritten whole</strong></td></tr><tr><td>scoped and stated</td><td>11 held; discovery calls down from <strong>ten of fifty-two to three of forty-nine</strong></td></tr><tr><td>scoped and unstated</td><td><strong>five calls refused and the rule still held</strong></td></tr></tbody></table></div><p class=\"b10x-table-guidance\" id=\"b10x-table-_R_gallq5_-instructions\" hidden=\"\" data-pagefind-ignore=\"true\">More columns: swipe horizontally, or focus the table and use the arrow keys.</p>\n<p>The last one is the only run that measures this feature's own claim: with the prose warning removed,\n<strong>the toolset stopped the run</strong> rather than the instructions doing it. Everything else could have\nbeen the model being agreeable.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"and-the-gate\">And the gate<a href=\"https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/#and-the-gate\" class=\"hash-link\" aria-label=\"Direct link to And the gate\" title=\"Direct link to And the gate\" translate=\"no\">​</a></h2>\n<p>Green for the first time that session, <strong>read from its own exit status rather than a pipeline's</strong> —\nthe same mistake this repository already paid for once and wrote down.</p>\n<hr>\n<p><em>Written retrospectively from this release's <code>CHANGELOG.md</code> section and its annotated tag; no\nre-run command output.</em></p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/where-a-run-may-write/",
            "title": "0.12.0 — a workflow declares where a run may write",
            "summary": "A step now declares the files it is handed and the paths it may write, with partial-only as the word that earns the shape. Measured on four live runs rather than asserted — and the toolset stopped a run the prose had only warned about.\n",
            "date_modified": "2026-08-24T14:18:54.000Z",
            "tags": [
                "release",
                "aep",
                "driver"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/ground-truth-and-docs/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.11.0 — the corpus becomes ground truth, and a gate that lied gets caught | AEP</span><span data-pagefind-meta=\"description\">An outside adopter re-issued the horizons corpus as ground truth, and the scanner followed. Plus the process lesson that cost the most: two gates that aborted at their first step were read as green through a piped exit status.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-22-0105-ground-truth-and-docs.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-22-0105-ground-truth-and-docs.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>The most useful thing in this release is a mistake it documents.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-corpus-becomes-ground-truth\">The corpus becomes ground truth<a href=\"https://beyond10x.github.io/updates/field-notes/aep/ground-truth-and-docs/#the-corpus-becomes-ground-truth\" class=\"hash-link\" aria-label=\"Direct link to The corpus becomes ground truth\" title=\"Direct link to The corpus becomes ground truth\" translate=\"no\">​</a></h2>\n<p>The adopter fixed <strong>their</strong> reference against this repository's scanner and re-issued\n<code>expected.json</code>: <strong>43 raw, 43 parsed, <code>missed_by_reference</code> zero</strong> — adding a seventh position and a\nrule running the other way. <strong>An annotation inside a fenced code block is an illustration</strong>,\nexcluded from parsing <em>and</em> from the coverage denominator both.</p>\n<p>The scanner follows, with the <strong>fence-stripping implemented twice on purpose</strong> so the denominator\nstays independent evidence. Two implementations agreeing is evidence; one implementation checking\nitself is a tautology.</p>\n<p>This is what ground truth is supposed to look like: the corpus is not ours, and it corrected us as\noften as we corrected it.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-gate-that-was-read-as-green\">The gate that was read as green<a href=\"https://beyond10x.github.io/updates/field-notes/aep/ground-truth-and-docs/#the-gate-that-was-read-as-green\" class=\"hash-link\" aria-label=\"Direct link to The gate that was read as green\" title=\"Direct link to The gate that was read as green\" translate=\"no\">​</a></h2>\n<p>Two gates had <strong>aborted at their first step</strong> and were misread as green <strong>through a piped exit\nstatus</strong> — <code>$?</code> was the pipeline's, not the gate's.</p>\n<p>The record is corrected <strong>in git notes</strong> rather than by rewriting history, and <strong>the first honestly\ncaptured gate immediately caught a stale test</strong>. Which is the point: the reason to fix the reading\nis not tidiness, it is that the gate had something to say and nobody heard it.</p>\n<p>The rule that came out of it — <em>read the gate's own exit code, never a pipeline's</em> — has been\napplied on every gate run since, including the one that cut this release.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"also\">Also<a href=\"https://beyond10x.github.io/updates/field-notes/aep/ground-truth-and-docs/#also\" class=\"hash-link\" aria-label=\"Direct link to Also\" title=\"Direct link to Also\" translate=\"no\">​</a></h2>\n<p><code>protocol evidence inspect</code> no longer refuses a record <strong>the day it is written</strong>: the future check\nnow runs at the reference date's own granularity.</p>\n<p>And the documentation caught up with the tree under one rule: <strong>every number from a command, every\nreference resolving, every quoted output reproduced.</strong></p>\n<hr>\n<p><em>Written retrospectively from this release's <code>CHANGELOG.md</code> section and its annotated tag; no\nre-run command output.</em></p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/ground-truth-and-docs/",
            "title": "0.11.0 — the corpus becomes ground truth, and a gate that lied gets caught",
            "summary": "An outside adopter re-issued the horizons corpus as ground truth, and the scanner followed. Plus the process lesson that cost the most: two gates that aborted at their first step were read as green through a piped exit status.\n",
            "date_modified": "2026-08-21T23:05:33.000Z",
            "tags": [
                "release",
                "aep",
                "evidence"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/horizons-and-the-first-governed-run/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.10.0 — evidence gets a shelf life, and the first governed run stops | AEP</span><span data-pagefind-meta=\"description\">A fact decays to Unknown past its horizon, never to False, and no API can extend one. Then the protocol governs a real story out of this repository's own backlog — and blocks four states short of where it was meant to.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-21-2343-horizons-and-the-first-governed-run.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-21-2343-horizons-and-the-first-governed-run.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Two things, and the second is the one that matters.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"evidence-horizons\">Evidence horizons<a href=\"https://beyond10x.github.io/updates/field-notes/aep/horizons-and-the-first-governed-run/#evidence-horizons\" class=\"hash-link\" aria-label=\"Direct link to Evidence horizons\" title=\"Direct link to Evidence horizons\" translate=\"no\">​</a></h2>\n<p>An evidence record carries <code>observed_at</code> as <strong>the identity of the fact</strong> — not metadata about it. A\nrequirement may declare a <strong>horizon</strong>, past which the fact decays to <strong><code>Unknown</code>, and never to\n<code>False</code></strong>.</p>\n<p>That asymmetry is the design. A lapsed check has not failed; <strong>nobody has run it</strong>. A tool that\nreported a stale pass as a failure would train people to re-run things to clear noise; one that\nreported it as a pass would be lying.</p>\n<p><strong>No API can extend a horizon.</strong> There is deliberately no <code>extend</code> verb: if extending were as easy\nto call as re-checking, it is the one that gets called by whoever is trying to get a gate green.</p>\n<p>Against the adopter's vendored corpus: <strong>42 of 42</strong>, with self-reported coverage. It closed the\nfirst adopter's ranked-first finding, and was designed and adversarially reviewed the same day it\nwas built.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-first-governed-run--and-it-stopped\">The first governed run — and it stopped<a href=\"https://beyond10x.github.io/updates/field-notes/aep/horizons-and-the-first-governed-run/#the-first-governed-run--and-it-stopped\" class=\"hash-link\" aria-label=\"Direct link to The first governed run — and it stopped\" title=\"Direct link to The first governed run — and it stopped\" translate=\"no\">​</a></h2>\n<p><code>protocol drive</code> walked a real story out of this repository's own store under <code>development.driven</code>.\nFour headless model sessions, hooks as the enforcement arm, <strong>80 decisions, 11 denies one-for-one\nwith the transcripts</strong>.</p>\n<p><strong>It blocked in <code>establish_verifiers</code>, four states short of the person it was meant to stop at.</strong></p>\n<p>Both reasons the engine printed were correct refusals. The model wrote its failing checks as shell\nscripts — the idiom the story's own acceptance is written in — while the map it was driving under\nran <code>cargo</code> in every state naming a verifier, so the suite came back green and <code>test-driven</code> refused\nto advance.</p>\n<p><strong>Nothing was changed to make the run go through.</strong> The run is the finding: four new gap-register\nrows, none patched to pass.</p>\n<p>That is the whole reason to dogfood. A run engineered into a pass measures the engineering.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-lab\">The lab<a href=\"https://beyond10x.github.io/updates/field-notes/aep/horizons-and-the-first-governed-run/#the-lab\" class=\"hash-link\" aria-label=\"Direct link to The lab\" title=\"Direct link to The lab\" translate=\"no\">​</a></h2>\n<p><code>/lab</code> executes the synthesised billing realization as WebAssembly over its real boundary —\ndeterministic, asserted outside a browser, and <strong>a page without a module says so instead of\npretending</strong>.</p>\n<hr>\n<p><em>Written retrospectively from this release's <code>CHANGELOG.md</code> section and its annotated tag; no\nre-run command output.</em></p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/horizons-and-the-first-governed-run/",
            "title": "0.10.0 — evidence gets a shelf life, and the first governed run stops",
            "summary": "A fact decays to Unknown past its horizon, never to False, and no API can extend one. Then the protocol governs a real story out of this repository's own backlog — and blocks four states short of where it was meant to.\n",
            "date_modified": "2026-08-21T21:43:54.000Z",
            "tags": [
                "release",
                "aep",
                "evidence",
                "driver"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-reference-driver/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.9.0 — something walks the workflow, on evidence alone | AEP</span><span data-pagefind-meta=\"description\">The reference driver exists: protocol drive walks a workflow, blocks with the engine's reasons verbatim, and is held to the protocol verbs by enforcement hooks. Preceded by an adversarial review of six architecture decisions, with all seventeen corrections applied before a line was built.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-21-2120-the-reference-driver.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-21-2120-the-reference-driver.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Everything before this release <em>answered questions</em>. This one <strong>walks a workflow</strong> — and the design\nof it was argued out and corrected before any of it was written.</p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"wave-2-the-decisions-judged-before-the-build\">Wave 2: the decisions, judged before the build<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-reference-driver/#wave-2-the-decisions-judged-before-the-build\" class=\"hash-link\" aria-label=\"Direct link to Wave 2: the decisions, judged before the build\" title=\"Direct link to Wave 2: the decisions, judged before the build\" translate=\"no\">​</a></h2>\n<p>The driver's six open architecture questions became taken decisions, and an <strong>adversarial\nfeasibility review judged every one against the code</strong>: 23 confirmed, 14 needs-change, 3 infeasible.\n<strong>All seventeen corrections were applied before a line was built.</strong></p>\n<p>Seventeen corrections is what a design document costs when somebody is genuinely trying to break it.\nPaying that before implementation is the whole argument for having the document.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"wave-3-the-driver\">Wave 3: the driver<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-reference-driver/#wave-3-the-driver\" class=\"hash-link\" aria-label=\"Direct link to Wave 3: the driver\" title=\"Direct link to Wave 3: the driver\" translate=\"no\">​</a></h2>\n<ul>\n<li class=\"\"><code>aep-driver-spec</code> and <code>aep-driver</code>, with step maps under <code>drivers/</code>.</li>\n<li class=\"\"><strong><code>protocol drive</code> walks a workflow on evidence alone</strong>, and blocks <strong>with the engine's reasons\nverbatim</strong>. Not summarised, not re-worded — the driver is not allowed to become a second place\nwhere the meaning of a refusal is decided.</li>\n<li class=\"\"><strong>Enforcement hooks</strong> holding the planning store's frontmatter and a driven shell to the protocol\nverbs, <strong>with every adjudication logged</strong>.</li>\n<li class=\"\">A <strong>driven eval</strong> running a live session under the hooks, answering an open question empirically\nrather than by argument.</li>\n<li class=\"\">The <code>development.driven</code> profile — the only one that grants a shell, and it is held to the\n<code>protocol</code> CLI by the driver's own per-call policy.</li>\n<li class=\"\"><code>env.tool_available</code> as the fiftieth trace expectation kind.</li>\n<li class=\"\"><strong><code>protocol workflow render</code></strong>, drawing a workflow and its live run in four formats.</li>\n</ul>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"the-split-that-makes-it-safe\">The split that makes it safe<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-reference-driver/#the-split-that-makes-it-safe\" class=\"hash-link\" aria-label=\"Direct link to The split that makes it safe\" title=\"Direct link to The split that makes it safe\" translate=\"no\">​</a></h2>\n<p><strong>Gates are evaluated only by the engine. The driver asks and does what it is told.</strong> A driver that\ncould evaluate a gate would be a second protocol implementation, and the two would disagree —\neventually, quietly, on the case that mattered.</p>\n<p>Also in this release: the repository begins <strong>planning itself</strong> in <code>.engineering/</code>.</p>\n<hr>\n<p><em>Written retrospectively from this release's <code>CHANGELOG.md</code> section and its annotated tag; no\nre-run command output.</em></p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-reference-driver/",
            "title": "0.9.0 — something walks the workflow, on evidence alone",
            "summary": "The reference driver exists: protocol drive walks a workflow, blocks with the engine's reasons verbatim, and is held to the protocol verbs by enforcement hooks. Preceded by an adversarial review of six architecture decisions, with all seventeen corrections applied before a line was built.\n",
            "date_modified": "2026-08-21T19:20:50.000Z",
            "tags": [
                "release",
                "aep",
                "driver"
            ]
        },
        {
            "id": "https://beyond10x.github.io/updates/field-notes/aep/the-plan-and-the-transcript/",
            "content_html": "<div class=\"b10x-search-attributes\" data-pagefind-ignore=\"true\"><span data-pagefind-meta=\"qualified_title\">0.8.0 — the repository starts planning itself, and a transcript gets judged | AEP</span><span data-pagefind-meta=\"description\">Planning artifacts become markdown in the repository, moved only through lifecycle-validated verbs. And an agent transcript normalises into an event IR judged against a typed specification — the third observation domain after a specification and a cluster.</span><span data-pagefind-meta=\"project\">AEP</span><span data-pagefind-meta=\"document_type\">field-note</span><span data-pagefind-filter=\"project\">aep</span><span data-pagefind-filter=\"document_type\">field-note</span><span data-pagefind-filter=\"audience\">adopter</span><span data-pagefind-filter=\"audience\">developer</span><span data-pagefind-filter=\"experience\">try-spec-driven-development</span><span data-pagefind-filter=\"experience\">understand-safe-agentic-coding</span><span data-pagefind-filter=\"task\">research</span></div>\n<div class=\"b10x-source-banner\" data-pagefind-ignore=\"true\"><blockquote>\n<p>Source-owned field note · <a href=\"https://github.com/beyond10x/aep/blob/8f106fad0926a7036f1d3a6299948d7bb5de86a1/website/blog/2026-08-21-1708-the-plan-and-the-transcript.md\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"\">website/blog/2026-08-21-1708-the-plan-and-the-transcript.md</a> · revision <code class=\"b10x-revision\" title=\"8f106fad0926a7036f1d3a6299948d7bb5de86a1\">8f106fad0926</code></p>\n</blockquote></div>\n<p>Two waves in one release, and they are the same idea applied twice: <strong>take something that was prose\nand make it a typed thing a program can refuse.</strong></p>\n<!-- -->\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"harness-wave-1--the-plan-becomes-data\">Harness wave 1 — the plan becomes data<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-plan-and-the-transcript/#harness-wave-1--the-plan-becomes-data\" class=\"hash-link\" aria-label=\"Direct link to Harness wave 1 — the plan becomes data\" title=\"Direct link to Harness wave 1 — the plan becomes data\" translate=\"no\">​</a></h2>\n<p>Planning artifacts live in the repository as markdown under <code>.engineering/planning/</code>, and are\n<strong>moved only through lifecycle-validated CLI verbs</strong>. The consequence of choosing markdown over a\ndatabase is concrete: the diff of a status move is one line, and <code>git log</code> already knows who made\nit.</p>\n<p>A <strong>Claude Code plugin</strong> — one skill, two agents, no hooks at this point — teaches the store's rules\nand <strong>discovers its vocabulary at use time</strong> rather than hard-coding it, so the plugin does not go\nstale when the vocabulary grows.</p>\n<p>And a <strong>repeatable hermetic eval</strong> checks the plugin's behaviour with mechanical assertions, run\nmetrics, and an advisory adversarial review.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"trace-wave-1--a-run-becomes-a-judgeable-object\">Trace wave 1 — a run becomes a judgeable object<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-plan-and-the-transcript/#trace-wave-1--a-run-becomes-a-judgeable-object\" class=\"hash-link\" aria-label=\"Direct link to Trace wave 1 — a run becomes a judgeable object\" title=\"Direct link to Trace wave 1 — a run becomes a judgeable object\" translate=\"no\">​</a></h2>\n<p>A harness transcript normalises into a <strong>content-addressed event IR</strong> and is judged against a\n<code>trace-spec/1</code> document: <strong>forty-nine expectation kinds</strong>, verdicts <code>ok</code> / <code>gap</code> / <code>unk</code>, exit codes\n0 / 1 / 3.</p>\n<p>The third value earns its place here more than anywhere: <code>unk</code> means <strong>the adapter did not\nunderstand the event</strong>, which is a different thing from the expectation failing, and a checker that\nreported those as failures would be unusable against any harness it did not fully model.</p>\n<p>A passing check <strong>mints <code>trace_conformance</code> evidence the engine admits</strong>, produced by the\n<code>trace-checker</code> verifier class and fed back through <code>protocol evaluate --evidence</code>. That is the same\njoin as the ESS half: an observation becomes a fact a completion rule can read.</p>\n<h2 class=\"anchor anchorTargetStickyNavbar_Vzrq\" id=\"and-a-narrowing-stated\">And a narrowing, stated<a href=\"https://beyond10x.github.io/updates/field-notes/aep/the-plan-and-the-transcript/#and-a-narrowing-stated\" class=\"hash-link\" aria-label=\"Direct link to And a narrowing, stated\" title=\"Direct link to And a narrowing, stated\" translate=\"no\">​</a></h2>\n<p>The vision's refusal of \"a workflow engine\" was <strong>narrowed to admit a reference driver</strong> — decided\nand designed, not built. A boundary that moves should move in writing, with the reason attached, or\nit looks later like it was never there.</p>\n<hr>\n<p><em>Written retrospectively from this release's <code>CHANGELOG.md</code> section and its annotated tag; no\nre-run command output.</em></p>",
            "url": "https://beyond10x.github.io/updates/field-notes/aep/the-plan-and-the-transcript/",
            "title": "0.8.0 — the repository starts planning itself, and a transcript gets judged",
            "summary": "Planning artifacts become markdown in the repository, moved only through lifecycle-validated verbs. And an agent transcript normalises into an event IR judged against a typed specification — the third observation domain after a specification and a cluster.\n",
            "date_modified": "2026-08-21T15:08:47.000Z",
            "tags": [
                "release",
                "aep",
                "planning",
                "trace"
            ]
        }
    ]
}