One library: every Drive and sheet source in one registry, all 14 import packages in the prod library, live coverage in the control room
All 14 import packages are in the prod library (4 Nov, 10:24-11:09 UTC): of 46 Drive, Sheets, Excel and copied sources, 13 are retired and 18 imported, and the control room shows the library's coverage live.
The 46 sources by status (registry, 4 Nov 11:12 UTC)
The prod library before and after the imports (records)
Drive and Sheets link lines left in code on each main (4 Nov baseline; drops when the projects' PRs merge)
How a source leaves Drive
- Package
The owning project writes library-import/<package>/manifest.json: records, files with SHA-256, the source by name and row.
- Check
tools/check_import.py: schema, keys, checksums, no links.
- Import
The platform runs it as one import batch: idempotent, reversible, prod backed up first.
- Switch
Readers move to the Library API with a SHA-256 file cache; tests use Library API exports.
- Retire
Drive reading removed from every runtime, build, report and test path; the registry records the date.
The control room's new Library page (live)

What the library holds, read live from prod /ops/coverage and /ops/imports

Control room, before and after
Before (live, 4 Nov 07:55)
- Library health: records, files, missing DXFs, Drive links stored (0)
- No view of the Drive and sheet sources the projects still read
- No route for the library
After (live, 4 Nov 08:01)
- Same library health, unchanged
- A card: sources retired, missing, packages, still edited, per project
- A Library page: sources, references left in code, contents, imports, living sources
The new card on the control room

Owner decisions needed
- Pattern makers' trackers and their Drive folders: the Adapter recommends an "adaptation pair" form in the platform admin (the pattern makers stop using the sheet); alternatives: the adapter's review platform writes pairs through a new write scope, or a snapshot package per change (keeps Drive alive). Until then each change is a new snapshot, so no edit is lost.
- 17 pairs where the library's RM pattern is another file than the one the pattern maker adapted: which file is the RM's pattern?
- RM sheet: lock it as a read-only archive. Categories: tailcoats (26 rows) and Bermuda/Shorts/Skirts (74 designs).
- Chest windows: 33 sizes where the SDA tab and the library disagree (Design Builder package exceptions).
- Team rules and construction limits: keep the master in git with a snapshot per round, or edit them in the library.
- Merge PR #20 (and the projects' PRs). The ops.bettter.us deploy runs from the branch; the 05:30 UTC refresh from main replaces it until the merge.
What each project did (from its migration page)
| Project | Result | Regression |
|---|---|---|
| Design Builder (v1.3.0 live, PR #13) | 0 Drive/workbook readers; fixtures are a Library API export; chest windows and team rules as packages | gate 58 of 58; picks identical for 4 live brands; 65 tests |
| Design Builder Tech (v0.7.3, branch) | RM sheet and Drive downloader removed; data from Library API snapshots; examples from GET /examples; 3 packages | 114 tests (110 before); pocket limits equal; lab images byte-identical |
| Adapter (branch) | trackers read from snapshots, every pattern file from the library by SHA-256; 4 packages (167 examples, 31 RM, 14 references incl. file sets; retires 7 examples and 10 sizes the owner left out) | ground-truth map 50 rows byte-identical; 151 of 168 pairs map once imported (simulated) |
| Platform (QA, PRs #45, #46) | serves /examples (with the status filter), /references, /ops/coverage, /ops/imports and the reversible package importer on QA; 4 packages of its own: the RM sheet's trousers tab (523 RM), six more SDA tabs (427 SDA), the sheet's pattern folders, the adapter's pairs | schemas checked with ajv; DB conformance suites green; prod after the QA imports and an RDS snapshot |
| OperationalLayer (live) | registry, contracts, Library page, company materials package | all routes, promote and roll back, 17 tests |
Contract changes (v1, additive)
| Change | For |
|---|---|
| Import packages: library-import.md, import-manifest schema, tools/check_import.py | every project with data not yet in the library |
| Reference files: GET /references, kinds reference_document/data/video/image | decks, videos, rulebooks, tracker snapshots, workbooks, size charts |
| Adaptation pairs: optional fields on SDA examples, GET /examples | the Adapter's and Builder Tech's pairs |
| Import batches: package, origin, reverted; GET /ops/imports | the control room, reversibility |
| GET /ops/coverage and optional health counts | the control room's Library page |
| Size constraint source; demo keys read their own references | Design Builder |
| Examples of pending SDAs, height labels, pair registration and rule clauses, house-block ids, brand dna_role, RM fabric_tests | Design Builder Tech |
| Reference file sets and sda_ids, file role and derived_from, import action retire | Adapter |
| Portable regex patterns (no (?i)); check.py refuses inline flags | platform (ajv) |
| File kind reference_cad for CAD project files and archives (.gdb, .zprj, .zip) | Adapter |
Registry summary per project
| Project | Sources | In library | Missing | Package ready | Kept / frozen | Still edited |
|---|---|---|---|---|---|---|
| Adapter | 12 | 1 | 9 | 0 | 2 | 5 |
| Builder | 12 | 6 | 2 | 0 | 4 | 2 |
| Builder Tech | 7 | 5 | 2 | 0 | 0 | 4 |
| Platform | 4 | 2 | 0 | 0 | 2 | 0 |
| OperationalLayer | 2 | 0 | 0 | 1 | 1 | 1 |
| All | 37 | 14 | 13 | 1 | 9 | 12 |
Verification
- python3 docs/contracts/check.py: 54 schemas, 73 examples, 0 problems.
- Today's live Library API responses (/ops/health, /ops/usage, /ops/feedback, the validation queue) validate against the extended schemas: 0 errors.
- python3 -m unittest discover -s opsdash/tests: 17 tests pass (registry, reference counts, import packages, collector back-off, control room).
- Deployed with opsdash/deploy/deploy.sh at 07:58 UTC (server backup kept). Every page and asset answers 200; the old sslip.io name still redirects (301).
- browser-use on the live site: all routes render, the control room headline is unchanged, and the Library page filters on click. Promote v1.0.0 to v1.1.0 and roll back on the test engine both switched (HTTP 200). Owner signed out afterwards.
- The company-materials package passes check_import.py with its staged files (4 files, 316,120,814 bytes).
- 10:18 UTC: prod serves /ops/coverage and /ops/imports; the collector switched (cache cleared), both answers validate against the contract, and the Library page (checked behind the site login) reads them.
- 11:09 UTC: all 14 packages succeeded on prod (batches 7c042950, 39ee293e, c36d1a06, a773c374, 81aa01a5, 37fa0066, 46684f36, f8d0345d, 7d7c470d, fd73e30d, 5d927adf, fdf74b57, f148da11, 874b888c); the blazer batch updated 148 pairs and created none; the company references carry the package's SHA-256.
- 11:11 UTC deploy with the lock-aware deploy.sh: every path 401 without the login, 200 with it; collector, control and test engine active; Library, control room, Activity, Adapter, Builder Tech and Platform render.
Not achieved yet
- The projects' PRs (Adapter #49, Builder #13, Builder Tech #13, OperationalLayer #20) are not merged, so each main still holds its Drive references (Adapter 26, Builder 3, Builder Tech 2, platform 44 lines); the readers are switched on the branches.
- 1 source is not in the library (the adapter alignment data the tech builder pins); 5 are in the library with a reader still on the copy.
- Skipped for lack of a category: 74 Bermuda/Shorts/Skirts designs and 26 tailcoats.
- The pattern makers' trackers are still edited in Google Sheets: snapshots keep every edit until the owner picks the library-side edit path.
- The published contracts site is not republished; the changes are in PR #20.