Skip to content

Releases: ipeterpetrus/samewrite

SameWrite 1.4.0

Choose a tag to compare

@ipeterpetrus ipeterpetrus released this 16 Sep 22:12
787411a

SameWrite 1.4.0 — release notes

One sentence. The optimizer's evidence is now typed, integrity-checked and read-only: 1.4
measures and evaluates evidence in shadow mode, and automatic candidate promotion and persistence
are deliberately not part of this release.

The feature people would expect from this cycle is not here, on purpose. Evidence-gated
promotion — a finding that clears its dependency contract writing a candidate proposal by itself —
was built and refused by its own review. What ships is the half that can be trusted today: the
measurement, the integrity semantics, and a shadow evaluation that prints what a decision would
see and writes nothing.

What changed

  • A typed evidence kernel. 35 files under tools/evidence/ and tools/wire/, ported byte for
    byte from the frozen Phase-1 contract; their concatenated sha256 is
    88e4b48486eaa2a72abcdc4e52542113834e3c96bf08777fd67d13ac1adb82fd, and every test run re-checks
    it. Nothing in this release modifies a kernel file.

  • Acquisition produces evidence, not totals. A sweep emits a certificate of what it actually
    read: the sources it selected, the identity each had when it was selected, and one outcome per
    source. A sweep that read nothing writes a tombstone, not a measurement with no shares.

  • History schema 4. The current write format chains each record to the one before it by
    position and digest. The read-tail-then-append sequence is serialised with an advisory lock, and
    a lock that cannot be taken stops the append rather than proceeding without one.

  • Legacy generations are read fail-closed. Schemas 0, 1, 2 and 3 are read far enough to be
    counted and attributed. Facts their schema never carried stay ABSENT, and a container that
    holds one is UNVERIFIED: previous-generation evidence cannot acquire current trust by
    defaulting. A current-generation record that does not decode is damage — never silently demoted
    to a legacy record.

  • Container integrity is global. One container, one integrity answer, independent of which
    records a particular finding looks at. An unparseable line, a duplicate position, a broken chain
    or a stale head changes the container's state rather than being reported as a footnote.

  • Two axes, kept apart. Acquisition integrity — INTACT, BOUNDED (a bound someone chose),
    DEGRADED (a loss nobody chose), FAILED, UNVERIFIED — is separate from analysis
    sufficiency. "The evidence is intact" and "there is enough of it" are different questions, and
    blurring them is how an optimizer talks itself into acting on a partial read.

  • Privacy-safe provenance. Sizes, shares and digests. No paths, no prompts, no tool content; a
    planted canary is proved absent from every output.

  • Shadow evaluation.

    python3 tools/evidence_shadow.py ~/logs/carry_history.jsonl --scope default

    One row per retained finding — container state, acquisition integrity, sufficiency, whether it
    would promote and why not — then exit 0 whatever it found. It writes no candidate, no artifact
    and no file.

Retained findings, evaluated in shadow

listing_cost
write_guard_retirement

Intentionally not active in 1.4.0

automatic promotion
automatic candidate persistence
automatic policy mutation
windowing
host shift
carry_share_concentration
carry_bytes_trend

Automatic evidence-based candidate persistence remains disabled while the transaction and API
boundary around it is still being researched. NO_ACTION and "the evidence is not sufficient" are
first-class answers here; nothing in this release promotes itself, and nothing writes a proposal
without a human running a command that says so.

Install

Claude Code   claude plugin marketplace add ipeterpetrus/samewrite && claude plugin install samewrite@samewrite
Codex         codex  plugin marketplace add ipeterpetrus/samewrite && codex  plugin add     samewrite@samewrite
Hermes Agent  hermes skills install https://raw.githubusercontent.com/ipeterpetrus/samewrite/v1.4.0/adapters/hermes/samewrite/SKILL.md --yes
OpenClaw      (d=$(mktemp -d) && trap 'rm -rf "$d"' EXIT \
               && curl -fsSL https://github.com/ipeterpetrus/samewrite/archive/refs/tags/v1.4.0.tar.gz | tar -xz -C "$d" \
               && openclaw skills install "$d"/samewrite-*/skills/samewrite)

The raw-URL routes are pinned to this release, as in every cycle: a reader must not end up
installing a version other than the one whose notes they are reading
(python3 tests/test_install_paths.py checks that pairing offline).

Policy body, identical everywhere — and unchanged by this release

The skill body did not change in 1.4.0. The version moved; the policy did not.

artifact                FULL_FILE_SHA256   bytes         BODY_SHA256   bytes  desc
CLAUDE (canonical)      d7c65ee5a4496263    4816    7edec9f21e0bd505    4385   391
CODEX / AGENTSKILLS     d7c65ee5a4496263    4816    7edec9f21e0bd505    4385   391
HERMES                  9cce7a6c367b8b4a    4472    7edec9f21e0bd505    4385    49
OPENCLAW                d7c65ee5a4496263    4816    7edec9f21e0bd505    4385   391

CROSS_HOST_BODY_IDENTITY = PASS

Evidence claims, unchanged

TOTAL_SAVINGS=NOT_PROVEN
WORLD_BEST_CLAIM=NOT_TESTED

The best end-to-end measurement remains −1.7%, cheaper on 8 of 10 fixtures at p = 0.109 — smaller
than the same rig's variance between two byte-identical arms. Typed evidence does not change that
number; it changes how honestly the optimizer can describe the evidence behind it.

Compatibility

  • Existing history files keep working: 0/1/2/3 are read, and a 1.3 history stays readable and
    reportable after upgrading.
  • python3 tools/optimize.py behaves as it did in 1.3 for a previous-generation history,
    including its opt-in --emit-candidate proposal writer, which is unchanged 1.3 behaviour and
    runs only when a human passes that flag.
  • Hooks, the guard, the skill body and the adapters are untouched by this release.

SameWrite 1.3.0

Choose a tag to compare

@ipeterpetrus ipeterpetrus released this 15 Sep 06:56
f188630

Four coding-agent hosts, one command each, one canonical policy body. The headline feature of this
cycle did not ship — and the write-up for why is in here.

Claude Code VERIFIED        public install from the published marketplace, isolated profile, 11/11
Codex VERIFIED              public install, isolated CODEX_HOME, plugin reports 1.3.0
Hermes skill VERIFIED       public install from the v1.3.0 raw URL, isolated HERMES_HOME, 8/8
OpenClaw VERIFIED           README one-liner run verbatim against the v1.3.0 tarball, 14/14

AI-VOS_READY=PASS           readiness only. NOT production activation, which is not authorized here

TRUTH_RULE=NOT_PROMOTED     designed, pre-registered, 130 runs, refused by its own gate
TOTAL_SAVINGS=NOT_PROVEN    -1.7%, 8/10 fixtures, p = 0.109, below the rig's own noise
WORLD_BEST_CLAIM=NOT_TESTED no comparative benchmark was run, so no such claim is made

HERMES_OBSERVER=DEFERRED_BY_SCOPE
OPENCLAW_OBSERVER=UNTESTED
CODEX_UNUSED_BODY_COST=NOT_OBSERVABLE
WINDOWS=UNTESTED

Upgrading from 1.2.1 is a normal reinstall: one plugin entry, one listed skill, the hidden
edit-discipline alias preserved, and foreign settings from other tools untouched (verified in an
isolated profile, 9/9).


SameWrite 1.3.0 — release notes

One sentence. SameWrite now installs natively on four coding-agent hosts with one command each,
from a single canonical skill whose policy body is byte-identical everywhere.

The headline feature of this cycle did not ship. A persistent status-reporting rule was designed,
pre-registered, benchmarked over 130 runs, and refused by its own gate. That is in here too.

What changed

  • Four verified hosts. Claude Code, Codex, Hermes Agent and OpenClaw each install and load the
    skill, each proven in an isolated profile by this repository's own acceptance scripts.

  • One command per host, every one executed exactly as published:

    Claude Code   claude plugin marketplace add ipeterpetrus/samewrite && claude plugin install samewrite@samewrite
    Codex         codex  plugin marketplace add ipeterpetrus/samewrite && codex  plugin add     samewrite@samewrite
    Hermes Agent  hermes skills install https://raw.githubusercontent.com/ipeterpetrus/samewrite/v1.3.0/adapters/hermes/samewrite/SKILL.md --yes
    OpenClaw      (d=$(mktemp -d) && trap 'rm -rf "$d"' EXIT \
                   && curl -fsSL https://github.com/ipeterpetrus/samewrite/archive/refs/tags/v1.3.0.tar.gz | tar -xz -C "$d" \
                   && openclaw skills install "$d"/samewrite-*/skills/samewrite)
    

    The raw-URL routes are pinned to a release tag rather than main, and to this release: a
    reader must not end up installing a version other than the one whose notes they are reading.
    Claude Code and Codex use their own package managers. The OpenClaw command runs in a subshell
    with an EXIT trap, so a failed download, a corrupt archive or a refused install all clean up
    after themselves and none of it touches the caller's own traps
    (bash tests/test_oneliner_cleanup.sh, 11 checks).

  • A portable AgentSkills surface. adapters/agentskills/samewrite/SKILL.md is generated,
    byte-identical to the canonical file, and contains only spec-valid frontmatter.

  • The Claude-only alias stops travelling. disable-model-invocation is rejected by the
    AgentSkills reference validator and silently ignored by Codex — which would un-hide the alias
    and charge a user catalog bytes for something that exists only for Claude 1.0.0 upgraders.
    .codex-plugin/plugin.json now points Codex at the portable surface instead of at skills/.
    Packaging diverges; behaviour does not.

  • tools/doctor.py — read-only, no network, no model. Every line is something it checked;
    anything it cannot see says NOT_OBSERVABLE rather than showing a green mark.

  • AI-VOS readiness, proven against the canonical state with a planted canary: 27/27, zero
    mutation of the governed workspace, proposal-only optimizer.

Policy body, identical everywhere

Two hashes, named, because one number called "the sha256" is how two documents end up quoting
different values for the same file and looking like a contradiction:

  • FULL_FILE_SHA256 — every byte of the installed file, front matter included. Differs per host
    by design
    , because the front matter is exactly what a host shapes.
  • BODY_SHA256 — every byte after the closing front-matter delimiter, unmodified. Must be
    identical on every host.
    That is the whole claim.
artifact                FULL_FILE_SHA256   bytes         BODY_SHA256   bytes  desc
CLAUDE (canonical)      d7c65ee5a4496263    4816    7edec9f21e0bd505    4385   391
CODEX / AGENTSKILLS     d7c65ee5a4496263    4816    7edec9f21e0bd505    4385   391
HERMES                  9cce7a6c367b8b4a    4472    7edec9f21e0bd505    4385    49
OPENCLAW                d7c65ee5a4496263    4816    7edec9f21e0bd505    4385   391

CROSS_HOST_BODY_IDENTITY = PASS

Reproduce with python3 tools/adapters.py --hashes; tests/test_adapters.py fails the build if the
bodies ever diverge. Hermes truncates a skill description to 60 characters in its prompt, so its
adapter shortens that field only — which is why its full-file hash differs and its body hash
does not. One canonical behaviour, four packagings.

The truth experiment: NOT_PROMOTED

A 157-byte sentence asking the agent not to report an action as done unless it observed it. Five
arms, 24 traps plus 2 positive controls, 130 runs, zero infrastructure errors, order randomised
under a recorded seed, pre-registration frozen by hash before the first run.

The null calibration passed first — two identical treatments scored 4/24 against 4/24,
p = 1.000 — so this is a real negative, not an inconclusive one. Candidates moved 4/24 → 3/24 at
p = 1.000, nowhere near the pre-registered 30% reduction. No rule was added to SameWrite.

The reason is a floor, not a dud: only 7 of 24 traps ever caught any arm. The rule did nearly double
how often the answer named the missing evidence, and caused zero false failures on both positive
controls. What it could not do is reduce claims that were already rare.

The more useful finding is where the remaining failures sit — truncated tool output, version
mismatch and conflicting evidence, 14 of 18. Two of those are evidence-sampling problems rather
than reporting ones, and a one-sentence reporting rule is the wrong instrument for them. That is a
future research direction, not a feature in this release.

Full write-up: experiments/truth/RESULTS.md.

One real, local saving

Repairing a real profile removed a hand-copied 1.0.0-era skill that had lost its hiding flag:
listing 25,334 → 25,083 bytes, −251 B per turn. That is a configuration saving on one machine,
not a SameWrite universal saving, and it is labelled that way everywhere it appears.

Known limitations, stated plainly

overall end-to-end token savings NOT_PROVEN — best measurement −1.7%, 8/10 fixtures, p = 0.109, below the rig's own noise
"best in the world" NOT_TESTED — no comparative benchmark was run, so no such claim is made
Codex unused-body cost NOT_OBSERVABLE — measuring it would mean intercepting a prompt the host does not expose
Hermes observer DEFERRED_BY_SCOPE — feasible and audited, deliberately not built: see docs/HERMES_OBSERVER.md
OpenClaw observer UNTESTED
the truth rule NOT_PROMOTED — designed, tested, refused by its own gate
Windows UNTESTED
ClawHub distribution NOT_PUBLISHED — no clawhub CLI and no authenticated publisher identity on this machine, and the samewrite slug is unregistered there. Claiming a slug in someone else's namespace, or publishing 1.3.0 before 1.3.0 is released, are both worse than not publishing; the pinned tarball route is used instead

Unchanged

The canonical skill and the Claude hooks are byte-identical to v1.1.0. The observer still adds
zero bytes to a model's context, still makes zero model calls, still opens no socket, and still
promotes nothing on its own.


Verified against this exact tag

RELEASE_COMMIT   f1886307fb6bcf277bed38149a7ec7186aeefeb8
TAG_OBJECT       9b28f518ca9f3b14eae15bcfcfd3130d9789da35 (annotated)
MAIN_CI          success on Python 3.9 and 3.12
BODY_SHA256      7edec9f21e0bd50583e388e0bdc177f92ba8f0db6ce2bb61acd52b39d81e7767  (4385 B, all four hosts)
CANONICAL_SKILL_DELTA   0   no byte of skills/ or hooks/ changed since v1.2.1
DEFAULT_CONTEXT_DELTA   0   the model-visible listing is unchanged

Every install command in the README was executed against the real host, from this published tag,
in a home or state directory created for the run and deleted afterwards.

SameWrite 1.2.1

Choose a tag to compare

@ipeterpetrus ipeterpetrus released this 15 Sep 04:03

A patch release with one product fix. Overall token-cost improvement is still NOT_PROVEN and
nothing about SameWrite's behaviour changed.

The fix

The default guard installer now creates its destination parent directory.

bash hooks/install.sh — the guard installation the README documents — aborted on any machine where
~/scripts did not already exist, which is most machines:

install -m 0755 "$PKG/write_noop_guard.py" "$DST"      # $DST defaults to $HOME/scripts/...

install does not create parent directories, and GNU's -D flag does not exist on macOS, so the
fix is a portable mkdir -p before the copy. The ledger line immediately below it already did this;
the guard line was missed.

Why this needed its own tag

The bug is pre-existing: it is in v1.1.0 and v1.2.0 too. It is not a regression in
either. It was found shortly after v1.2.0 was tagged, and fixed on main right away — but a
published tag is immutable, so the two diverged:

install path had the fix before this release
/plugin marketplace add ipeterpetrus/samewrite (tracks main) yes — marketplace users already had it
cloning or downloading the v1.2.0 tag no

v1.2.1 exists to close exactly that gap. v1.2.0 was not moved, retagged or edited, and it still
points at 14eb217.

Why it survived three releases

No test had ever run the default destination. Every one of them set SAMEWRITE_DST to a directory
it had just created — reasonable in isolation, since a test should not write into a real home, but
together it meant the path every user takes was never exercised once.

The general lesson is worth more than the fix: an acceptance test that injects environment
overrides for convenience stops testing the default path, and the default path is the product.

What now prevents it:

  • tests/test_coexist.py runs the installer with the default destination in a throwaway home.
    The check was confirmed to go red against a copy of the tree with the mkdir -p removed —
    verified again for this release: exit 1, guard absent.
  • tests/acceptance_public.sh installs from the published marketplace into an isolated HOME
    and CLAUDE_CONFIG_DIR and drives the whole user path. This is the test that found the bug. Local
    acceptance proves the code works; public acceptance proves that what was published works, and
    those are different claims.

Verified for this release

check result
fresh home with no ~/scripts, from the v1.2.1 tag source exit 0, directory created, guard installed once
reinstall into the same home settings byte-identical, still exactly one guard entry
uninstall every samewrite hook entry removed, foreign statusLine and custom keys untouched
red/green oracle installer without the fix: exit 1, guard absent
public marketplace install version 1.2.1, ~/scripts confirmed absent beforehand, guard landed
deterministic suite 416 assertions across 11 suites, adapter drift clean, plugin manifest valid

Unchanged from 1.2.0

skills/samewrite/SKILL.md, skills/edit-discipline/SKILL.md, hooks/write_noop_guard.py,
tools/carry.py and tools/optimize.py are byte-identical to v1.2.0, and the three
model-facing files are still byte-identical to v1.1.0. No model benchmark was re-run, because
there is no model-facing change that could invalidate one.

overall token-cost improvement NOT_PROVEN (−1.7%, 8/10 fixtures, p = 0.109, smaller than the rig's own null-vs-null variance)
quality non-inferior on correctness, safety, evidence completeness and authority compliance
Hermes Agent skill VERIFIED (0.21.3, 1ad89ac) — 80 B listing, 0 B unused body
Hermes observer UNTESTED
GPT-5.6 Sol portability UNTESTED
bash-output-shaping REJECTED · listing-prune DEFERRED

Upgrading

Nothing beyond the usual update. If you installed the guard on a machine where it silently failed,
re-run bash hooks/install.sh — it is idempotent and will now create the directory it needs.

Full notes: docs/RELEASE_NOTES_1.2.1.md

SameWrite 1.2.0

Choose a tag to compare

@ipeterpetrus ipeterpetrus released this 14 Sep 21:00

Overall token-cost improvement: NOT_PROVEN.

That is the headline, and it is deliberate. 1.2.0 is released for the evidence layer, not for a
savings number. The observed effect was −1.7%, cheaper on 8 of 10 fixtures (p = 0.109) — and the
rig's own measured null-vs-null variance is larger than that, so no percentage saving is claimed
anywhere in this release.

What is measured and does hold:

default model-context overhead added by the observer 0 bytesskills/ and hooks/ are byte-identical to v1.1.0, verified by sha256 per file
Hermes Agent skill support VERIFIED — 0.21.3 (1ad89ac), isolated profile, 11/11; 80 B listing, 0 B unused body
AI-VOS profile evidence-aligned — rewritten after reading the canonical governance material
quality non-inferior on correctness, safety, evidence completeness and authority compliance across 80 runs

What is new

The skill is byte-for-byte what 1.1.0 shipped. Everything here is the measurement layer learning to
survive a population of agents that never stops.

  • Scope isolation. --scope-id and --workload-class keep populations apart; records from
    different scopes are counted and named, never averaged into a population that describes nobody.
  • Evidence quality, failing closed. A sweep labels itself COMPLETE / PARTIAL / INVALID /
    EMPTY; a partial sweep cannot produce a candidate unless you say the bounded corpus was the
    target.
  • Opaque run identity. A random run_id is the only dedup key, so two agents with identical
    numbers stay two observations and a re-copied file stays one. History merges across hosts, in any
    order, twice, safely.
  • Time is never trusted. Record order is classified ok / reversed / ambiguous; skew yields
    no direction at all.
  • Safe to schedule. Deterministic candidate ids, a non-blocking exclusive lock, fsync +
    os.replace. A 30-day, 9,000-invocation simulation emits zero new proposals once the evidence
    stops moving. No daemon; nothing is installed.
  • Concurrency and crash safety. 32 and 64 parallel writers with every line intact; a torn tail
    no longer destroys the record appended after it.
  • Machine contract. Exit 0 for any valid run including NO_ACTION; --strict-exit maps status
    to code; output_schema_version and threshold_schema_version move independently.

Two candidates the optimizer proposed, and neither shipped

  • bash-output-shaping — REJECTED. Bash is 62% of carry, so bounding it looked like the best
    change available. Measuring 30,731 real Bash results ended it: median 449 B, p90 2,246 B, maximum
    28,989 B, none above 30 kB. The host already caps Bash output and spills the rest to a file.
    Bash dominates carry by accumulation across thousands of small results — a different problem.
  • listing-prune — DEFERRED. 70 of 82 listing entries never invoked, 24,002 B, but 2.30% of
    carry
    — below the threshold fixed before the numbers were read, and those cold entries belong to
    other people's plugins, not to SameWrite.

The measurement finding worth more than the cost number

Because the skill file is identical at 1.1.0 and 1.2.0, two arms of the experiment show the model
the same bytes — which turns them into a ruler for the rig's own noise. Three such null-vs-null
comparisons read −5.6%, +15.1% and −6.4%. The middle one reached p = 0.021 between
treatments that cannot differ
, and did not replicate.

Two methodological defects were found and fixed along the way: arm was perfectly confounded with
wall-clock time (jobs submitted arm-major drain in blocks), and the second-channel rig scored a
provider usage limit as ten model failures. Both are the kind that manufacture results.

Still untested, and named as such

  • GPT-5.6 Sol portability — UNTESTED. The attempt returned 10/10 infrastructure errors on an
    account usage limit. An untested channel is never estimated from a tested one.
  • Hermes observer — UNTESTED. It runs there, but has no reader for Hermes session files, so it
    measures nothing. Hermes skill support is VERIFIED; the two claims are kept apart on purpose.

Install

/plugin marketplace add ipeterpetrus/samewrite
/plugin install samewrite@samewrite

Upgrading from 1.0.0 or 1.1.0 is in-place and idempotent; the guard's 1.0.0 entry form is
recognised, so no duplicate is created.

Full notes: docs/RELEASE_NOTES_1.2.0.md ·
experiment: experiments/aivos/RESULTS.md ·
candidate verdicts: docs/CANDIDATES.md

SameWrite 1.1.0

Choose a tag to compare

@ipeterpetrus ipeterpetrus released this 14 Sep 19:23

SameWrite 1.1.0 — release notes

One sentence. One canonical samewrite skill that spends a coding agent's tokens where they
matter — context, tool output, edits, retries — and leaves evidence that can fail; the measurement
tools and every experiment behind the numbers ship with it, including the ones that lost.

What is new

  • One canonical skill: skills/samewrite/SKILL.md — context ladder (expand only to answer an
    open question; symbol-level tools first when present), ask only when the ambiguity is material,
    minimum correct change, root cause with bounded retries (two failed fixes → stop and reassess),
    verification scaled by risk × uncertainty, and a compact result-first output rule.
  • edit-discipline becomes a hidden compatibility alias (disable-model-invocation: true):
    /edit-discipline still works for 1.0.0 users, it no longer costs listing bytes per turn, and the
    edit rule lives in one place.
  • Hardened installer / uninstaller: POSIX quoting (paths with spaces), exact-path ownership
    (a foreign hook that merely shares the filename is never touched; the 1.0.0 entry form is
    recognised on upgrade, no duplicate), malformed settings.json left alone with a warning,
    hooks/uninstall.sh, install.sh --human-output.
  • Coexistence proven deterministically with Ponytail, i-have-adhd, Caveman and rtk surfaces
    (tests/test_coexist.py, including the real Ponytail and i-have-adhd hooks running next to the
    installed skill). samewrite claims no mode phrase — not normal mode, not stop ….
  • Benchmark infrastructure that cannot lie by accident: infrastructure failures (missing test
    runner, usage/internal errors, zero tests collected, all skipped, CLI failure, broken transcript)
    are INFRA_ERROR, excluded and counted — never a model failure. Every scorer is proven to turn
    RED on a planted bad fixture (86 + 38 + 78 self-test checks). requirements-test.txt declares the
    only test-time dependency; CI runs clean Python 3.9 and 3.12.
  • Generated adapters for AGENTS.md / GEMINI.md readers (tools/adapters.py, drift-checked in
    CI) — INSTRUCTION_ONLY on those hosts.
  • Reference audits of nine related projects at pinned commits (docs/reference-audits/), no
    code copied.
  • Optional human-output hook (bash hooks/install.sh --human-output): one sentence injected at
    SessionStart (~170 bytes), off by default. See the known limitation.
  • Observer stays offline and private: the guard ledger and carry.py --history hold aggregates
    only (no paths, prompts or content); nothing reads history into the model; nothing rewrites the
    skill — evidence-driven optimization, not self-learning.

Measured (methodology in docs/FINDINGS.md, docs/VNEXT.md)

  • 1,316 transcripts: Bash + Read results are 63.8% of session carry; 20.8% of overwrites were
    byte-identical (the guard denies them); the "≤3 change blocks" edit rule is net negative.
  • 462 controlled A/B runs: one terseness sentence −22.7% / −19.6% output tokens (two languages,
    pre-registered); a 4.7 kB block adds −0.8% over the sentence.
  • Confirmatory run for this release (16 fresh cases × 8 arms × 2 reps, 256 runs, 0 excluded):
    correctness 25–26/32 in every arm, non-inferior to 1.0.0; stacking with Ponytail / i-have-adhd /
    both lost no correctness.

Known limitation (kept on purpose)

Human-output improvement: NOT_PROVEN. The one-sentence SessionStart policy met the human-output
contract on 24/32 runs vs 23/32 without it (p = 1.0); the earlier pilot's 7/8 vs 5/8 did not
replicate. It is safe and cheap, so it ships opt-in; it is not a measured optimization claim. Also:
one small model in the benchmarks; three fixtures were floors in every arm; the skill body is loaded
on /samewrite or when the model calls it, not automatically on every prompt; Windows untested;
OpenCode and Pi unsupported.

Upgrade from 1.0.0

/plugin update samewrite@samewrite (or reinstall). /edit-discipline keeps working; samewrite
becomes the listed skill. If you installed the guard hook, rerun bash hooks/install.sh — it
recognises the 1.0.0 entry and adds nothing. bash hooks/uninstall.sh removes only samewrite's
entries.