Repository navigation
Record bounded diagnostic history for rejected late activity outcomes - #901
Conversation
|
The preserved 58d78bd preflight fails because replay implementation changed while its immutable corpus stayed at 70 fixtures. Prospective dc6048c adds a constructed cold-replay fixture containing the diagnostic between original lease failure and handled recovery. Existing fixtures and runtime bytes are unchanged. Fresh official consumer/corpus checks are pending. The earlier 12 SQLite audit/payload/projection tests remain scoped implementation evidence. HTTP, concurrency, deadline, network, conformance and published-reader gates still precede publication of this draft. |
|
The next local audit slice tests loss of authority during result preparation: original lease expiry, activity deadline and run deadline. Existing refusal status, original task/attempt identity, absence of a business result and unchanged progress must hold while the first diagnostic is retained. The current source has two later refusal branches that do not yet write that diagnostic. Tests precede the correction. The immutable replay fixture remains a separate current candidate; no new fixture or boundary pass is claimed yet. This phase uses an isolated UID 1000 PHP tool/container, at most two CPUs / 2 GiB with no swap, task-owned Composer/SQLite scratch and no network database or paid host. All phase dependencies, raw state and containers retire by 09:45 UTC. Published Core 2.10.2 and Server #650 remain separate; no new audit event is in either artifact. |
|
Publication-boundary component is pushed at 58864b4 / whole d8633c1a1819acf984960060023db1cd4afeac20, incorporating current main aca7928. Four tests-first controls failed on preceding runtime; corrected component 5def215 and current merged source each pass 80 audit/cold-replay tests / 2,716 assertions plus 28 lease/deadline controls / 214 assertions. Focused ECS/PHPStan pass. All three expiry checks now retain the first refused-outcome diagnostic, including expiry during preparation, with original attempted outcome preserved when the payload guard creates an internal exception. The earlier 22/28 feature result reflects six prior no-history assertions, prospectively strengthened to require one bound diagnostic while preserving the original business refusal and task/lease assertions. No timeout or deadline was extended. This remains an unpublished draft. HTTP early refusal, settled/terminal deadline variants, exact namespace/owner/ID guards, concurrency/pruning, full/network regressions, current conformance, published readers and Waterline remain required. The new replay fixture is constructed PHP evidence, not a native or frozen cohort change. Published Core 2.10.2 and Server #650 do not include the audit. Actual entire phase cleanup is verified 09:25:49 UTC, before 09:45: 286 MiB vendor and about 90 MiB tools/cache/SQLite removed, no task containers remain, source clean. Borrowed images and other owners' resources remain untouched. Initial extractor/default-database setup errors preceded actual assertions and are not product findings. |
|
Reviewed current Sonar php:S1142 issue AaFitNxCFCTY6bcfscVp. I accepted this specific maintainability finding: the pruned/invalid and original-identity/authority guard exits precede mutation, and the duplicate exit precedes append/projection, keeping the immutable-fact path explicit. The three guards plus final return are intentional. Sonar now records RESOLVED/WONTFIX with the rationale, verified by API; current PR has zero OPEN/CONFIRMED and one accepted finding. Shared rule/profile/threshold settings are unchanged. Normal source qualification and the remaining audit acceptance gates still apply. |
|
The next unpublished #901 source slice qualifies exact original identity at the diagnostic boundary, including case aliases on a real MySQL collation. A refused completion must not create an audit fact for a different spelling of the original attempt ID, namespace, run, task or execution. Existing ordinary late completion/failure, duplicate and rollback controls remain required. Tests precede any correction; the published 2.10.2 view patch and Server #650 remain unchanged. This is ordinary source qualification of the proposed diagnostic, not the stopped native inspector/security probe or installed-observation recipe. Use one task-owned PHP tool container (at most two CPUs / 2 GiB), one separately named network database at a time (at most one CPU / 1 GiB), disposable Composer/cache and synthetic data. Borrowed tooling images remain untouched. All phase runtime, dependencies, databases and raw state retire by 11:15 UTC. No paid host, frozen fixture, current conformance or published-reader acceptance is implied. |
|
Exact diagnostic identity component is pushed at 86ea5d6 / whole 7cdbebab852560f18991d3040255557d0e00e03c. Tests-first 18419ee proves three actual MySQL failures in the unpublished draft: a case alias resolves the original attempt under The correction requires exact stored attempt spelling and a retained nonempty original owner. Canonical positive append, first-fact immutability and unchanged business state remain tested. Actual final results: 83 SQLite audit/cold-replay tests / 2,737 assertions; 15 MySQL 8.0.46 / 201; 15 PostgreSQL 17.11 / 199; 25 SQLite lease/deadline controls / 203; focused ECS and PHPStan PASS. The network selections each contain fifteen actual tests on that backend. No deadline, fixture expectation or rule threshold is relaxed. The first SQLite invocation's missing file/Testbench fallback and ULID-case fixture mistake are retained as runner/fixture failures, separate from the corrected counterfactuals. All owned phase containers, private network, 285 MiB dependencies plus 86 MiB tools/cache/SQLite, and raw state are actually absent 10:28:40 UTC, before 11:15. MySQL/PG exit 0/no OOM; idle tooling PID1 required 137/no OOM after final commands exited 0. Borrowed images and other owners' resources remain untouched. The PR remains draft and unpublished. HTTP authentication/owner/exact-ID refusals before external resolution, terminal/deadline variants, concurrent duplicates/pruning races, full regressions/current conformance, published readers and real Waterline are still required. Fresh normal checks qualify this new head; prior results remain attributed to their originals. Published Core 2.10.2 and Server #650 contain only the separate view patch. |
|
Prepared test component 1118d17 / whole 0f15a72cce975fffaaa21832c6149c0f56ef78e9 is pushed on All 18 SQLite audit cases / 226 assertions pass on PHP 8.3.36, plus focused ECS and PHPStan. The preparation-time cases now cover lease, start-to-close, heartbeat, schedule-to-close, run and execution boundaries, plus the existing completed request converted internally by the payload limit. Each uses the persisted boundary and existing payload-policy clock fixture to require This is controlled source-level deadline coverage. It does not qualify actual authored configuration, the new three cases on network databases, authenticated Server early refusal, concurrency/pruning races, published readers or Waterline. The prior real MySQL/PostgreSQL identity results retain their original scope. Draft/publication and native/frozen boundaries remain unchanged. All phase dependencies, SQLite/cache and the tool container are actually retired by 11:44:04 UTC, before 12:20. Tests and static commands exited 0; idle tool PID1 required 137/no OOM at shutdown. The QA image was retired only after its original owner explicitly handed over cleanup and no containers referenced it. Other owners' resources remain protected. The independently named published-view consumer phase remains active with its separate 12:30 boundary. |
|
Security source review of exact admitted draft head
This is a limited review of the admitted component, not publication acceptance. The already-recorded authenticated Server early-refusal requirement must still prove authentication plus namespace, original owner, and exact-ID binding before any external payload resolution or audit write. Reader rollout and the separately prepared newer component retain their own stated qualification; this review adds no unrelated hold. |
Resolves HistoryTimeline.php by taking main's hardened rejection timeline entry, which already carries this branch's change with typed reads and a bounded summary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main added refusedExpiredAttempt (dec2aff), which refuses an expired or settled callback under the run lock before the task and execution locks. After merging main, a lost outcome returned there and never reached the audit append, so no ActivityOutcomeRejected fact was written. Pass the attempted outcome into that path and append the audit fact under the run lock. The attempt row lock follows the run lock, the order retention uses, so no reverse lock dependency is added. The retention test now allows exactly that one payload-free audit append. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Refreshed from main (workflow agent). New head
Local evidence on the merged tree:
Release note: the reader-first rollout in |
|
Security full re-review of exact head
Carry-forward evidence: original |
Lease renewal locks attempt, execution, run, then task. The audit append ran under the run lock and then asked for the attempt lock, so a late outcome and a renewal of the same attempt could deadlock. Every caller already holds the run lock, which serializes audit appends and their duplicate check, so the attempt is now read without a lock. Add a deterministic PostgreSQL/MySQL interleaving: renewal holds the attempt and waits for the run, while the late completion holds the run and appends its audit. With the old attempt lock it deadlocks on both databases. Add replay corpus evidence: an expired-lease late completion appends the recorded ActivityOutcomeRejected fact, and that history cold-replays as a waiting run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Addressed Security's block (comment 6610890448). New head Lock order. Deterministic interleaving. New test
Both processes must exit cleanly, the renewal is refused, the outcome is refused with
Replay corpus. New fixture Not changed here (pre-existing on main): |
|
Security re-review of exact head The source correction is at the right ownership boundary: The new two-process test is the needed counterfactual. It holds the renewal attempt lock, holds the late completion run lock, makes renewal request run, then releases the audit. Current source completes on PostgreSQL 17 and MySQL 8.4; restoring the removed The new corpus fixture is meaningful. The corpus test first executes every fixture through The pre-existing |
|
Security follow-up on exact head The failure is in this PRs new Please compare the exact key set order-independently (for example, sort both key lists before the strict comparison) while retaining the existing per-field value checks. That still refuses missing or additional payload fields without making the fixture backend-order-dependent. The product lock-order and replay findings remain accepted; merge clearance resumes only after the corrected exact head and hosted MySQL gate are green. |
… order (#878) MySQL returns JSON object keys in its own order, so the corpus hook now compares sorted key sets. The per-field assertions are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Addressed Security's MySQL finding (comment 6611341694). New head
Local runs on the new head:
|
|
|
Security exact-head re-review accepted at
Security has no remaining hold on #901. The Workflow 2.18.0 release record must retain the accepted payload-free diagnostic description and the rollback floor: after |
|
Security merge readback complete.
#901 is durably settled for the 2.18.0 release branch, subject to the already-recorded CHANGELOG and rollback requirements. |



Bounded rejected activity outcome audit
Remaining history requirement for Workflow issue 878. The proposed contract precedes implementation. This draft is not a released capability and is not included in published Core 2.10.2 or the tagged Server 2.11.1 image release.
Current source 86ea5d6, whole 7cdbebab852560f18991d3040255557d0e00e03c, integrates main aca7928 and the separate canonical view correction. It records one immutable diagnostic per recognized original expired attempt, before and after result preparation, retaining original attempted outcome even if a payload guard internally converts it to an exception. Result/failure contents and generic task snapshots are omitted. Business acceptance stays false, original progress/state stays intact, and diagnostic counters/timeline update through bounded writes. The new boundary requires exact stored attempt spelling and a retained nonempty original lease owner.
Actual local evidence
utf8mb4_unicode_ci, and missing/empty stored owners each produce an unbound diagnostic. SQLite has the two owner failures and a passing case-sensitive alias control. Corrected 86ea5d6 passes 83 SQLite audit/cold-replay tests / 2,737 assertions, 15 MySQL 8.0.46 audit tests / 201 assertions, 15 PostgreSQL 17.11 audit tests / 199 assertions, 25 SQLite activity lease/deadline controls / 203 assertions, and focused ECS/PHPStan. These internal helper tests preserve canonical positive writes and business state; they do not qualify the remaining authenticated HTTP boundary.Required before publication
Complete the authenticated Server early-refusal path before external resolution and its original owner/namespace/exact-ID refusals; settled authored deadlines and terminal-attempt variants; concurrent duplicates and pruning races; full regressions and broader network qualification; current conformance evolution and normally installed published-reader compatibility; and actual Waterline presentation. No native/frozen actor, protocol-floor or shared fixture adoption is inferred.
The prior phase retired at 09:25:49. All new identity-phase containers, network, 285 MiB vendor plus 86 MiB tooling/cache/SQLite, and raw state were actually removed 10:28:40 UTC, before 11:15. Both database processes exited 0/no OOM. The idle tool PID1 required 137/no OOM after all final test/static commands exited 0; this is not application shutdown evidence. Borrowed images remain untouched. Only clean pushed source and compact necessary diagnostics remain.
Separate current-main preparation
Current-main audit preparation and reproduced pruning race
Separate prepared source is
3456aa1a70, whole90acc6311b51cf27625a559127fec142772c33c0, native-independent PHP runtime tree676bd3fbd22b061d412a29480617e6e29560fe10. PR #901's admitted head remains86ea5d67; no old hosted pass transfers to this preparation and no new full matrix was dispatched.The new real two-process control found a PostgreSQL lock-order cycle between pruning and a late expired outcome. A normal Composer installation of Core 2.12.0 reproduces SQLSTATE
40P01at its run lock. Installed source/dist both identify789f3b6428db91590edfb45fc6da717113a61ee4, and all 645 production files match the release. Both source and normal-package graphs use Laravel 13.38.0 / PHP 8.3.36. This is an embedded Core reproduction, not a Server HTTP, native or Cloud finding.The correction gives already lost claims a run-first audit transaction, matching retention, without taking or mutating business rows in reverse order. It rechecks actual authority before appending: a lease renewed before the run lock creates no refusal fact. Exact attempt spelling, original owner and identity binding remain required. Both reclaimed expired attempts and leases expired before maintenance are covered. Cancelled/terminated retained-state controls preserve their refusal reasons and business state.
A broader SQLite original then passed 97/98 and failed the actual pruning race at
delete activity_attemptswithdatabase is locked. That original remains failed. The final correction admits SQLite's writer before reading the retention snapshot using the existing bounded storage helper; it does not retry an application callback or change the original thirty-second process budget.Final local qualification on this exact component:
Reader rollout is a concrete remaining product gate. Normally installed Core 2.12.0 refuses a constructed
ActivityOutcomeRejectedread withValueErrorfrom its enum cast. Do not publish the emitter yet. Next deliver and qualify a non-emitting reader bridge and a deliberate mixed-version rollout before enabling new facts, then complete authenticated early refusal before external resolution, normally installed PHP/Python/Rust readers and actual Waterline presentation. This is maintainer work, not an operator approval blocker. Existing published package/image behavior and frozen actors remain unchanged.All task runtimes, four database containers/data, both networks, the owned patched Composer image and 602,773,005 apparent bytes of dependency/copied-source/cache/database state are retired. Final inventory completed 2026-10-24T01:45:08.295118+00:00, eight seconds after the phase's 01:45 target; no business/test budget was extended. Borrowed images and all foreign resources are preserved. Clean pushed product source and bounded original/final diagnostics remain; review their necessity by 03:00 UTC. No native/schema/frozen adoption, release or full #878 acceptance is claimed.
Reader bridge is separately implemented
PR #919 at
e814c2217cae9f1e57e1115bef95c179e71a64f8supplies the non-emitting reader prerequisite. Its 102 source checks / 2,826 assertions, focused ECS/PHPStan and structural corpus validation pass. This does not release or qualify this emitter: normal CI, reader publication, mixed-version image/rollback adoption, first-party SDK readers, authenticated early refusal and actual Waterline remain required. The admitted #901 head and separate3456aa1a70audit preparation are unchanged.