Skip to content

Qualify devkit workspace, build and sanitized data contracts on Community 20 (Q870) #278

Closed

Description

@shiny-code-app

Objective

Qualify devkit workspace, build and sanitized data contracts on Community 20 (Q870). Child of #277, Director decision Q870.

Finish Line

Merged small PRs let a manifest-selected Community 20 workspace build and initialize through existing devkit commands, keep sanitized restores fenced before registry hooks, and emit provenance conforming to the canonical artifact contract. Launchplane#4913 qualifies consumption afterward; current 19 consumers remain qualified.

Current Status

Completed through PR280, which Launchplane landed at10:49AMET October26 asf135a08016f2c87d438c0f2897bb3f6c55508169. Sourcec9379c8bfbaf8b0a1d1e2b5009074558909e1ef1 passed independent review with weighed findings6418739434, all seven current-head checks and checkedReady6418986725. Full native CI40341048425 passes22tests on19 and24on20, including the final native-reload bound. The complete unit suite and lock/static gates pass.

Both required tenant consumer gates from the canonical130scope pass with exact current runtime/source/platform/lock readback: OPW40341110594 atsource4f6beac62630bfd5117beb0b51d43dc3557a64bd and website40341116803 atsource3936b71584e4c7c2f92a248cf663c3f76f160f49, linux/amd64. Earlier mention of three consumers was my reporting error; CM operations is outside that recorded scope and has no workflow on main. The unsupported CM dispatch was not retried; its uncertain client receipt is retained without a passing-check claim. The two required original dispatches were reconciled from their exact candidate artifacts, not replayed.

Local complete affected Python safety modules pass176tests. Supported manifest-selected20 local build/init/up/privatehealth/identity/admin/zero-worker-and-cron proof passed on isolated synthetic inputs. Correct default-site/logo/string handling and loaded-site pending-state exclusion are qualified through real19/20 ORM and safety-hook tests. Runtime snapshot48f14c59 and unchanged CLI build inputs are explicit; subsequent pending-state and finalization checks pass in exact-head CI. All task runtime resources were cleaned.

Source278 emits the unchanged canonical publisher contract; build-check schema1 is not a published schema2 product artifact. Launchplane4913 retains real20artifact/provenance/identity/private-readiness consumption and existing release boundaries. No tenant conversion, Client acceptance or production cutover is inferred. Normal main CI is followed separately while source claim6416737237 is released and the task worktree retired. Next source work is4913 after fresh ownership/admission.

Removed: old-only parameter/proxy/default-site assumptions, duplicate website-presence logic and the false single-physical-registry invariant. Net lines:+231 (+276/-45), including native API/safety coverage and the retained19/20 CI matrix. Inspection NOTRUN under direction98comment6399734189. No live18, productiondata/livekeys, access, subscription, publication or release operation. Parent277 claim remains explicitly authorized.

Scope

Fix real version/API assumptions in generators, startup, addon CI, bootstrap and data workflows. Keep image selection manifest-owned and remote operations Launchplane-owned. The existing enterprise_base_digest wire field may carry the selected Community base; do not add a schema rename without a reproduced need. Consumer-build readiness repair #274 remains with its owner.

Acceptance Criteria

  • Small reviewed PRs through Launchplane's train; at most two open for this lead.
  • No live OPW 18 modification, production data writes or access changes. Every production copy is sanitized and disconnected before it runs.
  • Report Removed: and Net lines:.

Relationships

Parent: #277. Native prerequisites are linked in the parent graph. Research: #275. Supervisor: https://github.com/cbusillo/direction/issues/98.

Validation

Focused unit tests plus full affected startup/restore/credential safety modules, disposable Community 20 live checks and required tenant consumer builds. Verify no live keys or outbound mail/integrations survive in copies. Inspect generated workspace files if their generator changes.
IDE inspection may be recorded NOT RUN under https://github.com/cbusillo/direction/issues/98#issuecomment-6399734189; all other required gates remain.

Decisions

Q870 selects Odoo 20 Community once, offline OPW 18->19->20, fresh CM foundation and a separate canonical website conversion. Keep subscriptions through verified cutovers.

Open Questions

No new Director decision is required to start this source slice after its prerequisites. Product releases retain their Client acceptance and existing operational stop boundaries.

Receipt-size qualification

Odoo20 image qualification found a real receipt-size boundary to retain in this existing consumer port. Exact bare20 source0af7f93d renders329asset observations. Default JSON produced68687bytes and failedHTTP413; compact JSON preserves every asset/hash at65280bytes within the existing65536 bound. Image#162 implements compactPOST and tests actual bound/bound+1 behavior; both complete19/20 readiness suites pass. Runtime20 plus rebuilt20 devtools/browser also pass the full readiness fixture. This is a bare-image result, not tenant qualification.

Next actor for this consumer port must measure its actual routes/themes/assets through the existing complete readiness workflow, preserve all evidence and failclosed if oversized. Do not dropassets, enlarge the bound, mark health as readiness or relabel19 evidence to get20 through. If a real tenant receipt exceeds the bound, report the measured shape/size and weigh the smallest supported contract change with outside review in its owning source slice. No new gate or protocol is added: this is evidence for the existing runtime/readiness contract qualification.

Native20 bootstrap port evidence

Read-only source/probe qualification, ODOO20LEAD-1025, exact native20 source0af7f93d7b4e81895545bd1ed3db85099e7fa32b in the already-qualified isolated image. No production copy, registry load or external network was used; the container ran with network none and a read-only mount of current devkit helpers.

Confirmed real port points for the existing278 slice:

  • Native ir.config_parameter defines get_str/set_str and typed bool/int/float accessors; get_param/set_param are absent. Current docker/scripts/odoo_website_bootstrap.py requires get_param and calls set_param, and odoo_website_settings.py does both in nonproduction exclusion and accepted settings readback. These paths need dual19/20 adaptation while retaining exact readback and exclusion semantics. This includes the mandatory copied GA4/indexing exclusion, not just normal website bootstrap.
  • Current bootstrap logo readback fails with a real native20 BinaryBytes value. Passing synthetic raw logo bytes through native BinaryBytes and its to_base64() into the current _assert_binary_field_value reproduced: expected32encoded bytes, got46. The current helper stringifies the proxy representation. Fix the encoding boundary and test actual BinaryValue/readback, preserving native19 base64 strings/bytes; do not double-decode raw content. Existing OPW312 already owns tenant binary consumers; this finding belongs to the shared bootstrap here.
  • The native base data defines base.default_website. Current shared bootstrap selects website.default_website. Preserve the intended existing site/domain and prevent duplicate website creation on both fresh setup and copy conversion; canonical tenant215 owns its own XMLID consumers.
  • Native20 api.Environment and Registry imports are available when Odoo's source path is configured. No compatibility shim is needed for those imports on the inspected source.

Next actor implements after native prerequisites, with focused/full affected website-startup/restore-credential safety modules and actual19/20 synthetic live readback. The pre-registry SQL credential fence remains before any registry hook. No source implementation, new issue, gate, helper or schema was added by this research.

Activity

  1. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    Read-only next-slice preparation while image158's source is reviewed and173/174 await hosted capacity. No devkit source edit or qualification claim.

    A small port can retain one parameter adapter instead of adding independent19/20 shims to bootstrap, settings and Launchplane. docker/scripts/odoo_website_settings.py already ships alongside bootstrap and is the canonical self-contained source copied by Launchplane's immutable generator. Put shared string parameter read/write compatibility there; bootstrap can import it without a cycle (settings currently imports only stdlib). Startup/data-workflow callers already ship/import both modules. The generated maintenance program then gets the same adapter by regeneration from the eventual committed devkit revision, with no second handwritten copy in Launchplane.

    Keep the native API distinction explicit: current19 uses get_param/set_param; actual20 evidence on this issue shows typed get_str/set_str. Verify missing/empty values, string0 and stringFalse in both real runtimes before choosing normalization; do not turn the helper's current str(False) representation into a stored string or silently change a boolean setting. Native indexing and analytics exclusion must still happen for every nonproduction instance before serving, even without an optional sanitization payload.

    The bootstrap's _binary_field_value currently handles bytes or str(value). Prior actual20 BinaryBytes evidence demonstrates that proxy stringification is not encoded logo data. Use the native binary interface and compare encoded content without double decoding, preserving failure on mismatch. The default website XMLID and canonical-domain/page selection still need actual20 bootstrap fixtures; do not create a second website or copy stale content as a fallback. Existing19 stage support remains needed for OPW's offline18->19->20 path.

    After image158/shared ports: full affected settings/bootstrap/startup/data-workflow safety modules, real isolated19/20 startup/readback/no-outbound fixtures, actual tenant receipt size/assets and a schema2 built20 artifact. Launchplane4913 regenerates its accepted-settings consumer from that exact committed source and qualifies the artifact. Inspection may be recorded NOT RUN under the existing Director exception; no other gate is waived.

    Removed (planned): old-only parameter/website/binary assumptions and duplicated adapter logic. Net lines: none in this read-only preparation. No production data, live18, outbound key, access or release action.

  2. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    Native parameter semantics checked on both retained synthetic Community runtimes while the image train runs. Read-only preparation for this blocked slice; no devkit implementation or qualification claim.

    The 19 image exposes get_param/set_param; 20 exposes get_str/set_str. Real ORM calls preserve string "0" and string "False" exactly in both versions. Missing keys return the supplied default. Empty string is stored in both: 19 get_param substitutes the supplied default, while 20 get_str returns the empty string. Using an explicit empty-string default therefore gives consistent missing/empty readback for this string-only helper without turning a missing legacy False into literal "False".

    Setting Python False/None after an existing value deletes the 19 row; 20 retains an undefined row whose getter returns the supplied default. The shared string adapter should not depend on row deletion or use those values to set indexing. Indexing continues to write/read exactly string "0" or "1". Preserve literal strings, exact write/readback failure and mandatory nonproduction analytics/indexing exclusion.

    Proof used initialized base-only databases on an internal Docker network with no published ports, synthetic credentials, and rollback after each shell session. Source images: native19 Odoo8b87b90007838271d9141fc0f2232fdb20938ceb and native20 Odoo0af7f93d7b4e81895545bd1ed3db85099e7fa32b; the20 image includes the current package-trim base. All task containers/network were removed. Logs and executable probe are retained in task evidence as parameter-runtime-19.log, parameter-runtime-20.log and parameter-runtime-probe.py/.sh.

    Next remains implementation after158/63/83, then full affected startup/settings/bootstrap/data-workflow modules plus actual native19/20 fixtures. BinaryValue/logo and default-website identity still need their own implementation/readback. Removed: none in this research. Net lines: 0 repository lines.

  3. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    Actual initialized native website fixtures confirm the source findings on this issue. Each fresh Community database contains exactly one website. Odoo19 binds it as website.default_website; Odoo20 binds it as base.default_website, with the other reference absent in each version.

    A generated synthetic79-byte PNG written to the native logo field, flushed and invalidated, round-trips byte-for-byte in both runtimes. The19 value is encoded bytes and the current bootstrap helper matches it. The20 value is BinaryValueAttachment; its to_base64() returns the correct encoded string, while the current helper's proxy stringification fails the comparison. This confirms the defect through real ORM attachment readback, in addition to the earlier standalone BinaryBytes reproduction.

    Implementation remains behind158/63/83. Select the actual existing default site without duplication and normalize through the native binary interface before the existing exact-content comparison. Keep failure on a mismatched logo and verify actual bootstrap/startup behavior in both supported stages. This research does not qualify a converted tenant, its theme/assets or its receipt size.

    The fixtures used the same native19/20 source images as comment6408982918, fresh synthetic databases, an internal Docker network, no host ports or live keys, and a read-only mount of current devkit helpers. Both probe sessions rolled back, then all task containers/network were removed. Retained evidence: website-runtime-19.log, website-runtime-20.log and website-runtime-probe.py/.sh. Removed: none in this research. Net lines: 0 repository lines.

  4. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    LP4844-1025 isolated host qualification independently reproduced the parameter API port already recorded here. The retained per-event web log fails in docker/scripts/odoo_website_settings.py exclude_collection at parameters.set_param(INDEXING_PARAMETER, "0"): AttributeError: 'ir.config_parameter' object has no attribute 'set_param'. This occurs before initial serving even with no optional settings payload and the shared settings addon excluded. It is an empty Community20 fixture on an internal local Docker network, not a live lane failure.

    No helper, native API or addon migration change was made here. Please preserve the one canonical parameter adapter and its Launchplane regeneration path described in comments 6408163284 and 6408982918. This run corroborates their real startup impact; #4844 remains held for the supported Odoo20 devkit/consumer prerequisites. The exact source logs are retained under LP4844-1025 task evidence (installed-c8243359), alongside the real terminal/Compose harness. No live keys, production writes, access changes or Odoo19 migration work.

  5. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    Claimed by ODOO20LEAD-1025

    Session: 01a17537-b01c-7721-89fb-60509a049441
    Branch: work/community20-contracts-1026
    Claimed at: 2026-10-26T09:05:02-04:00
    Next action: Implement one native19/20 string-parameter adapter and exact website/logo readback, then qualify existing startup/build/sanitization contracts on isolated fixtures before small reviewed PRs.

    Admission: milestone; #277

    Work record

  6. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    ODOO20LEAD-1025 checkpoint,9:18AMET October26. Program remains actionable; no Director action needed.

    Completed disable65/source63 and shared-addons84/source83 through Launchplane.84landed158bec70 at9:02AMET; source and normal mainCI pass181tests, native desktop/mobile14JS62assertions each. Reviews weighed/checkedReady; issue closed/reconciled, claim released6416691987, worktree retired and clean primary advanced. Removed: obsolete shared policy/storage/navigation assumptions, stale aliases, manual insertion code and duplicate JS runners. Net lines:84-95; delivered lead total+1022.

    Current278 claim6416737237, branchwork/community20-contracts-1026, committed locally74e0ac327c755a0943f57a37cf7f69b8017dc8d1; no PR/push yet.169full affected safety tests and fresh native19/qualified20 contract probes pass. Current source+71 (+89/-18), including regressions/docs. Independent AnthropicOpus5.5 review finished and confirmed adapter/logo/default-site source paths; it identified remaining live-fixture typedAPI/series ports, a test-fake default fidelity gap, and a website-model gate assumption. Root confirmed exact20 source now declares website in base while google_analytics_key belongs to the website addon. Thus the old model-presence gate can block non-website20 startup. Next: reproduce on a base-only fixture, distinguish installed website before preserving fail-closed analytics behavior, strengthen19 fake defaults, port native test fixtures, requalify/review; then schema2artifact and three tenant consumer gates before Ready. Launchplane4913 follows exactdevkit source. No production/live18, livekeys, access or release action. Inspection NOTRUN under the recorded exception. Native probe resources cleaned up; review finished. Formalclaimcoverage remains conditional, nooverride.

  7. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    Confirmed default-branch landing: #280 at f135a08. This issue is already closed as completed; a reference alone does not prove its finish line. Planning metadata reconciled through the existing close preflight; retained artifact custody remains on the source PR/handoff.

  8. shiny-code-app commented on Oct 26, 2026

    @shiny-code-app
    ContributorAuthor

    Released claim 6416737237

    Completed through PR280, which Launchplane landed at10:49AMET October26 asf135a08016f2c87d438c0f2897bb3f6c55508169. Sourcec9379c8bfbaf8b0a1d1e2b5009074558909e1ef1 passed independent review with weighed findings6418739434, all seven current-head checks and checkedReady6418986725. Full native CI40341048425 passes22tests on19 and24on20, including the final native-reload bound. The complete unit suite and lock/static gates pass.

    Both required tenant consumer gates from the canonical130scope pass with exact current runtime/source/platform/lock readback: OPW40341110594 atsource4f6beac62630bfd5117beb0b51d43dc3557a64bd and website40341116803 atsource3936b71584e4c7c2f92a248cf663c3f76f160f49, linux/amd64. Earlier mention of three consumers was my reporting error; CM operations is outside that recorded scope and has no workflow on main. The unsupported CM dispatch was not retried; its uncertain client receipt is retained without a passing-check claim. The two required original dispatches were reconciled from their exact candidate artifacts, not replayed.

    Local complete affected Python safety modules pass176tests. Supported manifest-selected20 local build/init/up/privatehealth/identity/admin/zero-worker-and-cron proof passed on isolated synthetic inputs. Correct default-site/logo/string handling and loaded-site pending-state exclusion are qualified through real19/20 ORM and safety-hook tests. Runtime snapshot48f14c59 and unchanged CLI build inputs are explicit; subsequent pending-state and finalization checks pass in exact-head CI. All task runtime resources were cleaned.

    Source278 emits the unchanged canonical publisher contract; build-check schema1 is not a published schema2 product artifact. Launchplane4913 retains real20artifact/provenance/identity/private-readiness consumption and existing release boundaries. No tenant conversion, Client acceptance or production cutover is inferred. Normal main CI is followed separately while source claim6416737237 is released and the task worktree retired. Next source work is4913 after fresh ownership/admission.

    Removed: old-only parameter/proxy/default-site assumptions, duplicate website-presence logic and the false single-physical-registry invariant. Net lines:+231 (+276/-45), including native API/safety coverage and the retained19/20 CI matrix. Inspection NOTRUN under direction98comment6399734189. No live18, productiondata/livekeys, access, subscription, publication or release operation. Parent277 claim remains explicitly authorized.

    Retained PR handoff: #280

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions