Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
80a1b30
feat(workspace): squash the workspace_roots topic onto the r3 closure
qiuYliangM Sep 30, 2026
4adf734
fix(tui): resolve the restore boundary predicate through symlinks
qiuYliangM Sep 30, 2026
24af2da
fix(tui): fold apply_patch path aliases in the preflight summary
qiuYliangM Sep 30, 2026
f2f88c4
fix(core): validate the /tool roots intake and cap the normalizer
qiuYliangM Sep 30, 2026
b760522
perf(tui): hoist repo-law per-root input work and cache constitutions
qiuYliangM Sep 30, 2026
f8ee8b0
fix(tui): rename the /cd guidance and correct the change records
qiuYliangM Sep 30, 2026
e70ee05
fix(tui): close the round-24 P3 residue wave
qiuYliangM Sep 30, 2026
4496c47
perf(tui): hoist per-call root work and memoize boundaries
qiuYliangM Sep 30, 2026
848dd22
fix(tui): close the round-26 isolation and intake gaps
qiuYliangM Sep 30, 2026
3f35818
fix(tui): close the round-27/28 blocking set
qiuYliangM Oct 2, 2026
e600b3a
fix(tui): close the round-29..31 blocking set on the public base
qiuYliangM Oct 9, 2026
7ec1a76
fix(tui): close the round-32 blocking set and pin residuals
qiuYliangM Oct 9, 2026
c056b81
fix(tui): validate persisted workspace_roots on resume lanes (r35 M2)
qiuYliangM Oct 9, 2026
0994c42
fix(tui): close the round-37 blocking set and sandbox majors
qiuYliangM Oct 11, 2026
b05f3e8
fix(tui): close the round-38 majors and record wave
qiuYliangM Oct 11, 2026
301c127
fix(tui): close the round-39 majors and receipt wave
qiuYliangM Oct 11, 2026
d798d15
fix(core): keep native component comparison on Unix (round-39 P2)
qiuYliangM Oct 11, 2026
61cdca9
fix(tui): close the round-40 majors and uniformity wave
qiuYliangM Oct 12, 2026
d350748
fix(tui): close the round-41 majors and truth wave
qiuYliangM Oct 12, 2026
9c3b0f0
fix(tui): land the round-41 M41-1 guard for real, fix the M41-6 fixture
qiuYliangM Oct 12, 2026
656e14d
fix(core): fold the strip's vanished-directory fallback spelling
qiuYliangM Oct 12, 2026
9a245a0
fix(tui): close the round-42 majors and records wave
qiuYliangM Oct 12, 2026
6852cbb
fix(tui): close the round-43 wave (Windows green, alias targets, cove…
qiuYliangM Oct 13, 2026
563a821
fix(core): platform-correct generated root fixtures
qiuYliangM Oct 13, 2026
6b31bbd
fix(core): close the round-44 required set
qiuYliangM Oct 13, 2026
b5b640c
fix(tui): close the round-45 required set
qiuYliangM Oct 14, 2026
bf24487
fix(tui): own the round-45 replay record, close round-46 riders
qiuYliangM Oct 14, 2026
be2cd01
fix(tui): correct the round-46 record docs, map the PATCH fence 409
qiuYliangM Oct 14, 2026
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
605 changes: 574 additions & 31 deletions crates/app-server/src/lib.rs

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions crates/cli/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4991,6 +4991,7 @@ fn run_sandbox_command(command: SandboxCommand) -> Result<()> {
path: None,
ask_for_approval: ask.into(),
sandbox_mode: Some("workspace-write"),
workspace_roots: Vec::new(),
})?;
println!("{}", serde_json::to_string_pretty(&decision)?);
Ok(())
Expand Down
23 changes: 23 additions & 0 deletions crates/command-contract/src/facets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -937,6 +937,29 @@ pub trait CommandSkillGroupContext {
/// `/restore <N>`: host restores by snapshot id; handler composes the
/// exact success message from its list entry.
fn restore_snapshot(&mut self, id: &str) -> Result<(), String>;
/// `/restore` rollback scope: true when the session root set has entries
/// beyond the primary workspace. Snapshots are primary-bound, so the
/// handler must name the boundary instead of implying every accessible
/// root was reverted.
fn restore_covers_primary_only(&self) -> bool;
/// `/restore` trust gate posture (yolo / trust_mode).
fn approval_state(&self) -> CommandApprovalState;
/// `/restore` rollback-boundary disclosure text. The default is the
/// stable English sentence shared verbatim with the model/API lanes
/// ([`ATTACHED_ROOTS_NOT_REVERTED_NOTE`]); hosts with a localized
/// human-facing surface (the TUI) override it with their translated
/// form so the same disclosure is not English-only on one face
/// (round-45 R45-3).
fn attached_roots_not_reverted_note(&self) -> String {
ATTACHED_ROOTS_NOT_REVERTED_NOTE.to_string()
}
}

/// Honesty clause for revert/undo/restore reports when the session root set
/// extends beyond the primary workspace: the snapshot side-repo is rooted at
/// the primary, so a restore rolls back only the primary while attached-root
/// writes persist. Owned here (single source) so the portable `/restore`
/// handler and the host's model/API lanes can never drift; the TUI re-exports
/// it from `crate::snapshot` and layers the localized form on top.
pub const ATTACHED_ROOTS_NOT_REVERTED_NOTE: &str =
"Only the primary workspace was reverted; attached workspace roots were not rolled back.";
4 changes: 4 additions & 0 deletions crates/command-contract/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1492,6 +1492,10 @@ impl CommandSkillGroupContext for FakeSkillGroup {
}
}

fn restore_covers_primary_only(&self) -> bool {
false
}

fn approval_state(&self) -> CommandApprovalState {
self.approval
}
Expand Down
3 changes: 3 additions & 0 deletions crates/config/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,7 @@ fn config_store_exec_policy_engine_uses_sibling_permissions() {
path: None,
ask_for_approval: codewhale_execpolicy::AskForApproval::UnlessTrusted,
sandbox_mode: Some("workspace-write"),
workspace_roots: Vec::new(),
})
.expect("policy check");

Expand Down Expand Up @@ -854,6 +855,7 @@ fn config_store_appends_exact_workspace_allow_rules() {
path: None,
ask_for_approval: codewhale_execpolicy::AskForApproval::OnRequest,
sandbox_mode: Some("workspace-write"),
workspace_roots: Vec::new(),
})
.expect("check exact grant");
assert_eq!(
Expand All @@ -871,6 +873,7 @@ fn config_store_appends_exact_workspace_allow_rules() {
path: None,
ask_for_approval: codewhale_execpolicy::AskForApproval::OnRequest,
sandbox_mode: Some("workspace-write"),
workspace_roots: Vec::new(),
})
.expect("check extra args");
assert!(extra_args.requires_approval);
Expand Down
Loading
Loading