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
3 changes: 2 additions & 1 deletion LESSONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,5 @@ the row is `open`, so several start past the 14-day limit and need a decision.
| L-009 | 2026-10-08 | Audio brief failed with "voice engine not found" on the main laptop from the first build with PRIV-1 until 1.44: removing a developer path removed the only lookup that found the engine. | When a lookup path is removed, give its replacement (a setting) and a health check in the same change. | open | Fixed on `fix/1.44` (engine folder setting). |
| L-010 | 2026-09-25 | On the main laptop, local `main` tracks `origin`, which is upstream Handy, not `korero`; a bare `git push` targets the wrong repo. | Always push with `git push korero <branch>`. | open | One-line fix: `git branch -u korero/main main` on each machine. |
| L-011 | 2026-10-16 | The first in-room plan listed `pyannote-rs` as a fallback engine. The M0 probe found it does not compile against Kōrero's `ort` (29 errors), ignores the model's speaker-change output and drifts about 60 ms per 10 s. | Compile a dependency and read its source before naming it in a plan, even as a fallback. | advice-only | `app-dev-pm` Phase 1.5 already requires probing claims; this was a planning slip, caught by M0 before any app code. |
| L-012 | 2026-10-16 | M0's first scores were worse than calling everyone one speaker. The cause was the CAM++ embedding model packaged with `pyannote-rs`: it ran without error and gave stable output, but told AMI speakers apart no better than chance, even on headset audio. The harness was checked first (reference timing, feature scale, window type), then models were compared on clean labelled turns; WeSpeaker ResNet34-LM separated them 82–100% of the time. | A model that runs is not a model that works: score it on labelled data, and check the harness before trusting a bad number. | open | Plan M2 adds a check that scores the shipped models on the AMI test set and fails above the agreed error. |
| L-012 | 2026-10-16 | M0's first scores were worse than calling everyone one speaker. The cause was the CAM++ embedding model packaged with `pyannote-rs`: it ran without error and gave stable output, but told AMI speakers apart no better than chance, even on headset audio. The harness was checked first (reference timing, feature scale, window type), then models were compared on clean labelled turns; WeSpeaker ResNet34-LM separated them 82–100% of the time. | A model that runs is not a model that works: score it on labelled data, and check the harness before trusting a bad number. | check-added | `diar_ami_der` in `src-tauri/src/diarise.rs` scores the shipped models on four AMI far-field meetings and fails above a 25% mean error (manual: 177 MB of audio, not in CI). Its own scorer agrees with pyannote.metrics to within 0.2 points. |
| L-013 | 2026-10-16 | Editing `src/bindings.ts` with a script that normalised line endings turned a 31-line change into a 2,003-line diff: the file is stored in git with mixed CRLF and LF lines, and the rewrite made them uniform. The same session then wrote garbled macrons into a decision row, because Windows PowerShell 5.1 read a script saved without a byte-order mark as ANSI. Both were caught before any push. | Before committing a scripted edit, compare `git diff --numstat` with and without `--ignore-cr-at-eol`, and search the added lines for mojibake (Ã, Å); write text with macrons from Python or a UTF-8-with-BOM script. | open | A `.gitattributes` rule for `src/bindings.ts` (or regenerating it in CI) and a mojibake check on added lines would make these checks. |
1 change: 1 addition & 0 deletions docs/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ in the Kōrero claude.ai project), where some carried older labels (shown in bra
| D-005 | 2026-10-08 | Accepted | **Notes for a meeting over 48,000 characters are written in parts and combined** (split at speaker turns, at most 8 parts); shorter meetings are unchanged. Nic: "go with reading in parts". | 8 of 35 meetings on the main laptop had notes from the start only, and lost every flagged moment. | A bigger context window: needs more video memory than the target machines have, and quality falls off on long inputs. | Ask needs whole-meeting answers (it still reads one part and says so). |
| D-006 | 2026-10-08 | Accepted | **`wasapi` was upgraded from 0.23 to 0.25 to clear a security advisory**, rather than recording an exemption. Nic's choice during the 1.44 publish gates. | An exemption leaves the advisory in place; the upgrade's side effect (Windows manifest embedding in test binaries) was fixable. | Exempt the advisory in `cargo deny`. | — |
| D-007 | 2026-10-16 | Accepted | **In-room speaker separation runs in Kōrero's own code on its existing ONNX runtime** (`ort 2.0.0-rc.12`), after Stop, on the CPU, never live: pyannote segmentation-3.0 (MIT) read for speaker changes, not only speech; WeSpeaker ResNet34-LM speaker embeddings (CC BY 4.0, attribution in the third-party notices); clustering of the whole meeting on segments of 1.5 s or more, clusters under 20 s of speech folded into the nearest one, short fragments attached by voice. Plan: `KORERO_1.45_IN-ROOM-SPEAKERS-PLAN_2026-10-16.md` (v2). (Approved by Nic 16 Oct 2026: "Execute D007".) | M0 probe, 16 Oct, on four AMI test meetings recorded by one far-field room microphone (92 minutes): mean error 23.1% with a 0.25 s collar, 28.1% strict, against 22.4% strict for pyannote's own pipeline on all 16 test meetings; right number of people in 2 of 4 meetings (one too many in one, two too few in the other). About 80 s of CPU time per hour of audio on 4 threads. It builds in the same binary as `transcribe-rs` with one `ort`. | `pyannote-rs` 0.3.4: does not compile against `ort` rc.12 (29 errors); reads the model only as a speech detector; its clock drifts 60.6 ms per 10 s; its packaged CAM++ embedding model told AMI speakers apart no better than chance, even on headset audio (57.5% error with the right model, 80.5% as published). `sherpa-onnx`: a second ONNX runtime beside `ort`. Telling the clusterer the number of people: worse (31.5%) than finding it. The notes model guessing speakers: invents attributions. | Results on Nic's own room recordings differ from AMI; `knf-rs` (C++ build, `ndarray` 0.16) is replaced by Rust feature code. |
| D-008 | 2026-10-16 | Accepted | **The speaker-separation models are downloaded on first use, not bundled.** "Separate speakers" fetches pyannote segmentation-3.0 (5,983,836 B) and WeSpeaker ResNet34-LM (26,530,550 B) into the models folder (`diarise/`), writes each as `.partial`, and keeps it only if its size and sha256 match the values pinned in `diarise.rs`; a mismatch is deleted and never loaded. Sources for now: the `pyannote-rs` v0.1.0 and sherpa-onnx speaker-recognition-models GitHub releases. Filterbank features come from `knf-rs` 0.3.2 (MIT; a C++ build through CMake and bindgen, and a second `ndarray`, 0.16, internal to it). | Bundling would roughly triple the installer (14 MB to about 46 MB) for every user, including those who never record in a room. Download-on-first-use matches how Kōrero already fetches speech models and stays offline afterwards. Pinning size and hash means a changed or substituted file at either URL fails closed. | Bundle in the installer: simplest offline story, but the size cost falls on everyone. Mirror to Kōrero's own GitHub release now: more control, but publishing a release is Nic's call. Rust filterbanks instead of `knf-rs`: removes the C++ build, but needs a parity check first (plan M2 step c). | Either upstream URL changes or disappears (the pinned hash makes that a clean failure, not a silent one): mirror both files to a Kōrero release. The Rust filterbank parity check passes (drop `knf-rs`). |
1 change: 1 addition & 0 deletions docs/PRODUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ A build or enable bet enters Now only on research or a requirement. Keep Now to
Dated one-liners for every reorder, drop or gate decision, newest first. Larger product decisions go to
`docs/DECISIONS.md`.

- 2026-10-16: B4, first slice built on `feat/diarise`: the engine and a "Separate speakers" action on the Audio tab, with speaker labels reaching copy, export, search, Ask and the notes. Mean error 21.5% on the AMI check (bar 25%). Still to come in B4: naming, merge and split (M3), and splitting lines where the speaker changes mid-sentence.
- 2026-10-16: Nic: "Execute D007". B4 moves to Now beside B1 and B3 (3 of 3), and is built on its own branch from `main`, ahead of B3 (M1); D-007 is Accepted.
- 2026-10-16: First brief (dev-product Mode A). Proposed order, for Nic to confirm: B1 then B3 in Now; B6, B4 and B5
in Next. Nic sets the order; this is the session's proposal.
Expand Down
Loading
Loading