AEC drawing register — sheet extraction + per-project rollup

Kodori extracts AIA/CSI standard sheet numbers (A-201, S-101, M3.05, etc.) from drawing PDFs and surfaces a per-doc index plus a per-project drawing register grouped by discipline.

Updated 2026-05-12

On any drawing PDF at /doc/<id>, scroll to the **Drawing sheets** panel below the Citations panel. Click **Extract drawings**.

The extractor scans the document's text against the AIA/CSI standard sheet-numbering scheme — discipline letter prefix + dash or dot + 1-3 digit major + optional 1-3 digit minor. Recognized prefixes:

- A — Architectural; AD — Architectural demolition - S — Structural; SD — Structural demolition - M — Mechanical; MD — Mechanical demolition - E — Electrical; ED — Electrical demolition - P — Plumbing - C — Civil - F / FP — Fire / Fire protection; LS — Life safety - T / IT — Telecom / IT - L — Landscape - Q / EQ — Equipment - X — Security - G / GD — General / cover sheets / general demolition

Captures sheet titles when extractable from text adjacent to the sheet number (title-block lines that follow the number). Repeat references to the same sheet collapse to one row with × N occurrences. Re-running on the same doc is idempotent — the SHA-1 fingerprint of the normalized form is the dedup key.

Like the citation extractor, the bias is precision over recall. Discipline-prefixed bare numbers without a dash (M3, A1) are rejected unless the major is 3 digits — too many false positives in prose otherwise. Tenant-specific prefix schemes outside the standard list show up under "Other" without breaking.

## Per-project drawing register

On any project Collection (kind=project), the header gets a **Drawing register →** affordance alongside Timeline → and Download as ZIP. /collections/<id>/drawing-register aggregates every readable doc's sheet index across the project, grouped by discipline. For each sheet, the rollup shows total occurrences across the project + which docs contain it and how many times each. Discipline filter chips for drilling into one trade. Permission-trimmed: docs you can't read drop from the rollup, even if they would otherwise contribute.

The "drawing register" output every AEC project requires — sheet list by discipline with traceable source documents — built from the same extraction surface that powers per-doc indexing. The agent can extract on your behalf: "extract drawings from this PDF" calls extractDrawings under the hood. Every run lands a `drawings.extracted` event on the doc's audit stream alongside every other governance signal.

## Bulk extraction

The drawing register surfaces a "Bulk-extract drawings" button when there are unindexed docs in scope. Click → Kodori runs the extractor across every readable doc in the project. Capped at 200 docs per call (re-run to continue past the cap). Default skips already-indexed docs; toggle for full re-extract after a new revision set lands. Per-doc failures don't roll back — banner reports processed / sheets found / skipped counts. Each successful doc emits its own `drawings.extracted` event with `source: "bulk-extract"`.

## Drawing-set integrity check

On every project drawing register, the **Drawing-set integrity** section lets you define expected sheet ranges per discipline. Type discipline + start_major + end_major + optional label, click Add range. Kodori then cross-checks against the indexed sheets and surfaces:

- **Expected count** — every integer major in [start, end] - **Found count** — the subset whose discipline+major was actually extracted from a doc - **Missing list** — expected majors with no doc reference (e.g. "Missing: A-205, A-206, A-208 …") - **Completeness chip** at the top of the section — green at 100%, amber ≥90%, red below

Range coverage is over major numbers only. "M-1 to M-99" considers M3.05 as in-range because its major (3) lands in [1, 99] — minor sub-sheets are accepted as expected drilldown of the major.

When at least one range is defined, an **Unexpected sheets** warning panel surfaces every indexed sheet whose discipline+major lies outside every defined range. Either extend a range to cover them, or accept them as out-of-scope.

Range edits emit `project-drawing-range.added` / `project-drawing-range.removed` on the collection's audit stream so admins reviewing the chain can see who edited the spec when. Useful for project closeout reviews — the integrity check answers "do we have every sheet on the contract drawing list?"

## Tenant-wide search

/drawings is the third drawing-extraction surface — alongside the per-doc panel and the per-project register. Type a sheet number ("A-201", "S101", "M3.05") and Kodori returns every readable doc that references it across every project, ranked by total occurrences. Useful for "find every doc in the firm that mentions sheet A-201" — comes up during cross-project change tracking, library design reuse, and standards-compliance audits.

Sheet-number normalization strips dashes, dots, and spaces before lookup so "A-201" and "A201" and "a 201" all find the same row. Discipline filter chips narrow to one trade. Permission-trimmed.

When the search input is empty, the page surfaces the top-25 most-referenced sheets across the tenant.