Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
{
"name": "floppy",
"description": "Session ritual for agent work: durable memory, a start rite, a wrap rite, and the guards that keep them honest",
"version": "0.25.1",
"version": "0.26.0",
"source": "./"
}
]
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "floppy",
"description": "Session ritual for agent work: durable memory, a start rite, a wrap rite, and the guards that keep them honest",
"version": "0.25.1",
"version": "0.26.0",
"author": {
"name": "Alexander Malaev"
},
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "floppy",
"displayName": "Floppy",
"description": "Session ritual for agent work: durable memory, a start rite, a wrap rite, and the guards that keep them honest",
"version": "0.25.1",
"version": "0.26.0",
"author": {
"name": "Alexander Malaev"
},
Expand Down
8 changes: 4 additions & 4 deletions .floppy/config
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ memory_dir=.agent-memory
memory_language=en

# This repository does not hold its own memory: memory_dir is a symlink into
# the store below. Wire it on each machine with "bash .floppy/run store".
# the store below. Wire it on each machine with floppy's "store" verb.
public_repo=git@github.com:spscream/ai_floppy_memory.git
# One key, not two: project_key is the default of both memory_project_key and
# workplace_project_key, so the project is named the same in every store it
Expand All @@ -23,11 +23,11 @@ private_repo=git@github.com:spscream/agents_memory.git
# clone of its own instead of sharing the derived one: a live session of
# another project (measured 2026-09-13: vps_inventory) held its half-written
# status file dirty in the shared tree at the moment this project's wrap
# synced. A new machine runs "bash .floppy/run workplace" once and gets the
# synced. A new machine runs the "workplace" verb once and gets the
# same layout — the leading ~ resolves to that machine's home (0.24.1).
workplace_memory_dir=~/agents_memory/.clones/agents_memory--ai_floppy

# commit_push controls what "bash .floppy/run commit" does after committing:
# commit_push controls what the "commit" verb does after committing:
# auto (default) pulls --rebase then pushes, same as always. A repository
# with no upstream configured fails that every time — set commit_push=never
# to keep every commit local instead (the --no-push flag does this per call).
Expand All @@ -44,7 +44,7 @@ workplace_memory_dir=~/agents_memory/.clones/agents_memory--ai_floppy
# may write only the status file. wrap-guard matches these by prefix, so a
# nested path needs no code change.
watched_dirs=docs/statuses
watched_files=AGENTS.md,.floppy/run,.floppy/config
watched_files=AGENTS.md,.floppy/config

# A metric that got worse stays in the current-state file, marked. The mark is
# the word the file is written in, and this memory is English.
Expand Down
170 changes: 0 additions & 170 deletions .floppy/run

This file was deleted.

5 changes: 4 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,10 @@ project at all — the latter belongs in `common/`, which no index links to and
## Agent memory

This repository uses the `floppy` plugin for its session ritual and its
durable memory. The entry point is `.floppy/run` — see `agent-memory`
durable memory. Its verbs are run from the plugin, not from here:
`bash <plugin>/scripts/run <verb>`, where `<plugin>` is two directories above
the base directory the harness states when it loads a floppy skill
(`Base directory for this skill: <plugin>/skills/start`). See `agent-memory`
for what a note looks like and how the memory is laid out, and
`start` / `workstatus` / `wrap` for the three rites
built on top of it. Settings live in `.floppy/config`; the memory itself is
Expand Down
84 changes: 75 additions & 9 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,86 @@ Why this file exists, in one line: **`plugin update` compares version strings
and copies nothing while the version is unchanged**, so the version here is
load-bearing, and a consumer needs to know whether an update is worth taking.

One column matters more than the rest and is called out per release:
One column mattered more than the rest and is called out per release:

> **Refresh `.floppy/run`?** — `.floppy/run` is a *copy* in your repository,
> not a link, and no plugin update ever touches it. When a release changes the
> shim, updating the plugin is only half the job:
> `cp "$FLOPPY_ROOT/shim/run" .floppy/run`. Since 0.2.1 the shim notices this
> itself and prints the command; before that it was silent.
> **Refresh `.floppy/run`?** — until 0.26.0, `.floppy/run` was a *copy* in your
> repository, not a link, and no plugin update ever touched it. When a release
> changed the shim, updating the plugin was only half the job:
> `cp "$FLOPPY_ROOT/shim/run" .floppy/run`. Since 0.2.1 the shim noticed this
> itself and printed the command; before that it was silent.
>
> Since 0.14.0 the answer is usually **no**. The copy holds only the search for
> the plugin; verbs, config keys and defaults live in the plugin and arrive with
> `plugin update`. A release says **yes** here only when that search changes.
> Since 0.14.0 the answer was usually **no**: the copy held only the search for
> the plugin, and verbs, config keys and defaults arrived with `plugin update`.
> Since 0.26.0 there is nothing to refresh — the skills call the plugin's
> dispatcher by path and `init` puts no runner in your repository. The line is
> kept in every entry because a repository created before 0.26.0 still carries
> its copy, and the answer for it is still worth stating.

Dates are the day the version was tagged in `.claude-plugin/plugin.json`.

## 0.26.0 — 2026-09-25

**Refresh `.floppy/run`: no — there is nothing left to refresh.** A repository
that already carries a copy keeps working; a repository created from here on
never gets one.

### The runner leaves your repository

Every `init` before this release copied `shim/run` into the consumer as
`.floppy/run`, and every skill, document and status note named that path. The
copy existed for one reason: a skill had no way to say where the plugin was, so
something inside the repository had to search for it.

It does have a way. A harness states the skill's own base directory above the
skill text — `Base directory for this skill: <plugin>/skills/workstatus` — and
the plugin directory is two levels above that (measured in Claude Code on
2026-09-22, on this plugin and one other). So the skills now call
`bash <plugin>/scripts/run <verb>` directly, and `scripts/run` derives
`FLOPPY_ROOT` from its own `${BASH_SOURCE[0]}` instead of being handed it. A
direct call needs no floppy variable at all: `bash <plugin>/scripts/run status`
runs with nothing set but `HOME`, which the config parser has always read.

What follows from that:

- **`init` writes `.floppy/config` and nothing else.** Your repository carries
data, not code. Its refusal when the plugin had no `shim/run` is gone with
the copy it guarded.
- **`skills/init/SKILL.md` drops its hand copy of the plugin search** — 33
lines that existed because `init` ran before `.floppy/run` existed. The test
that executed that fenced block (`tests/test-init-bootstrap.sh`) goes with
it. Prose cannot be executed, so `tests/test-skills.sh` resolves it instead:
no skill names `.floppy/run`, a skill using `<plugin>` says where it comes
from and how far above the base directory it sits, and every `<plugin>/…`
path a skill names has to exist in this checkout. The last two were added
after a review showed `<plugin>/run` and "one directory above" passing.
- **`shim/run` still ships, byte for byte.** It is what a pre-0.26.0 consumer
calls, and it `cmp`s itself against the plugin's copy — so any edit here
would tell every one of those repositories that their copy is stale. It is
deliberately left untouched.

### Migrating a repository you already have

Nothing breaks if you do nothing: `.floppy/run` still finds the plugin and
still runs the verb. Nothing in the plugin calls it any more, so when you want
it gone:

```bash
git rm .floppy/run
```

In the same commit, correct the line in `AGENTS.md` that names `.floppy/run` as
the entry point — the verbs are run from the plugin now:
`bash <plugin>/scripts/run <verb>`, where `<plugin>` is two directories above
the base directory the harness states. A later `init` prints a reminder when it
sees the old line, and prints one more when it finds the leftover file.

### The command a human typed

There isn't one, and that is the measurement: the operator of the six
repositories that use floppy reports never having typed `.floppy/run` by hand.
The surface is dropped rather than replaced; no `AI_FLOPPY_HOME` recipe and no
cache path with a version in its last segment is invented to stand in for it.

## 0.25.1 — 2026-09-18

**Refresh `.floppy/run`: no.** The shim is untouched.
Expand Down
Loading
Loading