Living board for Phase 1 4-Hands enablement (VDT-3145) and Phases 2–3 HF/LW research (VDT-3343). Near-term focus is 4H only — LT all-zones via allowlist. Progress refreshed 2026-09-07 — MERGED TO UAT: pakas #618 → a88b5ea9 · siunta #158 → ff4e6aef · go-import #64 → 842eaa41, all three deployed. DDL complete. veniship (VDT-3205) is back IN on a minimal window (owner ruling 2026-08-28, superseding the 08-22 exclusion) — it fixes a live under-charge.
QA round (since 2026-08-26): automated part complete — 191 suite + 33 targeted results green on gouat, verdicts filled on the tests page; 74 manual cases remain open; precondition P7 is ANSWERED (owner 2026-09-06: there is no pack_4rp cron on UAT and no terminal re-weighing on dev/uat, so cases 6.8, 9.1, 9.6 and 17.1 cannot run there). 2026-08-28: the kl_view “4H AUTO” row moved mid-round into the all-regions price table (kl_edit_plius viewers only, clients with a price list; pakas #634 → uat a887f6da · #635 → dev 5beab194, merged, live on gouat) — see tests.html case 15.8.
All three pull requests are merged and deployed.
pakas #618 → uat a88b5ea9 (pipeline #733) ·
siunta #158 → uat ff4e6aef (pipeline #226) ·
go-import #64 → uat 842eaa41.
Each branch was verified immediately before merge: merge-tree clean, and zero 4H lines differing from
origin/dev within the payload in all three. Post-merge, every branch is contained in uat,
inc/inc.function.4rp.php is present, the config by-country map is live
(CONFIG_2X4RP_LOW_LIMIT now 50, was 80), the cron reads kl_4rp_auto, and siunta
serves asset VERSION 50.
The DDL ladder is complete. Audrius Puvačiauskas ran VDT-3384.sql on UAT at
12:09:20–12:09:39 — the MyISAM table copy took 19 seconds for 166,561 rows / 60.3 MB
(a useful production estimate: ~185k rows → roughly 20–25 s of write lock). Cutover exact: four clients at AUTO
(3464 JYSK BALTIC · 89398 ROMITEKA · 157673 ELECTRONIC TRADE · 158280 PRO TRADE), 166,557 at MANUAL,
nobody else touched. tbl_log_siunt_4rp was already present from 12/08.
UAT schema identified as demovenipak_new — proven by reproducing Audrius's 06/08 10:41
output to the row: 3-column backup tbl_post_info_4rp_flip_backup, COUNT(*) = 17246,
changed = 10567, enabled-before = 6679. That also settles VDT-3413: the LT flip is
applied on all three environments (dev + uat 06/08, prod confirmed by the owner), and the ticket now carries the
per-zone evidence it was missing.
QA validation steps are posted on VDT-3203, 3384, 3395, 3408, 3410 (pakas), VDT-3204, 3407 (siunta) and VDT-3202, 3403 (go-import) — numbered, UAT-specific, with the inclusive band boundaries (25.99 vs 26.00 kg), the country gates, pallet and OOH exclusions, and the evidence each ticket needs before it can be accepted.
Deliberately not in this release: tariff seeding (owner ruling — prices stay as they are for current
users, so VDT-3415 stays parked and the ~230 UAT rows at the 50 € default are intentional) · no client is moved
to AUTO beyond the four already there · VDT-3396, so the band table LT 26–75 / LV·EE
31–90 still lives in three app copies rather than being read from the helper — verified identical in all three today,
and guarded by FourHandsVpdriverDriftTest plus the standing no-band-change rule ·
veniship (VDT-3205), excluded from this window.
Next: the UAT test round against the posted steps, then master PRs, then production — where the DDL ladder runs again and the 19-second measurement above is the planning number.
*OD-3/25/4/8/27 answered + Q14 YES (Evelina 2026-07-30 on VDT-3203). †Demo venipak_dev — re-probe prod.
| PR | Ticket | Head | What landed | Status |
|---|---|---|---|---|
| pakas #394 | VDT-3203 | 425bf63c | Cron → posti_service1; drop zone/payers/volume; bands LT 26–75 / LV·EE 31–90 (incl. 2×4H); sender+consignee gate; doubling LT>50 / LV·EE>60; pallet skip wired; VDT-3384 client mode; dev merged. Pushed 2026-08-01; follow-up fixes 7c94a2ad (08-02) and the P3 kl_edit_plius ACL gate 425bf63c (08-03) — every push gated on suites green + veni-guard 42/0; PR body + Jira refreshed (FVS cases f–k) |
Merged to dev 08-04 · 4596d46e |
| siunta #90 | VDT-3204 | aa31edc3 | Order/import/UI predicates + both-country gate. Amended per ruling + pushed 2026-08-02 (24 files): creation-time auto-4H gated on the client-card switch kl_4rp_auto; bands 26–75/31–90 everywhere incl. JS validator + langs; pallet skip; cron-parity OOH; persisted-sender semantics. Suites green (36/36 · 44/44, 294 asserts); veni-guard 42/0; PR body + Jira refreshed (c.111510). Merge gates: helper 0.9.1 tag · Playwright when VPN returns · 2 approvals |
Merged to dev 08-04 · 7bd49b8b · Playwright 40/42 |
| go-import #49 | VDT-3202 | 7fc0030 | Import validation; EE=31; both-country gate; silent strip if not allowlisted. Amended per ruling + pushed 2026-08-03: creation-time auto-4H gated on payer kl_4rp_auto (memoized, fail-closed); bands raised to 26–75/31–90 + LV/EE ceiling matrix; branch rebased onto dev tip (linear VDT-3202-only history). Suite 57/64 green on 7.4.33 vs MySQL 5.6; veni-guard 42/0 (+2 advisories, seq env 99000); PR body + Jira refreshed (c.111638 incl. FVS). Merge gates: veni-tests go-import API on VPN · 2 approvals |
Merged to dev 08-04 · 7d70f60e · API 37/44 |
| — | VDT-3384 | in #394 | Client AUTO/MANUAL — default MANUAL; cron JOIN; seed legacy 4; blocks LT flip. Folded into the #394 branch and pushed with it (commit a71cff6c + the kl_edit_plius ACL amend). Review 2026-08-01: clean; e2e proves MANUAL skip. Seed list four-vs-six still open with Sales. |
Merged · SQL applied on venipak_dev |
| venipak-helper #43 | VDT-3203 | e868978 | The library half of 2×4H doubling: per-country low limit (LT 50 / LV·EE 60) in Price.php + label DirectionProvider.php, guarded scalar fallback; cut from the 0.8.2 tag (src diff = exactly two files) + 7 label tests; suite 170 green on 7.4.33. Review this one first — merge unblocks tags 0.8.3 → 0.9.1 → pakas pin ^0.8.3; inert until tagged (consumers pin tags) |
Merged 08-04 → tags 0.8.3 + 0.9.1 live |
| veniship #743 | VDT-3205 | 99f5a8b | Rate/order gate. Split reworked + pushed 2026-08-03; PR retargeted dev→master: rebased onto master 5caf391; explicit-request-only 4H with OOH-first on quote AND book; double-charge suppression on use_api_rates (provenance flag); EE 26→31; adversarial 2-verifier round found + fixed a PR-original global-rates service leak; confirm round CONFIRMED-SOUND. Suite 210/743 baseline-identical; veni-guard 42/0/0. Auto-detect DROPPED — veniship has no kl_4rp_auto read path (no legacy-DB conn); pakas cron stays sole AUTO writer. CAUTION: veniship master auto-deploys prod |
EXCLUDED from the UAT window (2026-08-22 ruling) — merged to dev on 1 approval; no international gate in the live 4H path; absent from the UAT corpus |
| — | go-ws | — | No eligibility logic (never writes siunt_4rp — safe deferral), but inc/config.php:37 low=60 / no ceiling skews courier docs — config-only fix recommended, no PR yet |
Gap · config fix |
After Phase-1 deploy, opening z2/z3/z4 is UPDATE tbl_post_info SET posti_service1='1' WHERE posti_salis='LT' (optionally wave by zone). Cron no longer filters posti_zone.
Approvals ×5 · #43 merge → 0.8.3/0.9.1 tags → pakas pin · VPN-deferred suites (siunta Playwright, go-import API, demo probes) · VDT-3395 design + build · tariff 14/28-vs-6/12 (Finance) · seed list (Sales) · promotion + UAT · zero-kain_4rp + posti_service1 prod probes · Ops capacity · then wave-by-zone LT flip · 48h monitor per wave.
Stakeholder enablement summary: .workflow/4h-enablement-executive-summary-2026-07-29.html
| Step | Result | Evidence |
|---|---|---|
Merges to dev | Done | pakas 4596d46e · siunta 7bd49b8b · go-import 7d70f60e. All conflict-free; dev-side files had zero overlap with PR files. |
| Helper release | 0.8.3 + 0.9.1 | #43 merged (fe15b6c6). 0.8.3 @ 2607c03 (no SmsService) · 0.9.1 @ ae7de98 (SmsService retained). |
| Tag trap found + fixed | Caught pre-deploy | helper composer.json carries a hardcoded version field; composer silently skips any tag whose name differs. First tags were invisible — ^0.8.0 still resolved 0.8.2 with no error. Re-cut with version-bump commits; verified Locking venipak/venipak-helper (0.8.3) / (0.9.1). A helper release needs 3 files, not 2. |
| DB migration | Applied | venipak_dev: single ALTER (column+index) + seed. Legacy four = AUTO (JYSK BALTIC, ROMITEKA, ELECTRONIC TRADE, PRO TRADE). Measured 20.8 s table lock on 169k rows — prod ~185k, so plan a genuine off-peak window. |
| Dev redeploys | Successful | pakas build 555 · siunta build 191. composer update now resolves 0.8.3 / 0.9.1, so LV/EE 2×4H prices against 60, not the LT threshold. |
| go-import API suite | 37/44 | Credential blocker resolved (same login as siunta/pakas; client_active YES, user_id=20579). 0 auth failures. 7 failures on non-Baltic routes, outside 4H scope. |
| Playwright siunta | 40/42 | smoke 20/20 · functional 20/22 against godev. Sole failure is outside 4H scope; PR #90 touches none of those files. |
| Item | Result | Evidence |
|---|---|---|
pakas #550 — pin ^0.8.3 | Merged | merge 9b935d72 → dev build 558 SUCCESSFUL (45 s) |
siunta #145 — pin ^0.9.1 | Merged | merge dfd672f7 → dev build 193 SUCCESSFUL |
| Tag resolution | Proven | Both deploys run composer update against the pinned constraint — a green build is the proof the tags resolve. With the version-field trap still present these builds would have failed loudly. |
| Prod dependency drift — observed, not theoretical | Watch | Within ~1 h of the tags going live, pakas and siunta both cut prod releases (release_20260804*). No lock + composer update --no-dev → prod resolved 0.8.3 / 0.9.1 unplanned. Behaviourally inert (neither master defines the country map → scalar fallback), and neither release carried the 4H work. Exactly the drift the pins remove. |
| helper #44 | 0/2 — chase | Until merged, helper master's version says 0.9.0 while tag 0.9.1 exists → next release repeats the invisible-tag bug |
| Case | Payer | Weight | Expected | Result |
|---|---|---|---|---|
| Default client | MANUAL | 30 kg | no 4H | siunt_4rp = 0 ✓ |
| In band | AUTO | 30 kg | 4H applied | siunt_4rp = 1 ✓ |
| Below LT floor 26 | AUTO | 20 kg | no 4H | siunt_4rp = 0 ✓ |
| 2×4H tier (>50) | AUTO | 55 kg | 4H applied | siunt_4rp = 1 ✓ |
| Above LT ceiling 75 | AUTO | 80 kg | no 4H | siunt_4rp = 0 ✓ |
Real shipments through the siunta UI on dev (32820227–32820231), reopened to read the stored flag; UI and database agree in every case. Test payer was switched to AUTO for cases 2–5 and restored to MANUAL — dev is back to exactly 4 AUTO clients (the seeded legacy set). Screenshots: test results page. Suites re-run same day: Playwright siunta 40/42, go-import API 37/44 — no 4H-related failure; the rest sit on non-Baltic routes outside 4H scope.
| Path | Result | Evidence |
|---|---|---|
Cron pack_4rp (authoritative writer) | 3/3 runs correct | Real dev-branch cron against the dev DB. Flags 30/55 kg, skips 20 kg (below floor) and 80 kg (above ceiling); idempotent on re-run; flags nothing once the payer is MANUAL. Note: it only sees shipments whose siunt_priemimo_data is in the last 2 days — new shipments carry 0000-00-00 until pickup, so creation-time application and the cron cover different moments. |
| PAKAS client card | Enable + disable via UI | Switch renders behind kl_edit_plius, default MANUAL for every client; ticked → saved → reloaded → persisted (DB = 1); returned to MANUAL the same way. Dev back to exactly 4 AUTO clients. |
| siunta UI | 5/5 | Identical 30 kg shipments differ only by the client switch; band floor/ceiling honoured. |
| XML / API import | 6/8 as specified | Auto-apply, floors, ceilings, explicit four_hands=1 and the disabled-postcode strip all behave. Two deviations below. |
Defect A — explicit four_hands=0 ignored | FIXED — PR #57 | VDT-3403. AUTO client sending an explicit zero on a 30 kg parcel still got 4H applied — empty("0") is true and the validator coerces an absent tag to '0'. Fixed siunta-style: presence captured at parse time (four_hands_declared), auto-apply guarded on declaration, empty tags stay auto-apply-eligible. Repro→fix proven through the real API route (pre-fix shipment 32820245 → 1; post-fix 32820247 → 0); 70 phpunit green; veni-guard 42/0. PR open to dev, 4 reviewers assigned. |
| Defect B — OOH not excluded at import | VDT-3404 · blocked on P11 | Sharper than first thought: both paths are name heuristics — import's isPickup()/isLocker() match only the canonical comma form ("venipak pickup,"), the cron matches the substring anywhere; "VENIPAK PICKUP Vilnius" (no comma) evades import but not the cron. The XML contract has no structured pickup-point field, so free-text names are this channel's only OOH signal. Evelina confirmed the business rule but delegated the detection mechanism to PO/sys arch — that ruling is what blocks the code. |
| LV imports — error 24 on test scenarios | VDT-3405 · downgraded | Not a rollout blocker: posti_kodas is MEDIUMINT(5) ZEROFILL — the "786 five-digit LV rows" are 4-digit values zero-padded for display. Real LV traffic is 4-digit at scale and passes; the test harness sent the padded form 01981. The validator's 4-digit rule matches official LV-NNNN. Residual question: do prod error-24 logs show clients sending LV--prefixed/padded forms (→ input normalisation, not a rule change). |
Full request/response for every XML scenario, plus expandable screenshots: dev test results & evidence.
| Issue | Impact | Owner |
|---|---|---|
DB_changes label missing on other teams' SQL tickets | VDT-3382, VDT-3380, VDT-3332 all ship SQL with no label — invisible to whoever runs prod queries, the exact gap raised on #394. | Team convention |
| veniship-client #23 open since 2024-03 with 5 approvals | 155 commits behind master; approvals long stale. Should be declined, not merged. | veniship-client |
| PR | Ticket | Target | Scope | Approvals |
|---|---|---|---|---|
| pakas #563 | VDT-3203 | dev | 4H dev sync — master-based VDT-3203-4h-release merged into dev · review round closed with two release-branch commits merged in pre-merge: cd2760ad (fourHands* split → inc/inc.function.4rp.php) + 6f66dc32 (s4rp_user_id INT(8)) · superseded #557/#551/#556 declined · post-merge dev 136/136 | MERGED 2026-08-11 (5572933) · 2/2 ✓✓ |
| siunta #152 | VDT-3204 | dev | 4H dev sync — VDT-3204-4h-release merged into dev (clean, +5/−1) · superseded #147 declined · post-merge dev 91/91 | MERGED 2026-08-11 (0c0d90c) · 2/2 ✓✓ |
| helper #46 | VDT-3396 | master | FourHandsWeightBands defaults + 0.9.2 bump · rename fix 16e74ef (Šalnis review) · tag 0.9.2 pushed (0.9.1 recipe) → the VDT-3396 re-raise off the 4h-release branches is unblocked (go-import lock regen; scheduled, not started) | MERGED 2026-08-11 (e885df4) · 2/2 ✓✓ · tag live |
| go-import #57 | VDT-3403 | dev | Defect A fix — explicit four_hands=0 honoured (billing path) · review fix 72084e8 (static provider) | MERGED 2026-08-10 (06e5127) · 2/2 ✓✓ |
| siunta #146 | VDT-3407 | dev | Phase 2: Skaičiuoti notice, per-pack 4H/no-4H badges, tooltip reword · review fixes 5d78ddd5 · MERGED to dev 2026-08-07 (e8ec98b4) · follow-up PR #147 DECLINED 08-11 — content merged via #152 (0c0d90c) | MERGED · #147 declined → #152 |
| pakas #551 | VDT-3408 | dev | Phase 2: 4H kaina column, kiek-4H totals, Neužsakytos-4-rankos filter, indicators · review fixes 6a22506f (LEFT JOIN) + cbfb57c8 (VERSION bump, Jovaiša) · RU-locale fix 81f95fae · content landed on dev via #563 (5572933) | DECLINED 08-11 · superseded by #563 |
| pakas #552 | VDT-3410 | dev | Phase 2: routing-map bubble colours (green ordered / red unordered-qualifying), badges, red weights · MERGED to dev 2026-08-07 (faaef868) | MERGED |
| pakas #556 | VDT-3410 | dev | Courier follow-up: get_vair_shipments emits shipment_4rp / shipment_4rp_weight (venicourier backend) + drift-guard & payload-contract tests · SUPERSEDED by #563 | SUPERSEDED |
| venicourier #3 | VDT-3410 | master | Stop-card 4H (white-on-violet) / no-4H chips + per-shipment chips in the marker info-window — gate satisfied 08-12 (#563 merged + dev auto-deployed) · 2026-08-15: venicourier ruled courier-side → out of our scope — the open PR (our authorship, 0/2) awaits the courier team's / owner's adopt-or-decline call; we no longer poll it | HANDED OVER · 0/2 |
| vpdriver-api #1 | VDT-3410 | dev | DECLINED | |
| pakas #557 | VDT-3395 | dev | Terminal re-weigh re-evaluates siunt_4rp; shipment-keyed tbl_log_siunt_4rp provenance (🚩 DDL must run on uat/prod with the deploy) · content landed on dev via #563; s4rp_user_id now INT(8) in the DDL — live dev ALTER pending | DECLINED 08-11 · superseded by #563 |
| pakas #516 | VDT-3343 | dev | PARKED HF/LW characterization suite — not on the 4H path; needs its refresh before merge | 0/2 |
All Phase 1 4H PRs are merged (pakas #394 · siunta #90 · go-import #49 · veniship #743 · helper #43/#45 + pins #550/#145). Reviewers on the four active PRs: Gediminas Šalnis · Vasilij Duško · Andrius Pečiūra · Arnoldas Jovaiša. Adjacent non-4H open PRs (other owners/tickets): siunta #135/#137 (VDT-3332 MH promotes), pakas #554 (VDT-3380 SQL), pakas #544/#545 (front-engine experiments).
Plain-language map of the programme. "4H" (keturios rankos / 4 rankos) is the paid two-person delivery service for heavy parcels. Each phase answers one question for the business.
"Which shipments qualify, and who says so?" The rules engine that decides 4H eligibility and writes the flag:
kl_4rp_auto), and only then does the nightly cron flag qualifying shipments automatically (VDT-3384).posti_service1 allowlist — the future "LT flip" is just turning postcodes on).tbl_log_siunt_4rp) so a human decision is never overwritten by the machine. Product requires this before billing can be enabled."Can every human in the chain see 4H where they work?" Phase 1 made the flag correct; Phase 2 makes it visible — sourced from the BRD deck's 48 annotations:
"One source of truth, no edge-case surprises." Cleanup before the money is switched on:
venipak-helper library (tag 0.9.2, live) so pakas / siunta / go-import can't drift apart; app-side delegation built 08-12 on release-based branches (b26c9c08 · e7633161 · 4e30753), PRs open with the promotion window."What still blocks billing clients?" The code being merged is necessary, not sufficient:
kain_4rp to 50 €; Finance-confirmed price is 14 € / 28 € (2×4H). SQL ticket ready.4h-release branches; DDL (VDT-3384.sql, VDT-3395.sql) runs before code on every env. Currently parked by ruling — nothing beyond dev.The BRD visuals deck re-checked annotation-by-annotation against the merged dev UI, with corrected anchoring (several 08-05 readings attached asks to the wrong surface). Full table: analysis/vdt-4h-p2p3/deck-recheck-2026-08-12/GAP-BREAKDOWN.md · Jira c.114171 on VDT-3406. Everything below is parked — no code changes until the owner reopens UI work.
| Gap | Deck wanted it in… | Today |
|---|---|---|
| „4H kaina" column (O–P) + export | siunta client report (siunt_report.php Detali + Excel) | Built in the pakas 12m terminal report instead; client report shows only „ 4 hands" text |
| „Neužsakytos 4 rankos" filter | report_all filter block | Built as a 12m-report sort; report_all has Visi/Su/Be only |
| no-4H indicator (qualifies, unordered) | report_all results/exports · Help Desk · pack_status | Renders only in the three 12m views (p4rp_sk opt-in) |
| „kiek 4H" count row | venicourier marker info-window | Built as a 12m totals row · out of scope 2026-08-15 — venicourier is courier-side (other team) |
| Label: bigger „4 hands" + „NO 4hands" | parcel label Directions box | Small „4 hands/2x4 hands" only when ordered — needs Product sign-off |
| Scanner cluster (Call: 4H, pack indicators, delivery wording, Aukštas/liftas) | mobile scanner app + all courier-side surfaces incl. venicourier | Handed off → VDT-3435 / courier team (ordered-4H red-bold only; the unordered marker is descoped there). Contract: new flags 4H/4H_applied |
Colour convention stays per the 2026-08-05 ruling — ordered = red bold 4H, qualifying-unordered = black bold no 4H (the deck itself is inconsistent). With the scanner descoping the unordered marker, the routing map and venicourier chips remain the only courier-facing „heavy but unordered" warnings.
Source: the BRD visuals deck "Keturių rankų paslauga 4H.vsdx" (48 annotations over 36 system screenshots). Phase 1 shipped the mechanics; Phase 2 is visibility — showing 4H / no-4H everywhere operations, couriers and clients look — plus the pricing/configurability decisions the deck raises. Epic: VDT-3406. Display convention throughout: ordered → red bold "4H"; weight-qualifies-but-not-ordered → black bold "no 4H" (= delivered to address, handed over at the vehicle).
| Ticket | Area | Scope |
|---|---|---|
| VDT-3407 | siunta UI | Code review (#146 5d78ddd5, 0/2 — review fixes in, re-review pending) · "Skaičiuoti" warning for non-AUTO clients registering an over-threshold pack without 4H · updated service-description text (incl. doubling + above-ceiling rule) · per-pack 4H/no-4H indicators. |
| VDT-3408 | pakas reports | Code review (#551 6a22506f, 0/2 — 2x4H cue + LEFT JOIN review fix, re-review pending) · "4H kaina" column (between O and P) · "kiek 4H" count row · new filter "Neužsakytos 4 rankos" · Call-view indicators (annotated 5× in the deck) · money shown at shipment · survives report export. |
| VDT-3409 | HD flow | Blocked (manual 4H write BILLS — 5 questions posted) · TO-BE: only HD may add 4H, with traceability (coordinate with the audit-log fast-follow + VDT-3395) · per-pack "+4H" action · shipment-level vs per-pack data-model question for sys arch. |
| VDT-3410 | courier | Code review (#552 716fcdcf 1/2 ✓ · #556 5a3cec1e · venicourier #3 1/2 ✓ · vpdriver-api #1 declined — system dead since 2020) · Route-map stop bubbles: green = 4H ordered in stop, red = 4H-weight present but unordered · red weight numbers · expanded stop shows which shipments carry 4H packs · bigger 4H marker on the stop card (white-on-violet when ordered) · scanner views. |
| VDT-3411 | comms | To Do (digest proposal awaits Product confirm) · Automatic notification to non-AUTO clients on over-threshold packages (channel/trigger/frequency TBD; coordinate with the pre-flip un-strip comms). |
| VDT-3412 | decisions | Done · Q1–Q4 answered 2026-08-05 (table below) — remaining: correct the BRD text/deck to match, then close. |
| # | Question | Answer (2026-08-05) |
|---|---|---|
| Q1 | Default direction — BRD/deck said "automatinis (default)", conflicting with the 2026-07-31 ruling. | MANUAL is default — per last week's ruling; Sales opts clients in via kl_4rp_auto. BRD wording to be corrected to "rankinis (default) / automatinis". |
| Q2 | Threshold wording — deck said "virš 25 kg LT / 30 kg LV·EE" vs implemented floors. | Inclusive floors confirmed — exactly 26.00 kg LT / 31.00 kg LV·EE qualifies (25.99 → no); doubling stays 50–75 / 60–90. BRD to say "nuo 26 / nuo 31 kg imtinai". |
| Q3 | Tariff default — deck said 15 € among four competing numbers. | 14 € 4H / 28 € 2×4H — resolved by Evelina's 2026-08-03 answer; the deck's 15 € is superseded. (Any kain_4rp DB-default alignment = separate SQL → DB_changes.) |
| Q4 | Configurability — deck proposed per-country weight limits as editable Price list rows. | Fixed weights for now — bands stay code constants shared by cron / go-import / siunta / veniship; tariff remains per-price-list via the existing kain_4rp row. |
| Severity | Finding | Fix |
|---|---|---|
| #394 blockers (pre-push / pre-prod) | ||
| Fixed 08-01 | Both local commits carried Co-authored-by: Cursor trailers | Amended — branch rewritten to a71cff6c · a37ceb05, trailers gone |
| In review | Published venipak-helper 0.8.2 is scalar-only (Price.php:699-703); country-aware doubling exists only as an untracked local vendor patch; no composer.lock, pipelines run composer update → deploy silently reverts and LV/EE 50–60 kg double-charge | PR #43 open (08-02) — two-file patch off the 0.8.2 tag; after merge: tag 0.8.3 → cherry-pick → 0.9.1 → pakas pin ^0.8.3. Release stays a promotion gate |
| Fixed 08-01 | Pallet exclusion was documented but not wired. Product 2026-08-01: "4H is for weighted parcels only — not PUDO, not pallets." | Wired — pack_paletes_tipas = '0' on the cron pack JOIN + e2e pallet row (commit 1529e793; suite 3/3, 35 asserts) |
| Fixed 08-01 | PR #394 body stale — no VDT-3384 / default MANUAL; still cited 80 kg doubling, ceiling-less bands | Body rewritten at push (incl. "apply VDT-3384.sql before/with deploy") |
| #394 should-fix | ||
| Should-fix | Scalar 80→50 makes 3 country-blind call sites print "2x4 hands" for LV/EE 50–60 kg (inc.siuntos.nurodymai.php:89 + 2 courier print lists) | Country-aware low-limit helper at the 3 sites |
| Fixed 08-02 | Test gaps: no absent-payer row; tripwire not extended to tbl_klientai shadow; seed UPDATE unverified | Closed in 7c94a2ad — test hardening + seed verification SELECT (+ the bootstrap cred-guard fix that explained the 9 "pre-existing" PPScheduleTest errors) |
| Fixed 08-01 | Deploy order (SQL before cron) documented only in one Jira comment; branch was 2 commits behind origin/dev (phantom VDT-2567 diff) | dev merged in before push (4bafe84a); deploy-order note in PR body + wiki |
| Verified clean | ||
| Cleared | Unit suite zero new regressions vs baseline (same 9 pre-existing PPScheduleTest errors) · 4H 32/32 · Pack4rpCronTest 3/3 incl. MANUAL skip (real PHP 7.4.33 + MySQL 5.6) · seed list = old dev whitelist exactly · no hardcoded IN(...) anywhere · cron fail-closed if SQL lags · client UI writeback / ACL / langs / PHP 7.4 syntax all clean | |
| Product one-liners needed (confirmed gaps, not #394 code bugs) | ||
| Open | pack_weight at cron time is client-declared until terminal weigh (accept, or gate on pack_weight_ok='1'?) · "doubles ≥51" wording vs strict >50 for fractional kg. Resolved 2026-08-03: re-weigh clearing is Product-required Phase-1 scope → VDT-3395 (flip gate) | |
| ID | Decision | Owner | Status | Outcome |
|---|---|---|---|---|
| Programme / HF+LW | ||||
| OD-3 | HF package-count trigger | Product | Resolved | Strictly >20 (BRD v17). |
| OD-25 | LW billing basis | Product | Resolved | Billable only when executed + valid photo. |
| OD-4 | HF pricing model & amount | Product + Finance | Resolved | Same as LW — LT 6.60 / LV 7.00 / EE 8.20 € / 100 kg. Configurable, not hardcoded. (A. Kvaraciejus 2026-07-22) |
| OD-8 | LW rates + unit | Product + Finance | Resolved | Unit = per 100 kg. Rates LT 6.60 / LV 7.00 / EE 8.20. Courier bonus 0.03 €/kg. Final for programming; adjustable later. |
| OD-27 | HF on OOH / pickup / locker | Product | Resolved | HF excluded on OOH / PP / locker (call 2026-07-26 · #110151). |
| OD-5 | Canonical pallet signal | Product + Eng | Open | pack_paletes_tipas; per-package vs per-shipment aggregation TBD. |
| 4H Phase 1 | ||||
| EE band | Effective EE threshold | Product | Resolved | 31 kg (not Confluence “EE 25”). |
| Ceilings | Auto-4H upper bands | Eng + Product | In PRs | LT ≤75 · LV/EE ≤90 (includes 2×4H). Doubling LT>50 / LV·EE>60. Legacy 80/100 rejected (PM 2026-07-30). |
| Q14 | Cron: drop payers · posti_service1 · drop volume · both-country | Product | YES 2026-07-30 | Eligibility YES. Default auto-for-all superseded 2026-07-31. |
| Client mode | PAKAS kl_4rp_auto AUTO/MANUAL | Sales + Eng | In #394 · pushed | Default MANUAL; Sales → AUTO (save+render behind kl_edit_plius per P3 ruling 2026-08-03); cron only if AUTO; seed legacy 4 (four-vs-six open with Sales). Review-verified 2026-08-01. Blocks LT flip. |
| Single writer | Auto-4H writers all gate on the client-card switch | User ruling | Executed | Ruled 2026-08-02: don't park — amend. Done across all channels: siunta aa31edc3 and go-import 7fc0030 gate creation-time auto-4H on kl_4rp_auto; veniship ships explicit-only (no read path — pakas cron is the sole AUTO writer for its traffic). Manual/declared paths unchanged. Recorded on VDT-3204/3202 (c.111508/111509). |
| Force-4H | Client rp4=1 without allowlist reject | Product | Policy | Wave-1 = monitored override (MANUAL clients). |
| Geography | First enable wave | Product + Ops | Settled | LT all zones via allowlist — after client-mode gate. |
Resolves the VDT-3345 ↔ VDT-3346 conflict (extend vs new table). Split by concern:
tbl_siuntos (needs ALTER window)tbl_siunt_charge_works not extended — stays legacy scalar captureStill blocked for HF/LW build on ALTER window + residual ODs (e.g. OD-5), not on OD-4/8/27.
| Ticket | Focus | Status | State / blocker |
|---|---|---|---|
| VDT-3344 | LW scanner ownership | In Progress | Sole writer mapped. Ops: device-app + DDL owner. |
| VDT-3345 | LW lifecycle / schema (P0) | In Progress | ADR resolved. Blocked: ALTER window, schema authority. OD-8 answered. |
| VDT-3346 | Eligibility→billing SM (P0) | In Progress | State machine + D8 fence pinned. Ownership ratification. |
| VDT-3347 | Terminal weight re-eval | In Progress | Late-correction trigger policy (Product+Ops). |
| VDT-3348 | Pallet + count boundary | In Progress | OD-3 resolved. Blocked: OD-5. |
| VDT-3349 | HF pricing model | Unblocked | OD-4 answered (same €/100 kg as LW). Implement when 4H wave allows; still needs ALTER/ownership sequencing. |
| VDT-3350 | Combinatorial matrix | In Progress | OD-27 answered. Residual: OD-13 / 5 / 11. |
Characterization — locks current behavior.
Applicability oracle + guards.
Ordered-eligibility oracle on siunt_lw_order.
Test-only HF/LW suite (head 8bcfde19) — not required for 4H enable. Needs its refresh before merge (7-param call fix · 350→250 kg · ADR docblock relabels); merge when Track A resumes. Details: briefing §9.
Dev lane done 08-11 (#563/#152 merged, tail declined, 0.9.2 tagged). Dev auto-deployed by pipelines (pakas #610 · siunta #214) · venicourier #3: repo ruled courier-side 08-15 → handed over (adopt-or-decline = courier team/owner) · live dev ALTER s4rp_user_id→INT(8) done 08-12 · VDT-3396 re-raise BUILT 08-12 (3 release-based branches, gated, PRs at the UAT window) · then, on the owner's word only (current ruling: nothing beyond dev): UAT deploys the 4h-release branches (2–3 wk soak) → master PRs (2 appr.) → prod deploy with VDT-3384.sql + VDT-3395.sql → tariff seeding VDT-3415 → LT posti_service1 flip (VDT-3413).
OD-4/8/27 answered — remaining: OD-5, ALTER window, ownership, then implement using €/100 kg HF=LW rates.
Keep parked until HF/LW implementation wave; do not block 4H enable on it.
7fc0030, 5 files, one production file); PR body + Jira refreshed. #743: explicit-request-only split (auto-detect dropped — veniship has no kl_4rp_auto read path; pakas cron = sole AUTO writer), Blockers A/B fixed, EE 31; 2-verifier adversarial round found + fixed a PR-original global-rates service leak; confirm round CONFIRMED-SOUND with mutation testing; suite 210/743 baseline-identical; pushed 99f5a8b, PR retargeted dev→master; Jira c.111674 (FVS).kain_4rp default 50) → Finance reconciliation before seed. P4 ruled Phase-1 scope (re-weigh must clear/re-flag siunt_4rp — billing cannot enable without it) → VDT-3395 created, joins the flip gate. P3: commercial field → kl_4rp_auto gated behind kl_edit_plius on the #394 branch (commit 425bf63c, pushed 2026-08-03; suites baseline-green, veni-guard 42/0). P5/P11/cron routed to Dainius/Mindaugas; seed four-vs-six still open with Sales.four_hands=0 repro'd pre-fix (shipment 32820245 → 1), fixed via parse-time four_hands_declared + declaration-guarded auto-apply (mirrors siunta's isset), fresh-eyes adversarial review folded in (empty tag = absent, so always-emit integrations keep auto-apply); 70 phpunit green incl. offline regression pin, e2e post-fix → 0 (32820247), veni-guard 42/0; pushed, PR #57 → dev with reviewers Gediminas · Vasilij · Andrius P. · Arnoldas. VDT-3404: corrected analysis — import vs cron are two different name heuristics (comma-anchored vs substring); Confluence/Jira sweep confirms P11's mechanism half was delegated to PO/sys arch and never ruled; no code until answered. VDT-3405: LV "5-digit table" = ZEROFILL display artifact; validator matches official LV-NNNN and real 4-digit traffic; residual = prod error-24 log check. veniship audited clean for the A-pattern (no auto-4H path). Dev restored to exactly 4 AUTO clients.tbl_log_siunt_4rp (🚩 DB_changes; DDL executed on dev, must run on uat/prod with the deploy; tbl_log_pack_edit keeps per-pack display rows; split command copies auto provenance); (2) flip-before-log ordering — now log-first with abort-on-failure and flag-conditional UPDATEs. Triaged-not-coded (reasoning on the ticket): rp4-already-checked confirmation gap (→ VDT-3409 +4H action), millisecond MyISAM cron windows. Gate: FourHandsReweighTest 13/13 (incl. pack-reassignment + forced log-failure aborts), full ss1-web suite 119/119, veni-guard 42/0, live weigh-form check on dev (set→clear, both log tables, all data restored). Same evening: VDT-3410 follow-ups pushed — pakas #556, venicourier #3 (→ master), vpdriver-api #1 (→ dev) — and VDT-3415 cross-linked on VDT-3413. Board total: 8 open PRs, all 0/2.shipment_4rp_weight is true for ordered in-band shipments too, so every all-ordered stop/cluster rendered red instead of green, and the unit test pinned the broken precedence (codex + grok + claude independently) → fixed, warn now counts only fhw && !fh, #552 @ 716fcdcf; (2) re-weigh set-path re-imposed 4H over an operator's manual decline — an unticked rp4 (logged manual 1→0) was auto re-flagged and re-billed at the next weigh (claude + kimi) → set-branch now skips when the newest provenance row is a manual set-to-0, + split-command provenance-copy failures are logged (codex), #557 @ 730c36e9; (3) opt-in report indicator silently dropped the legacy "2x4 hands" cue (kimi) → restored country-aware as red-bold 2x4H above LT>50 / LV·EE>60, #551 @ 6a5824d2. Also #556 @ 5a3cec1e: source-pin test for the venicourier payload keys. Gates per branch: ss1-web suites green + veni-guard 42/0 (VPN dropped mid-run → integration vs veniguard-local-testdb MySQL 5.6; PPSchedule excluded per the known VPN-down workaround). 10 findings disproven (duplicate-ID if/else, mysqli string types, ee48 GET flow, skaina_siunt_id UNIQUE index, lowercase countries, …). One structural gap survives as VDT-3423 (Option A, epic VDT-3209): creation-time auto-apply in go-import/siunta writes no tbl_log_siunt_4rp provenance, so re-weigh can't clear creation-set auto flags and import-time explicit declines stay invisible to pakas — both repos must write provenance rows (incl. a manual-decline row, closing the VDT-3403 mirror case); the shared-table ownership / veni-guard owner-map call needs sys-arch confirm before coding.getPostcodeServices chokepoint — covers the pre-existing #90 call path too; full typed signature; notice translated ET/LV/RU/PL, Product proofread requested; CSS dedupe), #551 @ 6a22506f (skaina_4rp via LEFT JOIN — UNIQUE key, 0 diffs on 500 dev shipments), #57 @ 72084e8 (static provider). 12 threaded replies posted. His "is vpdriver even used?" checked and confirmed: tbl_firebase_tokens (written only by vpdriver-api) frozen at 2020-06-11 on a DB with 2026-08 data, repo dormant since 2019-07, live scanner backend = vpcourier-api, venicourier calls only pakas jquery.routing → PR #1 declined, VDT-3410 vpdriver slice dropped (evidence on the PR + ticket c.112670). Board total: 7 open PRs.inc/inc.function.4rp.php (inc.function.log.php precedent, required from inc.function.php); 6f66dc32 — s4rp_user_id INT(6)→INT(8). Release→sync merge 41fc7c4d (sole conflict = the known pure block-reorder; resolved file byte-identical to release). Gates ×2 branches: dev-DB 136/136 + offline 127/127 + veni-guard 42/0; 5-CLI adversarial review codex/agy/grok/kimi = 4× SOUND (claude cut off pre-verdict, all its inline checks positive; findings only cosmetic NITs). Both branches pushed, approvals survived, #563 MERGED (5572933), #557/#551/#556 declined with cross-links. Post-merge: pakas dev 136/136, siunta dev 91/91. Owner ruling recorded: nothing beyond dev — release branches editable, no PRs, no merges. Jira: PR-map + state comments on all 11 4H tickets; closing LT note on #563.Superseded status blocks, newest first — moved here from the top of the page 2026-08-28; content unchanged.
Three fresh branches, cut from today's master and carrying only the approved 4H payload, are PR'd to uat:
pakas #618 (42 files, +2032/−47) ·
siunta #158 (28 files, +1764/−35) ·
go-import #64 (5 files, +735/−1).
These replace the stale *-4h-release branches, which were cut from a master that had since moved 47 commits.
All three merge conflict-free, and each PR page's diffstat now equals the real landing tree — the pakas
report_status12m_view.cm_new.php conflict is resolved in the branch using dev's verbatim union.
Gates on the merge result, not the branch: veni-guard 42 ran / 0 blocking on every branch · pakas 144/144 ·
siunta 91/91 + Playwright 48✓ · go-import 70/70 + API 36/36. Every test failure was baselined against plain origin/uat
and proven pre-existing or flaky.
veniship (VDT-3205) was excluded from this UAT window — SUPERSEDED 2026-08-28, it is back in on a minimal window — branch built and green, but held local and
not pushed. Three reasons: (1) 4H is excluded from international parcels as a business rule, and veniship's live
4H path enforces no destination-country gate at all — shouldApplyFourHands() excludes only pickup-point /
parcel-terminal, and isInternationalShipment() is never consulted; the only country-aware code
(FourHands::isRequiredByPackageWeight, LT 26 / EE 31 / LV 31) has no production callers.
(2) PR #743 merged on one live approval — the second mark sits on a force-pushed-away tree where 13 of the
14 merged files differ, and must not be counted. (3) VDT-3205 appears in zero files of the UAT planning
corpus: no probe, no FVS, no runbook entry. Its 4H stays dev-only while the other three move.
DDL ladder for uat — two steps, not three, and both must run before any code merges:
VDT-3384.sql (MyISAM ALTER tbl_klientai, ~169k rows / 62 MB on dev — table-copy under a write lock,
off-peak) then VDT-3395.sql (CREATE TABLE tbl_log_siunt_4rp).
VDT-3395-auto-weighed.sql belongs to the unshipped re-weigh-origin change and is not in this release.
Ordering is load-bearing: pack_4rp.php is a live cron on uat already, and its new version exits if the
provenance INSERT fails — code before DDL breaks a running job.
Still open: the uat posti_service1 flip was never evidenced. VDT-3415's “live on all envs”
inherits VDT-3413's decision comment, not a result; VDT-3413's own last comment says no uat/prod counts were ever
pasted. Treat the uat activation as real work until the read-only probe runs (needs uat DB access — Audrius, decision D2).
The dev lane is complete: every line of 4H Phase-1 and Phase-2 code, plus the VDT-3395 provenance work, is merged to dev and green (pakas 136/136 · siunta 91/91 · go-import 70/70 + API 36/36). Helper 0.9.2 is tagged, unblocking the Phase-3 band-centralization re-raise. Clean master-based 4h-release branches carry the identical content for the eventual UAT → prod promotion — parked by ruling: nothing moves beyond dev until the owner opens the UAT window. What actually remains before the LT flip: deploy dev to the dev server (also gates venicourier #3) · live dev-DB ALTER (s4rp_user_id INT(8)) · tariff seeding VDT-3415 (Finance) · UAT soak · master PRs · prod deploy with VDT-3384.sql + VDT-3395.sql · then the wave-by-zone flip (VDT-3413).
Phase 1 is fully merged and behaviourally verified on dev. All five 4H PRs merged (pakas #394, siunta #90, go-import #49, veniship #743 — retargeted to dev after dev was realigned — and helper #43), plus both helper pins (pakas #550, siunta #145) and the helper version-field fix (#45). Helper 0.8.3 / 0.9.1 released and pinned, so a deploy can no longer silently resolve a scalar-only helper. Per-client auto-4H proven on dev with browser screenshots: identical 30 kg LT→LT shipments differ only by the client switch — MANUAL stays unflagged, AUTO is flagged; 20 kg (below floor) and 80 kg (above ceiling) correctly excluded; 55 kg hits the 2×4H tier. UI and DB agree 5/5 → test results & evidence. Remaining before LT flip: VDT-3395 re-weigh re-eval · 14/28-vs-6/12 € tariff (Finance) · seed four-vs-six (Sales) · promotion dev → uat → prod. The three dev-exercise findings are triaged (2026-08-05): defect A (explicit four_hands=0 ignored) is fixed — go-import PR #57 (VDT-3403) open to dev, gate green, 4 reviewers assigned; defect B is ticketed as VDT-3404, blocked on the P11 mechanism ruling (PO/sys arch); the LV import failure is downgraded — VDT-3405: the validator's 4-digit rule matches the official LV-NNNN format and real traffic; the "5-digit table" was a MySQL ZEROFILL display artifact.