Repository navigation
Inspect stored PHP state before native upgrade - #460
Conversation
|
Actual published Server 2.8.0 source preparation passes: one original leased activity and a separate pending timer; explicit SIGTERM exits 0 without OOM. Initial cd455 inspection refuses. Read-only directory mounting prevented WAL sidecar creation, but a separate writable-directory countercontrol created empty WAL/shared-memory sidecars despite SQLite read_only=true (main database SHA unchanged). Prospective contract: refuse WAL from its header before opening SQLite; rollback-journal inventory only until a consistent WAL snapshot path is independently qualified. Separately, exact current PHP catalog differs from the old compiled physical baseline: service-call deadline column/index plus Worker registration-token/incarnation table/indexes. Unknown current layout remains refused; no schema difference will be discarded to manufacture acceptance. Original failure and both original run identities stay recorded. Takeover/backup/quiescence authority remains false. |
|
86d5 local source profile passes SQLite, including unknown-column and malformed ownership-marker refusals with before/after byte equality. Its MariaDB first inventory refuses: complete definitions match the exact variant, but MariaDB information_schema orders underscore-containing table names differently from Rust byte ordering. Prospective metadata disposition: canonicalize both complete source catalog row lists by exact table-name bytes before comparison/fingerprinting. Preserve every name/definition, table count, constraint and index; do not alter any business event or row ordering, native migration/catalog or frozen differential actor. The original MariaDB refusal remains failed. Separately, repository isolation policy correctly rejects the profile stop command redirecting to a variable output path; the new runner discards that redundant stop output and keeps independently checked stopped-state JSON. No policy relaxation or resource/budget change. |
|
Published-source inventory acceptance is local only; candidate all-six qualification remains pending in 38668390692. Final head c3f09fd, whole tree 2fc44702, native tree cad3a39e. Local profiles execute ddd696c; the final commit changes only documentation. The native binary stays
Each profile checks the exact 50-table layout, two pending runs, one leased activity, PHP SIGTERM/exit 0/no OOM, source rows/sequence positions or SQLite bytes unchanged, and all takeover/backup/quiescence/representation flags false. The raw public-protocol author is not an SDK continuation or completed workflow claim. Original preparation retains its 30-second deadline; inspection retains 30 seconds plus separate one-second connection retirement. The eight-minute hosted phase and three-minute cleanup bound are new prospective allocations, with existing job/scenario budgets unchanged. Twelve actual refusals pass: unknown column and malformed ownership marker in all four databases; denied network roles in three; PostgreSQL row security. Every inspection/refusal has a before/after source-state comparison. Foreign-owner cleanup refuses without mutation, and actual MariaDB cleanup is idempotent. Native library tests pass 73/73, 18 explicit ignores. The preceding SQLite component passes 105/105 before the MariaDB/catalog-order-only changes. Isolation policy and 72/72 controls pass; PHP syntax and Rust formatting pass. Initial cd455 WAL/source-catalog failures remain failed on original runs No production migration, WAL snapshot, SQL/external backup restoration, stored-representation conversion, interruption recovery, native capability/release, matched performance gain or cutover qualification is claimed. Existing PHP ownership guards require no change for this inventory step. |
|
Cleanup independently completed at 02:00:05 UTC, before the 02:15 boundary: all task HTTP/DB containers, network, owned MariaDB image, local databases, compiler/target/registry cache, formatter and raw source/transport files are removed. All three DB servers stopped with exit 0/no OOM. The task GHCR input reference is removed while the separate shared Docker Hub reference is preserved. Only the clean unfinished source worktree remains; no bulk retention is claimed. Code/countercontrols and readable outcomes above remain. Exact-head hosted qualification is queued in 38668390692; no pass is carried from another head. |
# Conflicts: # docs/rust-server-port.md
|
Current-main integration is now 68c42b1 / whole 68541db92c98a2577d20963352fef967676e7c99, merging delivered #457 main303. Native subtree stays exactly cad3a39e; local component acceptance above is unchanged, while the combined whole tree needs new qualification. Fresh shared 38669154951/source38669155000/boundaries38669154885+38669149206 are live/queued. Earlier c3 shared38668390692 was cancelled during SDK setup: dependent execution/storage/codec/MySQL placeholders have zero steps, so no database scenario was admitted. It remains cancelled, not passed. Documentation conflict was resolved to retain failure/retention limits and current delivery status; only the new task state ignore was added. No local runtime/cache/raw resources were recreated. |
|
Current 68 original SQLite job 116210443742 is failed, not qualified: library 73 pass/18 explicit ignores; HTTP 104 pass/1 fail. The existing stalled-upload control returns 503/external_payload_unavailable instead of 201 for its fresh three-byte upload under the unchanged 100ms timeout (external_payloads.rs:1354). The stalled first upload correctly refuses; no narrower cause is established. The codec step exits before creating the deployment network, so later source-inventory/marker/external-consumer steps report missing network and do not qualify their scenarios. Other original database jobs continue. I read the bounded 21KiB test summary and removed the downloaded archive immediately. No source, budget or expectation has been changed to rescue this original. |
|
Source review separates two checks that the failed control conflates. The stalled request must still stop on its original 100ms deadline. A fresh durable upload is allowed to return unavailable when its own 100ms filesystem/SQL budget expires, so that response alone does not prove a leaked capacity slot. I will keep the failed original and replace the speed assumption with a fresh request using the normal 30s policy while sharing the exact same one-slot semaphore. A retained slot must still make that control fail. No runtime timeout default or existing admitted request is changed. I am also checking special-file refusal in the new read-only CLI before claiming its observation bound. |
|
Revised source 4459140 / whole a2f44281bcacc3e0667a00595106694f484b31a7 / native a21b69a1be1cc1190d6df12d3b935c6c2da4b77d is pushed. Local component checks pass 73 library cases/18 explicit database-only ignores, 105 HTTP cases and one real CLI process control. The previous inspector fails that FIFO process control (killed at its 3s refusal ceiling); regular-file checks plus nonblocking Unix open pass it. Existing lockfile libc is now an explicit Unix dependency, with no transitive version update. Formatting and the action-policy validator pass. The stalled upload keeps 100ms; a fresh normal-policy request shares its exact one-slot semaphore. New hosted whole-tree qualification remains required, and old 68 database originals continue unchanged. Inventory runs now require successful deployment prerequisites and retain always-run cleanup. Source docs identify PHP queue/class/codec/cache representation gates without claiming conversion or takeover. |
|
All local verification resources were retired at 02:37:29 UTC, ahead of the 03:00 ceiling: task containers, compiler/target/registry cache, formatter, counterfactual source copy and logs are gone. Only the clean unfinished source worktree remains; root is 66% with 33GiB available. Exact-head hosted 38671922377 plus normal source/boundary checks are queued. Earlier 68 originals are not cancelled or rescued; no bulk retention is claimed. |
|
Revised head 4459140 / run 38671922377 has a separate failed SQLite original: execution-and-codec job 116222559598 fails in restart.php prepare while polling restart-old/restart-v1 activity work from the frozen published PHP target, http://parity-server:8080. The actual response is 503/backend lock pressure; the SDK exception is at restart.php:109. The workflow identifies that target from the unchanged PHP 2.5.14 / Workflow 2.5.5 baseline (amd64 image 28fa0f39). Native preparation is a separate preceding invocation. The upgrade-inspection step is SKIPPED because its prerequisite failed. No SQLite inventory or takeover acceptance is inferred. The later corrected-marker phase also fails with cURL52/empty reply from its native endpoint; its cause is not established or equated to the PHP lock observation. The job has 22 passing scenario outcome records before/around these failures, which do not rescue it. The complete job log has been read; the small failure artifact is being retrieved for a further bounded audit. Other admitted database cells continue unchanged. No retry, allocation/timeout change, frozen retuple, current-release correction or shared-cause claim is made by this checkpoint. |
|
Bounded artifact audit completed through the GitHub connector after the host artifact download hit an Azure TCP timeout. Artifact 11946313344 is 187,387 compressed bytes, not a bulk SDK archive. It independently confirms 73 library passes / 18 explicit ignores, all 105 native HTTP passes, and the real FIFO/directory process control pass. The revised 100ms/fresh-normal-budget capacity test passes in this execution; the earlier failed original remains failed. The installed local external-consumer comparison also completes all five original workflows per PHP/native target with original 30-second budgets and all seven reader refusals. These passed components do not rescue the failed shared restart or establish the skipped upgrade inspection. Corrected-profile PHP maintenance logs include a SQLite error5 during child-projection timeout publication; that is a separate profile observation, not proof of the primary poll cause or later native empty-reply cause. Original native exit/OOM state is not present in this thin artifact, so that cause remains unestablished. No CI/runtime restart or retuple was used to obtain the artifact; the local ZIP is being deleted after this audit. |
|
Correction to the follow-on empty-reply disposition: workflow/source inspection establishes the missing prerequisite. The failed PHP restart preparation is before creation of parity-recovered; that creation command never executes. The corrected-marker step nevertheless uses !cancelled() and invokes corrected-marker-shared-profile.sh against http://parity-recovered:8080. Its native phase therefore has no prepared recovered target. The proxy empty reply is a derived absent-baseline failure, not a qualified observation of native execution or an established native crash/OOM. The original PHP activity-poll 503 remains failed with its cause unestablished. I am preparing a narrow explicit prerequisite guard for the dependent corrected-marker steps across the three backend job definitions. Independent cohorts/cleanup remain separate. Already-admitted original jobs stay intact; no new head, retry, budget or frozen tuple is submitted while their execution continues. |
|
The prerequisite guard is now prepared locally: each backend comparison step has an explicit ID, and the corrected-marker step requires that prerequisite outcome=success. This applies to the prepared native-b targets on MySQL/PostgreSQL and recovered target on SQLite; independent isolated cohorts and all cleanup guards are unchanged. Central action-policy validation and diff checks pass. It is not pushed yet, so run 38671922377 and all already-admitted originals remain the same source. The original PHP 503 and derived absent-target failure remain failed; this guard is not a runtime correction or a rescue of those observations. |
|
Run 38671922377 is terminal and unsuccessful at unchanged head SQLite remains failed at frozen PHP restart preparation's The prepared workflow correction guards the dependent marker comparison on successful restart preparation while preserving independent cohorts and always-run cleanup. No changed-head rerun has started. I will integrate the coordinated qualified PHP tree once it is handed off, then qualify the resulting exact source. No backup, migration, takeover or native release is authorized by this inventory result. |
|
Actual stored-representation audit on the isolated immutable published PHP Server 2.8.0 image: the unchanged raw public-protocol author prepares its original activity and timer runs in 1.40s under the original 30s preparation deadline, then the sole fixture API writer stops with SIGTERM/exit 0/no OOM. This is not an SDK continuation or a completed workflow workload. The strict read-only SQLite reader observes two waiting runs, four canonical tasks (two completed workflow tasks, one stored leased activity, one ready timer), one activity execution and seven history events. Official installed Avro decoding preserves The database queue contains an actual serialized The final strict reader passes without warnings and preserves the exact database SHA-256 before/after. Initial reader probes used the wrong |
|
Next source-only migration gate: inspect known V2 workflow/activity/timer queue commands with the released phpserz token parser, disabling its optional Serde feature. Bound bytes, nesting and token counts; retain byte-string properties and refuse duplicate keys, references, custom serialization, trailing values and unknown classes. Known class/task metadata remains an observation until separately joined to canonical SQL task/run state. No PHP object execution, command replay, mutation, backup approval or takeover authority is introduced. Actual published-image serialized job fixtures and malformed controls will qualify the decoder independently before any migration path uses it. |
|
Prepared source ed686fc (tree 2865f097a3d4cfe0c49706bae9f80956ecba99ac) is pushed on rust-325-upgrade-source-preparation for review. Seven focused decoder controls pass using the normal phpserz 0.3.0 crate and the project-selected serde_json version. They cover the three real published-class fixtures, every truncated prefix, malformed/overflowing lengths and integers, binary strings, duplicate/hidden properties, references/custom/unknown objects and byte/depth/token limits. Regenerating fixtures in the immutable PHP image is byte-identical. Rustfmt and diff checks pass. The lock adds only phpserz and fast-float2; existing package identities remain unchanged. The 65 MiB task compiler/cache/harness/raw inputs are removed. This is an independently tested source module plus the earlier read-only fixture hook, not a full native build, row binding, migration, backup or takeover pass. The PR head and its old hosted failure records are unchanged pending the qualified parent/source integration. |
|
The separate migration preparation now binds a known PHP queue envelope to its original canonical task/run in source A genuine published PHP 2.8.2 source ( The actual timer uses canonical SDK queue Controls refuse changed identity/kind/run/namespace/SDK queue, wrong outer handler/policy/transport scope, duplicate or unknown envelope fields, oversized bodies and absent canonical identity. The small genuine source fixture and reproducible read-only exporter are committed. An initial image setup used a configuration digest as a manifest and failed before any application or original was admitted; the separate correct-index setup is the producer above. This proves the recorded source/decoder/binding component only. It does not scan every source row, validate every timestamp or PHP/embedded representation, restore a backup, prove writer quiescence or execute the originals in Rust. |
|
Read-only queue inspection is now implemented in preparation source
Local checks pass 93 library cases (18 existing explicit database/subprocess ignores), including 23 focused decoder/binding/inventory cases, and the process refusal test for both commands. Multi-page unknown jobs, orphan/foreign bindings, nonpositive IDs and oversized bodies refuse without changing database bytes or leaving a reader. The committed published-source recipe then passes on SQLite DELETE, MySQL 8.4.5 and PostgreSQL 17 against published PHP 2.8.0 image index Two PostgreSQL setup attempts failed at a custom Unix-socket configuration before any application or workflow admission. The fresh default-socket setup supplies the passing PostgreSQL originals. Neither failed setup is counted as a workload or product finding. These are raw-protocol source authors and read-only queue checks, not SDK continuation or Rust execution of the originals. Full hosted version-matrix integration, complete stored-state validation, verified backup/restore, writer quiescence and actual sequential takeover remain pending; their flags stay false. All completed databases/raw state are removed immediately after audit, with the remaining task build scratch being retired now. No bulk retention is claimed. |
|
Promotion of inspector candidate Using its exact optimized binary The existing static FIFO/directory and WAL controls do not cover this check-to-open gap. No takeover or source-mutation authority is granted. Next: correct and test the actual file-opening boundary, retain the failed control, and qualify a new source revision before merge. The current main-image/frozen references remain unchanged. |
|
Prepared correction All three SQLite inspection commands now require the documented kernel read-only source mount before opening SQLite. The check uses live descriptors and includes the resolved parent directory, since a file-only read-only bind mount can still leave a writable sidecar location. SQLite locking and change detection remain enabled. The outer 30-second budget covers the mount check and inventory. The report still cannot certify another process's writer quiescence, a backup or takeover. The first mounted valid/malformed payload and special-source process controls passed (2 tests), before the later expanded three-command writable-source assertions. A later library component passes 109 tests with 18 existing explicit ignores. Its broader local batch was terminated during the CLI stage at the overdue cleanup checkpoint, so there is no completed final-head CLI/execution acceptance. The expanded test and exact hosted whole tree remain pending. The previous CI maps one private fixture directory through writable and read-only aliases, so normal hosted execution checks both writable refusal and actual valid/malformed Avro decoding. PHP source, Composer, OpenAPI, frozen actors and takeover flags are unchanged. No merge, image, migration or release is qualified. |
|
The exact optimized artifact for correction
Each basic All binary, C test shim, source files and SQLite state were removed and the isolated phase was verified empty at 16:45:04 UTC, before its 17:00 bound. Fresh hosted 38769642932 remains in progress; promotion still requires its exact final acceptance. |
|
Additional inspector review is incomplete. This draft remains unpromoted even if its current hosted matrix passes. Existing completed controls retain their stated scope; the unfinished review supplies no confirming or clearing evidence. Next work is the separate Server API and Waterline consumer qualification under #325. No migration, backup or takeover authority is claimed. |
|
Source review of Four corrections before merge:
Next: refresh onto main after #478 and #476, make these four corrections with focused refusal controls on each database family, then qualify. |
PostgreSQL catalog reads now include non-internal triggers and rules other than a view's own _RETURN rule, so a rule or a trigger calling a built-in function is refused like other unknown objects. MySQL and SQLite already refused them. SQLite does not enforce varchar lengths, so the queue scan measures every transferred text value first and refuses values over 4 KiB instead of loading them. Controls cover an oversized queue name, lease owner and workflow class. MySQL and MariaDB inspection sessions bound lock waits and statement time on the server, so a statement abandoned by the client deadline cannot keep its locks and snapshot. The payload report now states that other root payload columns are not verified and names the published tables whose codec-tagged payloads are not scanned yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tests Sonar flagged two serde visitors that implemented visit_byte_buf without visit_bytes, so a deserializer offering borrowed bytes would be refused. Both now accept either form. The payload inspection integration test waited on child processes and slept with blocking calls inside its async runtime. The process runs and the bounded wait now happen on the blocking pool; assertions and the three-second retirement bound are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
|
Qualification of |



Adds development-only, read-only commands that inspect an existing PHP Server database before a native upgrade:
upgrade-inspect(exact known catalog and row counts),upgrade-queue-inspect(database-queue job binding) andupgrade-payload-inspect(recorded-codec Avro and root external-reference metadata). Inspection never constructs a runtime pool, migrates or mutates the source, and its reports keep backup, writer quiescence, complete representation and takeover explicitly false. This is a step toward the backup-first in-place upgrade in #325, not the upgrade itself.Refs #325.
Head
c90130362a1a8782f5373eb9b222e07eb332c9f7, treec9a436dd86ad0e57d004ae667c28d85c601b0e5e, on current main7e9cbf2c(which includes #476, #494 and PHP Server 2.9.5).Review corrections
Review findings:
_RETURNrule), so they are refused like other unknown objects, as MySQL and SQLite already did.other_root_payload_columns_verified: falseand names the published tables whose codec-tagged payloads are not scanned yet.Validation
upgrade-source-profile.shagainst published-PHP databases on SQLite, MySQL 8.0, the existing MySQL matrix, MariaDB and PostgreSQL on this push.🤖 Generated with Claude Code