Skip to report
Chief / OperationalLayer · Bettter Ops4 Nov 2026

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.

Deployed and verified on ops.bettter.us (behind the ops site login) · prod imports done · PR #20 open (not merged)

The 46 sources by status (registry, 4 Nov 11:12 UTC)

Imported into the prod library today18 sources
Retired: no reader left13 sources
In the library, a reader still uses the copy5 sources
Not in the library yet1 sources
Kept (not library data) or frozen copy9 sources
Source: docs/library-sources.md (PR #20); prod batches read from the Library API GET /ops/imports

The prod library before and after the imports (records)

RM records before663 records
RM records after (Blazers 668, Trousers 525)1,187 records
SDAs before160 records
SDAs after (Blazers 154, Trousers 158, Shirts 122, T-shirts 86)520 records
Pairs before176 records
Pairs after (7 retired as the owner asked)170 records
Reference files before0 records
Reference files after27 records
Source: Library API GET /ops/health 4 Nov 07:38 UTC (before) and GET /ops/coverage 11:12 UTC (after)

Drive and Sheets link lines left in code on each main (4 Nov baseline; drops when the projects' PRs merge)

Adapter26 lines
Builder3 lines
Builder Tech2 lines
Platform44 lines
OperationalLayer0 lines
Source: git grep on each repository's origin/main outside migration/ and library-import/ (opsdash/context/drive_refs.py); target 0

How a source leaves Drive

  1. Package

    The owning project writes library-import/<package>/manifest.json: records, files with SHA-256, the source by name and row.

  2. Check

    tools/check_import.py: schema, keys, checksums, no links.

  3. Import

    The platform runs it as one import batch: idempotent, reversible, prod backed up first.

  4. Switch

    Readers move to the Library API with a SHA-256 file cache; tests use Library API exports.

  5. 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)

Bettter Ops Library page after the prod imports: 13 of 37 sources retired, per-project bars
https://ops.bettter.us/#/library behind the ops site login, 4 Nov 11:12 UTC, after all 14 prod imports.

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

What the library holds on prod after the imports: 1,187 RM, 520 SDA, 170 pairs, 27 reference files, 0 Drive links; per category Blazers, Shirts, Trousers, T-shirts; the import list
Same page: prod /ops/coverage and /ops/imports at 11:12 UTC. The Drive references on each main drop when the projects' PRs merge.

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

Control room card: one library, Drive dependency, five tiles and a bar per project, above the promotion log with the test promote of 4 Nov
https://ops.bettter.us/ after the deploy; the promotion log shows the live promote/roll-back check on the test engine.
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?
  • 6 height-range stock lines (Voronin 0340-B and siblings) were folded together by the 3 Nov import; the tech builder's fix package is held because the importer only fills empty values: let the platform overwrite a record from the same sheet row, or say the tech builder's reading of the sheet wins.
  • 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)
ProjectResultRegression
Design Builder (v1.3.0 live, PR #13)0 Drive/workbook readers; fixtures are a Library API export; chest windows and team rules as packagesgate 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 packages114 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 pairsschemas checked with ajv; DB conformance suites green; prod after the QA imports and an RDS snapshot
OperationalLayer (live)registry, contracts, Library page, company materials packageall routes, promote and roll back, 17 tests
Contract changes (v1, additive)
ChangeFor
Import packages: library-import.md, import-manifest schema, tools/check_import.pyevery project with data not yet in the library
Reference files: GET /references, kinds reference_document/data/video/imagedecks, videos, rulebooks, tracker snapshots, workbooks, size charts
Adaptation pairs: optional fields on SDA examples, GET /examplesthe Adapter's and Builder Tech's pairs
Import batches: package, origin, reverted; GET /ops/importsthe control room, reversibility
GET /ops/coverage and optional health countsthe control room's Library page
Size constraint source; demo keys read their own referencesDesign Builder
Examples of pending SDAs, height labels, pair registration and rule clauses, house-block ids, brand dna_role, RM fabric_testsDesign Builder Tech
Reference file sets and sda_ids, file role and derived_from, import action retireAdapter
Portable regex patterns (no (?i)); check.py refuses inline flagsplatform (ajv)
File kind reference_cad for CAD project files and archives (.gdb, .zprj, .zip)Adapter
Registry summary per project
ProjectSourcesIn libraryMissingPackage readyKept / frozenStill edited
Adapter1219025
Builder1262042
Builder Tech752004
Platform420020
OperationalLayer200111
All3714131912
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.
  • A 15th package (tech-builder-rm-height-splits) is held on QA pending that decision; the size-constraint source is not served by prod yet.
  • 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.