Captures all clarifying-question answers + exploration findings so a fresh Claude Code session on Mac can resume at 'propose architectural approaches' without re-running the discovery work. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
Express Orders — Brainstorming Handoff (2026-05-25)
Status: Mid-brainstorming. Clarifying questions answered. NOT yet at "propose 2-3 architectural approaches" or "present design sections" stages.
Why this handoff exists: Previous session ran on a Windows machine (the user works from a Mac via Tailscale). Browser preview kept fighting cross-network localhost issues. User asked to restart natively on Mac. This doc preserves everything the brainstorming had reached so the new Mac session resumes instantly without re-asking.
How to resume: When the user opens Claude Code on their Mac and points it at this repo, kick off with:
"Resume the Express Orders brainstorming from
docs/superpowers/handoffs/2026-05-25-express-orders-brainstorm-handoff.md. Skip the visual companion entirely — design in text using the Excel mockup the user already sent. Pick up at 'propose 2-3 architectural approaches'."
What "Express Orders" is
A new sale-order entry surface that will eventually replace the current Direct Order Wizard. UX inspiration: a customer-shared Excel mockup showing a spreadsheet-style flat entry — header grid on top with customer/PO/job#/material-process/lead-time/terms/delivery, line table in the middle with per-row Part-#/Description/Specification/Job#/Thickness/Masking-checkbox/Baking-pill/Notes/Qty/UOM/Price/Subtotal + per-line Upload-Drawing + Open-Part buttons, footer with sub-total/tooling/tax/currency-selector/grand-total.
Goal: faster repeat-customer order entry. Type once on the line, no jumping to a separate part screen for routine work, every column inline.
Clarifying questions ANSWERED
| # | Question | Answer | Implication |
|---|---|---|---|
| 1 | Model strategy | D — new view on existing fp.direct.order.wizard |
Reuse the 500+ lines of onchange / recipe-cloning / spec-auto-fill / thickness-carry / tax-seeding logic that already debugged. Add masking/baking/currency fields to the existing model. Write a new "Express" form view. Retire the old direct-order view. Open drafts seamlessly become Express Orders (same DB rows). |
| 2 | Specification text storage | Free-text on the part — default_specification_text Text field on fp.part.catalog |
Type once → saves to part. Next order for same part → auto-fills. Cell value writes to sale.order.line.name (customer-facing). Bypasses the structured fusion.plating.customer.spec model entirely — simpler. |
| 3 | Per-line Job# column (ABC/DEF/GHJ) | NEW per-line customer sub-job-ref field | Header keeps x_fc_customer_job_number (e.g. 12345). Add NEW x_fc_customer_line_ref Char on sale.order.line. Both print on customer docs. |
| 4 | Masking checkbox scope | Both masking AND de-masking together | Unchecking creates override(included=False) for every node where default_kind IN ('masking', 'de_masking'). Logical pairing — can't unmask what was never masked. |
| 5 | Baking field shape | Free-text input + auto-fill from part default | Add default_bake_instructions Text on fp.part.catalog. Type once → saves. Next order → auto-fills. Empty cell = exclude baking node (override included=False on all baking-kind nodes). Non-empty cell = include baking node + write the text to fp.job.step.instructions for the bake step at job-creation time. |
| 6 | Currency mechanic | Pricelist-per-currency, labelled "Currency" | Selector shows currencies the company has pricelists for. Picking USD → looks up company's USD pricelist → sets sale.order.pricelist_id. currency_id flows from there. Admin must configure one pricelist per currency. |
| 7-14 | 8 default interpretations | All 8 accepted | PO Pending = keep existing flag + chase mechanism; Material Process = new informational Char; Upload Part Drawing = per-line button to part.drawing_attachment_ids; Create Part = per-line modal opening fp.part.catalog form; Lead Time = reuse min/max days; Blanket SO = reuse boolean; Delivery Method = reuse x_fc_delivery_method; phase-out path = both menus visible initially, retire old view after Express is stable on entech. |
Exploration findings (already verified by reading source — these are GROUND TRUTH)
Existing fp.direct.order.wizard model
- Persistent (not transient) — state machine
draft → confirmed → cancelled - File:
fusion_plating_configurator/wizard/fp_direct_order_wizard.py - Line model:
fp.direct.order.lineinfusion_plating_configurator/wizard/fp_direct_order_line.py - Creates SO in quotation state on confirm. Does NOT auto-confirm SO or auto-email.
Existing sale.order.line x_fc_* fields (verified — keep using these)
x_fc_part_catalog_idMany2one(fp.part.catalog)x_fc_internal_descriptionText REQUIRED — Notes column maps herex_fc_description_template_idMany2onex_fc_serial_idsMany2many(fp.serial) +x_fc_serial_id(primary, computed)x_fc_thickness_rangeChar — Thickness column maps herex_fc_revision_snapshotChar (frozen at line save time)x_fc_process_variant_idMany2one(fusion.plating.process.node) — recipex_fc_save_as_default_processBooleanx_fc_job_numberChar — shop's auto-sequenced ref (NOT customer's; that's the new x_fc_customer_line_ref)x_fc_customer_job_numberrelated from orderx_fc_po_numberrelated from orderx_fc_part_deadlineDate + offset_days + effective computesx_fc_archivedBooleanname(Odoo standard) = customer-facing description — Specification column writes here
NEW fields the Express Orders feature must add
On sale.order.line:
x_fc_customer_line_refChar — per-line customer sub-job (the ABC/DEF/GHJ column)x_fc_masking_enabledBoolean default=True — Masking checkboxx_fc_bake_instructionsText — Baking free-text
On fp.part.catalog:
default_specification_textText — for Spec auto-filldefault_bake_instructionsText — for Baking auto-fill
On fp.direct.order.wizard (header):
material_processChar — informational order-level tag (ENP-STEEL-HP-ADVANCED)
On fp.direct.order.line (wizard mirror, to be carried to SO line on confirm):
customer_line_refCharmasking_enabledBoolean default=Truebake_instructionsText
Existing fp.job.node.override model (verified — schema is exactly 3 fields)
File: fusion_plating_jobs/models/fp_job_node_override.py
job_idMany2one(fp.job) required ondelete=cascadenode_idMany2one(fusion.plating.process.node)includedBoolean
No instructions-text override field. For the bake free-text feature, do NOT extend this model — instead write the typed text to fp.job.step.instructions directly at job-creation time. Simpler, less schema churn.
Existing recipe model (fusion.plating.process.node)
File: fusion_plating/models/fp_process_node.py
default_kindis a Char (line 526), not Selection — flexible- Values seen:
masking,de_masking,baking, plating, inspection, contract_review, racking, etc. node_typeis a Selection (line 54):opt_in,opt_out,mandatory,recipe
Job-creation hook
File: fusion_plating_jobs/models/sale_order.py — action_confirm() calls _fp_auto_create_job() which groups lines by recipe. New Express-Orders-driven overrides should be injected here:
- Walk each SO line
- Resolve the line's recipe
- If
x_fc_masking_enabled == False, createfp.job.node.override(included=False)for every node in recipe wheredefault_kind IN ('masking', 'de_masking') - If
x_fc_bake_instructionsempty, createfp.job.node.override(included=False)for every node in recipe wheredefault_kind == 'baking' - If
x_fc_bake_instructionsnon-empty, write the text tofp.job.step.instructionsfor the baking step (find by recipe_node_id.default_kind == 'baking')
Currency
sale.order.currency_idrelated frompricelist_id.currency_id(Odoo native)- No multi-currency customisations in fusion_plating modules — using Odoo standard
- Per the answer to Q6, the Express Orders feature adds a selector on the wizard that looks up the matching pricelist by currency code
fp.part.catalog (file: fusion_plating_configurator/models/fp_part_catalog.py)
Verified key fields:
x_fc_default_customer_spec_id(added by quality module) — NOT used by Express Orders per Q2x_fc_default_thickness_rangeChardescription_template_idsO2M(fp.sale.description.template) with internal + customer descriptionsdrawing_attachment_idsM2M(ir.attachment) — Upload Part Drawing button writes heremodel_attachment_idM2O — 3D modelx_fc_certificate_requirementSelection — inherit/none/coc/coc_thickness
What's LEFT to do (resume here)
- ✅ Exploration complete
- ✅ Clarifying questions complete
- ❌ Propose 2-3 architectural approaches with the answered constraints baked in. Lead with recommendation. (Most of the architectural picture is already settled by Q1=D; this section should be brief — mostly the "where exactly does the recipe override logic live: in the wizard's
_prepare_order_vals, or post-confirm in_fp_auto_create_job, or a model hook?") - ❌ Present design in sections, get approval after each:
- Section 1 — Header layout + field-to-model mapping
- Section 2 — Line widget design (the spreadsheet table behavior)
- Section 3 — Masking + baking override flow at job creation
- Section 4 — Currency switcher mechanic
- Section 5 — Inline part create + drawing upload buttons
- Section 6 — Phase-out path for direct order
- ❌ Write design doc to
docs/superpowers/specs/2026-05-25-express-orders-design.mdand commit - ❌ Spec self-review + user review gate
- ❌ Transition to writing-plans skill (after user approves spec)
Lesson: SKIP the visual companion on this user's setup
The user runs Claude Code from their Mac via Tailscale into a Windows machine (this Home host). Browser previews bound to localhost on the Windows side are unreachable from the Mac browser. The bash-script brainstorm server (port 65170) hit this. The Python http.server (port 8765) hit this. We spent 20 minutes fighting it.
Resolution: the user said to switch to a native Mac Claude Code session entirely. On Mac the visual companion should "just work" — but consider whether it's necessary. The user already provided an Excel mockup as reference. Text-based design discussion using ASCII tables / structured lists is plenty for this feature. Don't push the visual companion unless the user explicitly asks for it.
Recent in-flight work (NOT Express Orders, but on the same Windows host)
For context: this Windows session also shipped these things today (2026-05-25) — they're DEPLOYED on entech but may need follow-up on the Mac:
- Tablet PIN self-service (cycle 4) — fully shipped, code 4018 last sent.
fusion_plating_shopfloor19.0.36.0.3. Three improvements during the day: SCSS undefined-variable bug fix, switch toforce_send=True, mail templateemail_fromaligned to mail-serverfrom_filter(fixes M365 DMARC misalignment / delivery delay). - fp_shopfloor_landing removal — entire OWL component deleted, QR scanner ported into
fp_plant_kanban, all references cleaned up. Same module version above. - Tablet lock-screen orphan localStorage — cleared
fp_landing_station_idto fix empty-tiles bug.
All committed to git on main. Pushed via the multi-remote (GitHub + Gitea). On Mac, you'll need to git pull origin main from the fresh local clone before doing anything.
Files written this session that the new Mac session should know exist
K:\Github\Odoo-Modules\fusion_plating\.claude\launch.json— Mockups preview config (port 8765). Mac equivalent path will be the same but on local Mac filesystem.K:\Github\Odoo-Modules\fusion_plating\.claude\mockups\index.html— 15KB layout-direction mockup with A/B comparison. Can be deleted (was for the failed Windows-side preview); if you want to show it on Mac it works fine.K:\Github\Odoo-Modules\fusion_plating\.superpowers\brainstorm\944-1779751836\— dead bash-script brainstorm server directory; safe to delete.- This handoff doc.
End of handoff.