test(canvas): verify crash cuts and pending image replacement lifetimes
This commit is contained in:
@@ -6,13 +6,20 @@ are not complete.
|
||||
|
||||
## Verified revisions and environment
|
||||
|
||||
- Current delivered Endoleap consumer: `24c45920602378d52a42cda7e8ec2840864c8dbd`.
|
||||
- Current Foundry: `5db2bf3c98f2627139cbb6d47afefa686b4c6547`.
|
||||
- Current verified Endoleap service consumer: `dcbbdad25de7c3b1d6bee317df6074da2c0642eb`
|
||||
(product implementation `15ee917`; receipt diagnostics added by `dcbbdad`).
|
||||
- Current Foundry: `506f778ac33d47fbd6f38412995a10218d59fe0a`.
|
||||
- [Foundry CI #1186](https://gitea.entroia.com/Zayden-Jung/foundry-core/actions/runs/1186):
|
||||
job 1283 completed successfully, all seven steps successful. All prior flags
|
||||
and `dissolveCanvas`, `dissolveLostAckRecovered`, `dissolveUndoRedo` are true;
|
||||
`aiExecutionCount: 3`, 84 transport calls. The new canonical-frame rotation
|
||||
test also passed. Same-commit PR CI #1187/job 1284 subsequently passed all seven
|
||||
steps, with the same flags/execution count and 83 transport calls.
|
||||
- [Foundry CI #1182](https://gitea.entroia.com/Zayden-Jung/foundry-core/actions/runs/1182):
|
||||
job 1279 completed successfully, all seven steps successful, pinned to the
|
||||
current delivered consumer. Its report has all document/resource/AI and
|
||||
browser delivery baseline `24c4592`, Foundry `5db2bf3`. Its report has all document/resource/AI and
|
||||
migration flags true, `aiExecutionCount: 3`, and 75 transport calls.
|
||||
Same-commit PR CI #1183/job 1280 was still running at this audit.
|
||||
Same-commit PR CI #1183/job 1280 subsequently passed all seven steps too.
|
||||
- [Foundry CI #1180](https://gitea.entroia.com/Zayden-Jung/foundry-core/actions/runs/1180)
|
||||
and [PR CI #1181](https://gitea.entroia.com/Zayden-Jung/foundry-core/actions/runs/1181):
|
||||
completed successfully for consumer `26da326` and Foundry `3268c57`;
|
||||
@@ -21,7 +28,7 @@ are not complete.
|
||||
- Existing `ces-control` runner executes Go checks/build, schema migration and
|
||||
isolated PostgreSQL integration, then the pinned Node 24 consumer and HTTP smoke
|
||||
checks. No local backend build or Docker execution was used.
|
||||
- Local frontend: 802 Node tests and full TypeScript checking passed. Tests use
|
||||
- Local frontend: 821 Node tests and full TypeScript checking passed. Tests use
|
||||
the source modules; packaged SDK and application delivery remain separate gates.
|
||||
|
||||
## What the checks actually prove
|
||||
@@ -32,6 +39,8 @@ are not complete.
|
||||
| Migration admission and late rollback | `TestCanonicalMigrationPermissionVersionAndRunGuards` checks viewer denial, stale source versions, queued/running work and stable negative receipts after conditions change. `TestCanonicalMigrationLateCancellationRollsBack` observes the actual identity-map INSERT blocked after canonical/material/subgraph writes, cancels it, then checks all related rows, original legacy JSON and version before retrying the original key successfully. |
|
||||
| Incremental writes and receipt identity | `TestCanonicalModelMigrationAndIncrementalLifecycle` verifies exact retries, unknown receipt semantics, logical ID coverage, participant versions, and zero writes/logical-ID consumption after a later batch condition fails. It checks canonical DB rows, not just HTTP status. |
|
||||
| Canonical concurrent writers | `TestCanonicalConcurrentMigrationAndOwnershipWrites` races four identical migrations, then four identical edits, requiring identical receipts and one version advance. Two different requests then compete to move alternate endpoints and their common edge: exactly one wins, the loser has a queryable terminal version-conflict receipt, both canvas versions advance once, and the full ownership graph remains valid. Reusing the winning key with changed bytes is rejected without changing the model. |
|
||||
| Dissolve without deleting members | The real consumer creates nested child/grandchild canvases, dissolves the child and loses its successful response. Reopen queries the original request without a second POST. Direct members and the nested entry move to the parent, the leaf retains its grandchild owner/geometry, and the original entry/edge remain. Undo/redo/undo restores the original bindings. This uses the existing atomic edit protocol and the real HTTP/DB service. |
|
||||
| Canonical frame geometry | `TestCanonicalFramesRetainRotationAcrossOwnerChanges` preserves nonzero frame rotation through owner changes, projection and an unrelated canonical AI patch, while rejecting 360 degrees. The legacy snapshot writer still rejects rotated frames; its restriction no longer rejects canonical coordinate conversion. |
|
||||
| Real frontend coordination | `TestHeadlessClientHTTPIntegration` runs `tests/headless/foundry.integration.mjs` against authenticated HTTP and PostgreSQL. It verifies lost document ACK recovery without duplicate POST, atomic partition edits, deep copy with a parent-owned incoming edge, partial import and old stream-tail coordination. |
|
||||
| Resources and authorization | The consumer verifies lost upload ACK, shared pending-image upload, original bytes, metadata, cross-project adoption and reopen. `TestOnboardingAndSharing` additionally revokes source access after warm reads, verifies no target model/version/binding changes, preserves the rejected receipt after permission restoration, and checks independent target access. |
|
||||
| AI execution identity and controls | `TestCanonicalAIAdmissionAndLifecycle` covers admission/query/retry, zero-effect rejection, old incarnation callbacks, cancellation, managed image output, owner relocation, archived admission routes and execution after permission revocation. |
|
||||
@@ -65,6 +74,12 @@ identity/abort fences and terminal rejection followed by explicit preparation.
|
||||
asset adapter now accepts a host `displayURL(id)` callback. Canonical source
|
||||
identity and authority remain separate; preview bytes are not used as original
|
||||
file digest evidence. Authentication stays in the host fetch/transport.
|
||||
3. CI #1184/#1185 rejected the nested creation before reaching dissolution:
|
||||
canonical validation had copied the legacy frame's zero-rotation rule. A
|
||||
rotated owner can require a frame to retain nonzero rotation after conversion.
|
||||
Foundry `506f778` removes that canonical-only restriction; existing finite/range
|
||||
checks and legacy normalization remain. The consumer now checks the creation
|
||||
receipt before reading descendants, so a rejection reports its actual state.
|
||||
|
||||
The test harness also needed working controlled timers, a cancelled run's final
|
||||
event drain before the next admission, and actual copy-source file persistence.
|
||||
@@ -73,6 +88,29 @@ copy stage permits source checkpoints but rejects bitmap file duplication and
|
||||
asserts no extra upload or generation. Those fixes do not bypass busy, cursor,
|
||||
durability or resource-sharing checks.
|
||||
|
||||
## Final-audit recovery cuts
|
||||
|
||||
`crash-windows.test.mjs` selects actual immutable cuts produced by the engine:
|
||||
before local durability, durable pending intent, frozen request, dispatch-marked
|
||||
before server commit, dispatch-marked after server commit, and durable receipt/base.
|
||||
Each independent recovery pairs that cut with its corresponding server/receipt
|
||||
state, then checks document/history/logical IDs, exact frozen request bytes,
|
||||
POST/query counts and final durability. Frozen recovery may conservatively query
|
||||
before its exact retry; a missing receipt never creates a new identity. These are
|
||||
memory StoragePort/protocol fixtures, not physical browser-process termination.
|
||||
Actual IndexedDB atomic rollback, fencing/checksum/journal-gap and reopening
|
||||
evidence remains the separate browser suite; this is not every possible cross-product.
|
||||
|
||||
`engine.test.mjs` additionally commits a create, loses its ACK, deletes locally,
|
||||
reopens, queries the original create and finally sends the dependent deletion.
|
||||
The server has no residual element; both original history units remain and the
|
||||
creation is not submitted twice. The focused engine/crash suite passes 36 tests;
|
||||
the full Node suite passes 821. `resources.test.mjs` also verifies replacement of
|
||||
an existing image while the new upload is gated: the old server reference stays
|
||||
valid, undo prevents a late replacement, and redo/reopen reuse the two uploaded
|
||||
resources without a new upload or element incarnation. Its 32 checks pass.
|
||||
The final acceptance matrix is still in progress.
|
||||
|
||||
## Boundaries and remaining audit
|
||||
|
||||
The recovery store is an in-memory durable-batch fixture, and response loss is
|
||||
@@ -115,7 +153,7 @@ are not proved by that fixture. `TestCanvasAIRealWorker` remains opt-in and skip
|
||||
|
||||
The CI log includes an early skip of `TestHeadlessClientHTTPIntegration` without
|
||||
its opt-in environment and a later successful execution in the explicit Node/DB
|
||||
phase. Those are different invocations. The latest log has 157 distinct PASS names
|
||||
phase. Those are different invocations. The latest successful log has 158 distinct PASS names
|
||||
including subtests; that count is not 154 independent end-to-end scenarios.
|
||||
|
||||
The service audit covers the original stage requirements: target incremental and
|
||||
|
||||
Reference in New Issue
Block a user