Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ Follows [Keep a Changelog](https://keepachangelog.com/); versioning is [SemVer](
- session-ledger heuristic intent extractor property surface (WBS-6.2 #463): `crates/sl-viewer/tests/properties_session_ledger_intent.rs` adds 10 proptest properties pinning `session_ledger::distill::extractor::HeuristicIntentExtractor::extract_intent` (the P1 SSOT for what the user wants — drives resume prompt, search index, and wiki/docs view). `user_turn_count` always equals the count of `Role::User` messages and ignores `Assistant` / `Subagent` / `Tool` / `System` messages. Empty sessions produce an empty `Intent`. Repeated acceptance / constraint patterns are deduplicated. Every documented acceptance pattern (16 of them: `looks good`, `works`, `that's correct`, `correct`, `done`, `fixed`, `passes`, `approved`, `looks right`, `looks great`, `all good`, `that works`, `nice`, `perfect`, `exactly`, `confirmed`) and every documented constraint pattern (19 of them: `don't change`, `do not change`, `must not`, `should not`, `keep`, `maintain`, `preserve`, `never`, `don't touch`, `do not touch`, `don't modify`, `do not modify`, `only`, `but don't`, `but do not`, `without changing`, `without modifying`, `leave alone`, `leave as is`) is recognized in any user message. Labeled `Goal:` / `Objective:` / `Task:` lines win over surrounding preamble. Labeled `Constraint:` / `Requirement:` / `Boundary:` lines contribute their full text. The extractor is deterministic across calls.
- session-ledger heuristic context extractor property surface (WBS-6.2 #464): `crates/sl-viewer/tests/properties_session_ledger_context.rs` adds 20 proptest properties pinning `session_ledger::distill::context_extractor::HeuristicContextExtractor::extract_context` (the P2 adapter for [`ContextExtractor`] — drives the working-context slice of any `ContinuationBundle`). `cwd` and `title` are always copied verbatim from the session. Empty sessions and whitespace-only messages yield an empty `Context`. Every detected file path is non-empty, ≥3 chars, and either contains a `/` or ends with a documented extension. Every documented file extension (28 of them: `.rs`, `.ts`, `.tsx`, `.js`, `.jsx`, `.py`, `.go`, `.java`, `.kt`, `.rb`, `.c`, `.h`, `.cpp`, `.hpp`, `.cs`, `.swift`, `.toml`, `.json`, `.yaml`, `.yml`, `.md`, `.sql`, `.css`, `.scss`, `.html`, `.sh`, `.tf`, `.lock`) is detected. Files / symbols / decisions / environment notes are deduplicated across messages. Decision summaries all read `Session contains '<pattern>' language` and rationale equals the source message. Every documented decision pattern (15 of them) and every documented environment pattern (19 of them) is detected, both case-insensitively. Symbols are extracted only from tokens containing `::` or `()`. `extract_context` is deterministic across calls, and the `ContextExtractor` trait path returns the same `Context` as the associated function.
- session-ledger heuristic contract extractor property surface (WBS-6.2 #465): `crates/sl-viewer/tests/properties_session_ledger_contract.rs` adds 18 proptest properties pinning `session_ledger::distill::contract_extractor::HeuristicContractExtractor::extract_contract` (the P2 adapter for [`ContractExtractor`] — drives the acceptance-contract slice of any `ContinuationBundle`). Empty sessions and whitespace-only messages yield an empty `Contract`. Every section string has a documented prefix and suffix shape (`Goal/requirement: '...'`, `Verification: '...'`, `Constraint: '...'`, `Do-not-touch: '...'`). Every documented criteria pattern (12 of them), test pattern (21 of them), constraint pattern (15 of them), and do-not-touch pattern (14 of them) is detected, and all patterns match case-insensitively. Success criteria / tests / constraints / do-not-touch lists are deduplicated across messages. `extract_contract` is deterministic across calls, and the `ContractExtractor` trait path returns the same `Contract` as the associated function. `is_empty()` is true iff every collection is empty.
- session-ledger token estimator property surface (WBS-6.2 #467): `crates/sl-viewer/tests/properties_session_ledger_token_estimator.rs` adds 24 proptest properties pinning `session_ledger::distill::token_estimator::CharCountTokenEstimator` (the bounded token-budget accountant for the distill pipeline — backs every `token_estimate()` query on a `Bundle` slice). `estimate_text` always equals `(chars + 3) / 4` (ceiling-division rounding up at every 4-char boundary), the documented fixed points (`n=1..=9` → `1, 1, 1, 1, 2, 2, 2, 2, 3`) hold, and the estimator counts unicode scalar values (chars) — not UTF-8 bytes (4 × `🦀` = 4 chars = 1 token, even though those are 16 UTF-8 bytes). `estimate_text` is deterministic, finite (u32), never panics on any unicode input (CJK / RTL / emoji / combining marks), and is monotonic for prefixes (`est(text) ≥ est(prefix)`). `estimate_text(s.repeat(n))` follows the exact `(chars(s) * n + 3) / 4` contract. `estimate_json(&v)` always equals `estimate_text(&v.to_string())` — i.e. it uses compact serialisation with no whitespace — and is total over `Null / Bool / Number / String / Array / Object`. `CharCountTokenEstimator` is `Default + Copy + Clone`, and the trait-default `estimate_json` delegates to `estimate_text` (verified with a dummy estimator that overrides `estimate_text`).
- session-ledger dedup compiler property surface (WBS-6.2 #468): `crates/sl-viewer/tests/properties_session_ledger_dedup.rs` adds 15 proptest properties pinning `session_ledger::distill::dedup_compiler::DedupCompiler::compile` (the deterministic scope-keyed manifest pipeline that compiles same-scope sessions into a typed, token-sized Dedup slice). Empty sessions always return `Err(EmptySessions)`. Whitespace-only or empty topic returns `Err(EmptyTopic)`. Topic is trimmed and lowercased before use. Output bundle always has `kind = BundleKind::Dedup` and a positive `token_estimate`. Manifest body always deserializes to `DedupManifest`. `dedup_key` is exactly 64 hex chars (sha256 fingerprint), independent of input order, and differs across topics and cwds. Duplicate members (same id + corpus) appear once preserving first occurrence order. Members preserve input order. Different corpora for same cwd produce different members. Mixed-scope sessions return `Err(ScopeMismatch)` with the offending session_id. Compilation is deterministic across calls and `token_estimate` is monotonic non-decreasing in session count.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

WARNING: Changelog entry for token estimator properties was replaced instead of appended

The session-ledger token estimator property surface (WBS-6.2 #467) entry is removed and replaced with the dedup compiler entry. This loses the changelog record for PR #467's token estimator properties. The dedup entry should be added as a new bullet, not a replacement.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

- Commit signing header scan (C04 L34): `commit-signing-check.ps1` reads bounded commit headers via line-scanner (no unbounded `git cat-file` buffers or `(?ms)` regex); `-SelfCheck` + `tests/commit_signing_check.rs`.

- Loom permutation CI timeout (P0 stability): split blocking `loom-permutation.yml` into core + per-daemon `loom_model` jobs with `LOOM_MAX_PREEMPTIONS` on broadcast/pipeline/shutdown; mirror in soft `loom-smoke.yml` so Wave-40 tokio-shaped daemon graph tests no longer exceed single-job ceilings.
Expand Down
Loading
Loading