chore(release): 0.12.0 -- a session measures the effort it ran with

Bumps the six version-bearing files and gives ac62a38 its changelog entry.

Until the tag exists the plugin cache keeps serving the 0.11.0 skill, which
instructs every new session that effort is not observable and to ask the
operator for it. The fix is committed and pushed but not in circulation, so
the release is the part that changes behavior.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxRVZm1busUeuXd5iPkK36
This commit is contained in:
Kjell Tore Guttormsen 2026-07-31 17:28:19 +02:00
commit dffc1f5e47
7 changed files with 49 additions and 6 deletions

View file

@ -1,6 +1,6 @@
{
"name": "repo-mailbox",
"version": "0.11.0",
"version": "0.12.0",
"description": "Local mailbox for coordination between Claude Code sessions in different repositories. Directed messages and broadcasts as plain Markdown files on your own disk, injected as context at session start. Local, private, no network.",
"author": {
"name": "Kjell Tore Guttormsen"

View file

@ -5,6 +5,49 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.12.0] - 2026-07-31
### Fixed
- **The last-session record asked the operator for the one field it could
measure.** `route-last` (0.10.0) exists to make the routing policy
falsifiable — a policy that always answers "Opus" is not a policy — and it
only is if `--last-effort` reports what the session actually ran with.
`route.sh` documented the opposite as settled fact: that a session cannot
observe its own effort from the inside. That was true when written and is not
now. Claude Code exports `CLAUDE_EFFORT` into every tool-use context as the
session's current effort, so a single Bash call reads it.
**The premise had a cost, and it was the record's weakest field.** With effort
unobservable, the record could only be completed by asking the operator at
session end, which made all four fields block on their presence. It was also
the weaker measurement, in exactly the way the previous board line is: the
operator reads the effort off the startup command they typed, so both sources
report what was *prescribed* rather than what was *run*. Those come apart
precisely when the record would be worth having — as a session that silently
ran `xhigh` under a board line saying `high` already showed. Reading the
variable makes all four fields knowable from inside the ending session, so the
record no longer waits on anyone.
**`route.sh` still does not read the variable, deliberately.** The skill
measures and passes `--last-effort`; the calculator only computes. A
calculator that consults its environment is no longer deterministic from its
arguments, and the route → board round trip in selftest section 6 rests on
that determinism.
- **The reading had a trap that would have hidden itself.** Skill frontmatter
overrides the session effort while that skill is active, so an `effort:` field
in `skills/route/SKILL.md` would make the reading report the skill instead of
the session — a measurement quietly measuring itself, with nothing in the
output to show it happened. Section 13 pins the absence of that field.
- **The neighbouring claim about the model was also wrong, in the other
direction.** There is no `CLAUDE_MODEL` to read: `model` is a SessionStart
field and documented as not guaranteed. The session takes the model from what
it knows itself to be running as, and only the effort is measured.
`route-selftest.sh`: 50 → 56 checks.
## [0.11.0] - 2026-07-31
### Added

View file

@ -8,7 +8,7 @@
*AI-generated: all code produced by Claude Code through dialog-driven development.*
![Version](https://img.shields.io/badge/version-0.11.0-blue)
![Version](https://img.shields.io/badge/version-0.12.0-blue)
![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple)
![Hooks](https://img.shields.io/badge/hooks-1-green)
![Skills](https://img.shields.io/badge/skills-3-orange)

View file

@ -1,6 +1,6 @@
{
"name": "repo-mailbox",
"version": "0.11.0",
"version": "0.12.0",
"private": true,
"type": "module",
"engines": {

View file

@ -14,7 +14,7 @@ description: >-
user names no repo and no tool — choosing *between* repos is this skill. Not for
"where were we" inside the current repo: that is this repo's own STATE.md,
already injected at session start.
version: "0.11.0"
version: "0.12.0"
---
# board — which repo deserves the next session

View file

@ -15,7 +15,7 @@ description: >-
covers retiring a broadcast that has become wrong or obsolete: "retract that
broadcast", "that announcement is outdated, pull it", "trekk tilbake kringkastingen",
"den broadcasten er utdatert".
version: "0.11.0"
version: "0.12.0"
---
# coord-send — natural-language front door for inter-repo messages

View file

@ -14,7 +14,7 @@ description: >-
the operator names no model and no tool — choosing the model for the next
session IS this skill. Not for choosing which REPO gets the next session:
that is the `board` skill.
version: "0.11.0"
version: "0.12.0"
---
# route — what the next session should run with