Skip to content

fix(daemon): bound ordinary revision replay#2689

Merged
Sinity merged 3 commits into
masterfrom
feature/fix/bound-ordinary-authority-replay
Jul 11, 2026
Merged

fix(daemon): bound ordinary revision replay#2689
Sinity merged 3 commits into
masterfrom
feature/fix/bound-ordinary-authority-replay

Conversation

@Sinity

@Sinity Sinity commented Jul 11, 2026

Copy link
Copy Markdown
Owner

Summary

Correct the unsafe ordinary-daemon replay amplification merged in #2688. Ordinary replay now censuses only the selected authority cohort; explicit offline rebuild remains the only archive-wide census route. Payload size is enforced after full durable cohort expansion and before opening any retained blob.

Problem

Independent adversarial review of #2688 found two critical defects:

  1. backfill_historical_revision_evidence(selected_raw_ids=...) still parsed and rewrote membership census for every retained raw before applying the selection. A 120-row daemon batch would therefore rescan roughly 18k raws / 45 GiB and mutate unrelated source evidence.
  2. The pre-expansion size guard could select a small raw whose authority sibling exceeded 1 GiB. Stream-capable formats were also incorrectly treated as executable even though raw_revision_material materializes the full retained payload before stream parsing.

#2688 remains explicit evidence of the superseded unsafe implementation; this PR corrects it forward without rewriting history.

Solution

  • Add selected-row support to the source-tier census reader.
  • Expand selected IDs through durable source-path and membership authority, census only that fixed-point cohort, and leave unrelated raw census rows untouched.
  • Keep selected_raw_ids=None as the explicit archive-wide/offline behavior.
  • Enforce max_payload_bytes over the fully expanded cohort before _parse_retained_raw opens any blob.
  • Treat all oversized retained raws as blocked; stream capability remains diagnostic until the retained reader actually streams.
  • Return a typed resource-blocked result to ordinary repair with stable metrics and detail.
  • Add anti-amplification, oversized-stream, and small-selected/oversized-sibling regressions that fail if unrelated or oversized blobs are opened.

Verification

  • devtools test tests/unit/storage/test_archive_readiness.py tests/unit/storage/test_repair.py tests/unit/sources/test_revision_backfill.py — 56 passed in 81.81s.
  • devtools verify --quick — all 13 steps passed in 22.37s.

Ref polylogue-yla8.

Summary by CodeRabbit

  • New Features

    • Added configurable limits for replaying historical revision data.
    • Added clear resource-blocking errors when individual or combined payloads exceed configured limits.
    • Expanded repair diagnostics to include related payload cohorts and authority components.
    • Added support for targeted census selection and payload-size reporting.
  • Bug Fixes

    • Prevented oversized or blocked payloads from being opened or replayed during repair.
    • Improved handling of parsing failures, append fragments, and related session data.
  • Tests

    • Added coverage for oversized cohorts, independent processing, and targeted rebuild isolation.

Limit ordinary daemon replay census to the selected authority cohort while preserving archive-wide census for explicit offline rebuilds. Enforce the retained-payload size bound after cohort expansion and before any blob is opened, including stream-capable formats whose current retained reader still materializes bytes.\n\nThis corrects the unsafe amplification and sibling-size gaps merged in #2688.\n\nRef polylogue-yla8.\n\nCo-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Raw revision backfill now enforces payload limits across authority components. Archive selection exposes cohort and size metadata, while materialization repair uses that metadata to block oversized components and process executable components across bounded passes.

Changes

Bounded raw replay

Layer / File(s) Summary
Authority component selection
polylogue/storage/sqlite/archive_tiers/archive.py
ArchiveStore supports filtered census queries, payload-size lookup, transitive authority components, and connection-aware membership expansion.
Bounded revision replay
polylogue/sources/revision_backfill.py, tests/unit/sources/test_revision_backfill.py
Historical replay enforces per-raw and aggregate payload limits, raises a new exported resource-blocked exception, and tests targeted cohort isolation.
Materialization repair gating
polylogue/storage/repair.py, tests/unit/storage/test_repair.py
Repair expands candidates to authority cohorts, reports blocking metrics, filters executable components, handles replay blocking, and tests oversized and multi-pass scenarios.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant repair_raw_materialization
  participant ArchiveStore
  participant backfill_historical_revision_evidence
  repair_raw_materialization->>ArchiveStore: expand raw ids into authority components
  ArchiveStore-->>repair_raw_materialization: expanded ids, payload sizes, components
  repair_raw_materialization->>backfill_historical_revision_evidence: replay executable raw ids with max_payload_bytes
  backfill_historical_revision_evidence->>ArchiveStore: census selected component raws
  ArchiveStore-->>backfill_historical_revision_evidence: census rows and payload sizes
  backfill_historical_revision_evidence-->>repair_raw_materialization: replay result or RawRevisionReplayResourceBlockedError
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and clearly summarizes the main change: bounding ordinary daemon revision replay.
Description check ✅ Passed The description includes the required Summary, Problem, Solution, and Verification sections and is mostly complete.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/fix/bound-ordinary-authority-replay

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.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4fc38aaadc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread polylogue/sources/revision_backfill.py Outdated
Comment on lines +70 to +71
if selected_raw_ids is not None:
census_selection, _keys = archive.expand_raw_membership_selection(selected_raw_ids)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Include raw revision siblings in the bounded cohort

When a selected raw has another raw_sessions.logical_source_key sibling under a different source_path, this expansion does not include that sibling unless it already has a raw_session_memberships row. Normal single-session revision ingest binds raw_sessions.logical_source_key and applies revision replay without writing membership rows, but later this function still calls raw_revision_rebuild_selection() and classify_raw_revision_cohort(), which read every full raw for the logical key. In that scenario an oversized sibling excluded from executable_raw_ids can still be opened by classification without the new max_payload_bytes guard, and accepted siblings were never spilled, so selected repair can still bypass the intended 1 GiB bound or fail during replay.

Useful? React with 👍 / 👎.

Sinity added 2 commits July 11, 2026 05:45
Expand backlog candidates through the same durable cohort metadata as execution and enforce the replay envelope over aggregate cohort bytes. Status and the actuator now block the same oversized materialized siblings and many-sub-limit cohorts before any retained blob opens.\n\nRef polylogue-yla8.\n\nCo-Authored-By: Claude <noreply@anthropic.com>
Partition selected raw work into transitive path/membership authority components. Backlog blocks only intrinsically oversized components, while execution processes independent safe components across bounded daemon passes even when total pending bytes exceed the per-component envelope.\n\nRef polylogue-yla8.\n\nCo-Authored-By: Claude <noreply@anthropic.com>
@Sinity

Sinity commented Jul 11, 2026

Copy link
Copy Markdown
Owner Author

Automated review classification: CodeRabbit is rate-limited and posted no code finding. An independent adversarial review ran four correction iterations over the combined #2688/#2689 surface; the final head 3b928e3 has no remaining P0 blocker. The review specifically validated scoped ordinary census, transitive cohort expansion, per-component resource admission, oversized-before-open behavior, offline-policy preservation, and non-starvation. All substantive CI gates are green; the skipped test job is the documented per-PR policy, with 59 focused managed tests run locally.

@Sinity
Sinity merged commit 8030555 into master Jul 11, 2026
15 checks passed
@Sinity
Sinity deleted the feature/fix/bound-ordinary-authority-replay branch July 11, 2026 03:59
@github-actions github-actions Bot mentioned this pull request Jul 11, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
polylogue/storage/repair.py (2)

1693-1702: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

elif can under-report the blocked scope in the detail message when both conditions hold.

When oversized_raw_ids (per-raw check against candidates.raw_blob_bytes, scoped to this pass's raw_ids) is non-empty, the elif blocked_component_raw_ids: branch is skipped entirely — even if the authority-component expansion pulled in additional raw ids beyond oversized_raw_ids (e.g. materialized siblings not in this pass's candidate list) that are also blocked. The raw_materialization_resource_blocked_count metric still reports the full, correct len(blocked_component_raw_ids), but the human-readable detail string would only mention len(oversized_raw_ids), which can be smaller — misleading for someone diagnosing why replay stalled. This combination isn't currently covered by a test (the existing tests only exercise cases where exactly one of the two is non-empty).

Consider reporting both counts when both are non-empty, e.g.:

-    if oversized_raw_ids:
+    if oversized_raw_ids and not blocked_component_raw_ids - set(oversized_raw_ids):
         detail += (
             f"; {len(oversized_raw_ids):,} non-stream-safe raw row(s) exceed execution limit "
             f"{_format_bytes(RAW_MATERIALIZATION_EXECUTE_BLOB_LIMIT_BYTES)}"
         )
-    elif blocked_component_raw_ids:
+    if blocked_component_raw_ids - set(oversized_raw_ids):
         detail += (
-            f"; {len(blocked_component_raw_ids):,} raw row(s) belong to authority components whose aggregate "
+            f"; {len(blocked_component_raw_ids - set(oversized_raw_ids)):,} additional raw row(s) belong to "
+            "authority components whose aggregate "
             f"payload exceeds {_format_bytes(RAW_MATERIALIZATION_EXECUTE_BLOB_LIMIT_BYTES)}"
         )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@polylogue/storage/repair.py` around lines 1693 - 1702, The detail message
conditionally reports only one blocked scope, under-reporting when both
oversized_raw_ids and blocked_component_raw_ids are non-empty. Update the detail
construction in the repair logic to report both counts when both collections
contain IDs, while preserving the existing messages for either-only case; add or
update tests covering the combined condition.

362-407: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

New backlog keys aren't present in the "unavailable" early-return dict.

expanded_candidate_count, expanded_total_blob_bytes, expanded_aggregate_blocked, authority_component_count, blocked_authority_component_count, executable_authority_component_count are only added to the dict returned on the "available" path (lines 402-407). The early return above (when source.db/index.db are missing) still returns the older, smaller key set. A caller that unconditionally indexes these new keys (rather than checking available first) will get a KeyError when tiers are missing, whereas previously-existing keys like oversized_count/oversized_stream_safe_count already had this gap — this PR just widens it with more keys that a caller might now start depending on.

Consider adding these keys with zero/False defaults to the early-return dict for shape consistency.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@polylogue/storage/repair.py` around lines 362 - 407, Add the new expansion
and authority-component fields—expanded_candidate_count,
expanded_total_blob_bytes, expanded_aggregate_blocked,
authority_component_count, blocked_authority_component_count, and
executable_authority_component_count—to the unavailable early-return dictionary
in the relevant storage repair function, using zero or False defaults so its
result shape matches the available path.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@polylogue/sources/revision_backfill.py`:
- Around line 70-128: Prevent archive-wide census from being combined with a
payload limit: at the start of the relevant backfill function, before
constructing census_selections, validate that max_payload_bytes is None when
selected_raw_ids is None and raise a clear ValueError otherwise. Document this
contract near the function signature or validation, using the existing
selected_raw_ids and max_payload_bytes symbols.

In `@polylogue/storage/sqlite/archive_tiers/archive.py`:
- Around line 1717-1732: raw_membership_selection_components_sync redundantly
expands raw IDs already belonging to discovered components. Before calling
expand_raw_membership_selection_sync for each raw_id, skip it when any existing
component already contains that ID; retain the existing merge logic for
uncovered IDs and preserve deterministic sorted output.

---

Outside diff comments:
In `@polylogue/storage/repair.py`:
- Around line 1693-1702: The detail message conditionally reports only one
blocked scope, under-reporting when both oversized_raw_ids and
blocked_component_raw_ids are non-empty. Update the detail construction in the
repair logic to report both counts when both collections contain IDs, while
preserving the existing messages for either-only case; add or update tests
covering the combined condition.
- Around line 362-407: Add the new expansion and authority-component
fields—expanded_candidate_count, expanded_total_blob_bytes,
expanded_aggregate_blocked, authority_component_count,
blocked_authority_component_count, and executable_authority_component_count—to
the unavailable early-return dictionary in the relevant storage repair function,
using zero or False defaults so its result shape matches the available path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1cae9e82-239b-44ad-ac59-990b12690ad2

📥 Commits

Reviewing files that changed from the base of the PR and between df559d8 and 3b928e3.

📒 Files selected for processing (5)
  • polylogue/sources/revision_backfill.py
  • polylogue/storage/repair.py
  • polylogue/storage/sqlite/archive_tiers/archive.py
  • tests/unit/sources/test_revision_backfill.py
  • tests/unit/storage/test_repair.py

Comment on lines +70 to +128
census_selections: tuple[tuple[str, ...] | None, ...]
if selected_raw_ids is None:
census_selections = (None,)
else:
census_selections = archive.raw_membership_selection_components(selected_raw_ids)
censused: set[str] = set()
for initial_selection in census_selections:
census_selection = initial_selection
while True:
rows = archive.raw_membership_census_rows(census_selection)
pending_rows = [(raw_id, source_index) for raw_id, source_index in rows if raw_id not in censused]
if max_payload_bytes is not None:
payload_sizes = archive.raw_payload_sizes([raw_id for raw_id, _index in rows])
total_payload_bytes = sum(payload_sizes.values())
oversized = [raw_id for raw_id, size in payload_sizes.items() if size > max_payload_bytes]
if oversized or total_payload_bytes > max_payload_bytes:
blocked_ids = oversized or list(payload_sizes)
raise RawRevisionReplayResourceBlockedError(
sorted(blocked_ids), max_payload_bytes, total_payload_bytes
)
for raw_id, source_index in pending_rows:
scanned += 1
censused.add(raw_id)
if source_index < 0:
archive.replace_raw_membership_census(
raw_id,
None,
parser_fingerprint="revision-membership-v1",
censused_at_ms=0,
detail="append fragments are governed by byte revision authority",
)
quarantined += 1
continue
try:
sessions, _payload_bytes = _parse_retained_raw(archive, raw_id)
except Exception as exc:
archive.replace_raw_membership_census(
raw_id,
None,
parser_fingerprint="revision-membership-v1",
censused_at_ms=0,
detail=str(exc),
)
quarantined += 1
continue
classified += int(len(sessions) == 1)
spill.add(raw_id, sessions, payload_bytes=_payload_bytes)
archive.replace_raw_membership_census(
raw_id,
sessions,
parser_fingerprint="revision-membership-v1",
censused_at_ms=0,
)
if census_selection is None:
break
expanded, _keys = archive.expand_raw_membership_selection(list(census_selection))
if set(expanded) == set(census_selection):
break
census_selection = expanded

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Payload-limit check operates on the whole census_selection regardless of censused state — correct, but combining selected_raw_ids=None with max_payload_bytes would block the entire archive-wide census in one shot.

When selected_raw_ids is None, census_selections = (None,), so census_selection never gets narrowed to a component — the size check (if max_payload_bytes were set) would sum all retained raws' blob sizes at once and raise for the whole archive, rather than gating per-cohort. Today no caller passes both selected_raw_ids=None and max_payload_bytes together (repair.py always passes a concrete selected_raw_ids list when it sets max_payload_bytes), so this isn't currently reachable, but it's a sharp edge for future callers given the docstring/PR intent that "explicit offline rebuilds retain archive-wide census behavior" (i.e. size limits are meant to be inapplicable to the None path).

Consider asserting/documenting that max_payload_bytes is only meaningful together with an explicit selected_raw_ids, e.g. raising a ValueError up front if both are combined, to prevent a future caller from unintentionally blocking the whole archive census.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@polylogue/sources/revision_backfill.py` around lines 70 - 128, Prevent
archive-wide census from being combined with a payload limit: at the start of
the relevant backfill function, before constructing census_selections, validate
that max_payload_bytes is None when selected_raw_ids is None and raise a clear
ValueError otherwise. Document this contract near the function signature or
validation, using the existing selected_raw_ids and max_payload_bytes symbols.

Comment on lines +1717 to +1732
@staticmethod
def raw_membership_selection_components_sync(
conn: sqlite3.Connection,
raw_ids: list[str],
) -> tuple[tuple[str, ...], ...]:
"""Partition scheduling hints into transitive authority components."""
components: list[set[str]] = []
for raw_id in dict.fromkeys(raw_ids):
expanded, _keys = ArchiveStore.expand_raw_membership_selection_sync(conn, [raw_id])
component = set(expanded)
overlapping = [existing for existing in components if existing & component]
for existing in overlapping:
component.update(existing)
components.remove(existing)
components.append(component)
return tuple(tuple(sorted(component)) for component in sorted(components, key=lambda item: min(item)))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Redundant per-raw expansion inside raw_membership_selection_components_sync.

Each raw_id in the input (after dedup) triggers its own call to expand_raw_membership_selection_sync, which internally re-runs the full fixpoint expansion query loop from scratch. Since expand_raw_membership_selection_sync([raw_id]) already computes the raw's entire connected component (it's a full closure over shared source_path/logical_source_key edges), any later raw_id that lands inside an already-computed component still triggers a brand-new expansion pass instead of being skipped. For a tightly-connected component with k members present in the input list, this repeats the same multi-query fixpoint computation k times.

This method is called from _raw_materialization_candidate_ids (twice per repair_raw_materialization pass: once up front, once for the "remaining" recheck) and again inside backfill_historical_revision_evidence's own census loop — so the redundant cost compounds across layers. Given the PR's goal is bounding replay work, it's worth avoiding this amplification in the component-discovery step itself.

♻️ Proposed fix: skip raw_ids already covered by a merged component
     `@staticmethod`
     def raw_membership_selection_components_sync(
         conn: sqlite3.Connection,
         raw_ids: list[str],
     ) -> tuple[tuple[str, ...], ...]:
         """Partition scheduling hints into transitive authority components."""
         components: list[set[str]] = []
+        covered: set[str] = set()
         for raw_id in dict.fromkeys(raw_ids):
+            if raw_id in covered:
+                continue
             expanded, _keys = ArchiveStore.expand_raw_membership_selection_sync(conn, [raw_id])
             component = set(expanded)
             overlapping = [existing for existing in components if existing & component]
             for existing in overlapping:
                 component.update(existing)
                 components.remove(existing)
             components.append(component)
+            covered.update(component)
         return tuple(tuple(sorted(component)) for component in sorted(components, key=lambda item: min(item)))
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@staticmethod
def raw_membership_selection_components_sync(
conn: sqlite3.Connection,
raw_ids: list[str],
) -> tuple[tuple[str, ...], ...]:
"""Partition scheduling hints into transitive authority components."""
components: list[set[str]] = []
for raw_id in dict.fromkeys(raw_ids):
expanded, _keys = ArchiveStore.expand_raw_membership_selection_sync(conn, [raw_id])
component = set(expanded)
overlapping = [existing for existing in components if existing & component]
for existing in overlapping:
component.update(existing)
components.remove(existing)
components.append(component)
return tuple(tuple(sorted(component)) for component in sorted(components, key=lambda item: min(item)))
`@staticmethod`
def raw_membership_selection_components_sync(
conn: sqlite3.Connection,
raw_ids: list[str],
) -> tuple[tuple[str, ...], ...]:
"""Partition scheduling hints into transitive authority components."""
components: list[set[str]] = []
covered: set[str] = set()
for raw_id in dict.fromkeys(raw_ids):
if raw_id in covered:
continue
expanded, _keys = ArchiveStore.expand_raw_membership_selection_sync(conn, [raw_id])
component = set(expanded)
overlapping = [existing for existing in components if existing & component]
for existing in overlapping:
component.update(existing)
components.remove(existing)
components.append(component)
covered.update(component)
return tuple(tuple(sorted(component)) for component in sorted(components, key=lambda item: min(item)))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@polylogue/storage/sqlite/archive_tiers/archive.py` around lines 1717 - 1732,
raw_membership_selection_components_sync redundantly expands raw IDs already
belonging to discovered components. Before calling
expand_raw_membership_selection_sync for each raw_id, skip it when any existing
component already contains that ID; retain the existing merge logic for
uncovered IDs and preserve deterministic sorted output.

Sinity pushed a commit that referenced this pull request Jul 11, 2026
Automated release PR opened by release-please. See
[docs/release.md](docs/release.md).
---


## [0.2.0](https://github.com/Sinity/polylogue/compare/v0.1.0...v0.2.0)
(2026-07-11)


### Added

* **analytics:** delegation enabling primitive + view (1vpm.1 phases
1-2) ([#2607](https://github.com/Sinity/polylogue/issues/2607))
([09dc46c](https://github.com/Sinity/polylogue/commit/09dc46c26648e7b90de3acf03e3efbf82f10dafc))
* **analyze:** add corpus-wide sanitized portfolio report
([#2437](https://github.com/Sinity/polylogue/issues/2437))
([#2451](https://github.com/Sinity/polylogue/issues/2451))
([d101a37](https://github.com/Sinity/polylogue/commit/d101a37c989177dc9d8a2b49a241a7a4818697ac))
* **archive:** preserve structured session evidence
([#2496](https://github.com/Sinity/polylogue/issues/2496))
([e55c675](https://github.com/Sinity/polylogue/commit/e55c675aaeee8c565c7cd1bb7276af7fccc2866d))
* **browser-capture:** add gated post commands
([#2494](https://github.com/Sinity/polylogue/issues/2494))
([79a8ac0](https://github.com/Sinity/polylogue/commit/79a8ac097aa68304bdb5b3e53ef1c1a7d6556afd))
* **browser-extension:** capture retry queue, receiver health probe,
popup outcomes
([#2671](https://github.com/Sinity/polylogue/issues/2671))
([67f522b](https://github.com/Sinity/polylogue/commit/67f522bd54762ad9a387ab4eadde1850806b4059))
* **capture:** acquire assistant-produced file bytes at capture time
([#2669](https://github.com/Sinity/polylogue/issues/2669))
([8db8d60](https://github.com/Sinity/polylogue/commit/8db8d60b34565f23ced411b786b252b6a4473b00))
* **cli:** add full message read export
([0d63cd6](https://github.com/Sinity/polylogue/commit/0d63cd6cc2c3aac5055535c7f9e30fe8a273a356))
* converge dogfood branch state
([#2504](https://github.com/Sinity/polylogue/issues/2504))
([d40d00a](https://github.com/Sinity/polylogue/commit/d40d00a312e5530a76e3e1ba29f3ddc37ce89d82))
* **coordination:** render subagent exchanges
([#2545](https://github.com/Sinity/polylogue/issues/2545))
([a35bd6d](https://github.com/Sinity/polylogue/commit/a35bd6d97eafef647cf016998437c49d5aca98bc))
* **cost:** price current Opus 4.7/4.8 flagships
([#2445](https://github.com/Sinity/polylogue/issues/2445))
([fbb8f09](https://github.com/Sinity/polylogue/commit/fbb8f09187ae013b6a27db01e2961440f507cacb))
* **demo:** enrich demo cost and fix profile token-lane round-trip
([#2446](https://github.com/Sinity/polylogue/issues/2446))
([05f8c98](https://github.com/Sinity/polylogue/commit/05f8c980c5c516bec358abcdd841edbf742c1e07))
* **demo:** give demo session a canonical repo for repos_touched
([#2447](https://github.com/Sinity/polylogue/issues/2447))
([b73f01d](https://github.com/Sinity/polylogue/commit/b73f01db8e2f008bee5801f17a297d80867a105d))
* **demo:** Incident 14:32 constructs — source outage, cross-material
duplicate, compaction omission
([#2674](https://github.com/Sinity/polylogue/issues/2674))
([8c15e86](https://github.com/Sinity/polylogue/commit/8c15e86127ba15454c667ccae0c7c1318d0050cc))
* **demo:** materialize session insights in no-daemon seed
([#2439](https://github.com/Sinity/polylogue/issues/2439))
([21951de](https://github.com/Sinity/polylogue/commit/21951de986200babb056d1f9c77ad17758ec4fad))
* **demo:** one-command receipts proof, enforced public-claims gate,
corpus v2 ([#2662](https://github.com/Sinity/polylogue/issues/2662))
([529fc43](https://github.com/Sinity/polylogue/commit/529fc43979d7e3292252529925ba2009a4ddfa23))
* **demo:** package claim evidence reproduction
([678f3d6](https://github.com/Sinity/polylogue/commit/678f3d6805b664ef47b1d8350ed81549a01bb9e0))
* **devtools:** accept bead: owners in coverage-manifest gap records
([#2611](https://github.com/Sinity/polylogue/issues/2611))
([10a1212](https://github.com/Sinity/polylogue/commit/10a1212f4b17b9359494949dccb032456f26c4ef))
* **devtools:** add bench ingest-throughput wall-clock benchmark
([#2490](https://github.com/Sinity/polylogue/issues/2490))
([d415412](https://github.com/Sinity/polylogue/commit/d415412d7d68008a92296f6f6dd29f53b4cb7a10))
* **devtools:** add claim-vs-evidence demo report
([af4915d](https://github.com/Sinity/polylogue/commit/af4915d11bea6c81eda0da5521932a9c7d150890))
* **devtools:** add cost reconciliation probe
([153dab3](https://github.com/Sinity/polylogue/commit/153dab3eaf721b82ffce37ac14174d12e91abc1d))
* **devtools:** add full-body read package projection
([0e83712](https://github.com/Sinity/polylogue/commit/0e837125aa425a8c6f8015cbeeb1b5231a01ebb6))
* **devtools:** catch subcommand/flag drift in verify doc-commands
([#2442](https://github.com/Sinity/polylogue/issues/2442))
([0d5a3bb](https://github.com/Sinity/polylogue/commit/0d5a3bb6ee3c18e1abc4690a249aa465d0ce5e9d))
* **devtools:** classify affordance surface usage
([fb4eab8](https://github.com/Sinity/polylogue/commit/fb4eab84989d6eee4aaab86f8eb0e05d7dcfba95))
* **devtools:** compare Claude usage grains
([2abe147](https://github.com/Sinity/polylogue/commit/2abe1478401ffe117df71e0c019a62f7a2152945))
* **devtools:** Demo Finding Packet contract + registry lint
([#2589](https://github.com/Sinity/polylogue/issues/2589))
([4e49b6c](https://github.com/Sinity/polylogue/commit/4e49b6ccd03a63ffed2b50a878a882131f79801e))
* **devtools:** enforce production writer ownership
([#2682](https://github.com/Sinity/polylogue/issues/2682))
([f314e81](https://github.com/Sinity/polylogue/commit/f314e812ec64b43bd50be04a8f825fc9402f7c14))
* **devtools:** expose cost probe residual metadata
([a6ecbaf](https://github.com/Sinity/polylogue/commit/a6ecbaf0a6d3aa7eba2da525cad14dca056a6a4c))
* **devtools:** instrument ingest with cpu/memory/io/stage metrics
([#2491](https://github.com/Sinity/polylogue/issues/2491))
([52b5bc0](https://github.com/Sinity/polylogue/commit/52b5bc038a0bd959563cf61db4a1e0fd15001ea3))
* **devtools:** show Claude lineage in cost residuals
([76f56a4](https://github.com/Sinity/polylogue/commit/76f56a46263278ec089d389dae54769e5854c702))
* **devtools:** show logical usage grain in cost probe
([77543d4](https://github.com/Sinity/polylogue/commit/77543d449515b036954216cb6349b5c6ed5eb7ee))
* **devtools:** summarize Codex state outlier flags
([ab72066](https://github.com/Sinity/polylogue/commit/ab72066dc528bedc06b1e1b6da01554ac0dec629))
* **devtools:** timestamp-doctrine lint for durable-tier DDL
([#2601](https://github.com/Sinity/polylogue/issues/2601))
([6c12e92](https://github.com/Sinity/polylogue/commit/6c12e92348d6e67db212462573ff939110996395))
* **export:** add fail-closed sanitized shareable export
([#2381](https://github.com/Sinity/polylogue/issues/2381))
([#2433](https://github.com/Sinity/polylogue/issues/2433))
([f5ab219](https://github.com/Sinity/polylogue/commit/f5ab2195558823fd01d6db432a32e1768d6ba930))
* **export:** add sanitized spans-jsonl bundle leg
([#2434](https://github.com/Sinity/polylogue/issues/2434))
([#2455](https://github.com/Sinity/polylogue/issues/2455))
([c4b6771](https://github.com/Sinity/polylogue/commit/c4b677181847375d9636cb9448e3accbf4688595))
* **export:** redact Windows paths and emails in sanitized export
([#2444](https://github.com/Sinity/polylogue/issues/2444))
([c05e83e](https://github.com/Sinity/polylogue/commit/c05e83ee9d1c2a8605f48f2d640749c0ddae62db))
* **forensics:** price origin-reported usage
([f859356](https://github.com/Sinity/polylogue/commit/f859356a56dde0229e846c6aa838b21e60ecd74c))
* **insights:** add usage timeline read model
([56f38ef](https://github.com/Sinity/polylogue/commit/56f38ef6653f9e2937983d9554270188ef1adae8))
* **insights:** deterministic agent-workflow pathology detectors
([#2448](https://github.com/Sinity/polylogue/issues/2448))
([72d0623](https://github.com/Sinity/polylogue/commit/72d0623ea331f5348ceb7c6fde61e7c6ce41d200))
* **insights:** expose pathology distribution via API + MCP tool
([#2383](https://github.com/Sinity/polylogue/issues/2383))
([#2449](https://github.com/Sinity/polylogue/issues/2449))
([e7a39b3](https://github.com/Sinity/polylogue/commit/e7a39b37fb0de39ba103bb4633bce8d4ba90da23))
* install and monitor harness hooks
([#2644](https://github.com/Sinity/polylogue/issues/2644))
([7e6123c](https://github.com/Sinity/polylogue/commit/7e6123cac3e5ed3c365ff9abb4fafe04deec3b9c))
* integrate archive convergence and capture platform
([#2534](https://github.com/Sinity/polylogue/issues/2534))
([3498981](https://github.com/Sinity/polylogue/commit/349898106783020294e52e30d3a2296021094940))
* **lineage:** surface a completeness signal on composed reads
([#2603](https://github.com/Sinity/polylogue/issues/2603))
([c06ca60](https://github.com/Sinity/polylogue/commit/c06ca601c3e35eae8408425c3c6b27092aab3ea4))
* **maintenance:** bound index replay selections
([d98f126](https://github.com/Sinity/polylogue/commit/d98f1262c6df6b3c274d723a80850fe56594cffa))
* **maintenance:** replay source rows into index tier
([a549285](https://github.com/Sinity/polylogue/commit/a549285140be52fde995ff826cd9d8b1073d9589))
* **mcp:** add filtered message tail paging
([f64920f](https://github.com/Sinity/polylogue/commit/f64920f22bc8234af2bb506130c6bf5c418f0da9))
* **mcp:** expose postmortem bundle and sanitized export as agent tools
([#2443](https://github.com/Sinity/polylogue/issues/2443))
([66fb40a](https://github.com/Sinity/polylogue/commit/66fb40af5c4a7aeb8cde44b6b605414602e0d60c))
* normalize session lineage and correct cross-provider cost accounting
([#2469](https://github.com/Sinity/polylogue/issues/2469))
([7412b69](https://github.com/Sinity/polylogue/commit/7412b69a9b64863a1bf4df11d7feeb99f61262ff))
* **parsers:** capture Claude server_tool_use web request counts
([#2486](https://github.com/Sinity/polylogue/issues/2486))
([badd731](https://github.com/Sinity/polylogue/commit/badd73180f1e33db3bcf26db02800f4648e4a965))
* **query:** add Terminal pipeline stage; route verbs through one
executor ([#2006](https://github.com/Sinity/polylogue/issues/2006))
([#2463](https://github.com/Sinity/polylogue/issues/2463))
([fb9073c](https://github.com/Sinity/polylogue/commit/fb9073cfc801a6b4d8150e6998c96b966e39047c))
* **query:** attach evidence units to session results
([f76e700](https://github.com/Sinity/polylogue/commit/f76e7006f3d6fcda7206ff7bc67b572421f15e59))
* **query:** attach related units to session queries
([#2495](https://github.com/Sinity/polylogue/issues/2495))
([4a9c7a0](https://github.com/Sinity/polylogue/commit/4a9c7a07a12787a2b71a13f588b1b4dc835747a5))
* **query:** expose action followup classification
([c68c278](https://github.com/Sinity/polylogue/commit/c68c278ef9c5f212ca49c4a9d70215910aca1f4c))
* **query:** expose action outcome predicates
([8b0595d](https://github.com/Sinity/polylogue/commit/8b0595dcc29f88c04679f8da307a66d5a43b462c))
* **query:** expose projection unit completions
([03f9ffb](https://github.com/Sinity/polylogue/commit/03f9ffb727072ed87fd6b576dcf41784134f0682))
* **query:** select fields for attached projection units
([867b1d0](https://github.com/Sinity/polylogue/commit/867b1d0482aca870053b188648b2a1d92170efc0))
* **read-package:** expose handoff freshness metadata
([d7aa9e8](https://github.com/Sinity/polylogue/commit/d7aa9e81a5a662236f86d938a06f750f9e9a7b57))
* **read:** add projection render specs
([#2503](https://github.com/Sinity/polylogue/issues/2503))
([ce2f62a](https://github.com/Sinity/polylogue/commit/ce2f62ac65e6e7c29558a74f1dd10ba78d0999e2))
* **storage:** block content-hash citation anchors with typed resolver
([#2588](https://github.com/Sinity/polylogue/issues/2588))
([6974706](https://github.com/Sinity/polylogue/commit/6974706611cb18695a1b85924193724c8b3f93dd))
* **storage:** classify attachment acquisition debt separately from
source blobs ([#2586](https://github.com/Sinity/polylogue/issues/2586))
([b536fc3](https://github.com/Sinity/polylogue/commit/b536fc3aa57ed92b3b6ec2300e97d7bb3b0af247))
* **storage:** persist raw revision authority evidence
([#2681](https://github.com/Sinity/polylogue/issues/2681))
([2032b2c](https://github.com/Sinity/polylogue/commit/2032b2cb26c6000b2f7db7d07efb4a2176546bf1))
* **usage:** expose all-origin logical token rollups
([8ca374e](https://github.com/Sinity/polylogue/commit/8ca374e59b7863e7414b473a85bb73886e98eb92))
* **usage:** label logical model rollup grain
([a336b86](https://github.com/Sinity/polylogue/commit/a336b864c670397b941a757ede80ac1df430692d))
* **usage:** report pricing provenance lanes
([57263f9](https://github.com/Sinity/polylogue/commit/57263f9c8831221ad44842259b68f9a5ab012292))
* **web:** evidence-cockpit IA — four-verb navigation, landing view,
session evidence strip
([#2675](https://github.com/Sinity/polylogue/issues/2675))
([79fb50d](https://github.com/Sinity/polylogue/commit/79fb50d9450f24a52cb84c7d060265c6ca70f2cd))


### Fixed

* **agent:** align quick raw-debt status
([28db963](https://github.com/Sinity/polylogue/commit/28db9636e2843cdd6ebcd43de73259a2c233e096))
* **agent:** allow active devloop backlog
([5816a75](https://github.com/Sinity/polylogue/commit/5816a7599067cb5347cedf16b25a9d801c3cf039))
* **agent:** include raw debt in quick devloop status
([d5589c4](https://github.com/Sinity/polylogue/commit/d5589c418635a8cfcf3525419b54857e0d6ba722))
* **agent:** keep devloop probes on quick status
([7bd0440](https://github.com/Sinity/polylogue/commit/7bd044094b22e6d98eeb4bc0ec4fc1d20383f8ee))
* **agent:** keep quick status off raw debt scans
([2743c46](https://github.com/Sinity/polylogue/commit/2743c46fd680349060154e26b1b008eb51afac4b))
* **agent:** resolve devloop repo roots dynamically
([#2505](https://github.com/Sinity/polylogue/issues/2505))
([79290e6](https://github.com/Sinity/polylogue/commit/79290e6e6ea718aad5de0bb5d015eeb91c42699a))
* **archive:** report evidence and convergence honestly
([#2502](https://github.com/Sinity/polylogue/issues/2502))
([7120bde](https://github.com/Sinity/polylogue/commit/7120bde619a1ffaaef6a82afcba13de904adf80f))
* **attachments:** acquire Claude extracted payloads
([60d93b6](https://github.com/Sinity/polylogue/commit/60d93b618e2d8cbd73dce8176ee2c9267fdfb8af))
* batch deep-read defects — convergence probes, conn leaks, reset gate,
parser ([#2543](https://github.com/Sinity/polylogue/issues/2543))
([9ed21a6](https://github.com/Sinity/polylogue/commit/9ed21a613d3f5c036434bc44a7f953321c240a17))
* **beads:** add timestamp-aware guard against post-checkout/post-merge
revert
([209c9db](https://github.com/Sinity/polylogue/commit/209c9db223286a70667c6a1fc64063d9d704df28))
* bound daemon HTTP archive-query concurrency, add per-request timeout
([#2628](https://github.com/Sinity/polylogue/issues/2628))
([f6c1da9](https://github.com/Sinity/polylogue/commit/f6c1da997bea64bc6cd9670d9cbb8f7e7439ec51))
* **browser-capture:** bound the outbound post-command queue (gnie
[#4](https://github.com/Sinity/polylogue/issues/4))
([#2568](https://github.com/Sinity/polylogue/issues/2568))
([28a263f](https://github.com/Sinity/polylogue/commit/28a263fcd217a4b611824edab6649d6705e4be56))
* **browser-capture:** report stale archived captures
([c972c84](https://github.com/Sinity/polylogue/commit/c972c843400b3fde9504f409fbebe9295bd64123))
* **browser-capture:** require an auto-minted bearer token by default
([#2571](https://github.com/Sinity/polylogue/issues/2571))
([f39a7fb](https://github.com/Sinity/polylogue/commit/f39a7fb6c19899a8a134c8db846723fc276c0861))
* **browser-extension:** bound asset acquisition by wall-clock and
failure streaks
([#2672](https://github.com/Sinity/polylogue/issues/2672))
([73a0654](https://github.com/Sinity/polylogue/commit/73a0654aa115ae6e6af597f122dfbaa35c950507))
* **chatgpt:** strip inline citation markers; keep injected context
messages ([#2668](https://github.com/Sinity/polylogue/issues/2668))
([9f54f7f](https://github.com/Sinity/polylogue/commit/9f54f7faf6e06d4da95e387f69588629fbb90056))
* classify blockless thinking messages as reasoning
([#2634](https://github.com/Sinity/polylogue/issues/2634))
([bdc7b73](https://github.com/Sinity/polylogue/commit/bdc7b73ad8500319cf2c8c9084856be9a3beb840))
* **cli:** bound daemon fast-path probes
([f458002](https://github.com/Sinity/polylogue/commit/f458002985838c379074cd6f1e321395f581eddb))
* **cli:** bound root find row output
([54dd217](https://github.com/Sinity/polylogue/commit/54dd217a0b9733d8c050a5b306c578eae09143c4))
* **cli:** compact ops status JSON by default
([62862df](https://github.com/Sinity/polylogue/commit/62862dfaabbd4b3ef1c425a6a963332932b9a8cd))
* **cli:** count queried analyze results from search scope
([2726f5a](https://github.com/Sinity/polylogue/commit/2726f5a5a186299b336d3bb49cbc5c6fbcc6ae47))
* **cli:** honor JSON format for select
([#2517](https://github.com/Sinity/polylogue/issues/2517))
([3baa238](https://github.com/Sinity/polylogue/commit/3baa238f87b2e2f12be1f5aaa24093dcd208470a))
* **cli:** mark analyze totals as partial during convergence
([37e192b](https://github.com/Sinity/polylogue/commit/37e192b346e5ce45f1d2e00f73a4580b5ffabf54))
* **cli:** resolve exact refs before root search
([08d3a5b](https://github.com/Sinity/polylogue/commit/08d3a5b8867f70f7e4acd16a9ece60fc69eb122e))
* **cli:** route structured queries without FTS
([c58f93e](https://github.com/Sinity/polylogue/commit/c58f93e2b7b63612d0766585277ae933ae32436e))
* **cli:** warn when empty results may be partial
([41b7e74](https://github.com/Sinity/polylogue/commit/41b7e7409573cdb5fbe11b303e082a6b1aff856a))
* **codex:** omit inline image data from tool text
([6d3871f](https://github.com/Sinity/polylogue/commit/6d3871f871d9b592981ad758bbaec57cb7c675c3))
* **context:** coerce non-user assertion authors to candidate at one
chokepoint ([#2572](https://github.com/Sinity/polylogue/issues/2572))
([39f0765](https://github.com/Sinity/polylogue/commit/39f0765a536a1268f64890aae49d5c5576641423))
* **context:** enforce assertion guidance trust boundary
([#2677](https://github.com/Sinity/polylogue/issues/2677))
([ce65396](https://github.com/Sinity/polylogue/commit/ce65396c2c80da8a652feaf71748cec6f5a15549))
* **convergence:** classify stale raw parse failures
([884efb5](https://github.com/Sinity/polylogue/commit/884efb5f92d76b065bedc1d22cf8dc836fe31201))
* **convergence:** restore append-only raw blob spans
([cbb27fb](https://github.com/Sinity/polylogue/commit/cbb27fbd030ca78ff03b7947860ed106243ac081))
* **coordination:** compact agent status projections
([#2656](https://github.com/Sinity/polylogue/issues/2656))
([#2656](https://github.com/Sinity/polylogue/issues/2656))
([de7f2b9](https://github.com/Sinity/polylogue/commit/de7f2b90960f6fc9af2733c2625ed6af81280aa8))
* **coordination:** resolve logical caller identity
([#2665](https://github.com/Sinity/polylogue/issues/2665))
([#2665](https://github.com/Sinity/polylogue/issues/2665))
([cfa0839](https://github.com/Sinity/polylogue/commit/cfa0839d2b7d34dc7673f7d0cd777b1f2523d37e))
* **core:** consolidate 6 divergent _parse_archive_datetime copies
([#2567](https://github.com/Sinity/polylogue/issues/2567))
([f54e87e](https://github.com/Sinity/polylogue/commit/f54e87ea123bf89ae7a9c52be0fefc04d338ee7e))
* **cost:** bill subscription output credits at 5x input rate
([#2484](https://github.com/Sinity/polylogue/issues/2484))
([3c1bbb3](https://github.com/Sinity/polylogue/commit/3c1bbb3f3248a2013edb3d8933539add2587723c))
* **cost:** count Codex cumulative tokens per session, not per model
([#2489](https://github.com/Sinity/polylogue/issues/2489))
([22d8bb5](https://github.com/Sinity/polylogue/commit/22d8bb50789d6ebec0fe59ae26eec16920c506d0))
* **cost:** flag paid models missing a catalog cache rate instead of $0
([#2487](https://github.com/Sinity/polylogue/issues/2487))
([e851b33](https://github.com/Sinity/polylogue/commit/e851b33deed3a79f560704c00104349098fcd6e1))
* **cost:** keep Codex message token lanes disjoint
([#2647](https://github.com/Sinity/polylogue/issues/2647))
([8c9dfbb](https://github.com/Sinity/polylogue/commit/8c9dfbb0044ea73a1629731b14347d2ac56d3388))
* **daemon:** align browser capture spool watching
([3b90e9e](https://github.com/Sinity/polylogue/commit/3b90e9e33eb1e66f50e019a822a18622bc4f57ca))
* **daemon:** back off filtered retry paths
([c92ecd5](https://github.com/Sinity/polylogue/commit/c92ecd5f99588d3d4ac0ddf780d71343dbde759c))
* **daemon:** back off no-op catch-up chunks
([95fe147](https://github.com/Sinity/polylogue/commit/95fe1475b1012ac5b301e7a728b2cd2cb081a94e))
* **daemon:** back off no-op retry batches
([c982135](https://github.com/Sinity/polylogue/commit/c982135f96f41169651aac7f29fa8a5c9cf673fa))
* **daemon:** bound ordinary revision replay
([#2689](https://github.com/Sinity/polylogue/issues/2689))
([8030555](https://github.com/Sinity/polylogue/commit/803055541011a3057477d9a4ac9c6396b06890c8))
* **daemon:** close two stored-XSS bug classes in the web shell (2n39)
([#2569](https://github.com/Sinity/polylogue/issues/2569))
([7002c9f](https://github.com/Sinity/polylogue/commit/7002c9f2e818a96b82b5681bcf90bc23c8b84b41))
* **daemon:** decode session route ids
([42c3ed6](https://github.com/Sinity/polylogue/commit/42c3ed6fd4f01cfa1c8962d310a19ba2131647e2))
* **daemon:** default /api/provider-usage to headline detail, not full
([#2560](https://github.com/Sinity/polylogue/issues/2560))
([3306866](https://github.com/Sinity/polylogue/commit/33068663ab6c4e6ce10ada7f94881bb017e989e6))
* **daemon:** enable authority-safe raw convergence
([#2688](https://github.com/Sinity/polylogue/issues/2688))
([df559d8](https://github.com/Sinity/polylogue/commit/df559d8b3047f3db096a01e5c6b0ee6d7a2937ba))
* **daemon:** Host-admission gate, receiver hardening, spool governor
([#2559](https://github.com/Sinity/polylogue/issues/2559))
([bfd247d](https://github.com/Sinity/polylogue/commit/bfd247d5646c66786eacb8351874625eb2ba9b3a))
* **daemon:** mark active index rebuilds not ready
([cc4698a](https://github.com/Sinity/polylogue/commit/cc4698a885c84be2956e2ede650c0dd4870232e3))
* **daemon:** route web facets through facade
([2e02aa8](https://github.com/Sinity/polylogue/commit/2e02aa8e1fe794219b72b3257989e3fc9cab9138))
* **daemon:** serialize archive writers across runtime loops
([#2676](https://github.com/Sinity/polylogue/issues/2676))
([29e5b45](https://github.com/Sinity/polylogue/commit/29e5b45524b850d4bbdb28e1ba9731ab82377317))
* **daemon:** share bounded embedding readiness
([19e493b](https://github.com/Sinity/polylogue/commit/19e493b5785f62b570d71c8c3f8ae456abd6eadc))
* **debt:** classify empty Claude raw artifacts
([16c42ef](https://github.com/Sinity/polylogue/commit/16c42efb0d5ec2062749feabd0f1dd5c665cbf9c))
* **debt:** mark parsed raw materialization repairable
([3afc6e1](https://github.com/Sinity/polylogue/commit/3afc6e15ffe10c62ce65f30ff34637e5a8bd6f3b))
* **demo:** add acknowledgment-window sensitivity
([8a12256](https://github.com/Sinity/polylogue/commit/8a12256ad9f22939e6d86740a8a2b927f8f9bc98))
* **demo:** calibrate failure acknowledgment markers
([ca76f2d](https://github.com/Sinity/polylogue/commit/ca76f2df1071c71d93cce0a63e35195f35cc9695))
* **demo:** explain claim classifier decisions
([b4bb351](https://github.com/Sinity/polylogue/commit/b4bb351147880f7a650b1e8a168e6e05b6f3183b))
* **demo:** expose claim evidence samples by origin
([c75dc47](https://github.com/Sinity/polylogue/commit/c75dc4737e8dddcf863f81701ccba08c9ef2e62b))
* **demos:** close generated shelf over repository inputs
([#2651](https://github.com/Sinity/polylogue/issues/2651))
([#2651](https://github.com/Sinity/polylogue/issues/2651))
([c6aa6a0](https://github.com/Sinity/polylogue/commit/c6aa6a05d2a64309a2dbed52bbdda75d495e1441))
* **demo:** show claim evidence follow-up previews
([aef35bf](https://github.com/Sinity/polylogue/commit/aef35bfbb5340d015c9eae555f2adcf306d2978d))
* **demo:** split ambiguous failure follow-ups
([1d9187d](https://github.com/Sinity/polylogue/commit/1d9187d532b6fcafdfe33bfe41113e20f4eb24b8))
* **demo:** split failure outcomes by handler class
([6e35892](https://github.com/Sinity/polylogue/commit/6e35892a1d5b32f50b00cfdc0ad0d1cf73b5e042))
* **demo:** state claim sample frames explicitly
([4640501](https://github.com/Sinity/polylogue/commit/46405011f667290b3b2a5cdcb719805453f457d8))
* **demo:** stratify claim evidence samples by origin
([2ce5e2f](https://github.com/Sinity/polylogue/commit/2ce5e2f433bcfc677eb64053cfb5b9b0e0ffb6dd))
* **devloop:** enforce demo shelf currentness
([943aebd](https://github.com/Sinity/polylogue/commit/943aebd8945d6d5928c45c9397f4e0687173d618))
* **devtools:** align Claude cost probe to cache horizon
([e5d39c0](https://github.com/Sinity/polylogue/commit/e5d39c08f6b38e4edcda0ad4d82de1e85cd52e14))
* **devtools:** detect squash-equivalent worktrees
([#2501](https://github.com/Sinity/polylogue/issues/2501))
([f41e078](https://github.com/Sinity/polylogue/commit/f41e078903edd6327459a609364aeb9755f6a6ac))
* **devtools:** generate demo shelf navigation
([7aba1c8](https://github.com/Sinity/polylogue/commit/7aba1c8bf9d8765b948d198d20b30624e6ae93de))
* **devtools:** keep dev-loop daemon source-only
([c37cb0d](https://github.com/Sinity/polylogue/commit/c37cb0dc390c539e0a121993d1e970d7977c9587))
* **devtools:** key verify's stall detector off test-event progress
([#2581](https://github.com/Sinity/polylogue/issues/2581))
([85fa450](https://github.com/Sinity/polylogue/commit/85fa4505585b46c37b6c03c10121babf201e0e77))
* **docs:** repair generated pages links
([#2500](https://github.com/Sinity/polylogue/issues/2500))
([a9985f4](https://github.com/Sinity/polylogue/commit/a9985f4115d057c7de0842c1a23414492b3c1efe))
* **embed:** account for skipped catchup sessions
([f316d4b](https://github.com/Sinity/polylogue/commit/f316d4b10f9cd2ecd08b37a0128587dd61fea13f))
* **embed:** align status text fields
([6a4b4ca](https://github.com/Sinity/polylogue/commit/6a4b4ca4bba681f9177e72bc580e0f4eddb4e9e3))
* **embed:** avoid false zero cost in status detail
([510fe18](https://github.com/Sinity/polylogue/commit/510fe188f8ecf90cb77c1b1084c4a8303a692f68))
* **embed:** bound archive backfill windows
([1963a01](https://github.com/Sinity/polylogue/commit/1963a0129022162b1ea519fcb4e48e52483f2017))
* **embed:** bound archive pending windows after eligibility
([47cb6f9](https://github.com/Sinity/polylogue/commit/47cb6f9fcd1e509b03ab16d77104596ded6d49e8))
* **embed:** bound default archive status counts
([2562cd4](https://github.com/Sinity/polylogue/commit/2562cd4dc343bbe9091ac6811ea4d8ceffa080d2))
* **embed:** bound exact archive detail status
([d7403e2](https://github.com/Sinity/polylogue/commit/d7403e2ad6e1735a193035337be872dc90437e0d))
* **embed:** count only prose in embedding stats
([#2519](https://github.com/Sinity/polylogue/issues/2519))
([4601922](https://github.com/Sinity/polylogue/commit/46019227d125ae113d5bdad8fc7496d28ace082d))
* **embeddings:** count exact prose in pending windows
([6ae15a9](https://github.com/Sinity/polylogue/commit/6ae15a909ed107bb1d75f251f05d0c6a27f335b9))
* **embeddings:** detect same-count message edits
([d07627e](https://github.com/Sinity/polylogue/commit/d07627ebeffb41100d4da82a1390dd8645d4dcae))
* **embeddings:** preserve unknown status counts
([#2661](https://github.com/Sinity/polylogue/issues/2661))
([69990dc](https://github.com/Sinity/polylogue/commit/69990dcc873c2fc0a9c900861bb10db94b75f434))
* **embeddings:** report manual backfill progress
([3eb5efa](https://github.com/Sinity/polylogue/commit/3eb5efaa4fa7f53960a1fd50386c505f6bde1275))
* **embeddings:** reselect stale clean archive sessions
([b998ec4](https://github.com/Sinity/polylogue/commit/b998ec4cfc28cde2606c89631a451b3b0133fd47))
* **embeddings:** stop retrying terminal provider errors
([108d71f](https://github.com/Sinity/polylogue/commit/108d71f3e5abe826fd2f937b3010a3679ff7b002))
* **embed:** distinguish session and prose coverage
([c1c1b1a](https://github.com/Sinity/polylogue/commit/c1c1b1a4144cc6c27164e8ef56884fe0cec4897c))
* **embed:** emit structured backfill results
([#2518](https://github.com/Sinity/polylogue/issues/2518))
([2993141](https://github.com/Sinity/polylogue/commit/299314105b0747a3d16a9d1b187ab3b6cc4b3df4))
* **embed:** expose preflight min-message floor
([#2506](https://github.com/Sinity/polylogue/issues/2506))
([12e7cdf](https://github.com/Sinity/polylogue/commit/12e7cdfd2fa877b8c094d5a4560c68e3ceb7dc94))
* **embed:** keep backfill windows under message cap
([#2516](https://github.com/Sinity/polylogue/issues/2516))
([18df4c4](https://github.com/Sinity/polylogue/commit/18df4c457445c016d29c7a1ceecbcfcfa1c4624c))
* **embed:** keep bounded backfill windows cheap
([3441570](https://github.com/Sinity/polylogue/commit/344157058cab0eb23a64b1a74324d2b9e9cfee6b))
* **embed:** keep partial vectors retrieval-ready
([#2515](https://github.com/Sinity/polylogue/issues/2515))
([aa13e1f](https://github.com/Sinity/polylogue/commit/aa13e1f73f85eefe347d9f8869d0a2e98825c25b))
* **embed:** keep status responsive during backfill
([33dae38](https://github.com/Sinity/polylogue/commit/33dae38e0e39a86a4b7ab01f0c097a8f3fe940f3))
* **embed:** make status backfill actions executable
([9ec46c8](https://github.com/Sinity/polylogue/commit/9ec46c89dcaccecff10892961472e3ab77d23891))
* **embed:** persist archive backfill runs in ops
([093fd81](https://github.com/Sinity/polylogue/commit/093fd814455174299f0a7718b7485b30bcf3bf68))
* **embed:** report archive catchup session counts
([7eb514e](https://github.com/Sinity/polylogue/commit/7eb514e955006da5f9ead6db307f20338542dec4))
* **embed:** report archive embedding metadata fast
([b187f5d](https://github.com/Sinity/polylogue/commit/b187f5d1f65c14d969506853cc7ee501909416ba))
* **embed:** report archive embedding timestamp bounds
([1f0d6b8](https://github.com/Sinity/polylogue/commit/1f0d6b80f75f882da6ce56378770af4b0c69ad7c))
* **embed:** summarize uniform archive metadata fast
([6d3a84d](https://github.com/Sinity/polylogue/commit/6d3a84d3069247e6ca9bc79023ea98be73a4284c))
* **embed:** surface material catchup progress
([fc24f58](https://github.com/Sinity/polylogue/commit/fc24f58b53560c21074d6b40dc766244ea6a7c27))
* **embed:** treat completed sessions as embedded
([#2514](https://github.com/Sinity/polylogue/issues/2514))
([6cd054d](https://github.com/Sinity/polylogue/commit/6cd054d652cffcdf27860e769e9a15451cddd08b))
* **extension:** make capture popup readable
([1bfb0a3](https://github.com/Sinity/polylogue/commit/1bfb0a3138da769fc62a7c274321c29331afa62e))
* **extension:** stop automatic page capture
([a35d521](https://github.com/Sinity/polylogue/commit/a35d5210110b6df6a5adfdbee93ce35c4f79387f))
* **fts:** chunk missing-row repair
([6406558](https://github.com/Sinity/polylogue/commit/6406558618b2a0e216b5e131bfbc5f83a1b8f3d1))
* harden cloud bootstrap for sandbox lanes
([#2631](https://github.com/Sinity/polylogue/issues/2631))
([c68585b](https://github.com/Sinity/polylogue/commit/c68585b8bf3a8e83f57faa364fff108a23ed504a))
* **hermes:** make state database imports reproducible
([#2639](https://github.com/Sinity/polylogue/issues/2639))
([#2639](https://github.com/Sinity/polylogue/issues/2639))
([9e92b6b](https://github.com/Sinity/polylogue/commit/9e92b6b6d7656f315dd491b8f5f59049d104e868))
* **import:** keep newer session body on stale reimport
([9beac9a](https://github.com/Sinity/polylogue/commit/9beac9a5300125eb0f4362d8c8ce41ab033db6ac))
* **ingest:** finalize live raw parse state
([#2663](https://github.com/Sinity/polylogue/issues/2663))
([938c671](https://github.com/Sinity/polylogue/commit/938c671e5c5c68454b77592d84c0c726f53819e7))
* **ingest:** preserve richer browser captures
([c907759](https://github.com/Sinity/polylogue/commit/c9077590a279037c530dd309f37b886f9052c594))
* **ingest:** publish full results after raw completion
([#2664](https://github.com/Sinity/polylogue/issues/2664))
([0cccef1](https://github.com/Sinity/polylogue/commit/0cccef1df3b8618c6e6dbe3e3a4b6860ab8cebc3))
* **insights:** add text_derived provenance markers to forensic payloads
([#2579](https://github.com/Sinity/polylogue/issues/2579))
([90d3e31](https://github.com/Sinity/polylogue/commit/90d3e31747de58f3a7cd354866504ca4ec49ea2c))
* **insights:** audit every registered product, not just contracted ones
([#2573](https://github.com/Sinity/polylogue/issues/2573))
([7b5f846](https://github.com/Sinity/polylogue/commit/7b5f846f57073d931737962dcabc17d5ef962dc0))
* **insights:** render None, not 0.0, for averages over empty backing
rows ([#2585](https://github.com/Sinity/polylogue/issues/2585))
([f8f3e40](https://github.com/Sinity/polylogue/commit/f8f3e40a5b7f548e6a9530d3e9f48c9964345e79))
* **insights:** scope run-projection row refs
([#2539](https://github.com/Sinity/polylogue/issues/2539))
([b9d01d7](https://github.com/Sinity/polylogue/commit/b9d01d7aa34a9ee106c5122dbb8f4d2f1a8bd457))
* **insights:** stop laundering weak temporal provenance into
provider_ts ([#2558](https://github.com/Sinity/polylogue/issues/2558))
([89b14e5](https://github.com/Sinity/polylogue/commit/89b14e5876749fdc66f26745ce507ba76ebc788a))
* **insights:** treat run projections as optional cache
([40f22dd](https://github.com/Sinity/polylogue/commit/40f22dd804ab9dbfa610a8111ce0c5cd981b3dd0))
* **insights:** upsert run-projection rows on cross-session ref
collisions ([#2464](https://github.com/Sinity/polylogue/issues/2464))
([15f4f21](https://github.com/Sinity/polylogue/commit/15f4f21b63f662f13fb4f16b5379d7dfaad17627))
* **lineage:** hold one read transaction across composition
([#2594](https://github.com/Sinity/polylogue/issues/2594))
([0861717](https://github.com/Sinity/polylogue/commit/0861717015066fe602d363df2440afadec7deea3))
* **lineage:** iterative transcript composition, remove effective depth
cap ([#2542](https://github.com/Sinity/polylogue/issues/2542))
([1e4a694](https://github.com/Sinity/polylogue/commit/1e4a694382a7a76ec7b2391f9309d02ab1a595cf))
* **logging:** forward exc_info/extra in stdlib logger shim
([#2548](https://github.com/Sinity/polylogue/issues/2548))
([ee1a51c](https://github.com/Sinity/polylogue/commit/ee1a51cb69bb9bfcba7fd577a843c655a42e1e7a))
* **maintenance:** clear session insight debt
([5ab2352](https://github.com/Sinity/polylogue/commit/5ab23525d17df4ef5f5e295b90aeae3fcfa1f982))
* **maintenance:** ignore parsed raw sidecars
([#2511](https://github.com/Sinity/polylogue/issues/2511))
([1d5d112](https://github.com/Sinity/polylogue/commit/1d5d1126943648d18bfcb2c55520942e0f807347))
* **maintenance:** make index rebuilds plannable and FK-clean
([#2522](https://github.com/Sinity/polylogue/issues/2522))
([41d4bb4](https://github.com/Sinity/polylogue/commit/41d4bb4a7be28376c1ace1e46e3ca31f0962c879))
* **maintenance:** replay parsed raw rows after index reset
([#2508](https://github.com/Sinity/polylogue/issues/2508))
([d1bbb3e](https://github.com/Sinity/polylogue/commit/d1bbb3e02bfb09d55ba0e2ef6a1f69be5db37408))
* **maintenance:** resume interrupted raw materialization
([#2510](https://github.com/Sinity/polylogue/issues/2510))
([b55ea52](https://github.com/Sinity/polylogue/commit/b55ea528e9c3d856c9ef2bf144b8ccba5a1e01b3))
* make partial resume profiles explicit
([#2635](https://github.com/Sinity/polylogue/issues/2635))
([186daf2](https://github.com/Sinity/polylogue/commit/186daf287ae2b04994f7f6afe5b0564b6f947584))
* **mcp:** report split-tier embedding stats
([c70081b](https://github.com/Sinity/polylogue/commit/c70081b69728b678a66371bf43e24d00eb6c267b))
* **mcp:** stop silently capping aggregate totals
([29c020d](https://github.com/Sinity/polylogue/commit/29c020d4b2f3dd58f3135c8ce5ff810a45d3a020))
* **ops:** point index resets at source replay
([e84c2ae](https://github.com/Sinity/polylogue/commit/e84c2aef8a75f8ae196643b2364e869f234350f6))
* parse ChatGPT recipient-addressed tool calls as TOOL_USE, not raw text
([#2629](https://github.com/Sinity/polylogue/issues/2629))
([7688d10](https://github.com/Sinity/polylogue/commit/7688d103d5393e9bc3d6b249bcd6daa656eee58a))
* **parsers:** keep asset-only chat turns
([607d79b](https://github.com/Sinity/polylogue/commit/607d79bddcff4f95eb046f0f80857d2ca656a515))
* **read:** degrade bounded reads to content
([4eb337b](https://github.com/Sinity/polylogue/commit/4eb337b36d139e806ccd1feacba904b6eb60141f))
* **readiness:** classify explained raw join gaps
([d9bc786](https://github.com/Sinity/polylogue/commit/d9bc786b8619e2d7a0ea3c80fdecbbb4a838cda3))
* **readiness:** close verifier failures
([#2547](https://github.com/Sinity/polylogue/issues/2547))
([4b9389d](https://github.com/Sinity/polylogue/commit/4b9389d752b53742fc70df5364d221b16a292f9d))
* **readiness:** expose fast archive convergence state
([c9ded08](https://github.com/Sinity/polylogue/commit/c9ded089ca53d61baa883e5915a3b2248c621250))
* **readiness:** report materialization progress counts
([f5d848e](https://github.com/Sinity/polylogue/commit/f5d848e87cf8946e3d981cede9ff58401cdf7cb8))
* **read:** use session links for streaming lineage checks
([29ed6ea](https://github.com/Sinity/polylogue/commit/29ed6ea87a9f3df390b5f9987c0dbfcd43f0c4e9))
* repair 3 flagship CLI query bugs found in prod smoke test
([#2626](https://github.com/Sinity/polylogue/issues/2626))
([5d5edaf](https://github.com/Sinity/polylogue/commit/5d5edaf496d70b9372c7c2123c2e70a6ed4d34e6))
* restore deterministic archive contracts
([#2641](https://github.com/Sinity/polylogue/issues/2641))
([f6b396b](https://github.com/Sinity/polylogue/commit/f6b396bf63cbe43b6e7645e94b8aafa88a2fd0b0))
* route ops reset --session/--source through the mutation contract
([#2627](https://github.com/Sinity/polylogue/issues/2627))
([a075ce2](https://github.com/Sinity/polylogue/commit/a075ce290837f68af678f093b02f39fe42286d11))
* **search:** keep default find lexical
([faba5f3](https://github.com/Sinity/polylogue/commit/faba5f3950b308658dbbbfe9067488f65b606fcc))
* **search:** make FTS readiness cheap in fresh indexes
([a46be16](https://github.com/Sinity/polylogue/commit/a46be16d2b3a74241fe9f063f1052f4743493198))
* **security:** harden blob hash validation, drop misleading symlink
check ([#2599](https://github.com/Sinity/polylogue/issues/2599))
([b6b9fef](https://github.com/Sinity/polylogue/commit/b6b9fef2a05ed7d5a1272188ce852f74a133b637))
* **sources:** close CursorStore get-&gt;modify-&gt;put lost-update race
([#2615](https://github.com/Sinity/polylogue/issues/2615))
([fac493c](https://github.com/Sinity/polylogue/commit/fac493cb3cc37edfa58e939b367c78e069730304))
* **sources:** merge Claude Code stream sessions
([#2520](https://github.com/Sinity/polylogue/issues/2520))
([a651bb9](https://github.com/Sinity/polylogue/commit/a651bb95f1fc3595cff8f545ec3768831b858daf))
* **sources:** restrict append planning to JSONL streams
([#2691](https://github.com/Sinity/polylogue/issues/2691))
([fae9e0b](https://github.com/Sinity/polylogue/commit/fae9e0bb580caaac18f94b28674f104c5b9ca6b8))
* stamp focused test runs with git head
([#2632](https://github.com/Sinity/polylogue/issues/2632))
([4dabc85](https://github.com/Sinity/polylogue/commit/4dabc85dd05f6c0d710e6755853a2bf70b4b0a2f))
* **status:** gate readiness on raw materialization
([91bf2d7](https://github.com/Sinity/polylogue/commit/91bf2d7fb8a43601f5b046ccddb974f29c6b2beb))
* **status:** ignore stale rebuild attempts for readiness
([f2f1a21](https://github.com/Sinity/polylogue/commit/f2f1a2156dbcfc1bc6e4f23ed449dfb16d37cac5))
* **status:** preserve unknown embedding pending messages
([36446ec](https://github.com/Sinity/polylogue/commit/36446ecbf0c79497712f3149509d1e8ae1e65b03))
* **status:** project durable raw authority into readiness
([#2695](https://github.com/Sinity/polylogue/issues/2695))
([93af1a5](https://github.com/Sinity/polylogue/commit/93af1a53a8b68d6500c69ddfc6060d542c6d0d8d))
* **status:** show SQLite maintenance state
([f7d2539](https://github.com/Sinity/polylogue/commit/f7d2539a4380c8e7b3d86499f6eb9d248af70726))
* **status:** use fast materialization readiness
([80dd748](https://github.com/Sinity/polylogue/commit/80dd748cce2c4b0e86927605f1cf605fc57ad490))
* **status:** validate actions view readiness
([#2687](https://github.com/Sinity/polylogue/issues/2687))
([9018d58](https://github.com/Sinity/polylogue/commit/9018d5861a699d595da42a56d9df95ad5d4fdd24))
* **storage:** add offline index generation promotion
([#2685](https://github.com/Sinity/polylogue/issues/2685))
([a2bbd25](https://github.com/Sinity/polylogue/commit/a2bbd25d6a315791430e11191c3b2070cdfdbe2f))
* **storage:** compose forks on paginated, batch, and streaming reads
([#2485](https://github.com/Sinity/polylogue/issues/2485))
([8664ee8](https://github.com/Sinity/polylogue/commit/8664ee872286811f5094e125cbcf78559c6b7499)),
closes [#2470](https://github.com/Sinity/polylogue/issues/2470)
* **storage:** contain authority-ambiguous raw replay
([#2670](https://github.com/Sinity/polylogue/issues/2670))
([#2670](https://github.com/Sinity/polylogue/issues/2670))
([202a09c](https://github.com/Sinity/polylogue/commit/202a09c240bc56a74c7d078663aafc7c7f97e59c))
* **storage:** contain conflicting archive index identities
([#2680](https://github.com/Sinity/polylogue/issues/2680))
([36147f2](https://github.com/Sinity/polylogue/commit/36147f29c7255474071bce869e6942c02ce3e348))
* **storage:** enforce monotonic raw revision replay
([#2684](https://github.com/Sinity/polylogue/issues/2684))
([6a579d0](https://github.com/Sinity/polylogue/commit/6a579d09021c9b0ed128287ace51cdff077cd5b7))
* **storage:** gate embedding success write against config-change race
([#2616](https://github.com/Sinity/polylogue/issues/2616))
([16fdb0f](https://github.com/Sinity/polylogue/commit/16fdb0fcacba55f9640222a3e0e52984f6c414aa))
* **storage:** include timeless sessions in search --since filters
([#2578](https://github.com/Sinity/polylogue/issues/2578))
([97459e6](https://github.com/Sinity/polylogue/commit/97459e61d4fae716594eb871381f865a4f79593e))
* **storage:** include timeless work-events/phases in since/until
windows ([#2577](https://github.com/Sinity/polylogue/issues/2577))
([1b29fa5](https://github.com/Sinity/polylogue/commit/1b29fa52460cbeca78656be4536531cf66cb6d1f))
* **storage:** pair actions view by transcript rank, not tool_id
equality ([#2597](https://github.com/Sinity/polylogue/issues/2597))
([7b5a5aa](https://github.com/Sinity/polylogue/commit/7b5a5aa0589772ed9d7eb9632af1591cf22cdd33))
* **storage:** preserve semantic replay frontiers
([#2692](https://github.com/Sinity/polylogue/issues/2692))
([7d300a5](https://github.com/Sinity/polylogue/commit/7d300a59628742cf739706bd5ebe225daf9b4825))
* **storage:** preserve source evidence during reset
([#2537](https://github.com/Sinity/polylogue/issues/2537))
([1f629c9](https://github.com/Sinity/polylogue/commit/1f629c9d2d923789f0dbf7167ffb021b13b3707d))
* **storage:** remove unreachable blob-GC lease mechanism
([#2617](https://github.com/Sinity/polylogue/issues/2617))
([a263612](https://github.com/Sinity/polylogue/commit/a2636120495d1b87a8e5170c7d108144c3bc7f4b))
* **storage:** reserve blobs until durable references commit
([#2660](https://github.com/Sinity/polylogue/issues/2660))
([a0ef2fa](https://github.com/Sinity/polylogue/commit/a0ef2fa8d479a0168db36fe09f3752de6311b26e))
* **storage:** retire governed bundle raws
([#2693](https://github.com/Sinity/polylogue/issues/2693))
([304b840](https://github.com/Sinity/polylogue/commit/304b84019d7dfa0474a8db4685166849af16d297))
* **storage:** route ops-doctor orphan-blob repair through the safe GC
planner ([#2564](https://github.com/Sinity/polylogue/issues/2564))
([8e4efb7](https://github.com/Sinity/polylogue/commit/8e4efb72379f458d23524c00fb2de29346ce0e0b))
* **storage:** single-source FTS freshness DDL
([c769ea7](https://github.com/Sinity/polylogue/commit/c769ea7b7cd6b04da1d54314809d5a093a62471c))
* **storage:** slice provider usage on prefix-sharing forks
([4628cd3](https://github.com/Sinity/polylogue/commit/4628cd30f24ea72546ed2d53512d093e2aea8501))
* **storage:** stop epoch-pinning timeless rows in the query CLI unit
engine ([#2576](https://github.com/Sinity/polylogue/issues/2576))
([c67fd45](https://github.com/Sinity/polylogue/commit/c67fd45392a693428d504c95359c7e4bdfcd9a53))
* **storage:** stop replaying terminal raw revisions
([#2690](https://github.com/Sinity/polylogue/issues/2690))
([90cf639](https://github.com/Sinity/polylogue/commit/90cf639b151c0c16dbb74ff70f7132c09297f6e7))
* **storage:** stop scheduling governed replay debt
([#2694](https://github.com/Sinity/polylogue/issues/2694))
([63a6c75](https://github.com/Sinity/polylogue/commit/63a6c756326ba43238bee48b8de24eab657bfb17))
* **storage:** stop usage_timeline silently dropping timeless-session
usage ([#2575](https://github.com/Sinity/polylogue/issues/2575))
([a31d096](https://github.com/Sinity/polylogue/commit/a31d0968581d108fba5a6261d41e939e3e4907ab))
* **storage:** surface SQLite maintenance drift
([e50b923](https://github.com/Sinity/polylogue/commit/e50b923168de1e2ec8a7c81a4f11f30cc0c724de))
* **storage:** trigram-index the affordance-usage CLI-detection
substring scan
([#2622](https://github.com/Sinity/polylogue/issues/2622))
([f5c35e7](https://github.com/Sinity/polylogue/commit/f5c35e7021dceebfb2836e4c84377fe8e0bbd457))
* **storage:** trust stale FTS readiness rows
([05a30c0](https://github.com/Sinity/polylogue/commit/05a30c0a8c652669305675fc29f0bd4cf55ea808))
* **test:** repair full-verify baseline drift from 2026-07-05 commit
batch ([#2556](https://github.com/Sinity/polylogue/issues/2556))
([a836e4b](https://github.com/Sinity/polylogue/commit/a836e4bfc9d8830d30b0995efbee4e2ada71e3cd))
* **topology:** integrate hook service placement
([#2658](https://github.com/Sinity/polylogue/issues/2658))
([#2658](https://github.com/Sinity/polylogue/issues/2658))
([a8eb1bf](https://github.com/Sinity/polylogue/commit/a8eb1bf1a8af6fdf3257f022b49935b07ad5dc73))
* **types:** restore quick verification gate
([87ce471](https://github.com/Sinity/polylogue/commit/87ce4718768abe247bc54bc03fda7f0db7a78752))
* **usage:** reconcile Codex tokens from disjoint rollups
([cae61ed](https://github.com/Sinity/polylogue/commit/cae61ed8ad5006e83374b72bfde7a252d82889bb))
* **verify:** restore quick gate currency
([3216c02](https://github.com/Sinity/polylogue/commit/3216c020660acef86db68f51239c343816c35a93))
* **web-shell:** correct total_sessions path, clear stuck status notice
([#2562](https://github.com/Sinity/polylogue/issues/2562))
([8506792](https://github.com/Sinity/polylogue/commit/850679209c6a551106d31104b640c728f70295f1))
* **web:** render truthful loading/stale/error states, not false
emptiness ([#2673](https://github.com/Sinity/polylogue/issues/2673))
([5479bea](https://github.com/Sinity/polylogue/commit/5479beabcb300049d9a2bbb50859d70b3742639d))
* word-boundary anchor the work-event text-signal keyword matcher
([#2630](https://github.com/Sinity/polylogue/issues/2630))
([7806b26](https://github.com/Sinity/polylogue/commit/7806b26e76f9307931d0150ca2bed35bd1d34566))


### Changed

* **cli:** avoid select setup on bounded output
([01e592e](https://github.com/Sinity/polylogue/commit/01e592e3db300e1420b7d209e68e9744c60d9f7b))
* **cli:** delegate session pages to daemon
([01847a3](https://github.com/Sinity/polylogue/commit/01847a36d52879bfef79d404413bf4d1a09b0102))
* **demo:** bound claim evidence report scans
([9045330](https://github.com/Sinity/polylogue/commit/90453304c1cf7e737459e1a83ea4ec8240d2d7b4))
* **demo:** bound claim evidence sampling before pairing
([8112fa2](https://github.com/Sinity/polylogue/commit/8112fa24373c5c8e8bbf64c69affd6686fa4b5d7))
* **devtools:** bound affordance detail reports
([898a6d1](https://github.com/Sinity/polylogue/commit/898a6d1868925a44a603fede6dc73e28379705a9))
* **embed:** avoid exact scans during window selection
([#2512](https://github.com/Sinity/polylogue/issues/2512))
([ba4655a](https://github.com/Sinity/polylogue/commit/ba4655afc2040bf0f59e015331032a487511cba5))
* **embed:** constrain archive block text lookup
([#2513](https://github.com/Sinity/polylogue/issues/2513))
([da18955](https://github.com/Sinity/polylogue/commit/da18955963ac32bc0c4f88443a0926d7a4abdb82))
* **embeddings:** batch archive vector writes
([660d01d](https://github.com/Sinity/polylogue/commit/660d01dbb9ceef95daff4b4613a05aecad1c7385))
* **embeddings:** stream pending prose windows
([ff6c4f9](https://github.com/Sinity/polylogue/commit/ff6c4f950960ee1848033e9faea1c99f5e3432a5))
* **embed:** index authored prose selection
([#2507](https://github.com/Sinity/polylogue/issues/2507))
([cdd0081](https://github.com/Sinity/polylogue/commit/cdd008167b4cfe03d08231b0200420b4353df957))
* **ingest:** batch commits by accumulated message count
([#2492](https://github.com/Sinity/polylogue/issues/2492))
([eaa4ad7](https://github.com/Sinity/polylogue/commit/eaa4ad7e23ac9238291b9d1902f9c13ec7963432)),
closes [#2391](https://github.com/Sinity/polylogue/issues/2391)
* **ingest:** batch session event writes
([6e681ff](https://github.com/Sinity/polylogue/commit/6e681ff40534daaac2479641d665c380cf560910))
* **ingest:** log slow write stage timings
([5da0be3](https://github.com/Sinity/polylogue/commit/5da0be374074fe6ad1fd46d911f3c5f1c38c549c))
* **ingest:** skip current root graph refreshes
([452f051](https://github.com/Sinity/polylogue/commit/452f051db880ad4d17156c981644b8b08f0241bd))
* **ingest:** skip unchanged thread refreshes
([cf6b41e](https://github.com/Sinity/polylogue/commit/cf6b41ef7a344e4577d37ba7158dadef1ddc1f33))
* **insights:** aggregate cost rollups from usage rows
([bb2f84f](https://github.com/Sinity/polylogue/commit/bb2f84ff871fb6717c94c733ddd3b963570509b1))
* **insights:** bound async giant-session rebuilds
([#2540](https://github.com/Sinity/polylogue/issues/2540))
([3de0079](https://github.com/Sinity/polylogue/commit/3de00794ef058d68ec8707c6a977f391504b8f95))
* **insights:** bound insight-rebuild WAL via per-chunk commits (Ref
[#2458](https://github.com/Sinity/polylogue/issues/2458))
([#2466](https://github.com/Sinity/polylogue/issues/2466))
([2eee22a](https://github.com/Sinity/polylogue/commit/2eee22a9fbfe9f177bc895f64c3271917044a91b))
* **insights:** bound usage timeline event scans
([b9f4253](https://github.com/Sinity/polylogue/commit/b9f4253cae00dfdd621281ef5ce3e1ebedbb8862))
* **maintenance:** batch raw materialization replay
([#2509](https://github.com/Sinity/polylogue/issues/2509))
([4a39c0c](https://github.com/Sinity/polylogue/commit/4a39c0c31fa07d76e314773cf69a7e191ff474d9))
* **maintenance:** replay rebuild rows source-first
([#2524](https://github.com/Sinity/polylogue/issues/2524))
([4a0ab58](https://github.com/Sinity/polylogue/commit/4a0ab5883a8fbcda0b558779d8066af04fc318d6))
* **maintenance:** report weighted rebuild run size
([#2529](https://github.com/Sinity/polylogue/issues/2529))
([ad1bf4e](https://github.com/Sinity/polylogue/commit/ad1bf4e177eafde709f0bc63f627b2d01bec2a90))
* **maintenance:** scope targeted index materialization
([90f1c5a](https://github.com/Sinity/polylogue/commit/90f1c5a493e1f583149fbf60ed78cdd1467e8532))
* **maintenance:** weight rebuild planning by raw payload
([#2528](https://github.com/Sinity/polylogue/issues/2528))
([3954534](https://github.com/Sinity/polylogue/commit/39545347c89f66e9e97ab63f59cbc206f625a185))
* **pipeline:** report raw ingest batch starts
([#2530](https://github.com/Sinity/polylogue/issues/2530))
([e15eda2](https://github.com/Sinity/polylogue/commit/e15eda24e6118ce7c1631da3b618c07666f1205a))
* **read-package:** run artifacts in process
([ed7cafb](https://github.com/Sinity/polylogue/commit/ed7cafbf4e8bff88a94089bf4629355a3af7651f))
* **read:** avoid full-session pagination loads
([a17e3af](https://github.com/Sinity/polylogue/commit/a17e3af95dd601f07ca0aa2b946f8efaa750b2c5))
* **read:** bound exact-session temporal handoffs
([478d6a7](https://github.com/Sinity/polylogue/commit/478d6a77cf1cea1d63c180701d49099ad2cfacc3))
* **read:** stream exact markdown file exports
([a9dc3f2](https://github.com/Sinity/polylogue/commit/a9dc3f274abb92c10830b5d2dcd82f5e291cb905))
* **read:** stream messages file exports
([177523a](https://github.com/Sinity/polylogue/commit/177523aab8c9407f319eed77361fad965f0ac56b))
* **status:** keep full status off exact scans
([4399db6](https://github.com/Sinity/polylogue/commit/4399db6360c27cb1e87e316fac6604470588f576))
* **storage:** append thread membership suffixes
([adc2541](https://github.com/Sinity/polylogue/commit/adc25412e5d57865e5325fc4cef9274e100bac2f))
* **storage:** avoid redundant thread refresh churn
([af0c1cc](https://github.com/Sinity/polylogue/commit/af0c1cc1c48c37f2ba37f80fd525ad934ff3142e))
* **storage:** bound revision census memory
([#2686](https://github.com/Sinity/polylogue/issues/2686))
([3fe7837](https://github.com/Sinity/polylogue/commit/3fe7837c83377017341958d544c62f79587bff0b))
* **storage:** cache composed lineage during graph repair
([51ddf75](https://github.com/Sinity/polylogue/commit/51ddf75a82adf1b248fdda287c12b4f5eb962043))
* **storage:** clean empty lineage tails by session
([#2525](https://github.com/Sinity/polylogue/issues/2525))
([b2936ba](https://github.com/Sinity/polylogue/commit/b2936ba8dddd90b94c5c708f8be4569e16171344))
* **storage:** reduce graph resolve refresh churn
([#2526](https://github.com/Sinity/polylogue/issues/2526))
([7b9f4e0](https://github.com/Sinity/polylogue/commit/7b9f4e0419875801d7cc26653b6f4858e7e3a2d4))
* **storage:** time delayed prefix re-extraction
([#2527](https://github.com/Sinity/polylogue/issues/2527))
([04ecfe0](https://github.com/Sinity/polylogue/commit/04ecfe0ec26910fa6abb3221aa4607ede15d81e9))
* **storage:** use session-scoped block lookup for signatures
([#2532](https://github.com/Sinity/polylogue/issues/2532))
([89b20c3](https://github.com/Sinity/polylogue/commit/89b20c33584a2a8aebef8798b1a425a1ce4d5ad9))
* **usage:** add headline detail for usage reports
([c1067fb](https://github.com/Sinity/polylogue/commit/c1067fb45cc1cf93fb6a9dd5ccd6bc03c79477a7))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.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