Summary
sources/construction/decisions.csv was last hand-curated on 2026-07-08, against the candidate pool as it existed then. The 2026-07-23 rebase (#86, commit 47740f7) re-mined candidates.csv/occurrences.csv from the full per-record zip MARC — which now includes the non-held Z39.50 harvest — and that surfaced 859 heading clusters that had no decision.
Because a book only gets an ab:constructedUsing edge when one of its headings falls in an include=y cluster, this stale gap meant only 390 of the 3,567 books with candidate headings were linked. The join was correct; the curation was simply behind the data.
Commit 7c1a21b (on feat/construction-vocab, PR #103) fills the gap: it extends decisions.csv from 435 → 1,294 rows so every current candidate cluster now has a decision. The 859 new rows are an auto-generated best-guess DRAFT and need human review — that's what this issue tracks.
Verified rebuild impact of the draft as committed:
construction-methods.ttl: 100 → 176 concepts (valid Turtle)
ab:constructedUsing: 390 → 606 books, 980 edges
What the draft did
Each new row carries a note column explaining its auto-call. The bias is deliberate: ambiguous → include=n, because a wrong y silently adds a junk concept to the published SKOS scheme, whereas a wrong n just leaves a book unlinked (the status quo we're improving on).
| Tier |
note contains |
Rows |
Call |
| Reconcile to existing concept |
reconciled to existing concept |
113 |
y, reuses an existing conceptId |
| New construction concept |
NEW … concept (best-guess) |
87 |
y, new conceptId + guessed category |
| Genre/subject noise |
genre/subject heading |
227 |
n |
| Unclassified |
unclassified |
432 |
n |
The columns you're reviewing
cluster,labels,include,conceptId,category,prefLabel,note
cluster — the reconciliation key (a $0 authority URI, or <scheme>|<normalized-label>). Do not edit. It's the join key to occurrences.csv.
labels — read-only: the distinct raw MARC heading strings in this cluster. This is what you're judging.
include — y or n. The gate.
conceptId — for y rows only: the SKOS concept this heading maps to. Reuse an existing id to merge variants across vocabularies; invent a new slug for a genuinely new concept.
category — for y rows only. Must be exactly one of: material, technique, binding-format, production-printing.
prefLabel — for y rows only: the human-facing label for a new concept. Ignored when conceptId reuses an existing concept (the existing prefLabel wins).
note — the auto-rationale. Delete it once you've reviewed the row so remaining notes = remaining work.
How to review
Work tier by tier (grep the note column). Only the existing 435 rows are trusted; every row with an auto: note is a draft.
-
reconciled to existing concept (113, y) — quickest. Confirm the heading in labels really is the concept named by conceptId. Most are safe (screen prints. → screen-printing), but the plural/qualifier matcher can overreach — check the VERIFY ones. If wrong, either repoint conceptId or flip to n.
-
NEW … concept (best-guess) (87, y) — needs the most attention. For each, decide:
- Is it actually a construction method/material/binding/printing technique? If not →
n, clear the other columns.
- Is
category right (one of the four)?
- Is
conceptId/prefLabel clean, and does it duplicate an existing concept that should be merged instead? Known cases to fix: MARC typos Accordian/Acordion fold should fold into accordion-fold; long AAT parentheticals like Perfect binding (process need a clean label; borderline art-media headings (drawings, gouaches) were split — decide whether they belong.
-
genre/subject heading (227, n). Skim to confirm none is actually a construction method. These are things like artists' books, poetry, limited editions, exhibition catalogs — correctly excluded.
-
unclassified (432, n) — the long tail. Mostly genuine noise (foreign-language genre terms, short stories, containers), but this is where a real construction heading could hide, so it's worth a scan. Anything real → set include=y + conceptId + category (+ prefLabel if new).
To exclude a row: set include=n and blank out conceptId, category, prefLabel (matches the existing convention; the build only reads y rows).
Rebuild & sanity-check after editing
# regenerate the SKOS scheme + the per-book edges
make -C sources construction-methods.ttl
make -B graph/artists-books.ttl
# how many books are now linked?
tools/jena/bin/arq --data=graph/artists-books.ttl -q <<'SPARQL'
PREFIX ab: <https://dkglab.github.io/ns/artists-books/>
SELECT (COUNT(DISTINCT ?b) AS ?books) (COUNT(*) AS ?edges) WHERE { ?b ab:constructedUsing ?c }
SPARQL
# validate the scheme
tools/jena/bin/riot --validate sources/construction-methods.ttl
Integrity rules the build assumes (worth a final check): every y row has a non-empty conceptId, a prefLabel, and a category in the four-value set; every n row leaves those three blank.
Definition of done
Every auto: note has been reviewed and removed, and decisions.csv reflects deliberate human calls for all 1,294 clusters.
Follow-up to #103 (commit 7c1a21b).
Summary
sources/construction/decisions.csvwas last hand-curated on 2026-07-08, against the candidate pool as it existed then. The 2026-07-23 rebase (#86, commit 47740f7) re-minedcandidates.csv/occurrences.csvfrom the full per-record zip MARC — which now includes the non-held Z39.50 harvest — and that surfaced 859 heading clusters that had no decision.Because a book only gets an
ab:constructedUsingedge when one of its headings falls in aninclude=ycluster, this stale gap meant only 390 of the 3,567 books with candidate headings were linked. The join was correct; the curation was simply behind the data.Commit 7c1a21b (on
feat/construction-vocab, PR #103) fills the gap: it extendsdecisions.csvfrom 435 → 1,294 rows so every current candidate cluster now has a decision. The 859 new rows are an auto-generated best-guess DRAFT and need human review — that's what this issue tracks.Verified rebuild impact of the draft as committed:
construction-methods.ttl: 100 → 176 concepts (valid Turtle)ab:constructedUsing: 390 → 606 books, 980 edgesWhat the draft did
Each new row carries a
notecolumn explaining its auto-call. The bias is deliberate: ambiguous →include=n, because a wrongysilently adds a junk concept to the published SKOS scheme, whereas a wrongnjust leaves a book unlinked (the status quo we're improving on).notecontainsreconciled to existing concepty, reuses an existingconceptIdNEW … concept (best-guess)y, newconceptId+ guessed categorygenre/subject headingnunclassifiednThe columns you're reviewing
cluster,labels,include,conceptId,category,prefLabel,notecluster— the reconciliation key (a$0authority URI, or<scheme>|<normalized-label>). Do not edit. It's the join key tooccurrences.csv.labels— read-only: the distinct raw MARC heading strings in this cluster. This is what you're judging.include—yorn. The gate.conceptId— foryrows only: the SKOS concept this heading maps to. Reuse an existing id to merge variants across vocabularies; invent a new slug for a genuinely new concept.category— foryrows only. Must be exactly one of:material,technique,binding-format,production-printing.prefLabel— foryrows only: the human-facing label for a new concept. Ignored whenconceptIdreuses an existing concept (the existing prefLabel wins).note— the auto-rationale. Delete it once you've reviewed the row so remaining notes = remaining work.How to review
Work tier by tier (grep the
notecolumn). Only the existing 435 rows are trusted; every row with anauto:note is a draft.reconciled to existing concept(113,y) — quickest. Confirm the heading inlabelsreally is the concept named byconceptId. Most are safe (screen prints.→screen-printing), but the plural/qualifier matcher can overreach — check theVERIFYones. If wrong, either repointconceptIdor flip ton.NEW … concept (best-guess)(87,y) — needs the most attention. For each, decide:n, clear the other columns.categoryright (one of the four)?conceptId/prefLabelclean, and does it duplicate an existing concept that should be merged instead? Known cases to fix: MARC typosAccordian/Acordion foldshould fold intoaccordion-fold; long AAT parentheticals likePerfect binding (processneed a clean label; borderline art-media headings (drawings,gouaches) were split — decide whether they belong.genre/subject heading(227,n). Skim to confirm none is actually a construction method. These are things likeartists' books,poetry,limited editions,exhibition catalogs— correctly excluded.unclassified(432,n) — the long tail. Mostly genuine noise (foreign-language genre terms,short stories, containers), but this is where a real construction heading could hide, so it's worth a scan. Anything real → setinclude=y+conceptId+category(+prefLabelif new).To exclude a row: set
include=nand blank outconceptId,category,prefLabel(matches the existing convention; the build only readsyrows).Rebuild & sanity-check after editing
Integrity rules the build assumes (worth a final check): every
yrow has a non-emptyconceptId, aprefLabel, and acategoryin the four-value set; everynrow leaves those three blank.Definition of done
Every
auto:note has been reviewed and removed, anddecisions.csvreflects deliberate human calls for all 1,294 clusters.Follow-up to #103 (commit 7c1a21b).