The proofread checkpoint gets its place: nav order, badge, and a rename
Eric's observation: cleaning up raw reads happens BEFORE resolve, but the app ordered Review ahead of Catalog and never said proofreading was a step at all. The pipeline has two human checkpoints — proofread the reads (after extract), decide the matches (after resolve) — and now the app says so: the sidebar runs Pipeline, Photos, Titles, Review, Queue, Library, Help in true workflow order; the Titles page (né Catalog — the old name suggested a finished collection, which is the Library's job; /catalog redirects) gets a badge counting unresolved shaky reads; an edit marks its entry human-verified so the badge drains as you proofread; the extract stage card nudges toward the proofread before resolving; and the Help flow is rewritten as six stages + two checkpoints with the loop called out. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqpWSz9g
This commit is contained in:
+49
-1
@@ -772,6 +772,54 @@ def test_help_page_serves_and_is_in_nav(tmp_path):
|
||||
web, _ = make_client(tmp_path)
|
||||
res = web.get("/help")
|
||||
assert res.status_code == 200
|
||||
assert "Fixing the catalog" in res.text
|
||||
assert "Fixing the titles" in res.text
|
||||
# every page's nav includes the Help entry
|
||||
assert 'href="/help"' in web.get("/").text
|
||||
|
||||
|
||||
def test_shaky_reads_badge_counts_and_drains_on_edit(tmp_path):
|
||||
cfg = make_cfg(tmp_path)
|
||||
titles = json.loads(cfg.titles_path.read_text())
|
||||
titles.append(
|
||||
{
|
||||
"title_raw": "Hebarceos",
|
||||
"confidence": "low",
|
||||
"source_photos": ["shelf.jpg"],
|
||||
}
|
||||
)
|
||||
cfg.titles_path.write_text(json.dumps(titles))
|
||||
web = TestClient(create_app(cfg, client=unauthorized_client(tmp_path)))
|
||||
assert web.get("/api/pipeline").json()["shaky_reads"] == 1
|
||||
# an edit means a human read the line: it is verified, the badge drains
|
||||
assert (
|
||||
web.post(
|
||||
"/api/edit-title",
|
||||
json={
|
||||
"title_raw": "Hebarceos",
|
||||
"source_photos": "shelf.jpg",
|
||||
"title_new": "Herbaceous",
|
||||
},
|
||||
).status_code
|
||||
== 200
|
||||
)
|
||||
assert web.get("/api/pipeline").json()["shaky_reads"] == 0
|
||||
|
||||
|
||||
def test_nav_order_matches_workflow(tmp_path):
|
||||
web, _ = make_client(tmp_path)
|
||||
html = web.get("/").text
|
||||
order = [
|
||||
html.index(f'href="{href}"')
|
||||
for href in (
|
||||
"/",
|
||||
"/photos",
|
||||
"/titles",
|
||||
"/review",
|
||||
"/queue",
|
||||
"/library",
|
||||
"/help",
|
||||
)
|
||||
]
|
||||
assert order == sorted(order)
|
||||
# the old address still lands on the page
|
||||
assert web.get("/catalog", follow_redirects=False).headers["location"] == "/titles"
|
||||
|
||||
Reference in New Issue
Block a user