Skip to content

release: v1.6.0 - #359

Merged
robotrocketscience merged 4 commits into
mainfrom
release/v1.6.0
May 2, 2026
Merged

release: v1.6.0#359
robotrocketscience merged 4 commits into
mainfrom
release/v1.6.0

Conversation

@robotrocketscience

@robotrocketscience robotrocketscience commented May 2, 2026

Copy link
Copy Markdown
Owner

Summary

Cuts v1.6.0 from main HEAD. 23 user-facing commits since v1.5.1 captured under [1.6.0] in CHANGELOG. Version bumped 1.5.1 → 1.6.0; uv.lock refreshed.

Companion to the retroactive v1.5.1 tag pushed today at 831881d (already published to PyPI via run 25262298217).

What landed in this PR

Three atomic commits:

  1. 123b10e — backfill #190 + #238 entries from stale [Unreleased] into [1.5.1] (where they actually shipped per git describe --contains).
  2. deac329 — write [1.6.0] section: 9 grouped feat entries (paragraphs), 1 changed entry (refactor: drop benchmarks/-importing targets from aelf bench (supersedes #329) #342), 6 fixed entries (one-liners).
  3. 3084da5release: v1.6.0 (pyproject + uv.lock).

v1.6.0 highlights (reviewer-facing)

Verification

  • Discretion grep clean on added lines.
  • All 23 commits in 831881d..main accounted for in [1.6.0] (excluding internal-only ci/build/test/style/docs/chore).
  • [Unreleased] section now empty / removed.
  • Staging-gate (secrets, pii, history-audit, pytest 3.12/3.13).
  • e2e (uv-tool / venv-pip; pipx blocked on PR test(e2e): tests/e2e/ skeleton + scenario 1 (#334 step 1) #354 fix).

Test plan

  • After merge: tag v1.6.0 at merge commit, push tag, verify publish.yml ships to PyPI.
  • Verify CHANGELOG renders correctly on PyPI release page.

Summary by Sourcery

Cut the v1.6.0 release by finalizing the changelog, backfilling the 1.5.1 section, and bumping the project version.

New Features:

  • Introduce hook hardening with framing-tag enforcement, escaped memory content, and a per-turn hook audit log with an aelf tail CLI for live observability.
  • Add belief retention classes, per-source aging defaults, and operator tooling to promote retention based on accumulated retrieval evidence.
  • Log context rebuild diagnostics and provide an audit script to analyze rebuild sessions and pack-rate distributions.
  • Provide a posterior-ranking evaluation harness with optional heat-kernel composition to compare retrieval strategies against a BM25 baseline.
  • Add a deferred-feedback sweeper that derives implicit posterior feedback from how retrieved beliefs are used in subsequent turns.
  • Scaffold the public v2.0 evaluation corpus and add a bench-gate harness that conditionally runs corpus-based tests.
  • Introduce a replay equality probe over the ingest log to validate log-derived state against the live store as a flip-readiness gate.
  • Propagate session identifiers from onboard, scanner, and MCP entry points into inserted beliefs to support downstream correlation.
  • Detect reachable installations and surface multi-install upgrade warnings before running aelf upgrade.

Bug Fixes:

  • Preserve belief corroborations during the unique-content migration by avoiding unintended cascaded deletes.
  • Add aelf doctor --gc-orphan-feedback to clean up dangling feedback history rows with non-existent belief references.
  • Deduplicate re-ingest paths and rebuild outputs by belief content hash to avoid inflated storage and duplicated host-visible facts.
  • Pin the step-security/harden-runner GitHub Action to a specific commit SHA and correct a misnamed merge-conflict label in workflows.

Enhancements:

  • Move dev-only benchmark commands out of the shipped aelf CLI into module-level entry points and improve aelf bench error messaging.

Build:

  • Bump the package version from 1.5.1 to 1.6.0 and refresh the dependency lockfile.

Documentation:

  • Update the changelog with detailed 1.6.0 release notes and move previously shipped items into the 1.5.1 section.

@coderabbitai

coderabbitai Bot commented May 2, 2026

Copy link
Copy Markdown

Important

Review skipped

Ignore keyword(s) in the title.

⛔ Ignored keywords (2)
  • docs:
  • release:

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0cf1ef3f-ab6d-4cd6-b478-19f44719e8ca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/v1.6.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sourcery-ai

sourcery-ai Bot commented May 2, 2026

Copy link
Copy Markdown

Reviewer's Guide

Release cut for v1.6.0: backfills 1.5.1 changelog entries, documents all user-facing changes since 1.5.1 in a new [1.6.0] section, and bumps project metadata/lockfile to 1.6.0.

Flow diagram for preparing and cutting the v1.6.0 release

flowchart TD
  start(["Start v1.6.0 release cut"]) --> backfill151
  backfill151["Backfill 1.5.1 entries into CHANGELOG [1.5.1]"] --> write160
  write160["Write new [1.6.0] section in CHANGELOG with all user-facing changes"] --> bumpmeta
  bumpmeta["Bump version: pyproject.toml 1.5.1 → 1.6.0 and refresh uv.lock"] --> mergepr
  mergepr["Merge release PR into main"] --> tag160
  tag160["Create and push Git tag v1.6.0 at merge commit"] --> ci
  ci["GitHub Actions publish.yml builds and uploads 1.6.0 to PyPI"] --> verify
  verify["Verify CHANGELOG renders correctly on PyPI release page"] --> endNode(["Release complete"])
Loading

File-Level Changes

Change Details Files
Document all user-facing changes for v1.6.0 and clean up historical changelog structure.
  • Replace [Unreleased] section with a dated [1.6.0] section summarizing new features, changes, and fixes since 1.5.1.
  • Add detailed entries for hook-hardening, observability tooling, belief retention and feedback systems, evaluation harnesses, and corpus scaffolding in the Added subsection.
  • Introduce a Fixed subsection capturing schema/migration robustness, feedback GC, dedup behaviour, workflow pinning, and label rename fixes.
  • Ensure the [1.6.0] section accounts for all relevant commits between 1.5.1 and the current main head.
CHANGELOG.md
Backfill 1.5.1 changelog entries that had been left under [Unreleased].
  • Insert the previously Unreleased 1.5.1 feature entries (belief corroboration tracking and default-on LLM-Haiku onboard) under a dated [1.5.1] section.
  • Remove the obsolete [Unreleased] section to reflect that all items have shipped and are now attributed to concrete versions.
CHANGELOG.md
Bump project version and refresh dependency lock for the v1.6.0 release.
  • Update pyproject project.version from 1.5.1 to 1.6.0.
  • Regenerate uv.lock to capture the dependency graph at the v1.6.0 cut point.
pyproject.toml
uv.lock

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@robotrocketscience robotrocketscience added the attn:review Needs review (PR open, awaiting reviewer) label May 2, 2026

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 2 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="CHANGELOG.md" line_range="21" />
<code_context>
+- **Belief retention class + per-source aging policy** ([#290](https://github.com/robotrocketscience/aelfrice/issues/290)). Phase-1 adds the `retention_class` schema column on `beliefs` (`unknown` | `transient` | `durable` | `permanent`) and the matching python validator. Phase-2 wires per-ingest-source defaults into `derive()` and the orphan-classifier scanner so new beliefs land with a non-`unknown` retention class based on which entry point ingested them. Phase-3 lands the promotion path: `MemoryStore.find_promotable_snapshots()` and `set_retention_class()` store APIs, surfaced through `aelf doctor --promote-retention` so an operator can run a one-shot pass that reclassifies low-prior beliefs based on retrieval / corroboration evidence accumulated since they were ingested. Foundational layer for the v2.0 aging / pruning policy spec'd in `docs/belief_retention_class.md`; no automated retention-driven eviction yet.
</code_context>
<issue_to_address>
**issue (typo):** Capitalize "Python" when referring to the language.

Since this refers to the programming language, please capitalize it as "Python" for consistency with standard usage in the docs.

```suggestion
- **Belief retention class + per-source aging policy** ([#290](https://github.com/robotrocketscience/aelfrice/issues/290)). Phase-1 adds the `retention_class` schema column on `beliefs` (`unknown` | `transient` | `durable` | `permanent`) and the matching Python validator. Phase-2 wires per-ingest-source defaults into `derive()` and the orphan-classifier scanner so new beliefs land with a non-`unknown` retention class based on which entry point ingested them. Phase-3 lands the promotion path: `MemoryStore.find_promotable_snapshots()` and `set_retention_class()` store APIs, surfaced through `aelf doctor --promote-retention` so an operator can run a one-shot pass that reclassifies low-prior beliefs based on retrieval / corroboration evidence accumulated since they were ingested. Foundational layer for the v2.0 aging / pruning policy spec'd in `docs/belief_retention_class.md`; no automated retention-driven eviction yet.
```
</issue_to_address>

### Comment 2
<location path="CHANGELOG.md" line_range="43" />
<code_context>
+- **Corroborations preserved across unique-applying migration** (refs [#336](https://github.com/robotrocketscience/aelfrice/issues/336)). The one-shot migration adding `UNIQUE(content_hash)` to `beliefs` did `DROP TABLE beliefs` with `PRAGMA foreign_keys=ON`, firing the `ON DELETE CASCADE` on `belief_corroborations` and wiping every corroboration row — including the synthetic `consolidation_migration` markers the dedup pass had just inserted. Wrap the swap in `PRAGMA foreign_keys=OFF/=ON` per the SQLite recommended pattern for table-mutation migrations.
</code_context>
<issue_to_address>
**issue (typo):** Fix the PRAGMA example to use `OFF/ON` instead of `OFF/=ON`.

`PRAGMA foreign_keys=OFF/=ON` doesn’t match SQLite syntax or the earlier `foreign_keys=ON` in the sentence. Please use `PRAGMA foreign_keys=OFF` / `PRAGMA foreign_keys=ON`, or otherwise show `OFF/ON` without the extra `=`.

```suggestion
- **Corroborations preserved across unique-applying migration** (refs [#336](https://github.com/robotrocketscience/aelfrice/issues/336)). The one-shot migration adding `UNIQUE(content_hash)` to `beliefs` did `DROP TABLE beliefs` with `PRAGMA foreign_keys=ON`, firing the `ON DELETE CASCADE` on `belief_corroborations` and wiping every corroboration row — including the synthetic `consolidation_migration` markers the dedup pass had just inserted. Wrap the swap in `PRAGMA foreign_keys=OFF` / `PRAGMA foreign_keys=ON` per the SQLite recommended pattern for table-mutation migrations.
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment thread CHANGELOG.md

- **`aelf tail` — live observability for hook injections** ([#321](https://github.com/robotrocketscience/aelfrice/issues/321), [#322](https://github.com/robotrocketscience/aelfrice/pull/322)). `tail -f`-style pretty-printer over the per-turn hook audit log. Streams each fire as a one-line summary (timestamp, session, n_locked, latency, prompt prefix); `--full` switches to the full rendered block. Reader half of the #321 observability story; complements the audit-log writer above. The audit record itself is extended with `beliefs[]` (per-belief id + tier), `latency_ms`, and `tokens` so the tail reader can surface what was injected at what cost without re-running retrieval.

- **Belief retention class + per-source aging policy** ([#290](https://github.com/robotrocketscience/aelfrice/issues/290)). Phase-1 adds the `retention_class` schema column on `beliefs` (`unknown` | `transient` | `durable` | `permanent`) and the matching python validator. Phase-2 wires per-ingest-source defaults into `derive()` and the orphan-classifier scanner so new beliefs land with a non-`unknown` retention class based on which entry point ingested them. Phase-3 lands the promotion path: `MemoryStore.find_promotable_snapshots()` and `set_retention_class()` store APIs, surfaced through `aelf doctor --promote-retention` so an operator can run a one-shot pass that reclassifies low-prior beliefs based on retrieval / corroboration evidence accumulated since they were ingested. Foundational layer for the v2.0 aging / pruning policy spec'd in `docs/belief_retention_class.md`; no automated retention-driven eviction yet.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (typo): Capitalize "Python" when referring to the language.

Since this refers to the programming language, please capitalize it as "Python" for consistency with standard usage in the docs.

Suggested change
- **Belief retention class + per-source aging policy** ([#290](https://github.com/robotrocketscience/aelfrice/issues/290)). Phase-1 adds the `retention_class` schema column on `beliefs` (`unknown` | `transient` | `durable` | `permanent`) and the matching python validator. Phase-2 wires per-ingest-source defaults into `derive()` and the orphan-classifier scanner so new beliefs land with a non-`unknown` retention class based on which entry point ingested them. Phase-3 lands the promotion path: `MemoryStore.find_promotable_snapshots()` and `set_retention_class()` store APIs, surfaced through `aelf doctor --promote-retention` so an operator can run a one-shot pass that reclassifies low-prior beliefs based on retrieval / corroboration evidence accumulated since they were ingested. Foundational layer for the v2.0 aging / pruning policy spec'd in `docs/belief_retention_class.md`; no automated retention-driven eviction yet.
- **Belief retention class + per-source aging policy** ([#290](https://github.com/robotrocketscience/aelfrice/issues/290)). Phase-1 adds the `retention_class` schema column on `beliefs` (`unknown` | `transient` | `durable` | `permanent`) and the matching Python validator. Phase-2 wires per-ingest-source defaults into `derive()` and the orphan-classifier scanner so new beliefs land with a non-`unknown` retention class based on which entry point ingested them. Phase-3 lands the promotion path: `MemoryStore.find_promotable_snapshots()` and `set_retention_class()` store APIs, surfaced through `aelf doctor --promote-retention` so an operator can run a one-shot pass that reclassifies low-prior beliefs based on retrieval / corroboration evidence accumulated since they were ingested. Foundational layer for the v2.0 aging / pruning policy spec'd in `docs/belief_retention_class.md`; no automated retention-driven eviction yet.

Comment thread CHANGELOG.md

### Fixed

- **Corroborations preserved across unique-applying migration** (refs [#336](https://github.com/robotrocketscience/aelfrice/issues/336)). The one-shot migration adding `UNIQUE(content_hash)` to `beliefs` did `DROP TABLE beliefs` with `PRAGMA foreign_keys=ON`, firing the `ON DELETE CASCADE` on `belief_corroborations` and wiping every corroboration row — including the synthetic `consolidation_migration` markers the dedup pass had just inserted. Wrap the swap in `PRAGMA foreign_keys=OFF/=ON` per the SQLite recommended pattern for table-mutation migrations.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (typo): Fix the PRAGMA example to use OFF/ON instead of OFF/=ON.

PRAGMA foreign_keys=OFF/=ON doesn’t match SQLite syntax or the earlier foreign_keys=ON in the sentence. Please use PRAGMA foreign_keys=OFF / PRAGMA foreign_keys=ON, or otherwise show OFF/ON without the extra =.

Suggested change
- **Corroborations preserved across unique-applying migration** (refs [#336](https://github.com/robotrocketscience/aelfrice/issues/336)). The one-shot migration adding `UNIQUE(content_hash)` to `beliefs` did `DROP TABLE beliefs` with `PRAGMA foreign_keys=ON`, firing the `ON DELETE CASCADE` on `belief_corroborations` and wiping every corroboration row — including the synthetic `consolidation_migration` markers the dedup pass had just inserted. Wrap the swap in `PRAGMA foreign_keys=OFF/=ON` per the SQLite recommended pattern for table-mutation migrations.
- **Corroborations preserved across unique-applying migration** (refs [#336](https://github.com/robotrocketscience/aelfrice/issues/336)). The one-shot migration adding `UNIQUE(content_hash)` to `beliefs` did `DROP TABLE beliefs` with `PRAGMA foreign_keys=ON`, firing the `ON DELETE CASCADE` on `belief_corroborations` and wiping every corroboration row — including the synthetic `consolidation_migration` markers the dedup pass had just inserted. Wrap the swap in `PRAGMA foreign_keys=OFF` / `PRAGMA foreign_keys=ON` per the SQLite recommended pattern for table-mutation migrations.

@robotrocketscience
robotrocketscience merged commit c102590 into main May 2, 2026
16 checks passed
@robotrocketscience
robotrocketscience deleted the release/v1.6.0 branch May 2, 2026 21:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

attn:review Needs review (PR open, awaiting reviewer)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant