230 lines
9.7 KiB
JSON
230 lines
9.7 KiB
JSON
{
|
|
"date": "2026-11-03T15:05:42.317Z",
|
|
"increment": "SGF-SOURCING-SUPPLIER-SEARCH-QA-v1",
|
|
"passed": true,
|
|
"functional_code": true,
|
|
"checks": 51,
|
|
"tests": {
|
|
"api": {
|
|
"file": "private/receipt-composition-ce396aec18ee/supplier-search-result.json",
|
|
"sha256": "dc8e8bfd011eecdc22744071b21a39dcce68b20a78146b515caf2f61aa91bdfd",
|
|
"checks": 31,
|
|
"result": {
|
|
"passed": true,
|
|
"checks": [
|
|
"selector source uses genuinely prepared and approved request",
|
|
"server supplier page1 contains authorised bounded window",
|
|
"server supplier page2 contains authorised bounded window",
|
|
"server supplier page3 contains authorised bounded window",
|
|
"server supplier page4 contains authorised bounded window",
|
|
"server supplier page5 contains authorised bounded window",
|
|
"all125 suppliers reachable beyond previous100 cap without overlap",
|
|
"explicit and current-unit audited suppliers admitted; unbound and another-unit origins excluded",
|
|
"blocked suspended overdue and foreign-tenant suppliers excluded",
|
|
"pages100 and25 cover same eligible universe",
|
|
"NUIT search reaches supplier beyond old cap with exact selection revision",
|
|
"selector response exposes no contact bank or diligence details",
|
|
"percent and underscore search are literal rather than wildcards",
|
|
"name search ignores case without broadening scope",
|
|
"empty search returns no invented alternative selection",
|
|
"invalid pages sizes and unsupported filters rejected",
|
|
"browse requires existing scoped sourcing preparation right",
|
|
"foreign request cannot be used as catalogue entry point",
|
|
"stale or substituted selection revision requires new lookup",
|
|
"forged foreign supplier id cannot bypass selector",
|
|
"forged blocked id remains refused by original native workflow",
|
|
"supplier beyond100 receives original pricing and impact preview",
|
|
"selector browsing and quotation preview persist no business decision",
|
|
"supplier change after preview refuses confirmation without quote",
|
|
"eligibility change after preview requires fresh conference",
|
|
"revoked right prevents browsing and confirmation",
|
|
"concurrent same-key confirmation still produces exactly one native quote",
|
|
"explicit beyond100 choice and historical receipt recover without duplication",
|
|
"different available module cannot browse procurement catalogue",
|
|
"unmapped unit cannot reuse supplier search",
|
|
"selection adds no order invoice debt payment or localisation"
|
|
],
|
|
"eligible_suppliers": 125,
|
|
"page_sizes": [
|
|
25,
|
|
100
|
|
],
|
|
"beyond100_selected": true,
|
|
"quote_count": 1,
|
|
"concurrency_statuses": [
|
|
200,
|
|
201
|
|
],
|
|
"new_right_names": [],
|
|
"visual_review": false,
|
|
"deployment_capacity_validated": false
|
|
}
|
|
},
|
|
"guards": {
|
|
"file": "private/receipt-composition-ce396aec18ee/supplier-search-guard.json",
|
|
"sha256": "b4cb3f0fbf743fdddc5cf650cc2d01b5625eb625dd0bf2bf7f0b3b1ee294a89e",
|
|
"checks": 3,
|
|
"result": {
|
|
"passed": true,
|
|
"checks": [
|
|
"disabled supplier lookup refuses before SQL",
|
|
"production refuses synthetic selector before SQL",
|
|
"lookup belongs to purchasing and guard probes issue zero SQL"
|
|
],
|
|
"database_queries": 0
|
|
}
|
|
},
|
|
"selection_model": {
|
|
"file": "docs/proofs/supplier-picker-model-20261103.json",
|
|
"sha256": "689d14df3fa24e8e38b6e1afae1e7e10dd5b5f1cdee9674932ce769530f4502f",
|
|
"checks": 8,
|
|
"result": {
|
|
"passed": true,
|
|
"checks": [
|
|
"late older query cannot overwrite newer results",
|
|
"results never automatically select first supplier",
|
|
"individual choice retains exact supplier revision",
|
|
"changing page immediately invalidates previous choice",
|
|
"failed request keeps no stale selectable options",
|
|
"query editing invalidates choice and options",
|
|
"departed workspace ignores outstanding response",
|
|
"unknown id cannot become a selection"
|
|
],
|
|
"visual_review": false
|
|
}
|
|
},
|
|
"demo": {
|
|
"file": "private/receipt-composition-4f0cc899a103/supplier-search-demo.json",
|
|
"sha256": "b103c4dae9020952553865976bdb5eb62e0003e891e05f9f57ad60884896eae1",
|
|
"checks": 6,
|
|
"result": {
|
|
"passed": true,
|
|
"checks": [
|
|
"new live demo starts before source request and proposal",
|
|
"sourcing screen serves in new composition",
|
|
"common integrated navigation preserved",
|
|
"served selector source matches sourcing-workspace.mjs",
|
|
"served selector source matches supplier-picker-model.mjs",
|
|
"live screen and source checks leave operations and locations intact"
|
|
],
|
|
"before": "b23efb2e45a4c182efd487e62289658699cf79e22091716f2cd2ea2c5b057bd2",
|
|
"after": "b23efb2e45a4c182efd487e62289658699cf79e22091716f2cd2ea2c5b057bd2",
|
|
"visual_review": false
|
|
}
|
|
},
|
|
"assets": {
|
|
"file": "private/receipt-composition-4f0cc899a103/supplier-search-assets.json",
|
|
"sha256": "4682a3c84651fc08694754dde531aec6a90670a10a71dcef816e1c8ecf682200",
|
|
"checks": 3,
|
|
"result": {
|
|
"passed": true,
|
|
"checks": [
|
|
"private frontend build succeeds",
|
|
"served built assets match private build",
|
|
"obligation module is served through private static whitelist"
|
|
],
|
|
"assets": [
|
|
"assets/app-rwyn9RPO.js",
|
|
"assets/app-BLSNCrO7.css"
|
|
],
|
|
"visual_review": false
|
|
}
|
|
}
|
|
},
|
|
"sources": [
|
|
{
|
|
"file": "app/Modules/Purchasing/SourcingController.php",
|
|
"sha256": "7b5ed82ee1b336b7a5f8ccf8a989d52ca4ccdcf321d0c92fd3385689151489f3"
|
|
},
|
|
{
|
|
"file": "app/Modules/Purchasing/SupplierAccess.php",
|
|
"sha256": "b823189d10e8ecf9a55e9021bffce023a7e6d4e2b0db2710c32910591968d814"
|
|
},
|
|
{
|
|
"file": "app/Modules/Purchasing/ReceiptRuntime.php",
|
|
"sha256": "9b426476b2805094fb317cc753385ef43882fb4964883e880eac287eed89d9e0"
|
|
},
|
|
{
|
|
"file": "public/sourcing-workspace.mjs",
|
|
"sha256": "9eb38e43626d96d71c0cbaf6c00700ab9fdaf06dd82d8405ba04b13cd2f86548"
|
|
},
|
|
{
|
|
"file": "public/supplier-picker-model.mjs",
|
|
"sha256": "7eda0e980a0d7c88a8fbf6ea446de2d169df22138a9fb6f62ecfa50b10506bde"
|
|
},
|
|
{
|
|
"file": "routes/web.php",
|
|
"sha256": "5a86c394ca72e0939c15333ff27097889d60e4d4a6aeb373020bdbd2a872c5d7"
|
|
}
|
|
],
|
|
"pinned_native_manifests": {
|
|
"bundle": "7709a3d447d54c17d2fb4be4f9a0f70455c4a38c34e4bb8c643f6b5169071556",
|
|
"economic": "8b2d3aa61054e0edc54fcd818467eb2bacb5e1178f903b12ab44119e0f2e8d2e",
|
|
"internal": "2343af71f72259dd705f4cc3a3b163c90edf331a5b6ebe173531aeb341649e1b"
|
|
},
|
|
"selector": {
|
|
"eligible_suppliers": 125,
|
|
"synthetic_extra_directory_rows": 127,
|
|
"server_page_sizes": [
|
|
25,
|
|
100
|
|
],
|
|
"literal_name_or_nuit_search": true,
|
|
"manual_choice": true,
|
|
"selected_revision_rechecked": true,
|
|
"request_scope_reused": true,
|
|
"new_permission_names": [],
|
|
"api_projection": [
|
|
"id",
|
|
"name",
|
|
"nuit",
|
|
"version",
|
|
"selection_revision"
|
|
]
|
|
},
|
|
"demo": {
|
|
"port": 8073,
|
|
"entry": "http://127.0.0.1:8073/qa/enter/requester?open=1",
|
|
"buyer": "http://127.0.0.1:8073/qa/enter/actor?open=1",
|
|
"initial_main_requests": 0,
|
|
"initial_quotes": 0,
|
|
"locations": 0,
|
|
"synthetic_directory_seed": true
|
|
},
|
|
"prior_proofs_preserved": [
|
|
{
|
|
"file": "docs/proofs/purchasing-integrated-composition-20261103.json",
|
|
"sha256": "10e8a7862a5a96cac6ec03dece68743605fd0ca98313c38070797fe40fcd2396"
|
|
},
|
|
{
|
|
"file": "docs/proofs/supplier-obligation-composition-20261103.json",
|
|
"sha256": "d8e7efeddd52cdf89bf6a1637ff323d6e39a2acaecbf591c054ee108ce1c1011"
|
|
},
|
|
{
|
|
"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": [
|
|
"Selector and quotation boundary verified; existing downstream suites were reused rather than repeated.",
|
|
"Legacy show response retains a bounded25-row supplier summary. The current interface uses the paged endpoint and never treats that summary as the complete directory.",
|
|
"Older direct clients may omit supplier_revision when preparing; the server still captures the current supplier fingerprint in every new preview and rechecks it before a new confirmation. Current interface also sends the fingerprint selected from the page.",
|
|
"Recorded same-key command receipts remain historical results, after current rights and origin checks; they do not execute a new quote when supplier facts subsequently change.",
|
|
"Extra directory records and scope audit markers are explicit synthetic fixture data, not130 newly onboarded supplier reviews or real company associations.",
|
|
"No new indexes, deployment activation, payment, accounting or real operations.",
|
|
"Visual review, sustained-load measurements and deployment/least-privilege capability remain pending."
|
|
],
|
|
"visual_review_pending": true,
|
|
"deployment_capacity_validated": false
|
|
}
|