Four visible bugs reported by user after deploy:
1. Type + Unit pills overlapped at top-right of every card.
Root cause: both <field>s carried the same .o_fp_iw_meta class
AND both mapped to grid-area: meta. CSS Grid stacked them on
top of each other so the labels rendered as overlap garbage
(e.g. "eachnber", "Time(secs)Time(seconds)").
Fix: distinct classes (.o_fp_iw_meta_type / .o_fp_iw_meta_unit)
each in its own grid column. Grid is now 4 columns wide:
"prompt | type | unit | trash"
2. Input borders barely visible in dark mode (#343942 on #22262d).
Operators couldn't tell where to click.
Fix: brighter border using $fp-iw-ink-faint instead of $fp-iw-border.
Hover bumps to $fp-iw-ink-mute. Focus uses brand purple. Also
added a slight surface tint ($fp-iw-page) so empty inputs read
as obviously-interactive instead of blending into the card.
3. Photo widget rendered enormous (full card width).
Root cause: max-width applied only to the preview image, not
to the .o_field_image container itself.
Fix: max-width 240px on .o_field_image AND its inner controls.
4. Numeric values floated centered in empty space.
Root cause: input width wasn't stretching to its grid cell;
default Odoo numeric-cell text-align: right plus our missing
width: 100% left tiny inputs centered in the value area.
Fix: explicit width: 100%, text-align: left, and 420px
max-width on the .o_field_widget container.
Bonus polish:
* Trash icon hidden by default (opacity: 0), reveals to 0.6 on
row hover, full opacity on direct hover. Reduces visual noise
for the common case where operator just types and saves.
* Boolean toggle scale bumped from 1.4 to 1.5 + adds left margin
so the switch sits properly inside the value cell.
* Mobile (<900px) grid collapses to: prompt|trash / type|unit /
value / extras — keeps the type+unit pair on one row but lets
them flow naturally below the prompt.
No model changes. SCSS + XML view only. v2 view still in place
for instant rollback.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fusion_plating_jobs
Native plating job bridge — wires fp.job and fp.job.step (defined in
fusion_plating core, Phase 1 of the migration spec dated 2026-04-25)
into the rest of the Fusion Plating module family: configurator, portal,
logistics, quality, certificates, batches, KPI, notifications, reports.
Coexists with fusion_plating_bridge_mrp during the migration period.
The x_fc_use_native_jobs settings flag (default: False) toggles the
behaviour. When False, SO confirm continues to create mrp.production
records through bridge_mrp. When True, SO confirm creates fp.job
records here.
See docs/superpowers/specs/2026-04-25-fp-native-job-model-design.md
for full design rationale and §6 of the implementation plan for phase
breakdown.
Phase 6 — deferred items
Phase 6 originally scoped the full operator UI rewrite. With Tailscale SSH to entech currently unavailable we cannot live-test OWL/JS in the browser, so Phase 6 ships a lean version: the data-layer endpoints land now, the rendering UI lands later.
Deferred to post-cutover hardening:
- Plant Overview kanban over
fp.job.step— replacesfusion_plating_shopfloor'smrp.workorderkanban. - Tablet Station UI rewrite over
fp.job/fp.job.step. - Manager Dashboard rewrite.
- Process Tree OWL component — currently a stub:
/fp/jobs/process_treereturns the serialized recipe tree as JSON, but the OWL component to render it is not built.
Rationale: these are large OWL/JS components that need live in-browser
verification on entech. Under the migration's parallel-coexistence
strategy, operators continue using the existing shopfloor UI (bound to
mrp.workorder) until cutover. After cutover, the operator UI rewrite
becomes its own focused project — the data layer (fp.job,
fp.job.step, time logs, timestamps) is fully in place from
Phase 1–5.
Phase 6 — what shipped
/fp/job/<id>— scan-redirect controller. The fp.job sticker QR encodes this URL. Routes managers to thefp.jobform; routes operators to the same form for now (will swap to the process tree client action once the OWL component lands)./fp/jobs/process_tree— JSON-RPC endpoint that returns the recipe tree for a job, with each node tagged by its matchingfp.job.stepstate, ready for an OWL component to consume.