Skip to Content

Sheet drawing completion roadmap

Primary deliverable: a usable, validated glass drawing connected to a sale order line. A salesperson can create it from the line, edit and save it, approve a numbered revision, download the correct PDF and reopen it without losing prior approved evidence.

Check items only after implementation and focused validation. Existing features below are confirmed by source inspection and recorded historical acceptance; tests were not rerun for this roadmap refactor. Unchecked items distinguish work to implement from acceptance still to prove.

Definition of a fully functional drawing part

For the supported shapes and fabrications, complete means:

  • One drawing configuration per sale order line, with clear navigation in both directions and explicit behavior for new/unsaved lines and copied quotations.
  • Reliable dimensions, fabrications and finishing instructions, with normal Save/Discard, visible invalid-draft feedback and server-side approval guards.
  • Separate editable draft and approved revision identities; an in-progress change never replaces the last approved PDF or silently changes dispatched evidence.
  • A readable PDF with design/revision, order/line identity, dimensions, coordinate conventions, fabrications and specifications, available to authorized users directly from the sales workflow.
  • No requirement to manufacture a sheet merely to draw and approve it.
  • Deterministic model/security/report checks and actual sale-order browser acceptance in English and Slovenian on desktop and mobile.

Completion covers rectangles, circles, ellipses and centered isosceles trapezoids, with circular holes and axis-aligned rectangular notches/slots. Arbitrary polygons, rotated cuts, CAD imports, customer portal approval and machine instructions are separate enhancements. Numeric dimensions and fabrication creation through the table are supported workflows; direct drawing creation/resizing tools are optional.

Completed foundation — reuse rather than rebuild

  • [x] Four supported outlines, exact fabrication containment/overlap checks and visible invalid-draft feedback; invalid layouts cannot be approved.
  • [x] Gross/net area and weight, descriptive material/treatment/coating instructions, original-outline finishing lengths, and named straight-edge/whole-outline finishes.
  • [x] Numeric placement helpers, duplicate/mirror/center/offset and hole patterns.
  • [x] Drawing selection/movement, snapping, keyboard/touch controls, zoom/fit and positional undo/redo using the form's Save/Discard buffer.
  • [x] Responsive numbered anchors and readable fabrication details, including paginated fabrication tables and newly saved rows.
  • [x] One configuration per sale line enforced by a database constraint; existing-line action defaults and explicit product/count reconciliation.
  • [x] Sale-line description updates preserve customer notes.
  • [x] Numbered immutable approval snapshots/PDFs, reopen history and DRAFT printing.
  • [x] Personal-sales/company rules, direct attachment protection and portal denial.
  • [x] Optional product-company sharing compatibility without widening visibility.
  • [x] Templates, independent draft copies, stable references and archiving.
  • [x] Existing manufacturing links, split/backorder revision retention and partial cancellation/replacement protection.
  • [x] Recorded model, PDF, HOOT and real-form English/Slovenian acceptance for the existing editor; exact historical results and metric limits are retained below.

Iteration 1 — complete the sale-line entry and ownership workflow

Outcome: users start from their real quotation line and return to it with the correct drawing, without manufacturing-specific product defaults changing that line.

Baseline gaps: the action defaulted only stockable Unit products, fell back to the seed product for other products, and the drawing model enforced stockable Unit products on save. Existing browser acceptance opens drawing forms directly; it does not prove the complete quotation-line entry and return path.

Implementation and acceptance: Iteration 1 is implemented. The scoped model suite passes 235 tests with 930 statements and 326 branches, both at 100% coverage. English and Slovenian browser runs each pass 21 HOOT tests on both presets, eight shape/viewport cases, four editing-boundary cases and four ordinary-sales quotation/drawing/copy cases. These include an unsaved quotation, unsaved lines, Unit/Surface products, explicit saving, return/reopen and independent copies. Editor coverage is 231/231 CDP executable locations, 39/39 V8 functions and 105/105 observed block ranges; these are not Istanbul statement/branch metrics. Evidence: /srv/pmiverse/logs/tests/20261008_154450/, /tmp/glass_sale1_browser_en_final_20261008/ and /tmp/glass_sale1_browser_sl_final_20261008/. The final fresh-install gate and static checks are recorded in the acceptance note below. No application database or production credentials are changed.

Save/Confirm follow-up: the hidden manufacturing-history field was editable and new forms submitted its empty value, triggering the direct-workflow-write guard for Manufacturing users. Approval/manufacturing history is now read-only in the model, with the hidden form field explicitly read-only as well. Six native Odoo Form regressions cover sales-only, Manufacturing-only and combined-role users, both saving first and saving immediately before confirmation. Before the fix, four Manufacturing-role cases failed and the two sales-only cases passed. The fresh disposable-install suite now passes 241 tests with 100% Python statement and branch coverage; the backend workflow guard remains intact. Changed-file IDE inspections report no diagnostics, and scoped Ruff/format/pylint checks pass. Evidence: /srv/pmiverse/logs/tests/20261008_161015/ (reproduction) and /srv/pmiverse/logs/tests/20261008_161108/ (acceptance). Browser suites were not rerun for this follow-up; the earlier browser evidence remains historical.

Save-first policy: unsaved-line drawing actions are hidden rather than relying on Odoo's inert new-row buttons. The quotation shows translated saving guidance. Native mobile cards expose drawing reference/status and actions; the source selector also displays and searches references. Seeded drawing numbering is shared across companies, including on upgrades, without resetting its format or counter.

Deletion policy implemented: a linked drawing blocks line/order deletion, including when archived. A draft without approval/production history can be explicitly removed first. A drawing with history cannot detach/change its sale line; a drawn line cannot change its order, and its order cannot change company. Salesperson reassignment continues to follow existing ownership rules.

  • [x] Implement: separate drawing product eligibility from direct-manufacturing eligibility. Preserve the accessible sale-line product on a drawing even when its sales UoM is Surface; retain stockable Unit checks at direct MO dispatch. Do not silently substitute the seed product for a linked line.
  • [x] Implement: keep physical sheet count explicit. Unit quantities may supply the count through category-compatible conversion; Surface quantities must not be converted to pieces without a defined measurement factor. Leave native sale quantities unchanged while creating/editing drawings.
  • [x] Implement or prove: Configure Glass on an unsaved quotation/line follows an explicit save-first flow and opens exactly one persisted configuration. Repeated clicks cannot create duplicate or disconnected drawings.
  • [x] Implement: provide a clear return/open action to the owning sale order/line, and expose drawing status/reference from the line without requiring MRP access.
  • [x] Implement or prove: copying an order/line offers an explicit independent draft copy of the design, with a new reference and no inherited approval/production evidence. Never share one mutable drawing between different sale lines.
  • [x] Implement or prove: prevent linking section/note lines, cross-company lines or unauthorized lines through both UI and RPC. Preserve standalone templates.
  • [x] Prove: order/line deletion, cancellation, archival and reassignment retain approval evidence and appropriate access. In particular, deleting a line must not silently turn its approved drawing into a broadly visible standalone design.

Acceptance: create a quotation and line, open/create the drawing, save, return, open again and duplicate into another quotation. Repeat with Unit and Surface products and non-superuser sales roles. Product, order identity and existing sales quantities remain correct throughout.

Final acceptance (2026-10-08): fresh installation and all 235 tests pass through run_pytest_repo.sh --addons <this addon> --db-prefix test_glass_sale1accept_20261008_ --parallel 1 -- -q --cov-branch --cov-fail-under=100. Evidence: /srv/pmiverse/logs/tests/20261008_155914/. Statement/branch coverage remains 930/930 and 326/326. Direct configured Ruff lint/format, the scoped lint wrapper, Node syntax, gettext format checks and git diff --check pass. All 63 addon files are inspected with IDE warnings enabled and have zero diagnostics; intentional Odoo method overrides and five incorrectly resolved references in the inherited sale-line kanban have narrow inspection suppressions. The latter are verified by Odoo view loading and both language/viewport browser runs, rather than hiding a runtime reference failure. The addon's README parses without docutils warnings. The installed mail dependency emits two pre-existing description diagnostics; its README remains unchanged outside this addon's scope. Disposable processes, credentials, database and filestores are cleaned up after evidence collection. Iterations 2–4 remain open; these results do not claim the complete drawing roadmap is finished.

Iteration 2 — finish drawing authoring as a complete user journey

Outcome: an ordinary salesperson can describe and correct every supported drawing through the existing form without technical help.

The editor itself is already implemented. This iteration closes workflow gaps found by real quotation-driven acceptance; it does not prescribe a new CAD editor.

Implementation: mobile acceptance exposed a shape-picker crash caused by the removed kanban_image helper. The catalog now uses Odoo 18's native image widget. Placement pickers previously exposed technical fabrication IDs; their searchable labels now show coordinates, exact sizes and optional notes without language-specific dimension prose. Numeric editing remains authoritative, and existing validation and save-first guidance are retained.

Focused model acceptance passes 246 tests with 937 statements and 328 branches, both at 100% coverage. New regressions cover searchable fabrication identities and independent copies of active/archived templates with another customer's approval and canceled production history. English and Slovenian combined browser acceptance each passes 21 HOOT tests on each preset, eight existing shape/viewport cases, four ordinary-sales boundary cases, four sale-line entry/copy cases, eight complete authoring journeys and two template-reuse cases. All boundary fixtures now enter through their quotation lines; unsaved moves survive three-page pagination before Save, with no intervening backend writes. Editor coverage is 231/231 CDP executable locations, 39/39 V8 functions and 104/104 observed block ranges; these are not Istanbul statement/branch metrics. Evidence: /srv/pmiverse/logs/tests/20261008_165542/, /tmp/glass_author2_browser_en_final_20261008/ and /tmp/glass_author2_browser_sl_accept_20261008/.

Final acceptance (2026-10-08): the fresh disposable-install model/coverage gate uses run_pytest_repo.sh --addons <this addon> --db-prefix test_glass_author2final_20261008_ --parallel 1 -- -q --cov-branch --cov-fail-under=100. The final dimension/type label regressions also pass through the scoped addon runner (three tests). Configured Ruff lint/format, the scoped pylint wrapper, Node syntax, gettext format checks and git diff --check pass. All 65 addon files and the repository README have zero IDE diagnostics with warnings enabled; evidence is /tmp/glass_author2_ide_20261008.json. The addon README parses without docutils diagnostics; the dependency's two pre-existing description diagnostics remain outside scope. Disposable databases, filestores, HTTP/Chromium processes and credentials are cleaned up after evidence collection. No application database is changed. Iterations 3 and 4 remain open.

  • [x] Prove: enter shape/dimensions/thickness, add/edit/remove holes and notches/slots, apply placement helpers and finish instructions, then Save/Discard from the actual sale-line flow. Show where to save new rows before selecting them.
  • [x] Prove: shape/dimension changes, table edits and pagination update the drawing, selection and move history correctly, without losing unsaved data.
  • [x] Prove: invalid/incomplete drafts have actionable feedback; correcting them restores approval. UI and direct RPC enforce the same geometry rules.
  • [x] Prove: combined specifications, edge finishes and fabrication annotations are readable for dense drawings and all four shapes at both viewport widths.
  • [x] Implement only where acceptance reveals a gap: concise validation/help text, focus/navigation and recoverable errors. Preserve numeric editing as the authoritative way to set exact dimensions.
  • [x] Prove: templates create independent drafts with the requested sale-line owner and do not copy another customer's approval or production links.

Acceptance: a user completes one drawing of each supported shape, including a hole pattern, boundary notch, interior slot and applicable edge finishes; saves, discards a later change, corrects an invalid placement and approves successfully.

Iteration 3 — approved revisions and PDFs in the sales workflow

Outcome: users can tell which drawing is approved, obtain it from the sale line and preserve exactly what was previously approved.

Baseline gaps: reopening clears the active revision/PDF pointers while preserving history; the sale line exposes the configuration but no explicit approved-revision selection or PDF action. The drawing PDF lacks explicit customer/order/line identity. Existing report/security tests do not prove quotation-driven PDF download usability.

Implemented revision rule: the drawing form shows the editable draft; the sale line separately exposes the latest approved revision until a new one is approved. Historical revisions remain selectable/downloadable, and dispatched MOs keep their own pinned revision. Approval applies to the saved revision, not the editable draft.

  • [x] Implement: expose draft status and latest approved revision distinctly on the sale line, including after reopen. Clearly label an approved drawing as superseded when a newer approval exists; do not imply approval of the current draft.
  • [x] Implement: open/download the current approved PDF and any historical PDF from the sale-line drawing workflow using normal attachment access.
  • [x] Implement: capture customer/order/line identification in approval evidence and the generated PDF. Later edits to order names/customer data must not rewrite an already approved PDF.
  • [x] Prove and improve where needed: PDF outline, dimensions, coordinate origin, fabrication numbers/table, finishing instructions and revision labels are readable for small/large and dense designs; avoid clipping and unusable pagination.
  • [x] Prove: draft printing remains labeled DRAFT, approval/PDF generation failures roll back cleanly, and repeated/concurrent approval cannot create inconsistent revision numbers or incomplete evidence.
  • [x] Prove: reopen, edit and reapprove leaves previous snapshot/PDF checksums intact; draft drawing changes do not silently publish themselves as approved revisions.
  • [x] Prove: PDF download through the actual binary URL enforces salesperson/company access after ownership changes. Keep customer sharing outside this iteration; portal access remains denied.

Acceptance: approve R1, download it from the sale line, reopen/edit, obtain R1 while the draft is in progress, approve R2 and download either revision. R1 is byte-for-byte unchanged and the sale line visibly distinguishes draft, current and historical status.

Implementation (2026-10-08): the sale line exposes draft/drawing status separately from its latest approval, plus Approved PDF and Approved Drawings actions. Revision forms/lists label superseded evidence and open/download the original attachment under normal authorization. Frozen sales identity belongs to the snapshot and PDF. Publication uses a savepoint, the existing row lock and a unique revision-number constraint; caught failures and competing transactions cannot publish partial evidence. Manufacturing pins are unchanged.

Real-PDF acceptance exposed SVG attribute case lost by the HTML field converter. The report now preserves vector SVG directly, with fixed dimensions, readable numbered callouts/leader lines and repeated table headers. Twelve real-wkhtmltopdf cases cover every shape at 50, 1000 and 10000 mm with 90 fabrications. Extracted text/coordinates prove all numbers/table rows, identity, origin, finishes and revision labels are present, anchors do not overlap and all text remains inside page bounds. Drafts retain the DRAFT label. Rendering, attachment and sales-publication failures roll back; failed replacement approval preserves R1 and its editable replacement draft.

Current fresh-install model acceptance passes 268 tests, with 1017 statements and 340 branches, 100% each, through run_pytest_repo.sh --addons <this addon> --db-prefix test_glass_revision3accept_20261008_ --parallel 1 -- -q --cov-branch --cov-fail-under=100. Evidence: /srv/pmiverse/logs/tests/20261008_174401/. The concurrent regression proves one complete R1, one serialization retry and rejection after retry; its committed synthetic fixture is explicitly cleaned up. Final combined browser acceptance passes independently in English and Slovenian: 21 HOOT tests / 86 assertions on each preset, eight shape/viewport cases, four sales boundary cases, four sale-line entry/copy cases, ten authoring/template cases and two new approval/PDF journeys per language. R1 downloads complete from the sale line, history list and revision form; inline and download binary URLs return unchanged evidence. R2 differs from R1 and remains unchanged after sales-label edits. Previous owners lose binary access, new owners gain it, and foreign-company sales, portal and anonymous requests are denied. Download actions use Odoo's download target; browser checks use native clicks and wait for completed files and actual form state. Frontend coverage stays 231/231 executable locations, 39/39 functions and 104/104 observed V8 blocks per language; these are not Istanbul metrics. Artifacts: /srv/pmiverse/logs/tests/20261008_174401/browser-en/ and browser-sl/.

Configured Ruff lint/format, scoped pylint wrapper with inspected diagnostics, all changed Node syntax checks, gettext syntax/format and git diff --check pass. All 321 current messages have non-fuzzy Slovenian translations with HTML-tag parity. The addon README parses without docutils diagnostics; the dependency's two existing description diagnostics remain outside scope. All 66 addon files plus the repository README have zero IDE diagnostics, including weak warnings. Three additional inherited sale-line kanban references use the existing narrow suppression for the IDE's incorrect parent-model resolution; runtime view loading and both browser languages prove them. No production database, dependency installation, deployment, commit or push is involved. Iteration 4 remains open for its separate end-to-end handoff acceptance. Cleanup verifies all three owned disposable databases/filestores are absent; the owned Odoo/Chromium processes are stopped and the temporary password/profile are removed. Logs, coverage, synthetic PDF layouts and both browser runs remain under the evidence directory.

Iteration 4 — drawing completion acceptance and handoff

Outcome: iterations 1–3 are proven together, with no unresolved drawing defects.

  • [x] Add deterministic coverage for changed ownership, UoM/count handling, copy/ deletion rules, revision selection and PDF metadata/access. Reuse existing geometry/editor/revision tests rather than duplicating their implementation.
  • [x] Extend the real-browser runner to start from a sale order and exercise the line action, return navigation, duplication, editing, approval and actual PDF downloads as non-superuser sales roles.
  • [x] Run the complete drawing journey in English and Slovenian on desktop/mobile; include read-only approved drawings, reopened drafts and actionable failure cases.
  • [x] Run scoped addon tests, existing HOOT/browser checks and configured static checks on the final filesystem. Recheck optional company-addon installation combinations when ownership/product changes affect that contract.
  • [x] Update maintained READMEs and acceptance evidence with what actually passes, remaining limitations and disposable-data cleanup; no deployment is implied.

Use the repository's scoped run_pytest_addon.sh or run_pytest_repo.sh --addons and run_lint_addon.sh --addon ... --check. Database/browser checks require authorized disposable infrastructure. Historical 100% Python/V8 coverage is not proof of this new workflow; Istanbul instrumentation is optional and does not block functional completion.

Final acceptance (2026-10-08): Iteration 4 is complete on branch 18.0, from the clean e97c543 baseline. Six composite model regressions connect Unit, Dozen and Surface count handling to independent copies, R1/R2 selection, frozen sales identity, archived deletion guards and ownership reassignment. The company-change wizard fixture explicitly shares its product so standard Sales company checks permit reaching the wizard's own guard with the optional sharing addon installed.

The browser runner now duplicates quotations through the native Actions menu and continues all four copied Unit/Surface drawings through approval, reopening, editing, reapproval and completed current/historical PDF downloads. Downloaded files must match the corresponding approved binary's SHA-256 checksum. Native clicks use instant scrolling, settled layout and a button hit test to avoid opening the mobile line dialog accidentally. Authoring accepts both installed Slovenian catalog translations of Move up, while English fallback still fails.

The fresh-install gate passes 274 tests, with 1017 statements and 340 branches, 100% each, using run_pytest_repo.sh --addons <this addon> --db-prefix test_glass_handoff4accept_20261008_ --parallel 1 -- -q --cov-branch --cov-fail-under=100. Focused company/count/copy/access checks pass 30 tests each with the real pmis_base_multi_company installed before and after the configurator. These matrix checks are scoped regressions, not full-suite coverage runs. Installation states are independently asserted before disposable cleanup.

Final English and Slovenian browser runs each pass 21 HOOT tests / 86 assertions on each preset, plus 32 real-browser cases: eight shape/viewport checks, four editing boundaries, four native quotation entry/return/duplication/copy journeys, ten authoring/template cases and six approval/PDF journeys. Each language includes four complete copied Unit/Surface handoffs at both widths. Approved drawings are read-only, reopened drafts retain R1, R2 and historical downloads match the approved bytes, and ownership/company/portal/anonymous denial is proved through actual binary URLs. Editor coverage is 231/231 executable locations, 39/39 functions and 104/104 observed block ranges in each language; these are CDP/V8 metrics, not Istanbul statement/branch coverage.

Configured Ruff lint/format, scoped pylint, Node syntax, gettext format checks, README parsing and git diff --check pass. All 67 addon/repository-README files have zero IDE diagnostics with warnings enabled; changed files are rechecked after their final edits. The installed mail dependency's two pre-existing description diagnostics remain outside this addon's scope. Initial fixture, language-cache, translation-selector and mobile-pointer diagnostic attempts remain separate from the passing final evidence.

Evidence: /srv/pmiverse/logs/tests/20261008_185042/, including browser-en/, browser-sl/, matrix logs, lint output, IDE inspections and cleanup.log. All four owned disposable databases/filestores, HTTP/Chromium processes, browser profiles and temporary credentials are removed. No application database or deployment is changed. The implementation changes two model-test files, three browser helpers and the maintained READMEs/testing roadmap; runtime models, security and report behavior needed no correction. Later integrations remain independent follow-ups below.

Later integrations — independent of drawing completion

These are separate follow-up work, not an unfinished drawing iteration.

  • [ ] Measurement bridge: agree shape-aware geometry ownership, units/precision, explicit synchronization and preservation of native sale/stock quantities. Rectangular recomputes must not overwrite nonrectangular drawing measurements.
  • [ ] Manufacturing handoff: choose one demand owner, carry sale-line/revision links through dispatch/splits/backorders/replacements, and preserve normal BoM selection. The drawing workflow must remain usable without dispatching an MO.
  • [ ] Planning/report adapters: expose accessible approved drawings and reference/ revision in existing worklists while preserving demand, filters and access rules.
  • [ ] Machine export: verify raw-component geometry, orientation, allowances and supported fabrication/shape representations against accepted machine samples. Reject unsupported geometry rather than silently flattening it into a rectangle.
  • [ ] Declare optional bridge dependencies and cover repeated synchronization, installation combinations, company isolation and dispatched-revision immutability.

Historical implementation evidence

The entries below retain the former implementation sequence and its original iteration numbers. Those numbers do not refer to the new drawing-completion iterations above. They describe past runs, not fresh acceptance for this roadmap.

Evidence and progress

  • 2026-10-08: baseline reviewed on branch 18.0, revision 744d8b5; clean worktree.
  • Implementation and disposable-database tests authorized by the user.
  • 2026-10-08: iteration 1 implemented. The module is undeployed; its original version 18.0.1.0.0 is retained, with no migration or legacy-compatibility code.
  • Final scoped runner after removing migration support: 168 passed; 735 statements and 260 branches covered, 100% each. Fresh installation, real PDF rendering, personal-sales/portal/company restrictions, native MRP splitting, partial-cancellation recovery, immutable snapshots/attachments, numeric placement and templates are covered.
  • Command:
/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_undeployed_20261008_ --parallel 1 \
  -- -q --cov-branch --cov-fail-under=100
  • Evidence: /srv/pmiverse/logs/tests/20261008_072152/pmis_sheet_configurator.log, pmis_sheet_configurator/coverage.xml and pmis_sheet_configurator/htmlcov/ under that run directory. Disposable database test_glass_undeployed_20261008_pmis_sheet_configurator was removed by the runner.
  • Direct repository-configured Ruff, the scoped lint wrapper (including pylint-odoo error checks), physical Python line-length checks and git diff --check pass.
  • Addon-wide IDE inspections, including Python, XML, SCSS, translations and documentation, report zero warnings/errors. IDE build reports success but cannot collect detailed build diagnostics; database-backed imports and execution provide runtime syntax evidence.
  • Existing dependency RST messages remain in the installation log; they are excluded from remediation by the runner manual. No browser acceptance or production upgrade was performed. Coverage is evidence of exercised branches, not manufacturing certification.
  • Standalone designs are deliberately shared within allowed companies. Manufacturing profiles use conservative rectangular edge expansion and exempt boundary notches.
  • Partial cancellations replace only unfinished demand under the existing revision; reopening a partially completed batch is blocked to prevent duplicate production.
  • Slovenian localization: 83 missing translations filled; all 232 active messages are translated with no fuzzy entries. Gettext syntax/format checks, placeholder and HTML-tag parity, current POT completeness and IDE inspections pass. Existing translations are preserved; runtime Slovenian UI verification remains pending.

Iteration 2 progress — 2026-10-08

  • Baseline: branch 18.0, revision 2646d81, clean worktree. Changes are confined to this addon and the owning repository's directly maintained README.
  • Delivered descriptive material, treatment and coating specifications plus whole-outline and individual straight-edge finishing instructions. Draft feedback rejects overlapping targets and individual edges on curved sheets. RPC approval guards cover additions, edits, deletions and moves between designs.
  • Templates copy specifications and finishes into independent drafts. Quotation descriptions preserve existing notes; immutable numbered snapshots and protected PDFs capture the instructions and lengths. Real HTML/PDF rendering is covered, including escaping of untrusted instruction text.
  • Rectangles and centered trapezoids expose bottom/right/top/left lengths; circles expose circumference; ellipses use Ramanujan's second perimeter approximation. These are original-outline lengths without notch deductions or cutout boundaries, displayed to four decimal places in meters. Specifications do not alter density, product selection, bills of materials or manufacturing routes.
  • Final scoped runner: 196 passed; 828 statements and 286 branches covered, 100% each, including 28 additional deterministic cases. The initial run exposed five assertions tighter than the declared four-decimal field precision; assertions now use half a last decimal place as their absolute tolerance.
  • Command:
/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_it2_final_20261008_ --parallel 1 \
  -- -q --cov-branch --cov-fail-under=100
  • Evidence: /srv/pmiverse/logs/tests/20261008_075559/pmis_sheet_configurator.log, with pmis_sheet_configurator/coverage.xml and pmis_sheet_configurator/htmlcov/ under that run directory. Disposable database test_glass_it2_final_20261008_pmis_sheet_configurator was removed by the runner.
  • Repository-configured Ruff lint and formatting, the scoped lint wrapper with central pylint-odoo configuration, physical Python line lengths and git diff --check pass. Addon-wide IDE inspections report zero warnings/errors.
  • The configured single-addon Odoo exporter regenerated the POT. Its verified-unused disposable database l10n_pmis_sheet_configurator was removed after export. Thirty new Slovenian terms were added without replacing existing translations; all 262 current POT messages are translated with no fuzzy entries. Gettext syntax/format, placeholder parity, HTML-tag parity and completeness checks pass.
  • Interactive editing, browser acceptance and sibling-addon bridges remained later work at iteration 2 closure. Slovenian browser verification and production deployment were not performed in that iteration.
  • 2026-10-08 lint follow-up: removed redundant material/treatment field labels, moved the transient placement helper into wizards/ and refreshed translation source references. Public revision creation/writes intentionally always fail; method-local method-required-super exceptions document this security boundary rather than adding unreachable or permission-bypassing superclass calls. The user's full-repository pylint command (odoolint, disabling only W8301/C8101) reports 10.00/10 with no diagnostics. Scoped Ruff, lint-wrapper and IDE checks pass. Regression evidence: 196 passed, 100% statement/branch coverage, in /srv/pmiverse/logs/tests/20261008_080157/pmis_sheet_configurator.log; its test_glass_lint_20261008_pmis_sheet_configurator database was removed.

Iteration 3 progress — 2026-10-08

  • Baseline: branch 18.0, revision dfbe2ad, clean worktree. Changes are confined to this addon and the owning repository's directly maintained README; no sibling addons, dependencies, production databases or deployment were changed.
  • Added the iteration 3 checklist for interactive drawing editing.
  • Delivered an OWL drawing field using the existing server-rendered SVG. Saved fabrications can be selected and dragged; screen coordinates use the actual SVG matrix and invert Y into bottom-left sheet coordinates. Snapping rounds absolute coordinates to a finite grid of 0–1,000 mm. Arrow keys move one grid step, or 1 mm without snapping; Shift multiplies the step by ten. Zoom is bounded to 50–400%.
  • Moves update Odoo's one2many form buffer, not direct write RPCs. Save/Discard determines persistence. Positional undo/redo survives successful moves and is invalidated by external geometry, fabrication, coordinate or record changes. Failed updates do not create history, and failed undo remains retryable. Escape, pointer cancellation and scale/selection changes cancel the drag preview.
  • Approved designs retain zoom but hide editing controls. Existing server draft, ownership and company guards remain authoritative for writes. Saved fabrication identities appear on SVG shapes and callouts; unsaved rows have no selectable ID. New rows must be saved first. Selection covers rows loaded in the fabrication table; additional pages must be loaded there. Sizes remain numeric inputs.
  • Scoped Python runner: 199 passed; 828 statements and 286 branches covered, 100% each. Three new cases cover SVG identities, unsaved onchange rows and buffered parent writes with validation and approved-design denial. Existing tests continue to cover all supported sheet shapes and security boundaries.
/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_it3_20261008_ --parallel 1 --keep-db \
  -- -q --cov-branch --cov-fail-under=100
  • Evidence: /srv/pmiverse/logs/tests/20261008_083241/pmis_sheet_configurator.log, with pmis_sheet_configurator/coverage.xml and pmis_sheet_configurator/htmlcov/ under that run directory. The database was retained solely for scoped browser tests and removed after those tests.
  • Native Odoo HOOT exception: the standard pytest wrappers do not start the HTTP server required by Odoo's browser suite. Only this addon's HOOT file was selected through Odoo's existing desktop/mobile WebSuite, on the same disposable database and a loopback-only HTTP server. No repository-wide test suite was executed. 12 tests pass on desktop and 12 on mobile, 47 assertions per suite. Cases cover buffered save/discard, snapping, zoom, approval visibility, stale history, failed moves/undo, SVG coordinate conversion, cancellation and unsaved rows. These are browser component/form tests with mocked models; complete real-form browser acceptance and fabrication-callout readability remain unchecked. Frontend coverage percentages were not measured and are not included in Python coverage claims.
/srv/pmiverse/_pmisuite18/venv/bin/python \
  /srv/pmiverse/_pmisuite18/repos/OCB/odoo-bin \
  -c /srv/pmiverse/_pmisuite18/config/pmisuite18.conf \
  -d test_glass_it3_20261008_pmis_sheet_configurator -u web --test-enable \
  --test-tags '/web:WebSuite.test_unit_desktop[@pmis_sheet_configurator/glass_drawing_editor],/web:MobileWebSuite.test_unit_mobile[@pmis_sheet_configurator/glass_drawing_editor]' \
  --http-interface=127.0.0.1 --http-port=18083 --gevent-port=18084 \
  --max-cron-threads=0 --stop-after-init --log-level=test \
  --logfile=/tmp/glass_it3_hoot_verified.log
  • Initial browser runs exposed mock-model setup and test-helper API mismatches, then an assertion that omitted the unchanged Y coordinate in Odoo's write command. Those test issues were corrected before final acceptance.
  • Repository-configured Ruff, the scoped lint wrapper with central pylint-odoo configuration, physical Python line lengths and git diff --check pass. Addon-wide IDE inspections, including the editor and tests, report zero warnings/errors after correcting type information and deprecated test imports.
  • The configured single-addon exporter regenerated the POT and removed its verified-unused localization database. The exporter needs the project virtualenv on PATH for its Odoo subprocess. Ten new Slovenian terms were added, preserving existing translations; all 272 current POT messages are translated with no fuzzy entries. Gettext syntax/format and completeness checks pass. Runtime Slovenian browser verification remains pending.

Iterations 3 closure and 4 progress — 2026-10-08

  • Baseline: branch 18.0, revision 37e44f4, clean worktree. Scope is this addon and the owning repository README. The user authorized tests and disposable databases for the drawing workflow.
  • Iteration 3 browser acceptance is complete. The drawing field occupied the group's narrow label column; it now spans both columns. The outline fits the drawing viewport before zooming. Numbered fabrication anchors remain 14 screen pixels on resize/zoom, with full readable type/coordinate/size details below. Server SVGs and approved PDFs retain their complete annotations.
  • Iteration 4 delivers previous/next selection, Page Up/Down, focus after selection, accessible move buttons and Ctrl/Command + Z with Shift for redo. Modified arrow shortcuts remain available to the browser. Pointer capture and previews are released on unmount. Numbering accounts for unsaved preceding rows and pagination.
  • Native HOOT: 21 tests and 86 assertions pass on desktop and on mobile. Added cases exercise navigation, touch-button buffering, shortcuts, missing relations/drawings, readonly/busy/history guards and readable annotations.
  • Real-form acceptance: eight cases pass, covering rectangle, circle, ellipse and trapezoid at 1440 px and 390 px widths. Actual mouse/touch drags, buffered edits, undo/redo, Save, Discard and responsive bounds are checked. Approval creates a revision/PDF; zooming the approved form preserves both revision and attachment. Desktop/mobile screenshots were visually inspected for readable callouts.
  • Frontend: 231/231 executable locations, 39/39 functions and 104/104 observed V8 block ranges covered, 100% each. The source is identical across both HOOT presets and the real forms. These are Chrome DevTools/V8 metrics, not Istanbul statement/branch instrumentation. Generated wrappers, XML templates and Odoo dependencies are outside that frontend denominator. Python metrics remain separate.
  • Browser evidence: /srv/pmiverse/logs/tests/20261008_105501/browser/, including browser-acceptance.json, frontend-v8-coverage.json, frontend-coverage-summary.json and shape/viewport screenshots. Invocation:
GLASS_BROWSER_DATABASE=test_glass_it34_20261008_pmis_sheet_configurator \
GLASS_BROWSER_PASSWORD_FILE=/tmp/glass_it34_password \
GLASS_BROWSER_OUTPUT=/srv/pmiverse/logs/tests/20261008_105501/browser \
node pmis_sheet_configurator/tests/browser_acceptance.mjs
  • The browser check is a scoped exception because pytest wrappers do not provide HTTP/browser serving. Its server uses the authorized disposable database, loopback-only ports 18083/18084, an exact database filter, no database listing and no cron workers. Chromium uses an isolated profile with extensions disabled and loopback debugging port 19223. No dependency installation or production change. See docs/BROWSER_TESTING.md for repeatable setup and metric boundaries.
  • Initial runs exposed asynchronous test-render waits, cached assets, an extension interfering with HOOT browser globals, floating-point font comparison and retired script IDs in CDP coverage. These were diagnosed and corrected before acceptance.
  • Final Python runner: 199 passed; 828 statements and 286 branches covered, 100% each. Evidence: /srv/pmiverse/logs/tests/20261008_112210/, including pmis_sheet_configurator.log and the addon's coverage XML/HTML. Command:
/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_final34_20261008_ --parallel 1 \
  -- -q --cov-branch --cov-fail-under=100
  • Repository-configured Ruff, formatting checks, scoped lint wrapper and git diff --check pass. The generated POT adds ten terms; all 282 current messages have Slovenian translations without fuzzy entries. Gettext syntax/format, placeholder and HTML-tag parity checks pass. Existing translations are preserved. Runtime Slovenian acceptance and integration contracts remain open.
  • Addon-wide IDE inspections plus the repository README and new browser guide/runner cover 57 files with zero warnings/errors, including weak warnings. The final fixture correction preserves complete data and update types for an unsaved row.
  • Cleanup verified: the browser and final Python disposable databases and the localization database are absent. The owned Odoo/Chromium processes are stopped and the temporary browser password is removed. Browser logs remain with the evidence directory. No production deployment, commit or push was performed.

Iteration 5 closure and roadmap reconciliation — 2026-10-08

  • Baseline: branch 18.0, revision 94a466b, clean worktree. Reviewed the actual manifest/assets, editor/template/styles, geometry/workflow/revision/specification models, attachment guards, ACLs/rules, focused tests and maintained documentation. Iterations 1–4 are present; current regression and browser checks confirm their existing acceptance evidence. No previously unchecked baseline implementation was found. Sibling-addon bridges remain absent pending integration contracts; Istanbul instrumentation remains an optional metric-specific follow-up.
  • Added iteration 5 and completed it, including the previously open Slovenian browser-acceptance item. Added iteration 6 for additional real-form editing boundaries and expanded iteration 7's integration-contract/bridge checklist.
  • The browser runner now accepts GLASS_BROWSER_LANGUAGE=en_US or sl_SI, rejects other languages and verifies the authenticated session language before opening a browser tab. Move/zoom controls no longer depend on English accessible labels. Checks prove translated selector/move/zoom labels, coordinate status, diameter callouts and unclipped controls within the editor at both viewport widths.
  • Actual forms: eight English and eight Slovenian cases pass, covering all four shapes at 1440 px and 390 px, mouse/touch drags, form-buffer edits, undo/redo, Save/Discard and approval/revision/attachment immutability. Slovenian desktop and mobile screenshots were visually inspected for readable instructions/callouts.
  • Native HOOT: 21 tests and 86 assertions pass on desktop and mobile in each invocation. HOOT component fixtures remain distinct from real translated forms.
  • Each language independently retains 231/231 executable locations, 39/39 functions and 104/104 observed V8 block ranges, 100% each. These are V8 metrics, not Istanbul statement/branch coverage; template/dependency exclusions remain as documented in docs/BROWSER_TESTING.md.
  • Current Python acceptance: 199 passed; 828 statements and 286 branches, 100% each. The authorized scoped runner retained its database for browser acceptance; it was removed after the browser runs.
/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_it5_20261008_ --parallel 1 --keep-db \
  -- -q --cov-branch --cov-fail-under=100
  • Evidence: /srv/pmiverse/logs/tests/20261008_115651/, including the Python log, coverage XML/HTML, ide-inspections.json, browser-server.log, and separate browser-en/ and browser-sl/ acceptance JSON, V8 coverage and screenshots. Browser invocations use the same environment below, with en_US/browser-en for English and sl_SI/browser-sl for Slovenian:
GLASS_BROWSER_LANGUAGE=sl_SI \
GLASS_BROWSER_DATABASE=test_glass_it5_20261008_pmis_sheet_configurator \
GLASS_BROWSER_PASSWORD_FILE=/tmp/glass_it5_password \
GLASS_BROWSER_OUTPUT=/srv/pmiverse/logs/tests/20261008_115651/browser-sl \
node pmis_sheet_configurator/tests/browser_acceptance.mjs
  • The existing browser exception remains necessary because pytest does not serve HTTP. Odoo used loopback ports 18083/18084, the exact disposable database filter, disabled database listing and no cron workers. Chromium used loopback debugging port 19223 and an isolated profile with extensions disabled. The standard language installer loaded Slovenian only in that database; no translation source changed.
  • Repository-configured Ruff lint/format, scoped lint wrapper (including inspected pylint-odoo diagnostics), Node syntax and git diff --check pass. Addon-wide IDE inspections and repository README cover 57 files with zero warnings/errors.
  • Cleanup: the owned Odoo/Chromium processes stopped; the disposable database and temporary password/setup scripts were removed. No dependency installation, sibling repository changes, production deployment, commit or push occurred.

Iteration 6 closure — 2026-10-08

  • Baseline: branch 18.0, revision 94a466b, with the five uncommitted iteration 5 files preserved. Scope remains this addon and its owning repository README. Added tests/browser_editing_boundaries.mjs to the existing acceptance invocation; updated its runner, guide, checklists and READMEs. Product models/assets, dependencies, translation sources and sibling repositories were not changed.
  • Each language passes eight existing shape/viewport cases and four new boundary cases, for 24 real-form scenarios total at 1440 px and 390 px. New rows are entered through the actual Fabrications table, excluded from drawing selection while unsaved, and selectable after normal Save. Native browser key events verify Page Up/Down, arrows, Ctrl + Z and Shift + Ctrl + Z. Numeric table edits clear old move history while permitting a new undoable move.
  • Invalid out-of-outline placements remain saveable drafts. The visible approval action is absent, including inside the mobile action menu; direct confirmation RPC raises UserError and preserves workflow evidence. Correcting and saving restores approval. Approved drawing/table controls are readonly and direct fabrication edits are denied. Reopening allows a buffered edit; reapproval creates revision 2 and a different PDF without changing revision 1's snapshot, attachment link, PDF checksum or file size.
  • Pagination uses 85 valid, nonoverlapping holes, with the actual 40/40/5 row pages. All loaded identities/global numbers, first/last pager wraparound, loaded-row keyboard wraparound, unloaded selection/history handling and a saved position surviving pagination are verified at both widths and in both languages.
  • Native HOOT still passes 21 tests / 86 assertions on each desktop/mobile preset in each language invocation. Each language independently reaches 231/231 executable locations, 39/39 functions and 105/105 observed V8 block ranges, 100% each. The additional observed block is exercised by the new real-form cases; the editor source is unchanged. V8 is not Istanbul statement/branch coverage; the browser harness, templates and dependencies are outside that denominator.
  • The supported Python runner passes 199 tests, 828 statements and 286 branches, 100% each, on the current filesystem. Its database was retained for the scoped browser exception, then removed after final acceptance:
/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_it6_20261008_ --parallel 1 --keep-db \
  -- -q --cov-branch --cov-fail-under=100
  • Evidence: /srv/pmiverse/logs/tests/20261008_120527/, with Python coverage XML/HTML, final browser-en-run.log / browser-sl-run.log, separate language directories containing browser-editing-boundaries.json, existing shape acceptance/screenshots and frontend coverage, plus IDE inspection summary and the loopback server log. Use the invocation in docs/BROWSER_TESTING.md with database test_glass_it6_20261008_pmis_sheet_configurator, password file /tmp/glass_it6_password, and the language-specific output directory in that run.
  • Initial checks exposed asynchronous form dirty/save/render transitions, collapsed mobile actions and an incorrect final-page assumption. Tests now wait on actual state and use Odoo's native menu/pager contracts. The Slovenian shared frontend catalog also supplies the installed editor/spreadsheet translation "Premakni se desno" for "Move right"; the runner accepts that verified catalog term alongside this addon's "Premakni desno", while still rejecting an English fallback. Diagnostic attempt logs/JSON are retained separately from the final passing artifacts.
  • Repository-configured Ruff lint/format, scoped lint wrapper with inspected pylint-odoo diagnostics, both Node syntax checks and git diff --check pass. Full-addon IDE inspections, the new helper and repository README cover 58 files with zero warnings/errors; changed files were rechecked after final edits.
  • Cleanup removes the owned disposable database, Odoo/Chromium processes, isolated browser profile and temporary credentials/setup/debug scripts. No production database, dependency installation, deployment, commit or push is involved.
  • Iteration 7 remains pending accepted measurement/export contracts. Istanbul instrumentation retains its existing conditional status.

Multi-company correction closure — 2026-10-08

  • Baseline remains branch 18.0, revision 94a466b. Existing iteration 5/6 changes and the staged browser helper are preserved. This correction changes only the glass product default/ORM company handling, four Python test files and maintained documentation. The manifest, seeded product XML, security rules, translations, frontend code and sibling repositories are unchanged.
  • The previous default dereferenced the seed's template before testing read access. With pmis_base_multi_company installed first, its product default assigns the installer's active company. The replacement searches the variant normally in the target company and returns an empty default if unavailable. Standard company_id search works both natively and through product_multi_company's company_ids adapter. No hard dependency, sudo(), access exception suppression or automatic global sharing is needed. Explicit quotation/context products retain precedence.
  • All three full-suite runs pass 215 tests each, with 834 statements and 290 branches, 100% each. Installation state was independently verified in each disposable database. The real optional addon and its declared dependencies were installed, not mocked; no Python packages or source dependencies were changed.
Configuration Database prefix Evidence directory
Standard Odoo, optional addon absent test_glass_pmis_first_20261008_ /srv/pmiverse/logs/tests/20261008_124334/
Optional addon installed before configurator test_glass_combo_20261008_ /srv/pmiverse/logs/tests/20261008_124405/
Optional addon installed after configurator test_glass_company_20261008_ /srv/pmiverse/logs/tests/20261008_124438/

The first prefix is merely an artifact name; the optional addon is absent there. Each final run uses the supported runner below with its corresponding prefix:

/srv/pmiverse/_pmiconfig/scripts/test/run_pytest_repo.sh \
  --addons /srv/pmiverse/_pmisuite18/repos/pmiverse/vertical-glass-working/pmis_sheet_configurator \
  --db-prefix test_glass_combo_20261008_ --parallel 1 --keep-db \
  -- -q --cov-branch --cov-fail-under=100
  • The runner has no additional-module installation option. For the installation-order matrix only, targeted Odoo initialization installed pmis_base_multi_company in owned disposable databases, using --stop-after-init --no-http --max-cron-threads=0. A prepared dependency database was cloned before installing the configurator. No production database or installed production product was modified.
  • Initial diagnostic runs caught an unordered selected-company assumption, existing foreign-product fixture incompatibilities, and registry user-company cache entries surviving transaction rollback. Focused regressions passed before the final matrix. Two attempts were denied local database socket access by the sandbox; the final authorized runs passed. Diagnostic artifacts remain separate from final evidence.
  • Installing Sales demo data with the optional company defaults exposed an upstream incompatible-company optional-product demo record. Odoo omitted that demo data; the actual addon installation and complete scoped suite pass. This unrelated demo issue is not patched in sibling dependencies.
  • Repository Ruff lint/format and the scoped lint wrapper, including pylint-odoo, pass. Eight changed files have zero IDE warnings/errors; exact results and the final lint log are under 20261008_124334. git diff --check passes. Browser/HOOT suites are not repeated for this backend-only correction; iteration 6 remains the current frontend evidence.
  • All four owned disposable databases and their filestores are removed. No production deployment, commit, push or change to existing product sharing is performed.