Releases: ipeterpetrus/samewrite
Release list
SameWrite 1.4.0
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/andtools/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 stayABSENT, and a container that
holds one isUNVERIFIED: 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 defaultOne 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.pybehaves as it did in 1.3 for a previous-generation history,
including its opt-in--emit-candidateproposal 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
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 anEXITtrap, 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.mdis generated,
byte-identical to the canonical file, and contains only spec-valid frontmatter. -
The Claude-only alias stops travelling.
disable-model-invocationis 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.jsonnow points Codex at the portable surface instead of atskills/.
Packaging diverges; behaviour does not. -
tools/doctor.py— read-only, no network, no model. Every line is something it checked;
anything it cannot see saysNOT_OBSERVABLErather 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
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.pyruns the installer with the default destination in a throwaway home.
The check was confirmed to go red against a copy of the tree with themkdir -premoved —
verified again for this release: exit 1, guard absent.tests/acceptance_public.shinstalls from the published marketplace into an isolatedHOME
andCLAUDE_CONFIG_DIRand 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
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 bytes — skills/ 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-idand--workload-classkeep 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_idis 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-exitmaps status
to code;output_schema_versionandthreshold_schema_versionmove 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 Solportability — 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
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-disciplinebecomes a hidden compatibility alias (disable-model-invocation: true):
/edit-disciplinestill 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), malformedsettings.jsonleft 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 — notnormal mode, notstop …. - Benchmark infrastructure that cannot lie by accident: infrastructure failures (missing test
runner, usage/internal errors, zero tests collected, all skipped, CLI failure, broken transcript)
areINFRA_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.txtdeclares 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 --historyhold 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.