Skip to content

Commit f7f8533

Browse files
docs(v1.2.1): publish plan ready, deferred to fresh session
Adds docs/plans/2026-04-28-v1.2.1-pypi-publish.md — a step-by-step plan for the v1.2.1 release across PyPI + git tags + GitHub. Strategy locked: skip v1.1.0 + v1.2.0 PyPI uploads (the existing v1.1.0 wheel from 2026-04-26 predates the duplicate-refine race fix and would publish a known-buggy snapshot); the v1.x PyPI line starts at v1.2.1. v1.1.0 + v1.2.0 stay as git-tag milestones in the narrative. The plan walks through 9 steps: version bumps (pyproject.toml + mnemos/__init__.py both still at older strings), pytest sanity, build, smoke-install in throwaway venv, twine upload (irreversible boundary — pause for user confirmation), annotated git tags v1.2.0 (at 4fddca4) + v1.2.1 (at e7cfdba), gh release create from CHANGELOG.md, commit the version bumps, STATUS/ROADMAP update. Includes a rollback section explaining yank-vs-bump-to-1.2.2 since PyPI has no overwrite semantics. STATUS.md and ROADMAP.md now point at the plan as the next-up work. The "Pending user actions" section was rewritten so the one-word `mnemos` resume protocol surfaces this plan first. "Completed today" section was reorganized into a full-day recap + a "Pickup point for next session" block telling the resume agent exactly what to do (read STATUS, read plan, verify pre-flight, show <100-word summary, wait for go-ahead before twine upload). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e7cfdba commit f7f8533

3 files changed

Lines changed: 293 additions & 43 deletions

File tree

STATUS.md

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -169,48 +169,53 @@ For early adopters: `pip install git+https://github.com/mnemos-dev/mnemos@v1.0.0
169169
| F6.3 Empirical smoke | 1 | done | kasamd farcry: TR transcript → TR headers + TR body. Locale-aware contract holds. **Surfaced pre-existing v1.1.0 duplicate-refine race — see v1.2.1 spec.** |
170170
| F7 Migration helper | 0 | not needed | locale-aware behavior obviates the need for a one-shot vault flip |
171171

172-
🟡 **Pending user actions:**
173-
174-
1. **Push commits to origin** — local main is 4 commits ahead of
175-
`origin/main` (`b7ee92f` --limit, `3774d05` env strip,
176-
`89f120b` neutral cwd + hook isolation, plus this docs update):
177-
```bash
178-
git push origin main
179-
```
180-
2. **PyPI v1.2.0 + v1.2.1 publish** (single-shot, both shipped same
181-
day; v1.2.1 supersedes the v1.2.0 wheel that was never built):
182-
```bash
183-
cd C:/Projeler/mnemos-v1.1
184-
python -m build
185-
python -m twine upload dist/mnemos_dev-1.2.1*
186-
git tag v1.2.0 -a -m "v1.2.0 — Locale-Aware Output"
187-
git tag v1.2.1 -a -m "v1.2.1 — Refine race + identity isolation fix"
188-
git push origin v1.2.0 v1.2.1
189-
gh release create v1.2.1 --title "v1.2.1 — Refine race + identity isolation fix" --notes-file CHANGELOG.md
190-
```
191-
3. **v1.1.0 PyPI publish** (still pending from yesterday):
192-
`python -m twine upload C:/Projeler/mnemos-v1.1/dist/mnemos_dev-1.1.0*`
193-
4. **Test infra cleanup**`~/.claude/test-session-end/` directory
194-
leftover from v1.1 design phase. Settings.json's SessionEnd
195-
already only has the canonical `mnemos-session-end` entry, so
196-
no settings.json edit needed; just remove the leftover directory:
197-
```bash
198-
rm -rf ~/.claude/test-session-end
199-
```
200-
201-
### ✅ Completed today (2026-04-28)
202-
203-
- v1.2.0 locale-aware output: shipped + merged + pushed
204-
- v1.2.1 refine-pipeline race fix: shipped + merged + pushed
205-
- v1.2.1 identity isolation follow-up: 3 commits on local main
206-
(push pending — see #1 above)
207-
- `mnemos refine-ledger --normalize --validate-paths` one-shot
208-
cleanup ran on kasamd
209-
- `/exit` empirical test passed — single Session/.md created, no
210-
duplicate
211-
- `mnemos identity bootstrap --force` ran successfully on kasamd
212-
(90 sessions → 85 used → 6 projects, 4 people, locale-aware TR
213-
headers + body, six revised-decisions in chronological order)
172+
🟡 **Pending user actions (next session pickup):**
173+
174+
**The next-up work is v1.2.1 PyPI release.** A step-by-step plan is
175+
ready at [`docs/plans/2026-04-28-v1.2.1-pypi-publish.md`](docs/plans/2026-04-28-v1.2.1-pypi-publish.md).
176+
The resume protocol should land there. The plan covers:
177+
178+
1. Version bumps (`pyproject.toml` 1.1.0 → 1.2.1; `mnemos/__init__.py`
179+
"1.0.0a1" → "1.2.1" — both still stale)
180+
2. Pytest sanity (must still hit 545 pass)
181+
3. `python -m build`
182+
4. Smoke install in throwaway venv (`mnemos --version` → 1.2.1)
183+
5. `python -m twine upload dist/mnemos_dev-1.2.1*`**irreversible
184+
boundary**, confirm with user first
185+
6. Annotated git tags `v1.2.0` (4fddca4) + `v1.2.1` (e7cfdba)
186+
7. `gh release create v1.2.1`
187+
8. Commit version bumps + STATUS/ROADMAP update
188+
189+
**Strategy decision (locked in plan):** PyPI for the v1.x line starts
190+
at v1.2.1. v1.1.0 + v1.2.0 are git-tag milestones only; the
191+
2026-04-26-built v1.1.0 wheel in `dist/` predates the duplicate-refine
192+
fix and would publish a known-buggy snapshot if uploaded.
193+
194+
Estimated wall time: 15-25 min, dominated by build + upload + the
195+
typed PyPI token.
196+
197+
### ✅ Completed 2026-04-28 (full day)
198+
199+
- v1.2.0 locale-aware output: shipped + merged + pushed to `origin/main`
200+
- v1.2.1 refine-pipeline race fix (per-JSONL filelock + ledger normalize CLI): shipped + merged + pushed
201+
- v1.2.1 identity isolation follow-up (3 same-day bugs surfaced by bootstrap pilot — env-strip, neutral cwd, hook re-entry guard, strict OUTPUT prompt): shipped + merged + pushed
202+
- `bootstrap --limit N` pilot mode added
203+
- `mnemos refine-ledger --normalize --validate-paths` one-shot cleanup ran on kasamd ledger
204+
- `/exit` empirical test passed — single Session/.md created, no duplicate
205+
- `mnemos identity bootstrap --force` ran successfully on kasamd (90 sessions → 85 used → 6 projects, 4 people, locale-aware TR headers + body, six revised-decisions in chronological order)
206+
- Test suite **545 pass** (+16 vs 529 baseline)
207+
- Worktree + branch cleanup: 4 stale agent worktrees removed, 2 redundant project worktrees pruned, 9 merged feature/chore branches deleted
208+
- Test infra cleanup: `~/.claude/test-session-end/` directory removed
209+
210+
### ⏳ Pickup point for next session
211+
212+
The PyPI publish — see [`docs/plans/2026-04-28-v1.2.1-pypi-publish.md`](docs/plans/2026-04-28-v1.2.1-pypi-publish.md). When the user types `mnemos`, the resume protocol should:
213+
214+
1. Read this STATUS.md
215+
2. Read the publish plan
216+
3. Verify `git status` clean + `origin/main == HEAD` + pytest 545 pass
217+
4. Show a <100-word summary leading with "Next: v1.2.1 PyPI publish per the plan; pause for confirmation before step 5 (irreversible twine upload)"
218+
5. Wait for user go-ahead
214219

215220
---
216221

docs/ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ archive; if they conflict, this file wins.
2121
| **v1.0.0a1** | **Narrative-first pivot (atomic-fragmentation dropped, Sessions = unit, Identity Layer)** | ✅ shipped 2026-04-26 | ⏸ deferred |
2222
| **v1.1.0** | **SessionEnd-driven memory (refine+brief+identity-refresh worker, settings TUI, briefing v3, readiness gates, in-session cross-check)** | ✅ shipped 2026-04-27 | ⏸ deferred 24h |
2323
| **v1.2.0** | **Locale-aware output (EN code+docs, runtime headers match dominant Session language; defaults English when mixed)** | **✅ shipped 2026-04-28** *(empirical smoke green, merge + PyPI pending)* ||
24-
| **v1.2.1** | **Hot-fix: refine-pipeline race (per-JSONL filelock + normalize CLI) + identity isolation (env-strip ANTHROPIC_API_KEY, neutral cwd, recall_briefing re-entry guard, strict OUTPUT prompt) + `bootstrap --limit N` pilot mode** | **✅ shipped 2026-04-28** *(push + PyPI pending)* ||
24+
| **v1.2.1** | **Hot-fix: refine-pipeline race (per-JSONL filelock + normalize CLI) + identity isolation (env-strip ANTHROPIC_API_KEY, neutral cwd, recall_briefing re-entry guard, strict OUTPUT prompt) + `bootstrap --limit N` pilot mode** | **code shipped 2026-04-28** *(PyPI publish next session — [`plan`](plans/2026-04-28-v1.2.1-pypi-publish.md))* ||
2525
| v1.3.0 | Polish + LongMemEval benchmark (R@5 ≥ 93% baseline, JSONL-direct identity bootstrap?) |||
2626
| v0.5.0 | Automation / Phase 2 — superseded by v1.1 SessionEnd hook | 🗄️ archived ||
2727
| v0.6.0 | Community & Ecosystem (Obsidian plugin, multi-language markers, demo video) |||
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
---
2+
title: v1.2.1 PyPI Publish + Tag + GitHub Release
3+
date: 2026-04-28
4+
status: Plan ready, execution pending (deferred to fresh session)
5+
target_release: v1.2.1
6+
preceded_by: docs/specs/2026-04-28-v1.2.1-duplicate-refine-race.md
7+
---
8+
9+
# v1.2.1 PyPI Publish — Step-by-Step
10+
11+
## Goal
12+
13+
Cut the v1.2.1 release across PyPI, git tags, and GitHub. Skip v1.1.0
14+
and v1.2.0 PyPI uploads — they are git-tag-only milestones; PyPI for
15+
the v1.x line starts at v1.2.1.
16+
17+
## Pre-flight state (verified 2026-04-28 end of day)
18+
19+
- `origin/main` == local main == `e7cfdba` (8 commits ahead of dawn-of-day)
20+
- Test suite: **545 pass**, 2 skipped, 3 deselected
21+
- Worktrees: clean (only `C:/Projeler/mnemos` main + `C:/Projeler/mnemos-v1.1` editable-install)
22+
- Local branches: clean (`main`, `feat/identity-bootstrap-limit`, `feature/v1.1.0`, `legacy/atomic-paradigm`)
23+
- Existing tags: `v0.2.0`, `v0.3.0..v0.3.3`, `v0.4.0-archived`, `v1.0.0a1`, `v1.1.0` (no v1.2.x)
24+
- `dist/`: contains stale `mnemos_dev-1.1.0-*` from 2026-04-26; v1.2.x not yet built
25+
- `PYPI_TOKEN` in Windows User env: set (per CLAUDE.md inventory)
26+
27+
## Pre-flight bumps still required
28+
29+
These are step 1 below. Listing here so the new-session resume can
30+
verify before invoking the plan:
31+
32+
- `pyproject.toml:version` is `1.1.0` → must bump to `1.2.1`
33+
- `mnemos/__init__.py:__version__` is `"1.0.0a1"` (stale since v1.0
34+
alpha era; never touched in v1.1 or v1.2.0/v1.2.1) → must bump to
35+
`"1.2.1"`
36+
37+
## Why skip v1.1.0 + v1.2.0 PyPI?
38+
39+
The pre-existing `dist/mnemos_dev-1.1.0-*.whl` was built on 2026-04-26.
40+
Since then the codebase landed:
41+
42+
- v1.2.0 locale-aware output schema
43+
- v1.2.1 refine-pipeline race fix (per-JSONL filelock)
44+
- v1.2.1 identity isolation fix (3 same-day bugs surfaced by bootstrap pilot)
45+
46+
Publishing the 1.1.0 wheel now would commit to PyPI a snapshot that
47+
predates the duplicate-refine bug fix, which is exactly the regression
48+
v1.2.1 closes. Better story: PyPI v1.x line starts at v1.2.1 with
49+
"all known bugs fixed". v1.1.0 + v1.2.0 are git-tag milestones in the
50+
narrative; users coming from v0.3.3 via `pip install --upgrade
51+
mnemos-dev` jump straight to v1.2.1.
52+
53+
(Both versions are documented in CHANGELOG.md regardless. Tags
54+
`v1.1.0` and `v1.2.0` will live on GitHub.)
55+
56+
## Steps
57+
58+
### 1. Version bumps
59+
60+
```bash
61+
# pyproject.toml
62+
sed -i 's/^version = "1.1.0"/version = "1.2.1"/' pyproject.toml
63+
64+
# mnemos/__init__.py — replace whatever __version__ is there
65+
sed -i 's/^__version__ = ".*"/__version__ = "1.2.1"/' mnemos/__init__.py
66+
67+
# Verify
68+
grep -E "^version|^__version__" pyproject.toml mnemos/__init__.py
69+
# Expect:
70+
# pyproject.toml:version = "1.2.1"
71+
# mnemos/__init__.py:__version__ = "1.2.1"
72+
```
73+
74+
### 2. Sanity test
75+
76+
```bash
77+
cd C:/Projeler/mnemos-v1.1
78+
python -m pytest tests/ -q
79+
# Expect: 545 passed, 2 skipped, 3 deselected
80+
```
81+
82+
If a test fails, STOP — do not proceed to publish. Investigate first.
83+
84+
### 3. Build
85+
86+
```bash
87+
# Clean dist/ first so we're not contaminated by 2026-04-26's v1.1.0 wheel
88+
mv dist/mnemos_dev-1.1.0-py3-none-any.whl dist/_archive_v1.1.0.whl 2>/dev/null
89+
mv dist/mnemos_dev-1.1.0.tar.gz dist/_archive_v1.1.0.tar.gz 2>/dev/null
90+
# (rename instead of delete so the v1.1.0 artifact is preserved on disk
91+
# in case we ever decide to publish historically)
92+
93+
python -m build
94+
# Expect: dist/mnemos_dev-1.2.1-py3-none-any.whl (~120 KB)
95+
# dist/mnemos_dev-1.2.1.tar.gz (~660 KB)
96+
```
97+
98+
### 4. Smoke test in clean venv
99+
100+
```bash
101+
# Throwaway venv to validate the wheel installs cleanly
102+
python -m venv C:/tmp/mnemos-smoke-v1.2.1
103+
C:/tmp/mnemos-smoke-v1.2.1/Scripts/pip install C:/Projeler/mnemos-v1.1/dist/mnemos_dev-1.2.1-py3-none-any.whl
104+
C:/tmp/mnemos-smoke-v1.2.1/Scripts/mnemos --version
105+
# Expect: mnemos 1.2.1 (or similar; exact format depends on how cli.py
106+
# prints the version)
107+
C:/tmp/mnemos-smoke-v1.2.1/Scripts/mnemos --help | head -5
108+
# Expect: usage: mnemos [-h] {init,...} (no exception, no missing modules)
109+
```
110+
111+
If the smoke fails (missing module, import error, version mismatch),
112+
STOP and fix before publishing. The smoke is the last reversible
113+
check before twine upload burns the version number.
114+
115+
Cleanup smoke venv after:
116+
```bash
117+
python -c "import shutil; shutil.rmtree('C:/tmp/mnemos-smoke-v1.2.1')"
118+
```
119+
120+
### 5. Twine upload to PyPI (IRREVERSIBLE)
121+
122+
```bash
123+
python -m twine upload C:/Projeler/mnemos-v1.1/dist/mnemos_dev-1.2.1*
124+
# Username: __token__ (literal string, twine convention for tokens)
125+
# Password: <value of $env:PYPI_TOKEN>
126+
```
127+
128+
Twine will print the URL on success: `https://pypi.org/project/mnemos-dev/1.2.1/`.
129+
130+
If the upload fails with "File already exists", the version was
131+
inadvertently published earlier. Check pypi.org directly. If you need
132+
to re-upload (e.g., for a bad wheel), bump to 1.2.2 — PyPI does NOT
133+
allow overwriting a version, only yanking.
134+
135+
### 6. Git tags (annotated)
136+
137+
```bash
138+
cd C:/Projeler/mnemos
139+
git tag v1.2.0 -a -m "v1.2.0 — Locale-Aware Output (git-tag milestone, not on PyPI)" 4fddca4
140+
git tag v1.2.1 -a -m "v1.2.1 — Refine race + identity isolation hot-fix" e7cfdba
141+
git push origin v1.2.0 v1.2.1
142+
```
143+
144+
### 7. GitHub release
145+
146+
```bash
147+
cd C:/Projeler/mnemos
148+
gh release create v1.2.1 \
149+
--title "v1.2.1 — Refine race + identity isolation hot-fix" \
150+
--notes-file CHANGELOG.md \
151+
C:/Projeler/mnemos-v1.1/dist/mnemos_dev-1.2.1-py3-none-any.whl \
152+
C:/Projeler/mnemos-v1.1/dist/mnemos_dev-1.2.1.tar.gz
153+
```
154+
155+
`--notes-file CHANGELOG.md` includes the entire CHANGELOG; this is
156+
intentional — release notes that show the full project history aid
157+
discoverability for new users finding the repo.
158+
159+
(If the user prefers the release notes to be just the v1.2.1 entry,
160+
extract it manually from CHANGELOG.md and pass `--notes "<body>"` instead.)
161+
162+
### 8. Commit the version bumps
163+
164+
```bash
165+
cd C:/Projeler/mnemos-v1.1
166+
git add pyproject.toml mnemos/__init__.py
167+
git commit -m "chore(release): bump version to 1.2.1"
168+
git push origin feat/identity-bootstrap-limit # or main, depending on workflow
169+
```
170+
171+
If working from `feat/identity-bootstrap-limit`, fast-forward main
172+
afterward:
173+
```bash
174+
cd C:/Projeler/mnemos
175+
git merge --ff-only feat/identity-bootstrap-limit
176+
git push origin main
177+
```
178+
179+
### 9. STATUS / ROADMAP update
180+
181+
After successful publish, update STATUS.md and ROADMAP.md so the
182+
next session's resume protocol surfaces the right "next work":
183+
184+
- STATUS.md: move v1.2.1 from "in progress" to "shipped to PyPI";
185+
remove the publish-related items from "Pending user actions";
186+
add a brief "Released 2026-04-28" line under the version banner.
187+
- ROADMAP.md: flip the v1.2.1 PyPI column from `` to `` in the
188+
Version status table.
189+
190+
Commit:
191+
```bash
192+
git add STATUS.md docs/ROADMAP.md
193+
git commit -m "docs: v1.2.1 published to PyPI"
194+
git push origin main
195+
```
196+
197+
## Definition of done
198+
199+
- [ ] `pyproject.toml` and `mnemos/__init__.py` show 1.2.1
200+
- [ ] `pytest tests/ -q` — 545 passed
201+
- [ ] `dist/mnemos_dev-1.2.1-py3-none-any.whl` and `.tar.gz` exist
202+
- [ ] Smoke install in clean venv: `mnemos --version` prints 1.2.1
203+
- [ ] `pip search mnemos-dev` (or pypi.org page) shows 1.2.1
204+
- [ ] `git tag` lists `v1.2.0` and `v1.2.1`
205+
- [ ] `git ls-remote origin "refs/tags/v1.2.*"` confirms remote tags
206+
- [ ] GitHub releases page shows `v1.2.1` with the two artifacts
207+
attached
208+
- [ ] STATUS / ROADMAP updated and pushed
209+
210+
## Rollback / damage control
211+
212+
PyPI does not allow deleting a published version. Options if v1.2.1
213+
turns out broken:
214+
215+
1. **Yank** the version: `pip install twine; twine yank mnemos-dev==1.2.1
216+
--reason "<short>"` — keeps the version string visible on PyPI but
217+
prevents new installs from picking it. Existing users with 1.2.1
218+
installed are unaffected.
219+
2. **Ship v1.2.2** with the fix. This is the standard PyPI workflow
220+
(no overwrite).
221+
222+
For git tags: `git push --delete origin v1.2.1; git tag -d v1.2.1` if
223+
the tag pointed at a bad commit. Be cautious — anyone who already
224+
fetched the tag has the old reference.
225+
226+
## Resume protocol — what to do when this plan is picked up
227+
228+
The new session's `mnemos` resume should land here. Steps for the
229+
agent (not the user):
230+
231+
1. Read this file top-to-bottom.
232+
2. Verify pre-flight state still matches:
233+
- `git status --short` clean
234+
- `git rev-parse HEAD` == latest documented in STATUS
235+
- `python -m pytest tests/ -q` still 545 pass
236+
3. Work step-by-step. Pause AFTER step 4 (smoke test) and confirm
237+
with the user before step 5 (twine upload) — that is the
238+
irreversible boundary.
239+
4. After step 7 (GitHub release), continue with step 8 (commit
240+
bumps) and step 9 (STATUS/ROADMAP) without further confirmation
241+
— those are routine cleanup.
242+
243+
Estimated wall time: 15-25 min total, dominated by `python -m build`
244+
(~30s), twine upload (~30s), and waiting for the user to type the
245+
PyPI token at step 5.

0 commit comments

Comments
 (0)