sheet-splitter — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sheet-splitter (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Splits a bound drawing set PDF into individual page PDFs. Mirrors what spec-splitter does for specifications.
Run after /project-setup identifies bound drawing sets. Produces split PDFs and sheet_index.yaml consumed by /schedule-extractor and all drawing analysis skills.
This is valuable for:
sheet-index-builder, drawing-reader, and all drawing analysis skills work better with individual sheet filesSheet Split Progress:
- [ ] Step 1: Check if drawings are already split
- [ ] Step 2: Locate the bound drawing set
- [ ] Step 3: Split into individual page PDFs
- [ ] Step 4: Extract sheet numbers from title blocks
- [ ] Step 5: Rename files with sheet number + title
- [ ] Step 6: Update project context
- [ ] Step 7: Write graph entry (AgentCM only)Look for individual sheet PDFs. Drawings are already split if:
.construction/index/sheet_index.yaml exists with individual sheet entries and file paths point to split PDFsA-1.1 - FLOOR PLAN.pdf)sheet_index.yaml exists in the drawings directoryIf already split, report the count and skip. If AgentCM has the sheet index but files haven't been physically split on disk, offer to split using the existing metadata for naming.
Search the project directory for ALL PDFs that are drawings. Many projects have multiple drawing PDFs:
Search in:
drawings/, plans/, 01 - Drawings/, or similar (case-insensitive)Process EACH PDF found. All split pages go to the same sheets/ output directory.
If the user specifies a single file (/sheet-splitter path/to/specific.pdf), process only that file.
Run the split script on each drawing PDF found:
${CLAUDE_SKILL_DIR}/../../bin/construction-python ${CLAUDE_SKILL_DIR}/scripts/split_drawing_set.py \
"{drawing_set.pdf}" \
--output-dir "{drawings_directory}/sheets"The script splits each page into its own PDF: page_001.pdf, page_002.pdf, etc. It does NOT attempt to read sheet numbers — that's unreliable across different title block formats.
After splitting, read each page to identify sheet numbers and titles:
${CLAUDE_SKILL_DIR}/../../bin/construction-python ${CLAUDE_SKILL_DIR}/../../scripts/pdf/rasterize_page.py page_NNN.pdf 1 --dpi 200 --output tb.pngpage_001.pdf → A-1.1 - FLOOR PLAN.pdfsheet_index.yaml with the identified sheet number, title, and discipline.Title blocks vary significantly across firms — they can be on the east side, south side, or bottom-center. Some use VA standard forms, some use firm-specific formats. Vision handles all these variations.
After identifying all sheets, write .construction/index/sheet_index.yaml.
sheets/
A-1.1 - FLOOR PLAN.pdf ← renamed by Claude via vision
A-2.1 - ELEVATIONS.pdf
S-1.1 - FOUNDATION PLAN.pdf
page_006.pdf ← could not read title block
...
sheet_index.yamlAfter splitting and identifying, update .construction/project_context.yaml with:
documents.drawing_count: number of sheetsdocuments.disciplines: list of unique discipline prefixes foundIf .construction/ directory exists, write a graph entry:
${CLAUDE_SKILL_DIR}/../../bin/construction-python ${CLAUDE_SKILL_DIR}/../../scripts/graph/write_finding.py \
--type "drawings_split" \
--title "Drawing set split: {N} sheets from {source_pdf}" \
--data '{"sheet_count": N, "source_pdf": "...", "identified_count": M, "unidentified_count": K, "disciplines": ["A","S","M","E"]}'If no .construction/ directory exists, skip — the sheet_index.yaml serves as the local record.
When a project has multiple drawing set PDFs (e.g., Architectural, MEP, Civil as separate files), use the source PDF name as a subdirectory to avoid filename collisions:
sheets/
Architectural_Bid_Set/
page_001.pdf ... page_050.pdf
MEP_Bid_Set/
page_001.pdf ... page_030.pdf
sheet_index.yaml ← merged from all setsPass --output-dir "{drawings_directory}/sheets/{source_pdf_stem}" to the split script for each set. The sheet_index.yaml merge logic combines entries from all subdirectories into a single index.
Report to user: number of pages split, how many identified via vision, output location.
Never overwrite existing split sheet PDFs. If sheets/ directory already contains files, check for conflicts before writing. The sheet_index.yaml merge uses additive logic — existing entries are preserved.
Allowed scripts — exhaustive list. Only execute these scripts during this skill:
scripts/split_drawing_set.py — split bound PDF into per-page PDFs../../scripts/pdf/rasterize_page.py — rasterize PDF pages for vision identification../../scripts/graph/write_finding.py — graph entry (Step 7)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.