Anchored on Huckson · reflects the 6/4 workshop + 6/5 capability review + 6/5 Logan×Jacob discovery · 2026-06-05
The same model has to serve two readers. The bridge between them is this picture: products stay real Shopify products; only the configurator logic is data.
A product TYPE defines the shared template (which steps, which options apply: sunglass / eyeglass / lenses-only / goggle). A product inherits that template and overrides where the frame forces it. Edge cases are the rule, not the exception.
Steps are the primary modular entity; options + rules hang off them as JSON. Rules that touch many products become separate referenced objects, not inline copies — so they can be shared and drag-dropped onto product steps in admin.
These two views agreed in the 6/5 discovery: "rules affecting multiple products become separate objects" (Logan) is the same call as the key-route (Justin). The open seam is whether a template is per-type or per-product — see Open Questions.
nameapplies_to_product_typesteps → ref[]key · titleoos_behavior (hide/disable)step_key · option_skutitle · product_refprice_delta · dvi_codekey · typetrigger ref[] · effecttargets ref[] · prioritygoggle_frame_upccompatible_insert_upcs[]Source of truth = the Magento dependency CSV. Numeric IDs are disposable plumbing; the slugs (feat-polarized, material-trivex) carry over and become the keys rules reference.
The full Huckson rule set is ≈ 680 rules (≈113 show + ≈570 hide; bulk lives in coating + signature-lens compatibility). That set is generated from the CSV, not hand-authored — the rows below are the spec the generator follows.
"When you pick X, these become available." trigger = the picked option, targets = the permitted list.
"When X and Y are both picked, hide Z." trigger = the condition group (AND), target = the option removed.
"Hide Z when (A·B) or (A·C) or (C)." One row per OR-branch, all pointing at the same target.
| key | type | trigger (AND-group) | effect | target(s) |
|---|---|---|---|---|
r-show-bifocal-materials |
dependency | vision-lined-bifocal |
show | material-polycarbonate, material-1.67 |
r-hide-polarized-bifocal-trivex |
independence | vision-lined-bifocal AND material-trivex |
hide | feat-polarized |
r-hide-polarized-single-167 |
independence | vision-single AND material-1.67 |
hide | feat-polarized |
r-hide-lc-polarized-greensmoke-2-bifocal-trivex |
independence | vision-lined-bifocal AND material-trivex |
hide | lc-polarized-greensmoke-2 ⚠ |
r-hide-lc-polarized-greensmoke-2-bifocal-167 |
independence | vision-lined-bifocal AND material-1.67 |
hide | lc-polarized-greensmoke-2 ⚠ |
r-hide-lc-polarized-greensmoke-2-trivex |
independence | material-trivex |
hide | lc-polarized-greensmoke-2 ⚠ |
⚠ Highlighted rows target lc-polarized-greensmoke-2, which isn't in the seeded lens_color options yet — add it (or retarget) so the example is self-consistent. Rows A–C plus the three OR-branches cover all four rule shapes.
Stays inside one rule. Within a trigger group, comma-separated keys must all be selected together (the polarized rule needs "both picked").
In dependence_value: a list of targets → one rule, many targets. In independence_value: OR → one rule row per branch.
Direction flip — show: trigger = picked option, targets = the list it permits. hide: trigger = the condition group, target = the row's own option. "Hide wins over show" on conflict — lives in priority.
Logan: "rules affecting multiple products become separate objects" and "steps as the main entity." Same calls we made — now echoed independently. Strengthens making configurator_step first-class.
Logan suspects independence (hide) rules are just the inverse of dependency (show) and might collapse to dependency-only to cut admin complexity. That touches ~570 of our ~680 rows. Not decided — pending review of the original architect's rationale for why independency exists. Our both-types model is the safe superset until then.
Jacob is pulling the full SQL table of all rule sets and resending the rule-dependencies spreadsheet. Supersedes the single Huckson CSV for sizing — answers Logan's "how many unique permutations?" question (we already have ~680 for Huckson as a first data point).
• Template = per-type or per-product? Schema names rule_template after a product (huckson-goggle) yet carries applies_to_product_type. This is the seam between Justin's two-level model and the build.
• "Hide wins" not yet written into the schema (priority is the hook).
• Goggle insert compatibility has no real seed — Huckson is a sunglass despite the label.
• Unique product identifier / SKU — option→real-product join waits on it (proceeding assuming it lands).