Closed general

Hardware taxonomy: component becomes hardware with first-class kinds (molecule, component, equipment)

Colby Knox · 2mo ago ·closed by Colby Knox

Design + tracking issue for the taxonomy restructure Colby called for: the top-level component type becomes hardware, with first-class kinds underneath (molecule, component, equipment, and room for more). This is the largest structural change since the owner-namespace overhaul, so this issue is the full plan: model, wire contracts, staged rollout, migration mechanics, test strategy, risks, and open questions. Development happens on feat/hardware-taxonomy, validated against staging data before anything reaches main.

1. Why (the modeling argument)

type: component today conflates at least three structurally different things:

What it really is Example Metadata it needs
A purchasable part WS2812B-2020, LP5912Q1 MPN, manufacturer, package, symbol/footprint/3D completeness
An Adom-built module workcell mainboard, PM coil molecule machine pins, BOM, placement renders, layout membership
Bench hardware / instruments DSOX1204G scope, Red Pitaya docs, calibration, drivers; often nothing installable

Only the first fits component_metadata, which is why molecule pages have always sat awkwardly in the /components browser: wrong facets, wrong completeness chips, MPN fields that mean nothing. Tags cannot fix this, because the branches need different STRUCTURED metadata and different UI treatment. Different schema = different type, and that is the line between a kind and a tag.

The companion decision (from the tags-vs-categories discussion): tags remain the organic, cross-cutting layer underneath (kicad, rgb, power, 0603). Kinds are closed and curated; tags are open. Navigation composes both.

2. Target model

  • Top-level types: app | skill | hardware | bootstrap. (component becomes the legacy alias for hardware.)
  • New kind axis, only meaningful for hardware, stored in its own column and declared in page.json:
{ "type": "hardware", "kind": "molecule" }
  • Initial kinds: component, molecule, equipment. The enum is deliberately extensible (candidates the data already suggests: board for non-molecule assemblies like eval boards; decision below in Open Questions).
  • Each kind gets its own metadata home over time: component_metadata stays the component kind's table; molecule and equipment metadata blocks come later (stage 4), not in the first cut.
  • Tags unchanged, on every type.

3. What type touches today (the honest blast-radius list)

  • DB: pages.type (+ CHECK constraints in places), queries keyed on type = 'component' throughout server.js and lib/.
  • Disk: bare repos live at data/repos/<owner>/<type>/<slug> — the type is a filesystem path segment.
  • Routes: /components listing + facets, /viewer/*/:owner/:type/:slug, /blob/:type/:slug/*, readme routes.
  • Publish: manifest validation (type enum), discovery gate (apps/skills), hero gate, component auto-metadata extraction.
  • CLI: type enum in publish and install; install semantics key on type (component packages get CAD + auto-skill delivery).
  • Content: every committed page.json carries the type string; external links reference /components.
  • Home stats, search type chips, badges, cards.

The migration playbook exists: the namespace overhaul renamed a type before (bootstrap) with alias windows, and built the owner-keyed repo mover this will reuse.

4. Staged rollout

Stage 1 — kind exists, invisible to every client (this branch, first).

  • pages.kind column (TEXT, addColumnIfMissing; NULL = unclassified).
  • page.json kind field, sanitized at index time (enum-checked; invalid values ignored with a publish hint).
  • Backfill classifier: a deferred sweep (same pattern as the skill-count sweep) classifies existing hardware pages by signals: MPN/manufacturer present = component; molecule signals (slug/tags/title, machine-pin metadata, molecule library membership) = molecule; explicit page.json wins over inference; everything ambiguous stays NULL and is listed for a human pass rather than guessed.
  • Browse: the /components page gains kind sections/filters (component | molecule | equipment | unclassified), reusing the existing facet machinery. Cosmetic only; URLs unchanged.
  • Publish hint KIND_MISSING (info) nudges hardware publishers to declare a kind.
  • Nothing changes for the CLI, the API adds a passive kind field on page reads.

Stage 2 — the outward rename, dual-name window.

  • Server accepts type: hardware (+ kind) on publish and serves BOTH names: API responses carry type: "hardware" plus legacy_type: "component" (or the reverse during the window, decided with the CLI thread) so old clients keep working untouched.
  • /hardware browse becomes canonical; /components 301s with the kind filter mapped.
  • Repo paths: new publishes land under hardware/; existing repos migrated by the owner-keyed mover with symlink or lookup aliasing during the window.
  • CLI coordination issue: enum extension, and install semantics re-keyed on delivery behavior (unchanged behavior for all hardware kinds: CAD + auto-skill delivery exactly as component gets today).
  • Committed page.json files: rewritten lazily on each page's next publish (the indexer treats component as hardware + inferred kind); no mass rewrite.

Stage 3 — legacy retirement, drain-gate keyed.

  • When the client fleet and traffic show no component-keyed consumers (same drain-gate discipline as every retirement this quarter), the alias becomes permanent-but-undocumented, then eventually removed from docs entirely. Nothing hard-breaks: aliases are cheap to keep.

Stage 4 — per-kind metadata (separate design).

  • molecule_metadata (machine pins, BOM ref, layout membership) and equipment_metadata (docs, drivers, cal) with their own completeness chips and facets. Out of scope here; filed separately when stage 2 settles.

5. Test strategy (per Colby: staging data as the test bed)

  • All development on feat/hardware-taxonomy; main stays deployable throughout. Nothing merges until stage 1 is green.
  • Classifier development is data-driven: a read-only dry run over the real page inventory (staging, plus prod read-only for volume, ~700 hardware pages) produces a classification report BEFORE the sweep ever writes a row. The report (counts per kind, the ambiguous list, per-page reasons) gets posted to this issue as the evidence base and human-pass worklist.
  • Merging stage 1 to main deploys it to staging (normal flow); the backfill then runs against the real staging dataset and the browse sections are verified there against live data before the prod tag moves.
  • Unit tests pin: sanitizer enum, classifier rules on synthetic + real-shaped rows, sweep idempotency, NULL-stays-NULL-for-ambiguous, hint firing, browse section rendering.

6. Risks

  • Repo-path migration (stage 2) is the dangerous part: moving bare repos while the server runs. Mitigations exist (the namespace mover, per-repo write locks from the perf epic), and stage 2 does not start until stage 1 has soaked.
  • CLI skew: the dual-name window plus drain gates make this boring, but the coordination issue must land before stage 2 merges.
  • Classifier overreach: mitigated by explicit-declaration-wins, NULL-for-ambiguous, and the human worklist. The sweep never deletes or downgrades an explicit kind.
  • External links: /components 301s forever; no link rot.

7. Open questions (Colby)

  1. Is board a fourth kind? The data has non-molecule assemblies (eval boards, breakouts, mainboards carrying molecules). Options: a board kind, or fold them into molecule (stretchy) or equipment (wrong). The dry-run report will show how many pages hang on this.
  2. Equipment scope: instruments only (scope, Red Pitaya), or also machines (PnP line, laser)? Proposed: anything you point at on a bench that is not itself a part or a module.
  3. Naming during the window: which name the API leads with while both are valid (proposal: hardware leads immediately at stage 2, legacy_type carries component).

Branch: feat/hardware-taxonomy. Stage 1 starts now; the classification dry-run report lands as the first comment.

16 Replies

This comment was deleted by its author · 2mo ago
This comment was deleted by its author · 2mo ago
Colby Knox · 2mo ago

Classifier dry-run report (read-only, prod public corpus), as promised in the plan. Stage 1 is implemented on feat/hardware-taxonomy (2f4f722); nothing has written to any live row yet.

379 public hardware pages: 340 component, 19 molecule, 4 board, 16 ambiguous. Staging's own 7 components all classify as component (all MPN-bearing).

Rules, in precedence order: equipment tag; molecule naming or tag; board-assembly naming (eval board, breakout, mainboard, toolboard); MPN or manufacturer present = component; otherwise NULL for the human pass.

Evidence on the open board-kind question (Q1): the 4 board-classified pages are the three cosmiic eval boards plus john's rp2040 breakout pipeline demo. Real, but few; molecule and board could merge if a 3-kind taxonomy is preferred, at the cost of eval boards filing as molecules.

The ambiguous worklist (16, mostly connectors and grid arrays with no MPN metadata):

  • adom/wireless-link-library
  • drew2/taprite-solonoid-wiretest
  • adom/pinheader-1x12-p2-54mm-vertical
  • adom/pinheader-1x08-p2-54mm-vertical
  • cosmiic/lrg-lrg-6x6-p16
  • cosmiic/lrg-lrg-5x10-p16
  • adom/bosch-molecules
  • adom/adom-machine-parts-library
  • adom/modular-bms
  • drew2/piprobe-occt-unified
  • adom/2n7002-hxy
  • drew2/rp2350a-mini-wiretest
  • drew2/piprobe-wiretest
  • drew2/bhi385-wiretest
  • drew2/taprite-mosfet-wiretest
  • drew2/usb2532-hub-c-wiretest

Most of these look like components missing metadata rather than new kinds (pinheaders, LRG grids); a metadata pass would shrink this list to near zero. The staging corpus seeding (copying prod hardware pages into staging under the adom org) is running now, so the sweep and the browse UI get tested against a realistic dataset there before anything merges to main.

Colby Knox · 2mo ago

Taxonomy settled (Colby, 2026-08-05) and implemented on staging. Prod stays frozen until the whole plan is approved.

The decided shape

Top level stays Hardware. Kinds: component | molecule | project | equipment (board retired; accepted as an alias at sanitize and in URLs so old declarations and links keep working). Each kind owns a category tree, defined in lib/taxonomy.js:

  • Components: the Component Ocean tree. 6 families, 23 categories, 105 subtypes. Families are display groupings (dropdown optgroups); category maps to component_metadata.category, subtype to .subcategory. No schema change.
  • Molecules: Scaffolds, Frames, Power & Charging, Wireless & Comms, Sensor Modules, Interface & IO (provisional beyond Scaffolds).
  • Equipment: Electronics Test Equipment, Tools and Supplies, Power Supply Products, Cables and Wire, Machining.
  • Projects: Eval Boards, Breakouts, Reference Designs, Fixtures & Jigs (provisional).

Resolutions applied to the CO tree

  1. TVS is owned solely by Fuses & Circuit Protection (was duplicated under Diodes).
  2. LEDs & Indicators moved from Diodes to Optoelectronics (the WS2812B test: distributors file LEDs under opto).
  3. Machine Pins & Contacts added under Connectors (the Adom catalog had no home).
  4. Same-name subtypes disambiguated in display form: Current Sense Resistors vs Current Sense Amplifiers.
  5. The pasted list totals 105, not 107; the Optoelectronics line was truncated mid-list, so two subtype slots may still be missing pending Colby's confirmation.

Shipped to staging

  • Kind rename board to project across enum, classifier, browse filters, plus idempotent data rewrites in setup-db.
  • Browse flow per the decided interaction model: picking a kind reveals its category dropdown (family optgroups, live counts, zero-count canonicals disabled, legacy values under Other) and the tag strip. The filter rail is retired.
  • Category alias sweep: unambiguous wild spellings (crystal, diode, LED, LDO linear regulator, Power ICs, LrgLrg, ...) fold onto canonical names; ambiguous ones (ic, passive, other) stay for a human pass.
  • Scaffolds are molecules: scaffold naming/tag/category now outranks the has-an-MPN classifier rule, with a corrective rewrite for already-classified rows.
  • New publish hint CATEGORY_NONCANONICAL names the canonical list for the page's kind.

Staging counts after the sweeps: 142 hardware pages = 100 components, 41 molecules, 1 project.

Still open before prod

  • Stage 3: wire rename (API type dual-name window, CLI coordination).
  • Stage 4: per-kind metadata; kind-aware category mapping (a molecule with category Sensors should offer Sensor Modules).
  • Colby: confirm the two truncated Optoelectronics subtypes and the provisional molecule/project category lists.

stg-hw-comp

stg-hw-mol

Colby Knox · 2mo ago

Tree completed per Ray: the truncated Optoelectronics tail was Signal Isolators and Laser Diodes. The component tree now totals its intended 107 subtypes (the resolutions cancel out: TVS dedup -1, LED move 0, Machine Pins & Contacts +1). Shipped to staging.

On TVS placement, noting Ray's point for the record: TVS parts are literally diodes, and JLC files them that way. Keeping single ownership under Fuses & Circuit Protection because the buyer's question is "what protects this rail", and dual-parenting is what made the original tree ambiguous. If Colby wants it back under Diodes it is a one-line move; the alias layer will map either spelling regardless.

Colby Knox · 2mo ago

Two taxonomy updates from Colby, implemented on staging:

Projects redefined. Projects are factory scaffold layouts designed in the 3D editor, not board assemblies. The kind is declared only now: the board-naming classifier rule (eval board, breakout) is retired along with its conflict case, and a scoped rewrite undid what it had classified. Molecule-tagged board-named pages (the cosmiic eval boards) now file as molecules on the owner's word. Project categories stay empty until the first real layouts exist.

Equipment shelf seeded. Workcells & Automation is the new leading canonical equipment category, and two pages are ported: adom/adom-workcell (from the definitions page and the workcell monorepo) and adom/essemtec-puma (the SMT pick-and-place, from the puma-file-prep sources). Both declare kind equipment in page.json, the first pages to exercise the declared path end to end.

Staging counts: 144 hardware pages = 101 components, 41 molecules, 2 equipment, 0 projects (the tab hides at zero until a layout page declares the kind).

stg-hw-equip

Colby Knox · 2mo ago

First real project page, for the feel of it: adom/cosmiic-implantables on staging, ported from the cosmiic/implantables app on prod.

What it is: the wireBender scaffold layout (designed in the Hydrogen 3D editor) as a hardware page with kind project declared in page.json. The install is nearly identical to the app's: install.sh copies wireBender.json into project-content/layouts for the 3D editor's layout picker, and now also delivers two node firmware images (pg4-stim-node-v0.3.2.uf2, pm1-power-node-v0.1.7.uf2, placeholder blobs) into project-content/firmware. Dependencies were rewritten to the six COSMIIC molecules present on staging under adom; pg4-frame-mol, bp2-frame-mol, and wireless-link were not in the seeded corpus so they are listed but undeclared. Hero, screenshots, and SKILL.md ported along.

Observed gap for stage 4: the create API requires component.mpn even for a project, so the page carries a synthetic MPN (COSMIIC-IMPLANTABLES) that renders in the metadata rail. Projects want layout-shaped metadata (scene, molecule count, wire count), not MPN and manufacturer. That is the strongest concrete argument yet for per-kind metadata.

Staging counts: 145 hardware pages = 101 components, 41 molecules, 1 project, 2 equipment.

stg-hw-proj

stg-proj-page

Colby Knox · 2mo ago

MPN for projects resolved per Colby: a project should not need one. The create validator now exempts project-kind manifests from component.mpn (board alias included), and normalize derives the display identifier from the slug uppercased with dashes kept (cosmiic-implantables becomes COSMIIC-IMPLANTABLES), preserving any explicit value. On staging.

Also noted from Colby: projects may eventually deserve a top level of their own above hardware, alongside apps and skills. Parked deliberately; they stay a hardware kind for now.

Colby Knox · 2mo ago

Ray's Component Ocean v2 (2026-08-05) is adopted verbatim as the canonical component tree, spellings included: 23 categories, 106 subtypes, every JLC subcategory mapping to exactly one place.

Deltas applied on top of what was here:

  • TVS consolidated under Diodes as TVS Diodes and removed from Fuses & Circuit Protection. This reverses the earlier dedup direction; Ray owns the JLC mapping so his direction stands.
  • Relays: Sockets becomes Sockets & Accessories.
  • Slash spellings restored throughout (Networks/Arrays, Pots/Trimmers, IGBT/Thyristors, RS-232/RS-485, and so on).
  • Ray's invisible re-homings are captured as SUBTYPE_ALIASES for the stage-4 subcategory mapping pass: Balun to Transformers/Baluns, Isolation Amplifiers to Optoelectronics/Signal Isolators, photo-interrupters to Optoelectronics/Photodiodes-Phototransistors.

One open item for Ray: Machine Pins & Contacts under Connectors is kept as a marked Adom extension (our contact catalog has no other home), making the wiki's working total 107. It is not in the v2 tree since it is not a JLC subcategory; bless it or name a better home and it moves.

No browse-visible change (subtypes are not rendered yet); the category level was already aligned.

Colby Knox · 2mo ago

Colby's rulings, all landed on staging:

  • Machine Pins & Contacts is confirmed in Connectors (the 107 stands), and every machine pin and contact page carries the adom tag (eight of nine already did; adom-machine-pins-fusion-lbr was the gap).
  • Molecule categories are user-picked until patterns emerge: molecules are exempt from the CATEGORY_NONCANONICAL publish hint; the canonical six stay in the dropdown as suggestions.
  • The equipment shelf pins a Built by Adom chip: sugar for the structured manufacturer=Adom filter, no privileged tag. Screenshot attached.
  • The cosmiic private-library question (#105) stays punted; the pages are cosmiic's to handle.

Stage 4 progress in the same push: the page sidebar is kind-aware (a project shows Identifier and an equipment page shows Model instead of MPN; package and pin rows hide for both), and the canonicalize sweep now folds subcategory spellings onto the canonical subtype lists with SUBTYPE_ALIASES re-homing rows wholesale (Balun to Transformers/Baluns and friends).

Remaining before the prod ask: finish stage 4 (per-kind metadata fields beyond labels, e.g. a project's scene stats), then the stage 3 wire rename last, coordinated with the CLI thread once the wiki side is done. Prod stays frozen throughout.

stg-hw-equip2

Colby Knox · 2mo ago

The wiki's component tree now syncs from Component Ocean's live endpoint instead of pasted snapshots, per Ray's note:

  • scripts/sync-taxonomy.mjs fetches /api/taxonomy?full=1 and regenerates lib/taxonomy-co.mjs: the tree plus 66 category and 651 subtype JLC alias mappings, all feeding the canonicalization sweeps. Run it when CO changes, review the diff, commit.
  • Deliberately a vendored snapshot, not a runtime pull: the browse must keep standing when CO is down. "Pulling it" happens at sync time.
  • lib/taxonomy.js composes the snapshot with ADOM_EXTENSIONS (currently just Machine Pins & Contacts under Connectors, which is not a JLC subcategory so it will never arrive via the feed; still awaiting Ray's blessing or a better home).
  • Live names landed in the process: Microcontrollers & Processors, and the longer subtype display names (Chip Resistors (Thick Film) and friends). The old vendored spellings are aliased, and the staging data already folded over on the next sweep.
  • Ray's structural deltas were already in our tree from the v2 paste (TVS under Diodes, LEDs & Indicators in Optoelectronics, the three re-homes); the WS2812B case is covered by the feed's RGB LEDs (Built-In IC) alias.

Also, per Colby: the home page stat line now orders Apps, Skills, Hardware, Pages, with Pages as a plain figure rather than a link.

Colby Knox · 2mo ago

Full read-only categorization audit of prod ran against the current rules (709 hardware pages, public and org-private; prod untouched). Two headline findings:

  1. Prod already carries stage-1 kind values: the prod tag (33e7974) includes the kind column and the OLD classifier's sweep, which filed 693 rows, among them 18 as the retired board kind and the scaffold grids as components. Those are sweep artifacts, not declarations.

  2. The migration converges with drift zero: simulating the setup-db correctives plus the boot sweep against every page lands each one exactly where fresh classification with today's rules would put it. No manual data surgery at rollout.

Would-be shape after migration: 513 components, 183 molecules, 4 equipment, 0 projects (declared-only), 9 unsorted (pages with no component metadata at all). Category axis: 44 already canonical, 340 fold automatically via the alias maps, 261 stay for a human or publisher pass (the big clusters: other 55, ic/IC 20, RF Testing 12, plus part-names-as-categories), 64 have none.

The audit fed five new rules back into the branch: a molecule category is a kind declaration (17 Adom-built modules on prod use it that way); MedMed and LrgMed scaffold grids fold to Scaffolds and file as molecules; a workcell category files as equipment; Ferrite Bead folds to Inductors and motor_driver to Power Management; the machine pin and contact subcategory spellings resolve to Connectors / Machine Pins & Contacts.

Full report with per-cluster worklists is in the audit archive (kept out of the wiki per policy). Remaining before the prod ask: the RF Testing cluster ruling, the ic/other/part-name category cleanups (publisher hints will chip at these), the adom tag content op on prod's machine pin pages, stage 3, and final approval.

Colby Knox · 2mo ago

Cleanup executed per Colby's rulings (Fusion exports are molecules; clean categories now). 215 page.json edits landed on prod as content commits: kind declarations plus canonical categories. Prod's UI shows none of it until the taxonomy ships; every edit is a git commit and reversible.

What moved:

  • About 120 pages declared molecule: the Fusion-export set (VNA DUTs included, category kept as their free-pick), Bosch breakouts, LED nameplates, battery packs, and the workcell electronics boards (category Workcell Electronics).
  • About 70 distributor parts got their canonical component category (resistors, MLCCs, LDOs, MCUs, CAN and Ethernet ICs, TVS parts, connectors, and so on). On the ICs question: ICs is a family of nine categories, not a single category, so each ic page landed in its right member (comparators to Amplifiers & Comparators, NOR flash to Memory, CAN transceivers to Interface ICs, ...).
  • 10 equipment declarations: the Essemtec feeder fleet, jet valve, Adom strip and bulk feeders, the prod Puma page (Workcells & Automation), and Indium 12.8HF paste (Tools and Supplies).
  • 5 pages got first-time component metadata (pinheaders, 2N7002, LAN9374, WAGO 2604-1102, ACT1210L).

Re-audit after cleanup: 711 pages would file as 395 components, 299 molecules, 14 equipment, 3 unsorted. Component-kind non-canonical categories fell from 194 to 16; three new aliases (Voltage Regulator, Ethernet Controller, ESD/TVS array) fold five more, leaving only the library-bundle species.

Remaining calls for Colby: the library species (10 "component library / BOM dependency set" pages: own kind or category?), adom/modular-bms (composable molecule system: project or molecule?), and adom/ignore (junk Fusion export, deletion candidate).

Colby Knox · 2mo ago

Colby's three rulings, applied:

  1. Fusion exports: the blanket molecule ruling stands with his caveat on record that some may turn out to be components or equipment. Every declaration is a per-page page.json commit, so re-filing any page is a one-line change; the full declared list is preserved in the audit rows.

  2. Library bundles are components with the library tag: all 14 adom-owned -library and -lbr pages now declare kind component, carry the library tag, and dropped their junk categories. They file under Components uncategorized.

  3. adom/modular-bms is a project, flagged incomplete: kind project is declared in its page.json, and the new invariant ships with it. Projects must include at least one layout: publishing a layout-less project warns with PROJECT_MISSING_LAYOUT, and the page sidebar shows "Layout: none yet (projects need at least one)" instead of staying silent. adom/ignore stays as-is per Colby.

One migration bug found and fixed in the process: prod's stage-1 code predates the project kind, so modular-bms's declaration could not materialize into the DB today, and at rollout the sweep would have classifier-guessed it. The sweep now reads each NULL row's page.json first and materializes any declared kind before falling back to the classifier, so late declarations land no matter which code version accepted the push.

Colby Knox · 2mo ago

Stage 3 is in motion. The full CLI contract is filed as adom/adom-wiki-cli#499: the type wire rename sequencing (server accepts hardware as a write synonym forever; CLI acks read-synonymy with a version; emission flips behind a drain gate on that version; component accepted on write permanently), the kind axis surface, project rules (no MPN, layout required), the new hint codes, and a staging test recipe against the classified corpus.

Also shipped from the CLI thread's feedback: PATCH /api/pages/{owner}/{slug} for gate-time metadata edits (title, brief, tags, plus a changelog string that names the commit without entering the manifest). Live-verified on staging; hero-studio's Apply no longer needs to stash edits for the next publish. Their set-insecure clap bug is reported in the same write-up.

Colby Knox · 2mo ago

Pre-launch delta audit ran against prod (715 pages now): four new pages since the cleanup, all LED nameplates, all classifying as molecules on their own; the eight classification changes are exactly the recent fixes materializing (library-kind declarations, and the Voltage Regulator / Ethernet Controller / ESD-TVS aliases folding). Unsorted is down to one page, adom/modular-bms, whose declared project kind lands via the manifest-reading sweep at migration. Nothing needs reclassification before launch; post-migration shape now 398 components, 302 molecules, 14 equipment.

One design question surfaced by the CLI thread's install-leg verification, the last open item on the projects story: the publish validator forbids install scripts on the hardware type entirely (installing a component never executes code, a deliberate safety property). Projects need install-time delivery of layouts and firmware. Options: exempt kind project from the rule, or better, keep no-code-on-install universal and add a declarative convention where layouts/ and firmware/ are delivered as files to known destinations, the way skills/ already are. Recommendation is the declarative route; it needs a small CLI feature post-1.1.0 and does not block the prod launch (no published project packages exist yet).

Colby Knox · 2mo ago

Launched. The full taxonomy is live on wiki.adom.inc as of today.

What shipped in the prod tag (33e7974 to 1c73438): the kind axis (component / molecule / project / equipment) with the declaration-aware sweep; Component Ocean's canonical tree synced from the live endpoint plus the Machine Pins & Contacts extension; the /hardware browse (kind tabs, per-kind category dropdowns with family groupings, narrowing tag strip, Built by Adom chip) with /components 301-redirecting; kind-aware page sidebars and project scene stats; the category and subtype canonicalization sweeps; the publish rules (project and equipment CAD exemptions, slug-derived identifiers, PROJECT_MISSING_LAYOUT with near-miss diagnosis); the PATCH metadata route; and the stage 3 wire rename with the emission armed, responses now saying type hardware while writes accept both spellings forever.

Migration verified against the pre-launch audit: the sweeps converged exactly as simulated. Scaffolds file as molecules with category Scaffolds, adom/modular-bms landed as a project via the manifest-reading sweep, the component dropdown is canonical with real counts (Resistors 93, Capacitors 52), and search emits hardware with both filter spellings working. Public shape: 387 hardware pages = 277 components, 108 molecules, 2 projects; equipment is currently all org-private, so its tab shows only to members (flagging for a visibility decision, not a bug).

Content ops done: every machine pin and contact page carries the adom tag, and adom/cosmiic-implantables is live as the first prod project page (wireBender scene stats in the sidebar, the nine cosmiic molecules as dependencies), with the original app cross-linking it and remaining the installer until the declarative file-delivery convention lands (the one open follow-up, tracked with the CLI thread).

One suite catch pre-tag: an undefined CSS token in the tag-strip styles, caught by the css-tokens lint on the launch-gate run, fixed before tagging.

Closing this issue. Follow-ups live on their own threads: declarative layouts/firmware delivery (with CLI post-1.1.0), the equipment visibility call, and the ic/other category long tail that publish hints will chip away at.

prod-hw

prod-proj

Colby Knox · 2mo ago

Two launch-night catches from Colby, both fixed on prod within the hour:

  1. Workcells misfiled as components: the audit's migration simulation included a workcell-category corrective that was never actually written into setup-db, so drift-zero was measured against an intended fix. The corrective is real now; wire-bender-workcell and plating-workcell file as equipment.

  2. Equipment invisible to logged-in members: every browse count (kind tabs, facet dropdowns, tag strip) was computed from public-only SQL, so an org whose equipment is all private never saw its Equipment tab even logged in. The /hardware route now derives every view from one org-filtered corpus: all counts are viewer-scoped (a member sees 716 pages with Equipment 14; anonymous sees the 387 public), user input no longer reaches the SQL at all, and the facet pivot semantics are preserved.

Also in the second push: a launch-gate lesson applied twice over, the suite pipe swallowed a failing exit code once; the re-tag went out only after a real green run.

Log in to reply.