diff --git a/CHANGELOG.md b/CHANGELOG.md index f23fd5cea..23fd251ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ them (`v0.1.0` … `v1.19.0`); the 1.x ranges below are derived from that history, not written from memory. Rust alpha and beta tags identify previews; the stable 2.0 release has not been cut. +## 2.0.0-beta.56 — 2026-10-19 + +**Skill evaluation review** + +- Pin **LORE 0.62.24** with opt-in diagnostic traces and human-run coding-skill experiments against frozen task fixtures, separate verifier checks and one-use final tests. +- Display advisory results in **`PendingReview::display_text`**, including explicit stale evidence; require reading the evidence section before arming proposal approval. +- Preserve exact raw proposal hashes and human approval. No automatic skill installation, factual-memory scoring or model experiment runs are added. + ## 2.0.0-beta.55 — 2026-10-19 **Background review history** diff --git a/Cargo.lock b/Cargo.lock index 8a849be1b..de582cab0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -453,7 +453,7 @@ dependencies = [ [[package]] name = "doxa-claude" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-isolation", "doxa-state", @@ -464,7 +464,7 @@ dependencies = [ [[package]] name = "doxa-codegraph" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "libc", "proc-macro2", @@ -480,7 +480,7 @@ dependencies = [ [[package]] name = "doxa-daemon" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-claude", "doxa-engines", @@ -510,7 +510,7 @@ dependencies = [ [[package]] name = "doxa-engines" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-isolation", "libc", @@ -524,7 +524,7 @@ dependencies = [ [[package]] name = "doxa-fleet" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-isolation", "doxa-state", @@ -541,7 +541,7 @@ dependencies = [ [[package]] name = "doxa-hub" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "base64 0.22.1", "bytes", @@ -565,7 +565,7 @@ dependencies = [ [[package]] name = "doxa-isolation" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-router", "errno", @@ -579,7 +579,7 @@ dependencies = [ [[package]] name = "doxa-lore" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-codegraph", "doxa-state", @@ -593,7 +593,7 @@ dependencies = [ [[package]] name = "doxa-mcp" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-vendors", "libc", @@ -606,7 +606,7 @@ dependencies = [ [[package]] name = "doxa-peers" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "bytes", "doxa-isolation", @@ -627,14 +627,14 @@ dependencies = [ [[package]] name = "doxa-protocol" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "serde_json", ] [[package]] name = "doxa-remote" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "bytes", "doxa-lore", @@ -656,7 +656,7 @@ dependencies = [ [[package]] name = "doxa-remote-wire" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "aes-gcm", "base64 0.22.1", @@ -668,7 +668,7 @@ dependencies = [ [[package]] name = "doxa-router" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-vendors", "libc", @@ -682,7 +682,7 @@ dependencies = [ [[package]] name = "doxa-runtime" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "libc", "serde_json", @@ -691,7 +691,7 @@ dependencies = [ [[package]] name = "doxa-state" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "libc", "serde", @@ -704,7 +704,7 @@ dependencies = [ [[package]] name = "doxa-transcript" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-vendors", "libc", @@ -715,7 +715,7 @@ dependencies = [ [[package]] name = "doxa-tui" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "crossterm", "doxa-claude", @@ -762,7 +762,7 @@ dependencies = [ [[package]] name = "doxa-vendors" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "futures-util", "libc", @@ -774,7 +774,7 @@ dependencies = [ [[package]] name = "doxa-worktrees" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" dependencies = [ "doxa-isolation", "doxa-state", @@ -1553,8 +1553,8 @@ checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "lore-core" -version = "0.62.23" -source = "git+https://github.com/docwilde/LORE?rev=c2b2da4dbcd80c4f2d478f92c29e9dff060ad103#c2b2da4dbcd80c4f2d478f92c29e9dff060ad103" +version = "0.62.24" +source = "git+https://github.com/docwilde/LORE?rev=d0dcbcc9a06690a1c340c858c5590d23fe814b77#d0dcbcc9a06690a1c340c858c5590d23fe814b77" dependencies = [ "fancy-regex", "hmac 0.12.1", diff --git a/docs/manual.md b/docs/manual.md index 769c4aee0..ca5e68671 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1979,3 +1979,22 @@ daemon sockets and the peer registry, kept out of the home directory because home directories can be network-mounted (Unix sockets misbehave there). The LORE store is neither — it stays `lore_core`'s own path, shared with the Claude Code LORE plugin on purpose. + +### Evaluating pending coding skills + +The LORE proposal review includes advisory skill-evaluation evidence when +provided by the native carrier. Changed proposal or installed baseline bytes +are labeled stale; unavailable evidence is shown explicitly. Read the full +proposal and evidence section before arming approval. The evidence does not +authorize installation; the existing exact-byte human approval applies. + +Run `lore skills evaluate PROPOSAL_ID --suite /absolute/corpus/suite.json` +from a human terminal to compare frozen baseline/candidate skills on separate +train, replay, validation and one-use final-test fixtures. This is opt-in; +DOXA does not launch experiments from the proposal screen. Automatic native +diagnostic capture is also opt-in through `LORE_DIAGNOSTIC_TRACES=1`. + +See the [LORE evaluation workflow](https://github.com/docwilde/LORE/blob/v0.62.24/docs/skill-evaluation.md) +for the corpus format, immutable evidence, answer/growth checks and limits. +The included deterministic fixture validates the mechanism; a real task +corpus and model adapter are needed to measure skill quality. diff --git a/rust/doxa-claude/Cargo.toml b/rust/doxa-claude/Cargo.toml index cd8e2a9aa..51d2dd6f5 100644 --- a/rust/doxa-claude/Cargo.toml +++ b/rust/doxa-claude/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-claude" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-codegraph/Cargo.toml b/rust/doxa-codegraph/Cargo.toml index 31f33a56b..e3aa5b227 100644 --- a/rust/doxa-codegraph/Cargo.toml +++ b/rust/doxa-codegraph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-codegraph" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-daemon/Cargo.toml b/rust/doxa-daemon/Cargo.toml index f8f7bb113..1461904d9 100644 --- a/rust/doxa-daemon/Cargo.toml +++ b/rust/doxa-daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-daemon" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-engines/Cargo.toml b/rust/doxa-engines/Cargo.toml index 22b2eb99a..e8d19acc7 100644 --- a/rust/doxa-engines/Cargo.toml +++ b/rust/doxa-engines/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-engines" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-fleet/Cargo.toml b/rust/doxa-fleet/Cargo.toml index 3c625888d..e14120397 100644 --- a/rust/doxa-fleet/Cargo.toml +++ b/rust/doxa-fleet/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-fleet" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-hub/Cargo.toml b/rust/doxa-hub/Cargo.toml index 93b8e0a28..7f8624322 100644 --- a/rust/doxa-hub/Cargo.toml +++ b/rust/doxa-hub/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-hub" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-isolation/Cargo.toml b/rust/doxa-isolation/Cargo.toml index cd542abd5..28f86ed63 100644 --- a/rust/doxa-isolation/Cargo.toml +++ b/rust/doxa-isolation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-isolation" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-lore/Cargo.toml b/rust/doxa-lore/Cargo.toml index 002ab1f32..4557306e3 100644 --- a/rust/doxa-lore/Cargo.toml +++ b/rust/doxa-lore/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "doxa-lore" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" [dependencies] -lore-core = { git = "https://github.com/docwilde/LORE", rev = "c2b2da4dbcd80c4f2d478f92c29e9dff060ad103" } +lore-core = { git = "https://github.com/docwilde/LORE", rev = "d0dcbcc9a06690a1c340c858c5590d23fe814b77" } doxa-codegraph = { path = "../doxa-codegraph" } doxa-state = { path = "../doxa-state" } doxa-vendors = { path = "../doxa-vendors" } diff --git a/rust/doxa-lore/src/lib.rs b/rust/doxa-lore/src/lib.rs index 0dfb48f34..6a2940380 100644 --- a/rust/doxa-lore/src/lib.rs +++ b/rust/doxa-lore/src/lib.rs @@ -515,6 +515,7 @@ pub struct PendingReview { raw: String, sha256: String, inode: u64, + skill_evaluation: Option, } /// One exact active belief selected for review. The sidecar checks the raw @@ -603,6 +604,25 @@ impl PendingReview { pub fn inode(&self) -> u64 { self.inode } + pub fn skill_evaluation(&self) -> Option<&Value> { + self.skill_evaluation.as_ref() + } + /// Evaluation evidence is advisory and separate from the proposal bytes + /// whose digest authorizes resolution. Older carriers omit this section. + pub fn display_text(&self) -> String { + match &self.skill_evaluation { + Some(evidence) => { + let freshness = match evidence["current"].as_bool() { + Some(false) => "Stale: the proposal or installed baseline changed.\n", + Some(true) => "Matches this proposal and installed baseline.\n", + None => "", + }; + format!("{}\n\nSkill evaluation (advisory; human approval required)\n{}{}", + self.raw, freshness, serde_json::to_string_pretty(evidence).unwrap_or_default()) + }, + None => self.raw.clone(), + } + } } #[derive(Debug, Clone, PartialEq)] @@ -1171,11 +1191,21 @@ impl LoreClient { if previous.is_some_and(|old| old.sha256() != sha256 || old.inode() != inode) { return Err(LoreError::Remote("pending_changed")); } + let skill_evaluation = match value.get("skill_evaluation") { + None => None, + Some(evidence) if evidence.is_object() + && serde_json::to_vec(evidence).is_ok_and(|b| b.len() <= 8192) + && evidence["status"].as_str().is_some_and(|s| matches!(s, + "not_evaluated" | "evidence_unavailable" | "quality_failed" | + "performance_failed" | "validation_passed" | "passed" | "final_test_failed")) => Some(evidence.clone()), + _ => return Err(LoreError::InvalidFrame), + }; Ok(PendingReview { pid: pid.to_owned(), raw: raw.to_owned(), sha256: sha256.to_owned(), inode, + skill_evaluation, }) } diff --git a/rust/doxa-lore/tests/native.rs b/rust/doxa-lore/tests/native.rs index 98776ec86..d2d873d0a 100644 --- a/rust/doxa-lore/tests/native.rs +++ b/rust/doxa-lore/tests/native.rs @@ -3,6 +3,25 @@ use doxa_lore::{CodegraphSnapshot, LoreClient, LoreError}; use sha2::{Digest, Sha256}; use std::time::Duration; +#[test] +fn native_skill_review_keeps_evaluation_separate_from_exact_proposal_bytes() { + let dir = tempfile::tempdir().unwrap(); + let cfg = lore_core::config::Config::for_root(dir.path().join("store")); + let cwd = dir.path().join("project"); + let authority = lore_core::gate::Authority::Derived { agent: "fixture".into(), engine: "codex".into() }; + let pid = lore_core::gate::stage(&cfg, &serde_json::json!({ + "kind":"skill", "name":"fixture-skill", "body":"Run the fixed task checks.", + "project":lore_core::config::project_slug(&cwd) + }), &authority).unwrap(); + let mut client = LoreClient::open_config(cfg.clone(), Duration::from_secs(2)).unwrap(); + let review = client.pending_review(cwd.to_str().unwrap(), &pid).unwrap(); + assert_eq!(review.skill_evaluation().unwrap()["status"], "not_evaluated"); + assert!(review.display_text().contains("Skill evaluation (advisory")); + let raw = std::fs::read_to_string(cfg.root.join("pending").join(format!("{pid}.json"))).unwrap(); + assert_eq!(review.raw(), raw); + assert_eq!(review.sha256(), format!("{:x}", Sha256::digest(raw.as_bytes()))); +} + #[test] fn reviewed_codegraph_read_is_scoped_and_rejects_stale_source() { let owned = tempfile::tempdir().unwrap(); diff --git a/rust/doxa-lore/tests/sidecar.rs b/rust/doxa-lore/tests/sidecar.rs index 0098fb4d5..f247c09b0 100644 --- a/rust/doxa-lore/tests/sidecar.rs +++ b/rust/doxa-lore/tests/sidecar.rs @@ -352,6 +352,8 @@ for line in sys.stdin: if req['pid'] == 'partial': value['complete'] = False if req['pid'] == 'swapped': value['pid'] = 'other' if req['pid'] == 'invalid': value['raw'] = '{"kind":' + if req['pid'] == 'evaluated': value['skill_evaluation'] = {'status':'passed','current':False,'advisory':True} + if req['pid'] == 'fake_evaluation': value['skill_evaluation'] = {'status':'model_says_perfect'} print(json.dumps({'type':'reply','id':req['id'],'ok':True,'value':value}), flush=True) "#, ); @@ -360,6 +362,14 @@ for line in sys.stdin: assert_eq!(review.pid(), "one"); assert_eq!(review.inode(), 87); assert!(review.raw().contains("entire signed op bytes")); + assert_eq!(review.skill_evaluation(), None, "older carriers remain compatible"); + let evaluated = client.pending_review("/repo", "evaluated").unwrap(); + assert_eq!(evaluated.raw(), review.raw(), "advisory evidence must not change reviewed bytes"); + assert_eq!(evaluated.sha256(), review.sha256()); + assert_eq!(evaluated.skill_evaluation().unwrap()["current"], false); + assert!(evaluated.display_text().contains("Skill evaluation (advisory")); + assert!(evaluated.display_text().contains("Stale: the proposal or installed baseline changed.")); + assert!(client.pending_review("/repo", "fake_evaluation").is_err()); assert_eq!(review.sha256().len(), 64); assert_eq!( client diff --git a/rust/doxa-mcp/Cargo.toml b/rust/doxa-mcp/Cargo.toml index 2e5a49077..9321acff7 100644 --- a/rust/doxa-mcp/Cargo.toml +++ b/rust/doxa-mcp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-mcp" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-peers/Cargo.toml b/rust/doxa-peers/Cargo.toml index 017b55c4b..4466e4ff8 100644 --- a/rust/doxa-peers/Cargo.toml +++ b/rust/doxa-peers/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-peers" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-protocol/Cargo.toml b/rust/doxa-protocol/Cargo.toml index e4878e295..0790bf3ff 100644 --- a/rust/doxa-protocol/Cargo.toml +++ b/rust/doxa-protocol/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-protocol" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-remote-wire/Cargo.toml b/rust/doxa-remote-wire/Cargo.toml index c31ce1076..be4205ed1 100644 --- a/rust/doxa-remote-wire/Cargo.toml +++ b/rust/doxa-remote-wire/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-remote-wire" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-remote/Cargo.toml b/rust/doxa-remote/Cargo.toml index e964df6e0..ad8442433 100644 --- a/rust/doxa-remote/Cargo.toml +++ b/rust/doxa-remote/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-remote" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-router/Cargo.toml b/rust/doxa-router/Cargo.toml index c2b0ad04a..2d8c8a5e2 100644 --- a/rust/doxa-router/Cargo.toml +++ b/rust/doxa-router/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-router" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-runtime/Cargo.toml b/rust/doxa-runtime/Cargo.toml index 6e4c1debc..ceb3aa589 100644 --- a/rust/doxa-runtime/Cargo.toml +++ b/rust/doxa-runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-runtime" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-state/Cargo.toml b/rust/doxa-state/Cargo.toml index 7a20007d6..13f86f4a3 100644 --- a/rust/doxa-state/Cargo.toml +++ b/rust/doxa-state/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-state" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-transcript/Cargo.toml b/rust/doxa-transcript/Cargo.toml index 02279bf7c..fe5b274ef 100644 --- a/rust/doxa-transcript/Cargo.toml +++ b/rust/doxa-transcript/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-transcript" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-tui/Cargo.toml b/rust/doxa-tui/Cargo.toml index af8a2e7e0..c81619b34 100644 --- a/rust/doxa-tui/Cargo.toml +++ b/rust/doxa-tui/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-tui" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-tui/src/ui/lore_controller.rs b/rust/doxa-tui/src/ui/lore_controller.rs index 922536edb..b7abb56c5 100644 --- a/rust/doxa-tui/src/ui/lore_controller.rs +++ b/rust/doxa-tui/src/ui/lore_controller.rs @@ -1178,7 +1178,7 @@ impl App { }; let width = usize::from(area.width.saturating_sub(3)).max(1); let visible = usize::from(area.height.saturating_sub(REVIEW_BODY_RESERVE)); - let total = raw_visual_rows(review.raw(), width).len(); + let total = raw_visual_rows(&review.display_text(), width).len(); if picker.review_width != width { picker.review_width = width; picker.review_scroll = 0; diff --git a/rust/doxa-tui/src/ui/render.rs b/rust/doxa-tui/src/ui/render.rs index 908d71303..09396054e 100644 --- a/rust/doxa-tui/src/ui/render.rs +++ b/rust/doxa-tui/src/ui/render.rs @@ -1356,7 +1356,7 @@ impl App { let width = usize::from(area.width.saturating_sub(3)).max(1); // Preserve all raw content across visual rows; terminal controls // are shown with visible escapes, and no field is summarized. - let visual_rows = raw_visual_rows(review.raw(), width); + let visual_rows = raw_visual_rows(&review.display_text(), width); let start = picker.review_scroll.min(visual_rows.len().saturating_sub(visible)); scrollbar = (visual_rows.len(), visible, start); for line in visual_rows.iter().skip(start).take(visible) { diff --git a/rust/doxa-tui/src/ui/tests.rs b/rust/doxa-tui/src/ui/tests.rs index 830cead30..0a259de52 100644 --- a/rust/doxa-tui/src/ui/tests.rs +++ b/rust/doxa-tui/src/ui/tests.rs @@ -8046,8 +8046,9 @@ import hashlib, json, sys print(json.dumps({'type':'hello','proto':1,'capabilities':['scrub','snapshot','pending_review_v1','resolve_reviewed_v1']}), flush=True) for line in sys.stdin: req = json.loads(line) - raw = json.dumps({'kind':'memory','text':'x'*4000}) - value = {'pid':req['pid'],'raw':raw,'sha256':hashlib.sha256(raw.encode()).hexdigest(),'inode':11,'complete':True} + raw = json.dumps({'kind':'skill','body':'x'*4000}) + value = {'pid':req['pid'],'raw':raw,'sha256':hashlib.sha256(raw.encode()).hexdigest(),'inode':11,'complete':True, + 'skill_evaluation':{'status':'passed','current':False,'advisory':True,'report_sha256':'a'*64}} print(json.dumps({'type':'reply','id':req['id'],'ok':True,'value':value}), flush=True) "#).unwrap(); let mut permissions = std::fs::metadata(&sidecar).unwrap().permissions(); @@ -8056,12 +8057,14 @@ for line in sys.stdin: let lore_picker::ResultPage::Review(review, can_resolve) = lore_picker::fetch_fixture(&sidecar, lore_picker::Query::Review("/repo".into(), "one".into())).unwrap() else { panic!("review") }; assert!(can_resolve); + assert!(review.display_text().contains("Skill evaluation (advisory")); + assert_eq!(review.skill_evaluation().unwrap()["current"], false); let mut app = App::default(); app.size = Rect::new(0, 0, 100, 40); app.lore_picker = Some(LorePicker { session_id: None, query: String::new(), filter_focused: false, rows: Vec::new(), selected: 0, offset: 0, - proposals: vec![lore_picker::Proposal { pid: "one".into(), kind: "memory".into(), + proposals: vec![lore_picker::Proposal { pid: "one".into(), kind: "skill".into(), action: "add".into(), scope: "user".into(), summary: String::new(), source_session_id: None, source_project: None }], proposal_mode: true, cluster_mode: false, all_proposals: Vec::new(), review: Some(review), review_scroll: 0, review_seen: 0, review_width: 0, armed_resolution: None, @@ -8081,7 +8084,7 @@ for line in sys.stdin: app.chooser_height_override.set(None); for _ in 0..200 { if app.lore_picker.as_ref().unwrap().review_seen == - raw_visual_rows(app.lore_picker.as_ref().unwrap().review.as_ref().unwrap().raw(), + raw_visual_rows(&app.lore_picker.as_ref().unwrap().review.as_ref().unwrap().display_text(), app.lore_picker.as_ref().unwrap().review_width).len() { break; } app.lore_picker_key(KeyEvent::new(KeyCode::PageDown, KeyModifiers::NONE)); } diff --git a/rust/doxa-vendors/Cargo.toml b/rust/doxa-vendors/Cargo.toml index e0f150bfb..5ed7fb146 100644 --- a/rust/doxa-vendors/Cargo.toml +++ b/rust/doxa-vendors/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-vendors" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only" diff --git a/rust/doxa-worktrees/Cargo.toml b/rust/doxa-worktrees/Cargo.toml index bbbb1f3f7..c6464ccbd 100644 --- a/rust/doxa-worktrees/Cargo.toml +++ b/rust/doxa-worktrees/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "doxa-worktrees" -version = "2.0.0-beta.55" +version = "2.0.0-beta.56" edition = "2021" publish = false license = "AGPL-3.0-only"