P3 review: the surface, docs and proofs
check / check (push) Canceled after 0s

Split kernel::entry_flows into entry_movements and flows_of so the
reversal-mirror proof fits CI; prove runs the fast harnesses, prove-slow
the 8 slow ones (own job in scheduled CI), prove-all both. Laws in
verification.md renumbered 1-31 with a table of all 55 harnesses.

MCP docs checked against the 115 tools (about 60 fixes) with a test that
every tool is documented; rules.md cross-references fixed; bookspec
statuses and loader tightened; viewer notes wrap and accounts sort by
code; STATUS.md says P3 is built, cutover pending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
This commit is contained in:
swaitsandClaude Opus 5.5 committed 2026-10-22 02:13:08 -06:00
1 parent 2c5b5a7171
commit 0495726001
49 files changed
+963 -292

No files matched your search

+3 -1
View File
@@ -78,7 +78,7 @@ pub fn show_chart(ui: &mut Ui, b: &Books, shell: &mut Shell<'_>) {
(AccountType::Revenue, "Income"),
(AccountType::Expense, "Expenses"),
] {
let accounts: Vec<_> = b
let mut accounts: Vec<_> = b
.ledger
.chart()
.all()
@@ -86,6 +86,8 @@ pub fn show_chart(ui: &mut Ui, b: &Books, shell: &mut Shell<'_>) {
a.account_type == t && (shell.state.accounts.show_empty || used.contains(&a.id))
})
.collect();
// In the chart's order: by code, as every report lists them.
accounts.sort_by(|x, y| x.code.cmp(&y.code));
if accounts.is_empty() {
continue;
}
+20
View File
@@ -1881,6 +1881,26 @@ fn render(ui: &mut Ui, t: &Table, pdf: &PdfInfo, shell: &mut Shell<'_>) {
Stroke::new(1.0, p.border),
);
for (ri, r) in t.rows.iter().enumerate() {
// A note wraps over the table's width, never cut short:
// it says how to read the figures above it.
if r.kind == Kind::Note {
let mut job = egui::text::LayoutJob::single_section(
r.label.clone(),
egui::TextFormat::simple(theme::regular(12.0), p.muted),
);
job.wrap.max_width = (width - 8.0).max(10.0);
let galley = ui.painter().layout_job(job);
let (rr, _) = ui.allocate_exact_size(
vec2(width, galley.size().y + 14.0),
Sense::hover(),
);
ui.painter().galley(
egui::pos2(rr.left() + 4.0, rr.top() + 7.0),
galley,
p.muted,
);
continue;
}
let h = match r.kind {
Kind::Section => 36.0,
Kind::Grand => 38.0,