Files
SGF/docs/proofs/request-history-composition-20261103.json
2026-11-04 09:37:20 +02:00

195 lines
8.5 KiB
JSON

{
"date": "2026-11-03T17:52:48.219Z",
"increment": "SGF-REQUEST-HISTORY-CURSOR-QA-v1",
"passed": true,
"functional_code": true,
"checks": 36,
"tests": {
"history": {
"file": "private/receipt-composition-0fe2284727df/request-history-result.json",
"sha256": "afc0cc47ac4b45f6a0479877726c8ee17f8cdda4fe80615652f44515752b18cb",
"checks": 20,
"result": {
"passed": true,
"checks": [
"request detail reuses first25 events and offers opaque older cursor",
"first cursor page retains exact own-stage order without global count",
"all older pages retain127 original events once despite new head append",
"previous cursor returns the original immediately newer25 events",
"refresh includes new event and supports100-row page",
"100-row traversal exposes remaining28 original records with final cursor absent",
"page-size change cannot reuse prior25-row cursor",
"cursor cannot migrate to another authorised request",
"another authorised reader must start own cursor context",
"invalid cursors and unsupported parameter forms are refused",
"expired cursor requires an explicit fresh consultation",
"current view right is checked again on every history page",
"physical-only role and foreign request cannot read history",
"unmapped unit cannot reuse known request history",
"another active module cannot read purchasing history",
"new session context generation invalidates former cursor",
"fresh consultation restores own-stage history only",
"history preserves draft version/status and pre-existing harness order without stock invoice debt or payment",
"zero request id refuses before database access",
"disabled request-history feature refuses before database access"
],
"request_id": 5,
"initial_events": 127,
"events_after_append": 128,
"native_audit_fixture_notes": 126,
"main_drafts": 2,
"inherited_harness_order_before_history_request": 1,
"inherited_order_source_setup_removed_for_future_runs": true,
"request_version_unchanged": true,
"successful_prefix_reused": 17,
"guard_database_queries": 0,
"new_right_names": [],
"visual_review": false,
"deployment_capacity_validated": false
}
},
"ui": {
"file": "private/receipt-composition-0fe2284727df/request-history-ui.json",
"sha256": "95b66c6d6c045b2d8bb4a967b664496f3262680b85a3668d0e20ec4ebeed73ef",
"checks": 10,
"result": {
"passed": true,
"checks": [
"initial own-stage page is reused without another request",
"older navigation encodes opaque cursor and current size",
"final page exposes only valid newer direction",
"newer direction sends server-issued previous cursor",
"page-size change begins new bounded consultation",
"history refresh preserves separate unsaved request form",
"history component calls read API without a command payload",
"late older response cannot replace newer history response",
"changed record or detached history drops late response",
"expired or refused cursor offers explicit safe refresh"
],
"dom_simulation": true,
"business_commands": 0,
"visual_review": false
}
},
"demo": {
"file": "private/receipt-composition-92a2386b386b/request-history-demo.json",
"sha256": "12f62283e255f40deb2909b6e3fd65b7fb0de0e147ddca535d0339f18498e53d",
"checks": 6,
"result": {
"passed": true,
"checks": [
"fresh demonstration has no main request or history-volume fixtures",
"request workspace remains mounted for original requester right",
"unknown history source grants no access and creates no record",
"served history module matches request-workspace.mjs",
"served history module matches request-history.mjs",
"demonstration probes preserve requests native audit and permission grants"
],
"before": "2f8a52ec464f18ae27496377e25dd877391c3fe9f5671d2ef6d159400eef60dd",
"after": "2f8a52ec464f18ae27496377e25dd877391c3fe9f5671d2ef6d159400eef60dd",
"visual_review": false
}
}
},
"sources": [
{
"file": "app/Modules/Purchasing/RequestController.php",
"sha256": "c5c2b78866be7f0e1c8ba09c1af538cefcfbafbea81197833b50821bba0fcbca"
},
{
"file": "app/Modules/Purchasing/ProcessHistory.php",
"sha256": "255a4ca5901cf323e3fd16e2fb16509962710c5d5b67e2e425cdc1f7e7a257a2"
},
{
"file": "config/receipt_qa.php",
"sha256": "29ead5efdd92eea6224f9a038b2bfaab44581c1b288f4e8ea74bbab1831738cb"
},
{
"file": "routes/web.php",
"sha256": "8e8e34551d0b130172fd0f6104db039b4fc7bfbaa051457a89ae1ae3eebd9a33"
},
{
"file": "public/request-workspace.mjs",
"sha256": "9a44d4153b8a158dc310ff157ecc0b108888661c6c467f46a099e2abee869cb4"
},
{
"file": "public/request-history.mjs",
"sha256": "523b8d018d0191c68628922b180b8798e567b8bb4b54ce986002fcbb6c5a809e"
}
],
"pinned_native_manifests": {
"bundle": "7709a3d447d54c17d2fb4be4f9a0f70455c4a38c34e4bb8c643f6b5169071556",
"economic": "8b2d3aa61054e0edc54fcd818467eb2bacb5e1178f903b12ab44119e0f2e8d2e",
"internal": "2343af71f72259dd705f4cc3a3b163c90edf331a5b6ebe173531aeb341649e1b"
},
"authority": {
"existing_right": "purchasing_requests.view",
"new_right_names": [],
"own_stage_filter_unchanged": true,
"request_preview_confirmation_blocks_unchanged": true,
"cursor_bound_to_request_actor_context_binding_size": true,
"cursor_lifetime_seconds": 600,
"permission_rechecked_each_page": true
},
"pagination": {
"implementation": "Laravel cursorPaginate",
"page_sizes": [
25,
100
],
"order": "id descending",
"global_count": false,
"initial_page_reused": true,
"all_universe_loaded": false
},
"regression": {
"initial_events": 127,
"events_after_new_head": 128,
"original_ids_seen_once": true,
"native_fixture_notes": 126,
"notes_are_not_request_versions": true,
"request_version": 1,
"draft_status_preserved": true,
"inherited_order_fixture_before_history_request": 1,
"inherited_source_setup_removed_for_future_runs": true,
"successful_prefix_reused": 17
},
"demo": {
"port": 8080,
"entry": "http://127.0.0.1:8080/qa/enter/requester?open=1",
"initial_main_requests": 0,
"initial_history_volume": 0
},
"prior_proofs_preserved": [
{
"file": "docs/proofs/purchasing-continuity-composition-20261103.json",
"sha256": "6135df7c6dca784297b3a5f70a571585dc6d6a0d401a491c1d17ab91b780ce35"
},
{
"file": "docs/proofs/module-association-consolidation-summary-20261102.json",
"sha256": "8f693f39763ee21a22ebd3929d95ba1480f339eca18742fa53055c69eb5219ef"
}
],
"preservation": {
"installed_purchasing_sha256": "81899e531e9eec449717e694d8bdc106a9e220a828f5491ce918c1d2dc612787",
"target_database_connected": false,
"protected_six_records_changed": false,
"blocked_cache_cleared": false,
"previous_demo_data_written": false,
"public_rights_changed": false,
"publication": false,
"checkpoint": false
},
"limitations": [
"Cursor order follows immutable event sequence, not a guaranteed database snapshot across arbitrary external writers. Refresh starts a new consultation.",
"Ten-minute expiry, changed context, actor or page size require an explicit refresh. Cursor is a read marker, not approval evidence or a business version.",
"Volume consists of126 explicitly marked audit notes plus original draft events; it is not126 operational request revisions.",
"The initial inherited harness also prepared one100MZN order before the history request. It remains preserved; this unnecessary setup was removed for future runs. The preservation suffix was corrected without replaying17 valid checks.",
"UI checks use a simulated DOM; actual API cursor traversal is separately exercised. Browser visual review and accessibility remain pending.",
"No new React/Vite build: changed UI is static ES modules. Served module hashes and syntax are verified; prior valid build proof is retained.",
"Sustained load, deployment compatibility and operational readiness remain separate."
],
"visual_review_pending": true,
"deployment_capacity_validated": false
}