From 1e557859a17210f5dad5cbe3e68532942f30ce28 Mon Sep 17 00:00:00 2001 From: Ashutosh Tripathi Date: Sat, 28 Feb 2026 21:05:34 +0530 Subject: [PATCH 1/3] release: v0.4.1 (#42) * chore: new branch (#33) * fix(ci): bench scorecard ci windows fixes (#34) * ci: auto-template and title for dev to main PRs * release: v0.3.2 (dev -> main) (#35) * New branch (#33) * chore: add pending project files * refactor(ingest): centralize ingestion via parser/resolver/store layers * docs: document layered ingest architecture * test(perf): add qmd benchmark harness and non-blocking CI regression check * perf(bench): add ingest hotpath benchmark and record qmd optimization * perf(ingest): batch session writes and add stable benchmark tooling * Add benchmark scorecard to CI summary and sticky PR comment * Fix bench import path and temporarily disable design-contract workflow * CI: checkout qmd submodule in perf bench workflow * Fix Windows path handling in ingest session discovery * Feature/bench scorecard ci windows fixes (#34) * chore: add pending project files * refactor(ingest): centralize ingestion via parser/resolver/store layers * docs: document layered ingest architecture * test(perf): add qmd benchmark harness and non-blocking CI regression check * perf(bench): add ingest hotpath benchmark and record qmd optimization * perf(ingest): batch session writes and add stable benchmark tooling * Add benchmark scorecard to CI summary and sticky PR comment * Fix bench import path and temporarily disable design-contract workflow * CI: checkout qmd submodule in perf bench workflow * Fix Windows path handling in ingest session discovery * CI: run full test matrix only on merge branches * CI: auto-create draft prerelease on successful dev CI * CI: auto-template and title for dev to main PRs * ci: create dev draft release after successful dev test matrix * chore: add e2e dev release flow test marker (#36) * release: v0.3.2 (dev -> main) (#37) * New branch (#33) * chore: add pending project files * refactor(ingest): centralize ingestion via parser/resolver/store layers * docs: document layered ingest architecture * test(perf): add qmd benchmark harness and non-blocking CI regression check * perf(bench): add ingest hotpath benchmark and record qmd optimization * perf(ingest): batch session writes and add stable benchmark tooling * Add benchmark scorecard to CI summary and sticky PR comment * Fix bench import path and temporarily disable design-contract workflow * CI: checkout qmd submodule in perf bench workflow * Fix Windows path handling in ingest session discovery * Feature/bench scorecard ci windows fixes (#34) * chore: add pending project files * refactor(ingest): centralize ingestion via parser/resolver/store layers * docs: document layered ingest architecture * test(perf): add qmd benchmark harness and non-blocking CI regression check * perf(bench): add ingest hotpath benchmark and record qmd optimization * perf(ingest): batch session writes and add stable benchmark tooling * Add benchmark scorecard to CI summary and sticky PR comment * Fix bench import path and temporarily disable design-contract workflow * CI: checkout qmd submodule in perf bench workflow * Fix Windows path handling in ingest session discovery * CI: run full test matrix only on merge branches * CI: auto-create draft prerelease on successful dev CI * CI: auto-template and title for dev to main PRs * CI: create dev draft release after successful dev test matrix * chore: add e2e dev release flow test marker (#36) * docs: update CHANGELOG.md for v0.4.0 [skip ci] * docs: add CI/release workflow architecture and north-star plan * ci: add commit lint, semver metadata, and deterministic release notes * docs: finalize workflow policy docs without backlog sections * ci: scope commit lint to pull request commit ranges only * fix(ci): setup bun before dev draft release metadata step * fix(ci): allow legacy non-conventional history for dev draft metadata * fix(release): align dev-main PR version with latest stable tag * ci: improve workflow and check naming for PR readability * ci: skip PR test job for dev to main release PRs * fix(ci): use import.meta.dir for cross-platform path resolution new URL(import.meta.url).pathname produces /D:/a/... on Windows, causing ENOENT errors. import.meta.dir is Bun's cross-platform alternative. Co-Authored-By: Claude Opus 4.6 * ci: add auto-release job for main branch merges After tests pass on main, automatically compute the next semver version and create a GitHub release. Handles squash merges (which lose individual commit types) by defaulting to patch when commits exist but bump is "none". Skips if HEAD is already tagged. Co-Authored-By: Claude Opus 4.6 --------- Co-authored-by: github-actions[bot] Co-authored-by: Baseline User Co-authored-by: Claude Opus 4.6 --- .github/workflows/ci.yml | 74 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 766c0fc..9125d3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -143,3 +143,77 @@ jobs: generate_release_notes: false draft: true prerelease: true + + auto-release: + name: Push(main) / Auto Release + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + needs: test-merge + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Check if already tagged + id: check + run: | + # Skip if this commit already has a stable version tag + for tag in $(git tag --points-at HEAD 2>/dev/null); do + if echo "$tag" | grep -qE '^v[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "skip=true" >> "$GITHUB_OUTPUT" + echo "Commit already tagged as $tag, skipping." + exit 0 + fi + done + echo "skip=false" >> "$GITHUB_OUTPUT" + + - name: Setup Bun + if: steps.check.outputs.skip != 'true' + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + if: steps.check.outputs.skip != 'true' + run: bun install + + - name: Compute release metadata + if: steps.check.outputs.skip != 'true' + id: meta + run: | + bun run scripts/release-meta.ts --allow-invalid --github-output "$GITHUB_OUTPUT" + + # Squash merges lose individual commit types, so if bump is + # "none" but there are unreleased commits, default to patch. + BUMP=$(grep '^bump=' "$GITHUB_OUTPUT" | cut -d= -f2) + COUNT=$(grep '^commit_count=' "$GITHUB_OUTPUT" | cut -d= -f2) + if [ "$BUMP" = "none" ] && [ "$COUNT" -gt 0 ]; then + echo "Bump was 'none' with $COUNT commits — overriding to 'patch'" + LATEST=$(git tag --list 'v*.*.*' --sort=-version:refname \ + | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1) + if [ -n "$LATEST" ]; then + IFS='.' read -r MAJ MIN PAT <<< "${LATEST#v}" + NEXT="v${MAJ}.${MIN}.$((PAT + 1))" + else + NEXT="v0.1.0" + fi + echo "next_version=${NEXT}" >> "$GITHUB_OUTPUT" + echo "bump=patch" >> "$GITHUB_OUTPUT" + fi + + - name: Create release + if: steps.check.outputs.skip != 'true' && steps.meta.outputs.bump != 'none' + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.meta.outputs.next_version }} + target_commitish: ${{ github.sha }} + name: ${{ steps.meta.outputs.next_version }} + body: ${{ steps.meta.outputs.release_notes }} + generate_release_notes: false + draft: false + prerelease: false From 0a90454cf0015f9a3e8fa68af01fe1119005ccd2 Mon Sep 17 00:00:00 2001 From: Baseline User Date: Sat, 28 Feb 2026 21:27:50 +0530 Subject: [PATCH 2/3] ci: trigger auto-release workflow on main Previous squash merge body contained [skip ci] from an old commit message, which prevented GitHub Actions from running. Co-Authored-By: Claude Opus 4.6 From ada24bf202d09129d573f7c74859621d251744b3 Mon Sep 17 00:00:00 2001 From: Baseline User Date: Tue, 3 Mar 2026 15:14:48 +0530 Subject: [PATCH 3/3] docs(claude): add proactive memory behavior directives to CLAUDE.md Add structured guidance for AI sessions to proactively save decisions, recognize save-worthy moments, and use consistent category tagging. Co-Authored-By: Claude Opus 4.6 --- CLAUDE.md | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 39aa414..99f56dc 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,6 +3,118 @@ Shared memory layer for AI-powered engineering teams. Built on [QMD](https://github.com/tobi/qmd). +## Memory + +You have Smriti. USE IT. + +### Start of Every Session + +Before writing a single line of code, run: + +```bash +smriti recall "[what we're about to work on]" +``` + +Use what comes back. If there's prior context on this topic, it changes how +you approach the work. Don't ignore it. + +### Recognize These Moments — Then Act Immediately + +No permission needed. No asking "should I save this?" Just do it. + +- Someone says "this works" or "let's go with this" +- An approach is chosen after comparing options +- A bug is fixed and the root cause is understood +- A constraint is discovered that will affect future work +- An architectural decision is made + +**WRONG**: Continue the conversation without saving. +**RIGHT**: Write the decision record, ingest it, tag it — then respond. + +### How to Save a Decision + +**Step 1 — Write the record:** + +```bash +cat > /tmp/smriti-note.md << 'EOF' +# [Title] + +## Decision +[One sentence — the actual choice made.] + +## Why +[The reasoning. What was considered. What was ruled out and why.] + +## Context +[What problem this solves. What breaks if someone reverses this later.] +EOF +``` + +**Step 2 — Ingest:** + +```bash +smriti ingest file /tmp/smriti-note.md \ + --title "[Title]" \ + --project smriti +``` + +**Step 3 — Tag:** + +```bash +smriti tag [session-id] [category] +``` + +### Categories + +| What happened | Tag | +|---------------|-----| +| Architecture choice, approach finalized | `decision/technical` | +| Library or tool selected | `decision/tooling` | +| Bug fixed, root cause identified | `bug/fix` | +| Structural design settled | `architecture/design` | +| Feature approach finalized | `feature/implementation` | +| Config or setup figured out | `project/config` | + +### Concrete Example + +User says: *"Okay let's use post-filtering for vector search with filters"* + +**WRONG**: +> "Got it, I'll use post-filtering." + +**RIGHT**: + +```bash +cat > /tmp/smriti-note.md << 'EOF' +# Vector search with filters: post-filter approach + +## Decision +Use post-filter strategy for applying metadata filters to vector search +results, rather than combining sqlite-vec queries with EXISTS subqueries. + +## Why +sqlite-vec's two-step query pattern hangs when combined with Smriti's +EXISTS subqueries on metadata tables. Post-filtering runs vector search +unfiltered (3x overfetch), then filters results against session metadata +in a separate batch lookup — no sqlite-vec changes needed. + +## Context +Affects smriti recall when --project, --category, or --agent flags are +used. Without this, filtered recall loses semantic search entirely and +falls back to BM25 only. +EOF + +smriti ingest file /tmp/smriti-note.md \ + --title "Vector search with filters: post-filter approach" \ + --project smriti + +smriti tag [session-id] decision/technical +``` + +Then respond to the user. + +--- + ## Quick Reference ```bash @@ -104,7 +216,7 @@ get a clean name like `openfga`. 4. Store message/meta/sidecars/costs (store gateway) 5. Aggregate results and continue on per-session errors (orchestrator) -See `INGEST_ARCHITECTURE.md` for details. +See `docs/internal/ingest-architecture.md` for details. ### Search