Traceable construction reporting
The system converts daily-report PDFs and cloud files into project-scoped data for owners, contractors, and subcontractors.
Context
Problem
Construction teams needed one reporting model across daily-report PDFs, SharePoint, and FileCloud without losing tenant boundaries or document evidence.
Constraints
- Owners, contractors, and subcontractors required different project scopes.
- Extracted values needed to remain traceable to the original document.
- The platform spanned several repositories and worker processes.
System
Architecture
- 01
SharePoint, FileCloud, and PDF sources
- 02
Project-scoped ingestion
- 03
PDF extraction workers
- 04
Raw and normalized records
- 05
Validation and provenance
- 06
Reporting workflows
My role
Led architecture and OCR work across FastAPI services, React workflows, PDF workers, shared Pydantic schemas, benchmarks, and reporting modules.
Decisions
- Kept raw and normalized data as separate records.
- Enforced project and tenant boundaries through scoped credentials and database policies.
- Reduced requirements to user behavior, domain invariants, failure semantics, and acceptance criteria.
Validation
What failed
- Early AI-assisted requirements were too verbose and prescribed implementation details.
- Engineers had difficulty separating required behavior from suggested implementation.
Tests and checks
- Used source-evidence contracts and real-document regression tests.
- Required idempotent worker completion and bounded retry behavior.
- Benchmarked extraction against retained document evidence.
Outcome
Result
The platform supports seven reporting workflows while retaining file, page, section, raw label, and validation state for normalized values.
- Project-scoped source-file review
- Report navigation
- Dashboard metric mapping
- Missing-data semantics
- Canonical review
- Manpower and equipment analytics
- Grounded daily briefs and questions
What I would change today
Start with user behavior, domain rules, failure states, and acceptance criteria. Keep framework and service choices in architecture records after those requirements are clear.