merge: P6, the evidence pipeline (branch P6, checkpoint ce366408)
The last of the paused branches, from its "not for merge" checkpoint:
extraction in ledger-import (text, pages, page images; capped, caught),
journaled as attachment.text_extracted; dedup by hash with
books.find_attachment and books.consolidate_duplicates; annotations and
books.set_entry_settles; the company record categories; the two fuzz
targets; feature attachment_text. Nineteen files conflicted with the
four P4b merges, resolved as plan 8.0.2 says: P6 retakes schema 18 (it
had taken 16, which S4.3 holds; S5 holds 17); the tool table is 129 and
the destructive count 31; both sides' appends kept with their seams
restored; one B-27 paragraph naming every feature; in the old-books
fixture P6's hand-written reimbursement is entry 7 (its ids collided
with S4.3's invoice); the replay fuzzer's list gains S7's
invoice.written_off; S4.3's issued-PDF test expects the extraction
record P6 journals right after a filing.
One integration defect between S7 and P6, found by the arap property
test and fixed here: under P6's dedup, a write-off whose evidence bytes
were filed already (the same collection letter for a second write-off of
the same invoice) was refused only after its entry had been journaled,
at the final link to the invoice ("already linked"). The write-off now
resolves the dedup before anything is journaled and keeps a link the
record already has to the invoice instead of refusing it; an explicit
existing_attachment_id already on an entry is still refused (S7's
one-receipt-once rule). P6's gate never ran before the pause; it runs on
main after this merge, and its ledger-store -> ledger-import dependency
is the open review point (plan 8.0.1).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HS8WZziDnyxunC23MUxrLp
This commit is contained in:
commit
2ad192bbcd
70 files changed
+4618
-384
No files matched your search
@@ -822,6 +822,37 @@ fn happy_path(name: &str) -> Mcp {
|
||||
);
|
||||
assert_eq!(up["existing_attachment_id"], json!(local), "{up}");
|
||||
|
||||
// P6: the evidence pipeline. Find the local receipt by its text, give
|
||||
// it a receipt number, settle nothing, and consolidate (there are no
|
||||
// duplicates here: a preview and a no-op confirm still exercise both
|
||||
// answers).
|
||||
let found = m.ok("books.find_attachment", json!({"text": "local receipt"}));
|
||||
assert_eq!(
|
||||
found["attachments"][0]["attachment_id"],
|
||||
json!(local),
|
||||
"{found}"
|
||||
);
|
||||
let annotated = m.ok(
|
||||
"books.annotate_attachment",
|
||||
json!({"attachment_id": local, "fields": {"receipt_number": 1,
|
||||
"payee": "Landlord", "amount": "12.34", "date": "2026-01-10"}}),
|
||||
);
|
||||
assert_eq!(annotated["next_receipt_number"], 2, "{annotated}");
|
||||
m.ok(
|
||||
"books.find_attachment",
|
||||
json!({"receipt_number": annotated["fields"]["receipt_number"]}),
|
||||
);
|
||||
m.ok(
|
||||
"books.find_attachment",
|
||||
json!({"sha256": ledger_store::journal::sha256_hex(b"a local receipt")}),
|
||||
);
|
||||
m.ok(
|
||||
"books.set_entry_settles",
|
||||
json!({"entry_id": e1, "settles": []}),
|
||||
);
|
||||
m.ok("books.consolidate_duplicates", json!({}));
|
||||
m.ok("books.consolidate_duplicates", json!({"confirmed": true}));
|
||||
|
||||
// Reversal: preview, then confirmed.
|
||||
let e3 = m.draft(
|
||||
"2026-01-20",
|
||||
|
||||
Reference in new issue
Block a user