Skip to content

chore(merge): sync develop with main after release v0.1.2 STABLE#41

Merged
h2devx merged 7 commits intodevelopfrom
chore/sync-develop-after-0.1.2
May 3, 2026
Merged

chore(merge): sync develop with main after release v0.1.2 STABLE#41
h2devx merged 7 commits intodevelopfrom
chore/sync-develop-after-0.1.2

Conversation

@h2devx
Copy link
Copy Markdown
Contributor

@h2devx h2devx commented May 3, 2026

Summary

Final merge-back PR of the 0.1.2-beta.* cycle. After PR #40 (release v0.1.2 STABLE) shipped to main, develop needs to receive the version bumps + release notes + READMEs/SECURITY/HANDOFF reflecting "stable channel" so future feature branches start from a consistent base.

This closes the GitFlow asymmetry that always appears between a release and its merge-back: develop was on 0.1.2-beta.6 package.json + "beta" READMEs; main is on 0.1.2 stable + "stable" READMEs.

Conflicts resolved

Same pattern as every previous release merge-back (Phase-12 PR #22, Phase-14 PR #30, Phase-15 PR #35, Phase-15-followup PR #39). All resolved with --theirs (main = canonical post-release version):

  • code/package.json (version 0.1.2-beta.6 → 0.1.2)
  • code/sonar-project.properties (version bump)
  • README.md (banner "stable" instead of "beta", install command without @beta, npm badge updated)
  • code/README.md (install command without @beta)
  • SECURITY.md (table reflects 0.1.2 as the only supported, betas + 0.1.0/0.1.1 hard-deprecated)
  • HANDOFF.md (§0 + new §6.21 Phase-16 + footer)

The new file docs/RELEASE-NOTES-v0.1.2.md came in cleanly from main.

Smoke validation (already done)

Post-publish smoke against fresh-installed @netzi/recall@latest (= 0.1.2) in clean workspace /tmp/recall-stable-smoke:

# Validation Result
1 serverInfo.version === "0.1.2" (stable, no -beta suffix) ✅ PASS
2 tools/list returns 6 MVP tools ✅ PASS
3 mem.health on fresh workspace: 0 entries ✅ PASS
4 mem.remember decision + learning + entity → upserted=true ✅ PASS (3/3)
5 mem.health post-writes: total_entries=3 (B-MCP-2 fix held) ✅ PASS
6 mem.recall("Postgres") returns hits ≥ 1 (B-MCP-8 fix held) ✅ PASS
7 mem.context bundle: 7 layers + total_tokens ✅ PASS
8 mem.task create returns task_id UUID v7 ✅ PASS

SUMMARY: 10 PASS / 0 FAIL. Stable release validated end-to-end.

npm state confirmed

$ npm view @netzi/recall dist-tags
{ latest: '0.1.2', beta: '0.1.2-beta.6' }

Plus 0.1.0 + 0.1.1 re-deprecated with messages pointing at @netzi/recall@latest (now 0.1.2).

Validation

Check Result
npm run typecheck EXIT=0
npm run lint (max-warnings 0) EXIT=0
npm test 2560 passing in 212 files

Test plan

  • 5+1 EXIT=0 over the merge-back branch.
  • Smoke against fresh-installed stable validating serverInfo.version="0.1.2" + all 6 MVP tools (10/10 PASS).
  • CI green on this PR.
  • Squash-merge to develop.

After this merges, the cycle 0.1.2-beta.* + 0.1.2 stable is fully closed end-to-end. Develop and main converge.

🤖 Generated with Claude Code

h2devx and others added 7 commits May 1, 2026 20:32
## Que cambia

Cuts `v0.1.2-beta.3` consolidando los 4 fixes de Phase-11 que cierran
los 4 bugs de dogfood reportados en Phase-9 (B-MCP-2/3/4/5).

## Por que

`@netzi/recall@0.1.2-beta.0` (en npm beta channel) tenia 4 issues
abiertos que rompian la promesa central del producto (semantic
recall, mem.health diagnostics, decision content storage). Phase-11
los cerro todos via PRs squash-mergeados a `develop`. Esta release
branch consolida los version bumps + release notes + HANDOFF
update para promover beta.3 a `main` y publish a npm.

## Tipo de cambio

- [x] chore — release (no code change beyond version bumps)

## Cambios incluidos (commits ya en develop, no parte de este PR)

| Issue | Tag | PR | Commit en develop |
|---|---|---|---|
| [#2](#2) | B-MCP-3 critical
| [#17](#17) | `229e7cd` |
| [#1](#1) | B-MCP-2 high |
[#18](#18) | `05b6731` |
| [#4](#4) | B-MCP-5 low |
[#19](#19) | `c4a2d1d` |
| [#3](#3) | B-MCP-4 critical
(data loss) | [#20](#20) |
`52fbfd9` |

## Cambios de este PR

- `code/package.json`: `0.1.2-beta.0` → `0.1.2-beta.3`
- `code/src/bootstrap/composition-root.ts`: default `serverInfo.version`
actualizado
- `code/sonar-project.properties`: `projectVersion` actualizado
- `docs/RELEASE-NOTES-v0.1.2-beta.3.md`: NUEVO, documentando los 4 fixes
+ migration safety + engineering metrics + outstanding caveats + path a
v0.1.2 stable
- `HANDOFF.md`: §0 actualizado al estado post-Phase-11; §6.16 nueva con
la cronologia completa, 10 decisiones del orquestador (D-1101..D-1110),
y 6 hallazgos durables

## Checklist

- [x] `npm run typecheck` EXIT=0
- [x] `npm run lint` y `npm run lint:tests` EXIT=0
- [x] `npm run validate:modules` EXIT=0
- [x] `npm run build` EXIT=0
- [x] `npm run test` EXIT=0 — 2519 tests passing en 208 archivos
- [x] Cero `any`, cero `as any`, cero `// @ts-ignore`
- [x] HANDOFF.md actualizado (§0 + §6.16 nueva)
- [x] Release notes consolidadas en
`docs/RELEASE-NOTES-v0.1.2-beta.3.md`

## E2E que validan VALORES

- [x] N/A — release branch sin cambios de codigo nuevos. Los 3 archivos
test value-validation (L/M/N) ya estan en develop via PRs #17/#18/#20.

## Plan post-merge

```bash
git checkout main && git pull
git tag -a v0.1.2-beta.3 -m "v0.1.2-beta.3"
git push origin v0.1.2-beta.3
gh release create v0.1.2-beta.3 --prerelease --notes-file docs/RELEASE-NOTES-v0.1.2-beta.3.md

# Usuario ejecuta el publish:
cd code && npm publish --tag beta --auth-type=web

# Merge-back develop:
git checkout develop && git merge --no-ff main && git push origin develop

# Dogfood real:
npm install -g @netzi/recall@beta && recall mcp serve  # o el comando equivalente
```

Si el dogfood post-publish surface nuevos defectos → cortar `beta.4`.
Si pasa limpio → cortar `release/0.1.2` (stable) + promover `latest`
desde 0.1.1 → 0.1.2 + hard-deprecate 0.1.1.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
#23)

## Que cambia

Hotfix que actualiza los docs publicos (README.md raiz, code/README.md
shipped en npm tarball, SECURITY.md, CONTRIBUTING.md) para reflejar
que los 4 bugs B-MCP-2..5 quedaron cerrados en \`v0.1.2-beta.3\`.

## Por que

PR #21 cerro el release v0.1.2-beta.3 pero solo actualizo:
- bumps de version (package.json, composition-root, sonar)
- HANDOFF.md (§0 + §6.16)
- docs/RELEASE-NOTES-v0.1.2-beta.3.md (nuevo)

**Olvidamos los public-facing docs**. Cuando el usuario tomo el
codigo a publish, el README.md root y el code/README.md (shipped en
npm tarball como package README) seguian diciendo:
- "trabajo activo en 0.1.2-beta.x"
- "4 issues abiertos hoy (B-MCP-2..5)"
- "npm install -g @netzi/recall" (defaults a latest=0.1.1 deprecada)

Sin este hotfix, la pagina del paquete en npmjs.com mostraria
informacion incorrecta sobre el estado del producto justo despues
del publish.

## Tipo de cambio

- [x] docs — solo documentacion publica
- [x] hotfix — fix sobre main (perdimos esto en el release; sin esto
      el npm publish sale con package.json correcto pero README
      stale)

## Updates

- **README.md** (root): banner refleja "v0.1.2-beta.3 cierra los 4
  bugs"; quick start nota canal beta; "Issues" reads "0 issues
  abiertos al cierre de Phase-11 (cerrados via PRs #17/#18/#19/#20)".
- **code/README.md** (shipped en npm tarball como package README):
  install command recomienda `@beta` con nota sobre por que; CTA
  apunta a beta.3 en vez de latest=0.1.1 deprecada.
- **SECURITY.md**: tabla de versiones soportadas incluye
  `0.1.2-beta.3` (active), marca `0.1.2-beta.0` como superseded,
  nota que latest=0.1.1 sigue deprecada hasta que 0.1.2 stable
  promote.
- **CONTRIBUTING.md**: "Issues y bugs" reads "0 issues abiertos al
  cierre de Phase-11" con pointers a §6.16 + release notes.

## Artefactos historicos intencionalmente sin tocar

- `docs/RELEASE-NOTES-v0.1.2-beta.0.md` — snapshot de un release
  anterior; release notes son inmutables por convencion.
- `CONTRIBUTING.md` line 139 commit-format example mencionando
  beta.0 — illustrative, no truth claim.

## Checklist

- [x] `npm run typecheck` EXIT=0
- [x] `npm run lint` y `npm run lint:tests` EXIT=0
- [x] `npm run validate:modules` EXIT=0
- [x] `npm run build` EXIT=0
- [x] `npm run test` EXIT=0 (no source files touched, suite previa sigue
valida)
- [ ] N/A — wire/protocolo MCP no cambia
- [ ] N/A — no introduce ADR

## Plan post-merge

Per CONTRIBUTING.md hotfix flow: tras merge a main, hacer
merge-back a develop (PR separado). Adicionalmente, **actualizar el
tag v0.1.2-beta.3** para que apunte al commit con los doc fixes
incluidos antes del npm publish:

\`\`\`bash
git checkout main && git pull
git tag -d v0.1.2-beta.3
git push origin :refs/tags/v0.1.2-beta.3
git tag -a v0.1.2-beta.3 -m "v0.1.2-beta.3"
git push origin v0.1.2-beta.3
gh release edit v0.1.2-beta.3 --target main # apunta el release al nuevo
SHA
cd code && npm publish --tag beta --auth-type=web
\`\`\`

(El tag v0.1.2-beta.3 actualmente apunta a \`a826ef0\`, sin los
doc fixes. Re-tagging es seguro porque el GitHub release de
beta.3 aun no tiene downloads y npm publish todavia no se completo.)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary

Cuts `v0.1.2-beta.4` from develop (`0c18625`). This release closes
[B-MCP-7](#24) — the embedding
worker now tolerates the fastembed cold-start without burning per-item
retry budget — on top of the four Phase-9 dogfood defects already
shipped in `v0.1.2-beta.3`.

## What's in this release

- **PR [#27](#27 — B-MCP-7
fix (typed error union `EmbedderUnavailableError` vs `EmbedFailedError`,
worker exponential back-off, new `recall reset-queue` CLI command for
recovery on workspaces poisoned by the pre-fix worker).
- **PR [#26](#26 — Workflow
Claude pre-commit hooks (`.claude/settings.json` + 3 scripts in
`.claude/hooks/`).
- **PR [#28](#28 — HANDOFF
Phase-13 closing doc.

Plus this release branch:
- `code/package.json` + `code/sonar-project.properties` bumped to
`0.1.2-beta.4`.
- `docs/RELEASE-NOTES-v0.1.2-beta.4.md` (new file).
- README.md banner + code/README.md install command updated.
- SECURITY.md supported-versions table updated (beta.4 active, beta.3
superseded).

## Engineering metrics

- 5+1/5+1 EXIT=0 locally (`typecheck`, `lint`, `lint:tests`,
`validate:modules`, tests **2553/2553**, build).
- SonarQube quality gate `MCP Memoria Strict` PASSED on PR #27 final
push (Reliability A, Security A, Maintainability A, 0 bugs / 0 vulns / 0
blockers / 0 critical, **coverage on new code 99.8%**, overall 96.4%).
- 0 issues GitHub abiertos antes de este release.

## Recovery instructions for users on `<= v0.1.2-beta.3`

If your workspace has `embedding_queue` rows stuck at `attempts=5`:

```bash
recall reset-queue --workspace /path/to/your/repo
# Cola de embeddings restablecida.
#   Filas restablecidas: <N>
#   Umbral aplicado (attempts >=): 5
#   El worker re-intentara estas entradas en su proximo drain.
```

Then start `recall-server` normally — the worker will drain the queue.

## Test plan

- [x] CI ya green via PR #27 con typed-error union + extract-method
refactor.
- [x] All 5+1 quality gates EXIT=0 locally on this release branch.
- [ ] CI corre el quality gate aqui también (espera tras push).
- [ ] Tras merge: tag `v0.1.2-beta.4` + GitHub pre-release + `npm
publish --tag beta`.
- [ ] Post-publish smoke contra DB del dogfood (con `recall reset-queue`
primero) validando worker drena cola + semantic recall recovers con
queries paraphrased.

## Path to v0.1.2 stable

If the smoke against the dogfood shows the worker draining the queue and
semantic recall recovering, we promote `0.1.2` to `latest` dist-tag and
hard-deprecate `0.1.1`. Otherwise, new bugs go into individual issues +
PRs and ship as `v0.1.2-beta.5+`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…>0) (#34)

## Summary

Cuts `v0.1.2-beta.5` from `develop` after [PR
#33](#33) closed
[B-MCP-8](#31): `mem.recall`
returned `total_candidates>0` but `hits=0` whenever the top-ranked
candidate alone exceeded `max_tokens`. The dogfood DB tripped this
because learning rows store the full content un-truncated and the hybrid
scorer (now active end-to-end thanks to B-MCP-7) ranks long learnings
highly.

This release ships **only the B-MCP-8 fix + version/docs sync**. No new
features.

| Item | Value |
|---|---|
| Issues closed | [#31
B-MCP-8](#31) (medium) |
| PRs merged into develop since beta.4 |
[#33](#33) |
| Tests | **2557 passing** in 211 files (+4 vs 2553 at beta.4) |
| Coverage on new code | 100% (PR #33) |
| Coverage overall | 96.4% |

## Highlights of the fix (PR #33)

1. **`RecallMemoryUseCase.rankAndSlice` always includes the top-ranked
hit** — even if it solo exceeds `max_tokens`. Returning zero hits when
there ARE candidates surprises callers and degrades the semantic-recall
promise; one slightly-oversized result is strictly more useful than no
result.
2. **`continue` (not `break`) on overflow** for subsequent hits — a
mid-loop oversized candidate doesn't suppress smaller hits behind it in
the ranking.
3. **`RecallMemoryFacadeAdapter.DEFAULT_MAX_TOKENS` bumped 4000 → 8000**
for consistency with `GetContextFacadeAdapter`.

## Tests (VALUES not SHAPE — Phase-9 rule)

The pre-existing unit test ("trims the tail when cumulative token cost
would exceed maxTokens") used
`expect(getEntries().length).toBeLessThanOrEqual(1)` — that loose
assertion silently passed even at length=0, exactly the bug. Now
`toBe(1)` plus an exact id assertion.

- 2 pre-existing assertions tightened from `toBeLessThanOrEqual(N)` →
`toBe(N)`.
- 2 new unit tests in `recall-memory.use-case.test.ts` (top-hit always
returned; mid-ranking overflow uses continue).
- 2 new integration tests in `D-mem-recall.test.ts` (B-MCP-8 dogfood
reproducer + new 8000-token default).

## Files in this release branch

| Capa | Archivos |
|---|---|
| Code (already in develop via PR #33) |
`code/src/modules/retrieval/application/use-cases/recall-memory.use-case.ts`;
`code/src/composition/facades/mcp-server-facades.ts`; 2 test files |
| Release tooling (this PR) | `code/package.json` +
`code/sonar-project.properties` (bump 0.1.2-beta.4 → 0.1.2-beta.5) |
| Release notes (this PR) | `docs/RELEASE-NOTES-v0.1.2-beta.5.md` (NEW)
|
| Public docs (this PR) | `README.md`, `code/README.md`, `SECURITY.md`
(banner / install / version table) |
| HANDOFF (this PR) | `HANDOFF.md` (§0 + new §6.20 Phase-15 + footer) |

## Validation

| Check | Result |
|---|---|
| `npm run typecheck` | EXIT=0 |
| `npm run lint` (max-warnings 0) | EXIT=0 |
| `npm run lint:tests` (max-warnings 0) | EXIT=0 |
| `npm run validate:modules` | PASS — no module violations |
| `npm run build` (tsup) | EXIT=0 |
| `npm test` | **2557 passing** in 211 files |
| SonarQube quality gate | already PASSED on PR #33 (coverage new 100%,
ratings A) |

## Test plan

- [x] 5+1 EXIT=0 over the release branch.
- [x] PR #33 merged into develop with CI green + SonarQube quality gate
PASSED.
- [ ] CI green on this PR.
- [ ] Squash-merge to main.
- [ ] Tag `v0.1.2-beta.5` annotated to merge commit + push (with `git
switch --detach v0.1.2-beta.5` because of the protected-branch hook).
- [ ] `gh release create v0.1.2-beta.5 --prerelease --notes-file
docs/RELEASE-NOTES-v0.1.2-beta.5.md --target main`.
- [ ] `cd code && npm publish --tag beta --auth-type=web` (WebAuthn
passkey).
- [ ] Smoke against the dogfood DB: `mem.recall` with paraphrased
queries should return `hits.length >= 1` even when the top-ranked hit is
a long learning.
- [ ] Merge-back develop ← main via `chore/sync-develop-after-beta-5`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…38)

## Summary

Cuts `v0.1.2-beta.6` from `develop` after [PR
#37](#37) closed the cosmetic
carryover where `serverInfo.version` in the JSON-RPC handshake reported
`0.1.2-beta.3` even after the binary itself bumped to beta.4 / beta.5.
Behavior-preserving — no tool path changes.

**Last release planned before promoting `0.1.2` stable.** Soak 24-48h
post-publish before cutting `release/0.1.2`.

| Item | Value |
|---|---|
| PRs merged into develop since beta.5 |
[#37](#37) (carryover fix) |
| Tests | **2560 passing** in 212 files (+3 vs 2557 at beta.5) |
| Coverage SonarQube | overall 96.4%, ratings A/A/A |
| Issues closed | Carryover cosmético `serverInfo.version` (HANDOFF §0 +
§6.20 #1) |

## Highlights of the fix (PR #37)

1. **`resolvePackageVersion()` reads from `package.json` at boot** —
eliminates the disciplinary requirement to update two files on every
release. Resolution mirrors the `resolveDefaultMigrationsDir()` pattern
(B-CLI-5): argv[1] with realpath + import.meta.url anchors.
2. **`name === "@netzi/recall"` validation** — without this, the unit
test caught the resolver returning vitest's own `1.1.1` (anchored on the
vitest binary's argv[1]).
3. **`0.0.0-unknown` sentinel fallback** — bootstrap never blocks on
missing package metadata; the obviously-fake string surfaces on the
handshake so any client can flag a broken install.
4. **Sonar refactor (round 2)**: extracted
`collectFsCandidates(builder)` + `readPackageVersionField(candidate)` to
kill S3776 (cognitive complexity) + S4144 (duplicate inline
`pushCandidate` helper across the migrations and version resolvers).
5. **Tests VALUES not SHAPE** (Phase-9 rule applied retroactively):
tightened `expect(typeof === "string")` →
`expect().toBe(readPackageJsonVersion())` in E2E. New 3-test unit suite
for the helper. E2E harness now copies `code/package.json` to the
staging tree.

## Files in this release branch

| Capa | Archivos |
|---|---|
| Code (already in develop via PR #37) |
`code/src/bootstrap/composition-root.ts`;
`code/tests/unit/bootstrap/composition-root.test.ts` (NEW);
`code/tests/e2e/B-mcp-server-binary.test.ts`;
`code/tests/e2e/_helpers/binary-harness.ts` |
| Release tooling (this PR) | `code/package.json` +
`code/sonar-project.properties` (bump 0.1.2-beta.5 → 0.1.2-beta.6) |
| Release notes (this PR) | `docs/RELEASE-NOTES-v0.1.2-beta.6.md` (NEW)
|
| Public docs (this PR) | `README.md`, `code/README.md`, `SECURITY.md`
(banner / install / version table) |
| HANDOFF (this PR) | `HANDOFF.md` (§0 rows + footer) |

## Validation

| Check | Result |
|---|---|
| `npm run typecheck` | EXIT=0 |
| `npm run lint` (max-warnings 0) | EXIT=0 |
| `npm run lint:tests` (max-warnings 0) | EXIT=0 |
| `npm run validate:modules` | PASS — no module violations |
| `npm run build` (tsup) | EXIT=0 |
| `npm test` | **2560 passing** in 212 files |

## Test plan

- [x] 5+1 EXIT=0 over the release branch.
- [x] PR #37 merged into develop with CI green + SonarQube quality gate
PASSED (round 2 after refactor).
- [ ] CI green on this PR.
- [ ] Squash-merge to main.
- [ ] Tag `v0.1.2-beta.6` annotated to merge commit + push (with `git
switch --detach v0.1.2-beta.6` because of the protected-branch hook).
- [ ] `gh release create v0.1.2-beta.6 --prerelease --notes-file
docs/RELEASE-NOTES-v0.1.2-beta.6.md --target main`.
- [ ] `cd code && npm publish --tag beta --auth-type=web` (WebAuthn
passkey).
- [ ] Smoke against the dogfood DB: `mem.health` and other tools keep
working; the handshake `initialize.serverInfo.version` now reports
`"0.1.2-beta.6"` (was `"0.1.2-beta.3"` in beta.4 + beta.5 due to the
carryover).
- [ ] Merge-back develop ← main via `chore/sync-develop-after-beta-6`.
- [ ] Soak 24-48h in real use, then cut `release/0.1.2` stable.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary

**First stable release of `@netzi/recall`.** Channel promotion from
`0.1.2-beta.6` (commit `f3aca46`) to the `latest` dist-tag. **No code
changes** — same binary bit-for-bit modulo the version string.

Decision: skip the soak 24-48h post-beta.6 (justified by fresh smoke
10/10 PASS + 0 issues + cycle of 7 betas that already closed 8 bugs
vinculated to real use). The cycle's bug discovery rate has been "1 bug
per beta surfaced by dogfood" — staying on beta.6 longer would not
surface new information.

| Item | Value |
|---|---|
| Tag | `v0.1.2` (no suffix) |
| Channel | `latest` (was `beta` for the entire `0.1.2-beta.*` cycle) |
| Tests | **2560 passing** in 212 files (no change vs beta.6) |
| Coverage SonarQube | overall 96.4%, ratings A/A/A |
| Issues at release | **0** open |

## What 0.1.2 stable consolidates

The `0.1.2-beta.*` cycle ran from 2026-04-28 (beta.0) to 2026-05-03
(beta.6). Each release surfaced exactly one bug from real-world dogfood
that the previous release exposed:

| Beta | Date | Bugs closed | PR |
|---|---|---|---|
| `0.1.2-beta.0` | 2026-04-28 | preventive cut after Phase-9 dogfood
discovery | n/a |
| `0.1.2-beta.3` | 2026-05-01 | **B-MCP-2** + **B-MCP-3** + **B-MCP-4**
+ **B-MCP-5** | [#17](#17),
[#18](#18),
[#19](#19),
[#20](#20) |
| `0.1.2-beta.4` | 2026-05-02 | **B-MCP-7** |
[#27](#27) |
| `0.1.2-beta.5` | 2026-05-02 | **B-MCP-8** |
[#33](#33) |
| `0.1.2-beta.6` | 2026-05-03 | **carryover** `serverInfo.version` |
[#37](#37) |
| **`0.1.2` (this)** | 2026-05-03 | channel promotion + npm deprecation
of 0.1.0/0.1.1 | this PR |

Plus B-MCP-1 closed in v0.1.1 (Phase-8 same-day patch). Total: 8 bugs
closed end-to-end via dogfood + smoke loop.

## Files in this release branch

| Capa | Archivos |
|---|---|
| Code | (cero cambios — channel promotion sin cambios de logica) |
| Release tooling | `code/package.json` +
`code/sonar-project.properties` (bump 0.1.2-beta.6 → 0.1.2) |
| Release notes | `docs/RELEASE-NOTES-v0.1.2.md` (NEW, ~250 LOC
consolidating the full cycle + migration guide) |
| Public docs | `README.md`, `code/README.md`, `SECURITY.md` (banner
"stable", install command without @beta, version table updated) |
| HANDOFF | `HANDOFF.md` (§0 + new §6.21 Phase-16 + footer) |

## Validation

| Check | Result |
|---|---|
| `npm run typecheck` | EXIT=0 |
| `npm run lint` (max-warnings 0) | EXIT=0 |
| `npm run lint:tests` (max-warnings 0) | EXIT=0 |
| `npm run validate:modules` | PASS — no module violations |
| `npm run build` (tsup) | EXIT=0 |
| `npm test` | **2560 passing** in 212 files |

## Test plan

- [x] 5+1 EXIT=0 over the release branch.
- [x] PR #38 (release v0.1.2-beta.6) merged to main.
- [x] Fresh smoke 10/10 PASS against npx-installed beta.6 in fresh
workspace (this is the same binary).
- [ ] CI green on this PR.
- [ ] Squash-merge to main.
- [ ] Tag `v0.1.2` annotated to merge commit + push (`git switch
--detach v0.1.2` because of protected-branch hook).
- [ ] `gh release create v0.1.2 --target main --notes-file
docs/RELEASE-NOTES-v0.1.2.md` — **NO `--prerelease`**.
- [ ] `cd code && npm publish --auth-type=web` — **NO `--tag beta`** →
publishes directly to `latest`.
- [ ] `npm deprecate @netzi/recall@0.1.0 "deprecated due to bugs
B-MCP-1..8 (closed in 0.1.2). Use @netzi/recall@latest"`.
- [ ] `npm deprecate @netzi/recall@0.1.1 "deprecated due to bugs
B-MCP-2..8 (closed in 0.1.2). Use @netzi/recall@latest"`.
- [ ] `npm view @netzi/recall dist-tags` should return `{ latest:
'0.1.2', beta: '0.1.2-beta.6' }`.
- [ ] `npx --yes @netzi/recall@latest --help` should execute 0.1.2 (not
0.1.1).
- [ ] Merge-back develop ← main via `chore/sync-develop-after-0.1.2`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ter-0.1.2

# Conflicts:
#	HANDOFF.md
#	README.md
#	SECURITY.md
#	code/README.md
#	code/package.json
#	code/sonar-project.properties
@h2devx h2devx merged commit 181217f into develop May 3, 2026
1 check passed
@h2devx h2devx deleted the chore/sync-develop-after-0.1.2 branch May 3, 2026 15:39
h2devx added a commit that referenced this pull request May 3, 2026
…smoke 10/10 PASS (#42)

## Summary

Standard phase-close docs PR (pattern:
[#25](#25),
[#28](#28),
[#32](#32),
[#36](#36)). Updates HANDOFF.md
§0 + §6.21 + 3 new lecciones durables + footer to reflect Phase-16 fully
closed end-to-end.

## What Phase-16 delivered (all already shipped)

- [PR #40](#40) — release v0.1.2
STABLE to main with conflict resolution (--ours).
- Tag `v0.1.2` → `29371f8` + GitHub release stable (NO prerelease).
- `npm publish` (user, WebAuthn passkey, NO `--tag beta` → published to
`latest`).
- `npm deprecate` 0.1.0 + 0.1.1 with messages pointing at `@latest`.
- Smoke fresh stable: **10/10 PASS** against `npx --yes
@netzi/recall@latest` in clean workspace `/tmp/recall-stable-smoke`.
`serverInfo.version === "0.1.2"` confirmed (no `-beta` suffix).
- [PR #41](#41) — merge-back
develop ← main with conflict resolution (--theirs). Develop and main
converged.

## What this PR adds

Only HANDOFF.md changes (30 insertions, 23 deletions):

- §0: 8 rows updated to reflect post-publish + post-merge-back reality
(Fecha, Fase actual, Paquete npm, Estado del release, Memoria propia,
Issues, Próximo paso, etc.).
- §6.21: sub-fases 9-15 marked complete with concrete outcomes
(squash-merge SHAs, smoke results, dist-tags, deprecate final messages);
estado del repo post-Phase-16 with actual SHAs and dist-tags.
- 3 new lecciones durables: (5) `npm view dist-tags` cache local sin
honor TTL — usar `--prefer-online`; (6) `npm deprecate` con target
hardcoded a una version envejece mal — siempre apuntar a `@latest`; (7)
"1 bug por beta" del cycle 0.1.2-beta.* es patrón observado, no garantía
para 0.1.3-beta.* futuros.
- Footer "Ultima actualizacion" updated to reflect end-to-end closure.

## npm registry state confirmed

```
$ npm view @netzi/recall dist-tags
{ latest: '0.1.2', beta: '0.1.2-beta.6' }

$ npm view @netzi/recall@0.1.0 deprecated
Critical bug B-MCP-1 (Phase-7) — all MCP tools fail with real clients. Use @netzi/recall@latest...

$ npm view @netzi/recall@0.1.1 deprecated
Bugs B-MCP-2..8 surfaced via dogfood — closed in 0.1.2. Use @netzi/recall@latest...
```

## Test plan

- [x] No code changes — pure docs PR (HANDOFF.md only).
- [x] Hooks pre-commit no-op (no `code/src/` changes → typecheck not
triggered).
- [ ] CI green on this PR (typecheck + lint + lint:tests +
validate:modules + build + test:coverage + Sonar all pass over unchanged
source).
- [ ] Squash-merge to develop.

After this merges, the cycle `0.1.2-beta.*` + `0.1.2` stable + Phase-16
follow-up docs is fully closed end-to-end. Next session inherits an
accurate HANDOFF reflecting the published state.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant