Skip to content

audit: track PostgreSQL, SDK, WASIX, extension, and tooling follow-ups #203

Description

@f0rr0

Purpose and scope

Track the complete engineering audit and its65 prioritized implementation/qualification tasks across native PostgreSQL, the C ABI, native Rust/JavaScript/Swift/Kotlin/React Native SDKs, single WASIX bindings/storage, concurrent WASIX Postmaster, all39 public extension integrations, tools, packaging and qualification. This issue transfers the design rationale, findings, evidence, limitations and task dependencies into the repository so implementation does not depend on a local audit checkout.

Audited baseline: e8192180bec4494c83bfa3adecbaa9b228b8f05d, fetched September7,2026 and still remote main when this issue was prepared September8,2026. No production changes were made by this audit. Repository source links in the supporting reports are pinned to that baseline. This issue is an umbrella engineering backlog; use focused PRs or linked child issues for implementation.

Relationship to work already underway

Read PR #202 and issue #201 before starting overlapping tasks. PR #202 is currently OPEN, head 8e45be7e281b5a1173a71c91cc11aea180b23d63, against the audited main. Its description reports substantial runtime correctness work and fresh tests that were not part of this audit. Those reports must not be relabelled as checks run by this review or as merged-main fixes.

Master items Reported overlap in PR #202 / issue #201 How to use it
01 native fsync Unconditional -F removed in the PR, with Linux ICU direct/broker effective-setting checks reported Verify the merged change meets01; avoid a duplicate implementation
03–04,14–15 native session/host boundary Trusted-session reset, cwd/startup cleanup, signal/timer ownership and COPY/cancellation changes reported Compare each specific audit trigger with the new implementation and acceptance result; coverage of the broad area does not close every item
16 LIKE and58 optional PG shortcuts LIKE plus other rejected shortcuts retired Prefer deleting/superseding the obsolete finding after merge; do not resurrect retired patches to satisfy an old optimization suggestion
20 recovery;23–24 artifact/output contracts Guest-local recovery, matching host ABI, strict AOT identity and bounded output changes reported Revalidate exact affected call paths; bounded output is not automatically bounded public queue admission
17 JSONB JSONB retained; #201 separately tracks upstream cast-visibility work Recheck the audit's expression-form fallback case; it is not automatically fixed by different JSONB work
43–50 qualification Fresh Linux/Rust/Chrome cases and parent Postmaster CI reported; final-head and broader platform gates remain separately scoped Credit exact commit/artifact/platform evidence only; do not repeat completed equivalent checks without a reason
59–60 organization Wasmer/libc monoliths decomposed in the PR Reconcile remaining first-party executor extraction separately; decomposition does not prove all runtime invariants

Additional high-priority context already owned by #201: inherited Postmaster POSIX signal-mask/pending-delivery semantics are reported unimplemented. The follow-up requires coordinated runtime/libc masks, pending signals, handler masking, nonlocal-return and lifecycle behavior; the separate sigsetjmp single-evaluation correction does not solve delivery masking. Keep its detailed acceptance work in #201 and coordinate with items14/43/46 here. This is source-supported inherited behavior, not a new observed-corruption claim from this audit.

Issue #201 also owns retained performance warnings/profiling and upstream follow-up. Preserve its completed work and explicitly conditional research; this umbrella issue does not turn discarded experiments into mandatory features. #90 (memory/concurrency use case) and #35 (custom WASIX extension/AOT support) are related product requests, not automatically defects or additional promised scope.

Design conclusions to preserve

  • Native direct intentionally has one process-resident backend; compatible logical reopen is distinct from terminal shutdown. Broker isolates the same engine in a helper. Native server is ordinary PostgreSQL processes with independent external client sessions.
  • Single WASIX and concurrent Postmaster are different products. Fresh EXEC_BACKEND guest instances, fixed shared mappings and real concurrent atomics serve essential Postmaster requirements.
  • Keep the shared native C ABI and existing language query cores. Share contracts, data and fixtures where semantics agree, retaining platform-specific execution/storage ownership.
  • Standard versus ICU data/catalog selection, native target versus Datum32 seed identities, descriptor-last initialization, private copies and create-only restore are intentional.
  • Extensions are exact opt-in artifacts; applications own normal CREATE/ALTER EXTENSION SQL and migrations. Native dynamic modules, mobile static registration and WASIX side modules require distinct build adaptations.
  • Ordinary PostgreSQL extensions can own SQL functions/types/indexes and existing hooks. They cannot replace startup/return, host process ownership, static loading, exec/shared-memory or WASIX platform semantics. Keep a small reviewed embedding/port seam, first-party host code, and independently removable optimizations.
  • Delete demonstrated dead code; measure conditional optimizations before adding abstractions or dependencies.

Main findings and reassessments

The highest-impact findings concern native persistent defaults and restored-data publication; reset commands whose SQL errors are discarded; raw multi-exchange response ownership; OPFS namespace/WAL ordering; channel and RN acknowledgement lifetime; Kotlin initializer ownership; broker framing/startup/close; and extension evidence that claims unexecuted lifecycle stages. Additional supported issues cover Swift diagnostics, JNI Unicode/output sizes, SQL fast-path assumptions, VFS zero writes/shared mappings and measured restore/parameter allocation costs. Every actionable finding appears in the checklist and supporting reports.

Intent review changed several assessments: browser-default IndexedDB durability is withdrawn as a defect; ordinary close waiting for admitted SQL is intentional; Swift native-smoke evidence is a task-specific gap rather than proof all mobile qualification is absent; maintainer --force replacement is optional rebuild resilience; cwd ownership is partly declared but host compatibility/restoration still needs a precise contract; the static SQL parser fails valid custom metadata forms but no currently shipped pin was shown broken. The per-area reports contain the full disposition tables, trigger, impact and smallest repair.

Priorities, evidence and completion rules

P1: address before relying on the affected advertised behavior. P2: consequential correctness, maintainability or qualification work. P3: optional cleanup, measurement or documentation. Priority is not a blanket assertion that a full release is blocked.

The65 original task boxes remain unchecked because this audit did not implement them and overlapping PR #202 is unmerged. As changes land, close a task only with a linked fix/retirement decision and its exact acceptance evidence. Distinguish observed boundary behavior, source-supported concerns, explicit product decisions, qualification gaps and conditional performance ideas. Qualification tasks are not assertions of unobserved bugs. An equivalent completed test from #202 can satisfy a criterion when its scope/artifact/commit actually match.

No full product/platform/extension execution matrix was run in this audit. First-pass Rust/mobile/addon/source checks, second-pass seed/ICU/candidate checks, selected source-boundary observations and host algorithm comparisons are documented in supporting report G and the owning report. Some test environments lacked dependencies or the pinned Moon version. A transport success, source substring, valid receipt, patch-apply success or skipped runtime-dependent test does not prove the advertised behavior.

Supporting reports

The master checklist is authoritative; task boxes in the reports expand its acceptance criteria rather than creating independent work. These comments contain the detailed findings, file/line permalinks, intent/history, observed results, measured costs, all-extension inventory, complete PostgreSQL patch dispositions, detailed task crosswalk and explicit gaps. Historical first-pass details are retained only as evidence; revised second-pass priorities and this master checklist govern implementation. Local scratch binaries and full runtime build caches are not release evidence or attached issue assets.

Complete prioritized checklist

First: persistence and session correctness

Evidence: PostgreSQL core (see report A), native desktop/C ABI (see report B), WASIX (see report D).

  • 01 — P1 / native runtime: make persistent defaults durable. Preserve explicit GUC tuning; remove the unconditional -F default instead of adding another public profile enum. Done when: default direct and broker persistent opens report the intended fsync, full_page_writes and synchronous_commit; all native adapters agree; temporary-storage behavior is explicit; benchmark overrides are distinguished from product defaults. Ref: CORE-01, D-C02.

  • 02 — P1 / C restore: finish the durable handoff. Preserve private staging and create-only restore. Sync restored data and directories before descriptor publication, then sync the destination parent after rename. Done when: the existing platform durability primitives cover the full tree and final publication; restore/reopen succeeds; publication uncertainty is reported without deleting possibly published data. Ref: ND-C03. Depends on: the durability contract in01.

  • 03 — P1 / C detach: check PostgreSQL reset outcomes. Reuse the backup control-command confirmation helper for ROLLBACK and DISCARD ALL. Keep ownership until SQL success and idle ReadyForQuery are established. Done when: unsuccessful reset cannot report successful detach; a successful compatible reopen contains no old transaction, temporary object, prepared statement or session setting; the original SQL diagnostic survives. Ref: ND-C01.

  • 04 — P1 / raw protocol: settle and enforce the exchange boundary. Prefer one complete exchange per call unless pipeline support is an actual requirement. Validate that contract before dispatch; if pipelines are supported, drain/count every expected completion. Done when: multiple Q/Sync boundaries and COPY/Flush cases have defined behavior, buffered and streaming paths agree, and the next query always receives its own response. Ref: ND-C02. Decision required during implementation: supported raw exchange forms, not a new API hierarchy.

  • 05 — P1 / browser storage: repair OPFS namespace durability. Preserve same-worker exact-range I/O as the goal. Until its namespace publication is sound, use the existing portable COW provider for durable persistence. Implement the smallest synchronous namespace/journal solution before selecting direct persistence again. Done when: required WAL names become durable before dependent control/data updates, both spare-handle and staged-overflow paths preserve a recoverable generation, and ordinary persisted reopen/rotation/checkpoint checks pass. Ref: WA01–WA02. Depends on: browser storage contract; avoid introducing another provider abstraction.

  • 06 — P1 / native maintenance: service ordinary checkpoint pressure. Reuse the single-WASIX deferred request design at the native safe-idle boundary; preserve PostgreSQL checkpoint ordering. Done when: sustained small transactions recycle WAL within the documented soft target, long transactions have a documented exception, and checkpoint work never recurses from XLogWrite. Include time-based maintenance only under an explicit policy. Ref: CORE-04, D-C03.

  • 07 — P1 / PostgreSQL inputs: update the minor release. Move canonical 18.4 inputs and derived native/single/Postmaster identities to18.6 using the existing producers. Keep this independent of patch reorganization. Done when: all pins/receipts/licenses agree, actual product builds and affected extension/recovery tests pass, and applicable upstream migration steps are recorded. Patch application alone does not close this item. Ref: CORE-02.

Native desktop process and transport behavior

Evidence: native desktop report (see report B).

  • 08 — P1 / shared JS child wrapper: handle launch errors. Make ChildProcess error settle startup through the existing owner. Done when: missing/unlaunchable executables reject open while the application stays alive and temporary process resources are released. Fix once for broker/server callers. Ref: ND-C05.

  • 09 — P1 / broker protocol: carry large responses in bounded frames. Keep the128 MiB per-frame ceiling; chunk/reassemble larger backup and raw results instead of treating the frame ceiling as an accidental database-size limit. Done when: Rust and JS consume below/at/above-ceiling results, a256 MiB backup restores, the next request remains aligned, and peak memory is measured. Ref: ND-C04. **Depends on:**04 exchange semantics.

  • 10 — P2 / broker close: bound the dispatched control exchange. Preserve intentional waiting for already admitted SQL. Start the close-control deadline before waiting for its acknowledgement and carry it through process reap. Done when: an unresponsive helper produces a finite, attributable outcome; child ownership is either confirmed released or retained as uncertain. Ref: ND-C06, D-C01. Decision: documented process termination policy after close-control expiry.

  • 11 — P2 / Rust broker: preserve close failure. Decode Close replies and retain their error even if the helper subsequently exits zero; attach later cleanup errors without replacing the first. Done when: Rust and JS agree on unsuccessful close acknowledgements and EOF outcomes. Ref: ND-C07. **Depends on:**10.

  • 12 — P2 / startup: carry one deadline through every stage. Cover ready-line, connection, broker authentication and JS PostgreSQL readiness handshake using the remaining time. Close the actual pending stream on expiry. Done when: a stalled stage cannot outlive the startup contract or publish a late owner; child/socket cleanup is complete. Ref: ND-C08. **Depends on:**08.

  • 13 — P2 / cancellation: bound broker control I/O. Apply the same control policy to cancel authentication/replies while leaving ordinary SQL duration caller-controlled. Done when: a stalled cancel reports its own error and releases the admitted-cancel gate so close can proceed; ordinary query cancellation recovers through ReadyForQuery. Ref: ND-C09. **Depends on:**10–12.

PostgreSQL embedding and SQL semantics

Evidence: core report (see report A), all PostgreSQL patch dispositions (see report A).

  • 14 — P1 / direct embedding: specify host-global ownership. State cwd, signals, environment and terminal-close restrictions at the public direct/mobile entry points; repair restoration to match them. Use existing broker/server for applications requiring independent process behavior. Done when: ordinary host callbacks, relative I/O and startup/close behavior are documented and checked; host chdir is either safely supported or explicitly excluded; signal restoration matches the stated contract. Ref: CORE-03, D-C04. Decision: unrestricted host behavior would require a real runtime adaptation.

  • 15 — P2 / native entrypoint: unify startup cleanup. Route all returns after exit-guard registration through cleanup. Preserve post-setjmp state with the proper C lifetime, including have_original_cwd. Done when: normal failed initialization clears its guard and restores owned state, and assembled source has no relevant clobbered-local warning at release optimization. Ref: CORE-07. **Depends on:**14's ownership definition.

  • 16 — P2 / LIKE: keep character boundaries correct. Remove or narrow0024 to proven-safe matcher/encoding cases and retain the upstream fallback. Done when: supported multibyte encodings and ordinary UTF8 produce upstream-equivalent results; escapes, wildcards, case-insensitive and nondeterministic collations remain on the correct path. Ref: CORE-05.

  • 17 — P2 / JSONB cache: handle expression forms conservatively. Guard absent/non-FuncExpr constant metadata and fall back per call; retain correct Param and cast behavior. Done when: the supported expression helpers and cache agree on their domain, ordinary fixed/VARIADIC calls remain equivalent, and the compatible operator case no longer dereferences absent metadata. Ref: CORE-06.

  • 18 — P2 / maintenance policy: assign VACUUM, freezing and ANALYZE ownership. Document ordinary SQL maintenance for long-lived single-backend stores; add safe-idle scheduling only if automatic maintenance is part of the product requirement. Done when: update churn, planner statistics and transaction-age behavior have a documented owner and representative checks; no claim assumes an absent autovacuum worker exists. Ref: CORE-04, D-C03. **Depends on:**06 for the shared maintenance seam.

WASIX bindings and concurrent runtime

Evidence: WASIX report (see report D).

  • 19 — P1 / byte channel: make terminal wakeups durable in the wait state. Have close/failure change the word or generation on which readers/writers sleep. Keep the bounded ring. Done when: empty-reader/full-writer close and failure schedules settle in both synchronous and waitAsync paths without relying on a notification that can be missed. Ref: WA03.

  • 20 — P1 / Wasm recovery: distinguish PostgreSQL ERROR from runtime failure. Share the same classification between buffered, streaming and drain paths. Recover only recognized PostgreSQL nonlocal error transfer; preserve and retire on unrelated runtime failure. Done when: normal SQL errors remain recoverable and runtime failure cannot be reported as a healthy PostgreSQL session with a substituted error. Ref: WA04.

  • 21 — P2 / concurrent VFS: remove zero-write-to-truncate substitution. Retain the existing vectored zero-write implementation. Done when: independent writers preserve each other's higher-offset data, ordinary positioned writes cannot shrink files, and zero writes retain their synchronization and allocation semantics. Ref: WA06–WA07. No inode-lock framework is justified to rescue this shortcut.

  • 22 — P2 / shared mappings: reuse owned unmapped intervals. Keep memory.grow for genuinely new pages and preserve disjointness from sbrk. Done when: repeated map/unmap with bounded live mappings does not exhaust the4096-page product budget, and partial unmap, padding and concurrent heap growth preserve ownership. Ref: WA08.

  • 23 — P2 / single-runtime AOT cache: validate the loaded byte identity. Bind the first process's validation to the same opened bytes used for loading, then reuse the existing Module cache. Done when: an outdated or same-size changed artifact cannot pass solely on its adjacent receipt, and warm reuse avoids redundant work. Keep the separate sealed Postmaster loader's existing ownership model. Ref: WA09.

  • 24 — P2 / public TypeScript admission: bound pending copied work. Account for pending requests/bytes before snapshots and encoding; include transactions/private reservations without adding another scheduler. Done when: accepted calls retain FIFO semantics, the documented backlog stays bounded, accounting is released on completion/rejection, and close/cancel retain their intended behavior. Ref: WA10–WA11; native D-C06 where the same policy applies.

Swift, Kotlin, JNI and React Native

Evidence: mobile report (see report C).

  • 25 — P1 / RN: register acknowledgements atomically with invalidation. Use the existing owner lock/state on iOS and Android; keep one-chunk backpressure. Done when: invalidate-before-register and register-before-invalidate both unblock the producer exactly once, no callback is delivered to a retired runtime, and a subsequent module/open can acquire ownership. Ref: MOB-C01.

  • 26 — P1 / Kotlin initialization: delete only owned staging. Remove whole process-root cleanup from a losing initializer's unowned preparation failure. Done when: two simultaneous default opens produce at most one successful owner and the loser leaves the winner's files and database intact. Ref: MOB-C02.

  • 27 — P2 / JNI: use standard UTF8 for native strings. Centralize the conversion for paths, identities, GUCs and restore inputs. Done when: ordinary BMP and supplementary characters, including emoji in a directory name, survive the actual JNI boundary; invalid C-string input still receives a clear error. Ref: MOB-C03.

  • 28 — P2 / Swift: enforce callback reentry across execution contexts. Read the existing callback-active state under its lock in addition to TaskLocal checks. Done when: prohibited detached-task/DispatchQueue reentry rejects promptly instead of waiting behind its own callback, while out-of-band cancel still works. Ref: MOB-C04. This enforces an existing restriction; it does not add async callbacks.

  • 29 — P2 / Swift bridge: preserve each operation's diagnostic. Carry a bridge-owned operation snapshot to Swift instead of a shared mutable last-error slot. Done when: concurrent query/cancel and no-handle failures retain distinct messages; size/copy reads remain stable; long native and bridge-loading errors remain intact. Ref: MOB-C05.

  • 30 — P2 / JNI: check output size before conversion. Apply checked size_t-to-jsize conversion to buffered responses, backups and chunks, always releasing native output. Done when: values beyond Java's array representation fail clearly without successful truncation or double release; ordinary output bytes are unchanged. Ref: MOB-C06.

Extensions, tools and truthful qualification

Evidence: extensions/tools report (see report F).

  • 31 — P1 / extension smoke: inspect SQL outcomes. Use the existing checked execution path rather than discarding raw response bytes. Done when: activation and functional SQL failures fail the named extension smoke; normal cases for all 39 execute successfully. Keep raw APIs byte-oriented. Ref: ET-01.

  • 32 — P1 / lifecycle receipts: record only executed cells. Collect actual extension/target/topology/stage results and bind those to the release candidate; remove synthesized all-passed dump/restore rows. Done when: every claimed round trip traces to its executed case, omitted cells fail required coverage, and native server physical backup is explicitly unsupported rather than passed. Ref: ET-02, ET-04. **Depends on:**31,33.

  • 33 — P2 / extension fixtures: verify retained objects. Split seed/setup from verify; reopen and restore the same index/IMMV/table, query it, then modify it. Done when: verify performs no DROP/recreate that could hide lost state, and supported physical/logical round trips check actual retained behavior. Ref: ET-04. **Depends on:**31 for WASIX and02 for native durable restore.

  • 34 — P1 / Postmaster launcher: fix documented default macOS start. Use Bash3-compatible optional array expansion. Done when: no-GUC start and configured start both work under maintained Bash3.2 and Bash5 with the shipped carrier layout. Ref: ET-03.

  • 35 — P2 / launcher configuration: keep options and connection string consistent. Bracket IPv6 literals. Reject or consistently resolve GUCs owned by host/port/data/socket options before initialization. Done when: accepted host/port inputs produce a usable advertised URI and listener behavior matches the documented options. Ref: ET-05.

  • 36 — P2 / mobile static extensions: replace incomplete SQL interpretation. Choose a small complete metadata mechanism: compiled PostgreSQL function metadata plus explicit aliases/lifecycle, or a real SQL parser. Preserve symbol prefixes and selected-module identity. Done when: comments, dollar quotes, folded/quoted names and aliases work for custom static extension packaging and a real mobile consumer loads the result. Ref: ET-06. Current shipped pins were not demonstrated broken.

  • 37 — P2 / older regression runner: reuse bounded supervision. Route process ownership and cleanup through existing process-supervision.sh; bound each readiness call within the total deadline. Done when: startup/shutdown terminate with useful diagnostics within their stated limits and leave no owned children. Ref: ET-07.

Product validation to close known coverage gaps

These are ordinary implementation/release checks to run when implementing the work. They were not all executed during this audit. Reuse current suites and consumer apps.

  • 38 — P1 qualification / native products: execute actual current carriers. Run the existing C/SDK regression lanes with real PostgreSQL plus reset, raw-boundary, restore and cancellation cases from03/04/02/13. Done when: results identify the exact artifact/SHA and distinguish executed from skipped tests. Refs: Q-C01; depends on affected fixes and07.

  • 39 — P2 qualification / host adapters: complete the supported OS/runtime matrix. Run the relevant Node/Bun/Deno and Linux/macOS/Windows/ARM consumers. Done when: lifecycle and protocol results agree, filesystem publication behavior is qualified per platform, and addon worker/finalizer cases remain green. Refs: Q-C02, WA12; depends on19 and38.

  • 40 — P2 qualification / Swift: make native-required smoke truthful. Add one separately selected Swift-to-C PostgreSQL consumer, or rename the task and remove the unconsumed requirement claim. Done when: required mode fails when runtime artifacts are unavailable and real mode proves open/typed query/close; unit mode remains independent. Ref: MOB-Q01.

  • 41 — P2 qualification / mobile typed facades: execute them directly. Extend current Swift/Kotlin integration smoke for typed nulls, bytea, custom-OID raw values, duplicate fields, transactions and SQL recovery. Done when: reports prove facade-to-runtime execution, beyond RN raw-path tests and fixture parsing. Ref: MOB-Q02; depends on40 and actual Android artifacts.

  • 42 — P1 qualification / mobile lifecycle and storage: run installed-app checks. Use the existing iOS/Android apps and durability/lifecycle lanes. Done when: lifecycle transitions during streaming complete, cancellation recovers, generations remain isolated, retained roots reopen, and successful persistent writes/restores meet the chosen contract. Refs: MOB-Q03–Q04; depends on01/02 and25–29.

  • 43 — P1 qualification / Postmaster: execute its runtime capability suite. Use exact pinned builds to prove fresh exec, fixed shared reattachment, wait/join, signals, timers and packed-latch behavior on supported hosts. Done when: required cases execute, cross-instance state works under ordinary concurrent clients, and process-group resources return to baseline. Refs: WA05, WA15, WA22; depends on21/22 and07.

  • 44 — P2 qualification / Wasmer compiler and tables: check semantic equivalence. Run compiled bulk-memory overlap/bounds/growth and indirect-table mutation/signature cases against a reference engine. Done when: bytes/results and defined runtime outcomes agree; shadow tables stay coherent through set/fill/copy/init/grow and side-module use. Refs: WA13–WA14; requires the pinned compiler, not just source-text checks.

  • 45 — P2 qualification / artifacts and start images: verify lifecycle ownership. Run existing loader/activation/rollback and deterministic-start-image suites on supported mapping implementations. Extend missing supported expression/initialization shapes conservatively. Done when: admitted images match ordinary fresh initialization, rejected loads release resources, frame/code/metadata lifetimes agree, and one failed initialization cannot become a later success through stale state. Refs: WA16–WA19. Do not generalize the image analyzer before this evidence exists.

  • 46 — P2 qualification / VFS and networking: exercise normal descriptor churn. Cover positioned/append I/O, growth, dup/renumber/close, queued accepts, repeated watches, multiple waiters and EOF. Done when: results match the supported POSIX contract and there are no stale-offset, stale-descriptor or lost-listener-progress outcomes. Refs: WA20–WA21; depends on21 and43.

  • 47 — P1 qualification / persistence: run existing recovery lanes for each provider. Cover normal WAL rotation/recycling, checkpoints, clean reopen and the repository's established recovery checks under the selected durability contract. Done when: committed state and retained extension objects remain correct and host locks/processes are released. Refs: WA23, CORE-04; depends on01/02/05/06/21/22.

  • 48 — P2 qualification / all extensions: deepen the useful behavioral subset. First cover pg_ivm updates/deletes/rollback, pgvector HNSW/IVFFlat lifecycle, retained pg_textsearch BM25 and persistent PostGIS GiST/transforms. Add dictionary-resource checks and topology-specific notifications/files/inspection cases for contrib. Done when: the supported native/mobile/WASIX ABI paths execute the relevant pinned cases and receipts distinguish target/topology. Ref: ET-08; depends on31–33. All39 integration families are enumerated in the area report.

  • 49 — P2 qualification / public Postmaster carrier: test the shipped entry point. Pick/document its actual default settings and run a small packed start/connect/stop consumer on Linux/macOS. Done when: published instructions execute and resource measurements describe the same settings, rather than only a separate qualification profile. Ref: ET-09; depends on34/35.

  • 50 — P2 qualification / seeds, ICU and tools: prove the final packaged closure. Reuse clean-consumer tests for each target's standard/ICU seed, locale probes, tool binaries and installed paths. Keep source/header receipts separate from actual execution. Done when: carrier versions/ABIs agree; ICU data and catalog expectations agree; ordinary psql/pg_dump options/output behave as the pinned tools specify. Refs: core seed review, D-C05, existing per-release seed checklist.

Performance work, ordered by existing evidence

  • 51 — P2 / native restore: remove quadratic metadata work. Collect and sort canonical entries once; validate duplicates/ancestor collisions and extract from the existing validated plan. Done when: existing archive semantics stay intact,10k→20k file metadata time is substantially below the observed3.95× growth, and full restore time/RSS are measured separately. Ref: ND-C10; depends on02's final restore flow.

  • 52 — P2 / Kotlin parameter encoding: use a presized byte buffer. Replace boxed byte-list construction while preserving public ownership copies and protocol bytes. Done when: the8 MiB parameter case allocates substantially less than the measured227.3 MiB, linear space is bounded, and small-query/device latency does not regress. Ref: MOB-P01.

  • 53 — P3 conditional / Node dispatch: measure thread-per-operation cost. Compare the existing path with one persistent addon worker using current lifecycle fixtures. Done when: implement only a demonstrated median/tail/thread-count improvement that preserves cancel and cleanup. Do not assume libuv's shared pool is automatically suitable. Ref: ND-C11.

  • 54 — P3 conditional / parameters and parsing: remove redundant work where measured. Benchmark typed/untyped JS inference and mobile frame/scalar copies. Reuse inferred prepared state or frame spans only where ownership is clear. Done when: null/custom codec/array/error behavior is unchanged and realistic allocation/latency improves. Refs: ND-C12, MOB-P02; depends on52 baseline.

  • 55 — P3 conditional / backup and logical tools: measure full-buffer costs. Measure peak RSS/throughput across direct, broker and language boundaries. Add a streaming/file output route only for a real large-database requirement. Done when: complete output and cancellation/recovery semantics remain correct, with measured benefit. Refs: ND-C13, ET-13; depends on09.

  • 56 — P3 conditional / warm startup and extension registration: remove redundant materialization. Measure immutable carrier hashing/file reads and Swift base64 registration working set. Reuse existing receipts or incremental fingerprints where justified. Done when: exact artifact identity and conflicting-file detection remain enforced and cold/warm startup/RSS improve. Refs: ND-C14, MOB-P03.

  • 57 — P3 conditional / Wasmer optimizations: require per-change evidence. Measure detached metadata, shared tables, sparse globals and start images with the same build/storage policy, including PSS/cgroup memory and tail latency. Done when: each retained optimization has a useful gain and its semantic checks; required exec/shared-memory fixes remain even if they are not speedups. Ref: WA28; depends on44/45.

  • 58 — P3 conditional / SQL and PostGIS build optimizations: keep only justified delta. Compare removal builds for optional PG micro-optimizations and measure PostGIS whole-archive/export-all cost. Done when: equivalent SQL/extension lookup/constructors and matched durability are proven; carrier size/AOT/startup or query improvement justifies the change. Do not delete exports from appearance alone. Refs: core patch strategy, ET-13.

Cohesion, duplication and documentation

  • 59 — P2 / Wasmer organization: extract the first-party executor. Move product-owned executor/proof tooling into ordinary repository sources, retaining narrow required runtime APIs. Done when: sealed CLI/manifest/features/dependencies and behavior remain the same, while code can be navigated, linted and tested directly. Ref: WA24. Preserve fresh-exec design.

  • 60 — P2 / patch ownership: organize by responsibility and upgrade risk. Split core embedding, platform correctness, process/mapping lifetime and optional optimization deltas. Record base, invariant, owner, relevant test and upstream/removal status for each logical change. Done when: the same current postimage is reproducible and a PostgreSQL/Wasmer/libc upgrade requires semantic review as well as patch application. Refs: WA25–WA26, core complete patch inventory. Do not merely concatenate patches or introduce an embedding framework before a real seam is defined.

  • 61 — P2 / shared semantics: reuse contracts and transition fixtures. Extend existing language query cores and common fixtures for reset outcomes, acknowledgement retirement, diagnostic precedence and ownership cleanup. Keep platform-specific schedulers and topology adapters. Done when: one expectation changes in one shared fixture, with every relevant SDK exercising it and no hidden topology fallback. Refs: MOB-O01–O02, WA29; depends on settled correctness behavior above.

  • 62 — P3 / delete verified dead code and move local adapters. Remove unused native JS tar/zip/readiness helpers, obsolete AGE branches and stale PGXS columns. Move Windows extension-specific transformations next to their recipes while retaining common build helpers and layout assertions. Done when: import/package checks pass, generated inventories are equivalent, and current extension arguments are not lost. Refs: ND-C15, ET-10–ET-11. Separate deletion from behavior changes for review.

  • 63 — P2 / public behavior docs: state the actual limits. Document one physical session, logical detach versus terminal close, queued cancellation versus admitted teardown, raw exchange scope, Java output ceiling, current32767 parameter cap, pending-work/mapping limits and buffered tools. Done when: examples and errors match tested semantics; no universal startup/close timeout is claimed for an uninterruptible direct backend. Refs: D-C01, MOB-D01–D02, WA30; depends on04/10/14/22/24/30.

  • 64 — P3 / preserve explicit product policy. Keep browser-default IndexedDB durability unless the product deliberately chooses otherwise; describe it accurately in matched benchmarks. Resolve opt-in pgrx experiment wording separately from the public39 catalog, and document Postmaster's current core-only support. Done when: one support inventory is unambiguous and no cleanup silently changes an accepted API/storage policy. Refs: WA27, ET-12.

  • 65 — P3 optional / maintainer rebuild resilience. If useful, stage replacement resources fully before promoting them under --force. Done when: a failed replacement can retain prior generated output while successful force rebuild remains simple. Ref: ET-14. This is build convenience, not a customer-data defect or release blocker.

Suggested implementation order

Start with the shared causes:01–04,08–09,19–20,25–26 and31–32. Resolve14 and18 as product contracts while smaller fixes proceed. Update07 without waiting for organization work. Follow with the remaining P2 correctness items and the relevant actual-carrier checks. Do51/52 next because their costs were measured. Finish conditional optimizations and cleanup after correctness and verification are credible.

Each completed item should link its focused change and actual verification result. Do not mark a box complete because a source checker finds a symbol, a transport call returned successfully, a receipt contains a hash, or an artifact-dependent test skipped. Existing checked-in implementation checklists and release gates should be updated from this list once fixes land; this report itself makes no release-ready claim.

Activity

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

    bugSomething isn't workingenhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions