From 93590690b44723e6b7f6eed6e83c498272324564 Mon Sep 17 00:00:00 2001 From: amar-python Date: Mon, 10 Aug 2026 11:12:39 +1000 Subject: [PATCH 1/5] Agent Host changes for agents/package-review-for-github-upload --- .gitignore | 9 + CSV_Loading_Guide.docx | Bin 25759 -> 0 bytes Pending Items 28072026.docx | Bin 22187 -> 0 bytes PostgresDataMigration.ico | Bin 31928 -> 0 bytes csv-table-hub-main.zip | Bin 188904 -> 0 bytes favicon-16.png | Bin 717 -> 0 bytes favicon-32.png | Bin 1719 -> 0 bytes favicon.ico | Bin 5103 -> 0 bytes frontend/public/favicon.ico | Bin 20373 -> 0 bytes g3tierxe.patch | 643 -------- postgres-migration-icon.svg | 80 - preview-512.png | Bin 30694 -> 0 bytes test-artifacts/00_SUMMARY.md | 43 - test-artifacts/01_provision.log | 17 - test-artifacts/02_deploy_dev.log | 195 --- test-artifacts/03_sql_test_suite.log | 254 --- test-artifacts/04_evals_p_i_s.log | 40 - test-artifacts/05_test_report_full.log | 23 - test-artifacts/06_lint.log | 10 - test-artifacts/07_health_check.log | 94 -- .../08_test_report_dbfree_markers.log | 39 - .../09_negative_control_unprovisioned.log | 225 --- test-artifacts/10_evals_summary.json | 1422 ----------------- test-artifacts/11_vcrm_gap_report.md | 60 - 24 files changed, 9 insertions(+), 3145 deletions(-) delete mode 100644 CSV_Loading_Guide.docx delete mode 100644 Pending Items 28072026.docx delete mode 100644 PostgresDataMigration.ico delete mode 100644 csv-table-hub-main.zip delete mode 100644 favicon-16.png delete mode 100644 favicon-32.png delete mode 100644 favicon.ico delete mode 100644 frontend/public/favicon.ico delete mode 100644 g3tierxe.patch delete mode 100644 postgres-migration-icon.svg delete mode 100644 preview-512.png delete mode 100644 test-artifacts/00_SUMMARY.md delete mode 100644 test-artifacts/01_provision.log delete mode 100644 test-artifacts/02_deploy_dev.log delete mode 100644 test-artifacts/03_sql_test_suite.log delete mode 100644 test-artifacts/04_evals_p_i_s.log delete mode 100644 test-artifacts/05_test_report_full.log delete mode 100644 test-artifacts/06_lint.log delete mode 100644 test-artifacts/07_health_check.log delete mode 100644 test-artifacts/08_test_report_dbfree_markers.log delete mode 100644 test-artifacts/09_negative_control_unprovisioned.log delete mode 100644 test-artifacts/10_evals_summary.json delete mode 100644 test-artifacts/11_vcrm_gap_report.md diff --git a/.gitignore b/.gitignore index 351419c..e57f482 100644 --- a/.gitignore +++ b/.gitignore @@ -53,5 +53,14 @@ terraform-provider-*.log *.zip +# Large / non-source assets and local artifacts +*.docx +*.pdf +*.png +*.ico +*.patch +*.svg +test-artifacts/ + # Serena tool workspace .serena/ diff --git a/CSV_Loading_Guide.docx b/CSV_Loading_Guide.docx deleted file mode 100644 index 55ac02f24954db6450f335c5f37eb5874a0e3223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25759 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 diff --git a/PostgresDataMigration.ico b/PostgresDataMigration.ico deleted file mode 100644 index df796b224fdd4dd77934bcd1c2977339a637acf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31928 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 HQfL1cxBUC( diff --git a/csv-table-hub-main.zip b/csv-table-hub-main.zip deleted file mode 100644 index 44bd3e42c6942f5980dab3697bf1b35f1fac8c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188904 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 diff --git a/favicon-32.png b/favicon-32.png deleted file mode 100644 index e7c0045625f1369d677aa50d16afafd6e7b56ed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1719 zcmV;o21xmdP)-P!w?nR7n#ojZ5A-3I~|PjWId_s)F3 z-}gJ;;~asGQ7)HdrBbncUn=kOKdT-n@V$xZ0%tIkpC!I_CxwZZA6VT?K_pTP9&N({ z;CBUGar<*WC#ai<>Z9}!0&c+;1UCiav7q6 zyU>4p$wuvGZxs-*CSuStaeO8+kji&1CQH!_w|*iQUQrl>3KCU@LSWr{>g{^ z;yJf8!;z#ViI5Pd=k-Y_5Wx~iP^QqMqwx4+gPYd=p0ORkW$T}~+7I%tnPxo(NOwr| z{~k^RmC1W?t$OY5N7n6>{Hr9ojrF$H2wrQJ{wz<rZ|k5V*~0v*-^SGIOKi0ja%< zY!X{uuCwHQssWMEzOYIBACVhbs(Y*~5Sb!b#07Ie~G(5M0wusqhy zv$y;m1W2Y>3LJ3E=EVG72rw1_AyNW35h$lJrc$KSCcsHajE@!p%bwfxdJ+YMfRe&} zY!d5$m6EOB?5R4y@1%H032;_$#XOk-!MuntI^Kk@73LJP4!9aNP;ErW2R^h`j>xGf z;4l%kW1zh*Gb_NQ)EJAzSgg5n8LnHo6z9+HhLi$dk4<3Ld;i9k*WSnIcpce{4=GcV zGdk49G7d_&@KaVZe88SFIA8C+bv0J4T#P6N;&ch-br*11@3~lYc^~fF^fw&&Vi;j9 zaVlxe(LRd;{D)}A0JCv@X}SVJNYv_0{At~__{HUmade~!C8Z<8au@R&_dWeOmMyvf z_y6%m{OhwJ3?CoGhG$=Qig;R0aja8q$ppqh6wIiA6ao{q27a=5A#S+lrx+fKox#cf zB`ZPbzoZw1Tn4@Z=Js@9%pBHx4~0#1_EgeD11vD5E9lH{CLqq96dgcIfblC z6w%&22!SXjEWP-AXRy{x5XT0?Rf8Y>Z~<}|4QtITG0-YRvK<36O=AoSIUjHAIf$Ku zAEJ=cFt!yBTDFMteWMv8P7D%5E;EWbh20+kq(JVlu#33BF~c3wi(bJdvy)JdB3Eu1EQ%6T!#aEq z_~`Hu9(?9ir%t1pVE-ro#h=%&!Rr1c7!7j0C{O5@VS z7dy{B9XjU9bs--htGFjf?0WYgq?FJ~B1#hMdhcUgcwQIY-1{l2qjdyxB}|=Dt~0l$ z)d9FAAaP%hwz2|91GSKkUJ>x(no{XvU?C{2n50_X9>#{yj|2=Op5x?4bHQ^!Gx_HrtT>)ZCdSoxI$6V^UNWN&b>(c&rE zrM3|_flma&L+p)!KOe}POYnNgdB}-uYe4ih&^#&-9Rq9w5Q=bYJD>tU_=L0|rcIIr zS!{CHrBX=^3=EjQU*7SkpX<6gZd4Nxmli&oq_LAmkc(B`Pj*ySCue)VAOY!3mbX;K z6To~v@q#WL*T)~$HdX*d86`{H+}|-N@a2nK6zN|yZ(;rq>?wmno9`i0?~InC%7stt3rx@g0Okt z)_Y#+6tB}6r$qbceAU`=Fm^O5ekbsB1jR=9*1)}W_s}|?yVk*v-vB}kG57ZqW-b5# N002ovPDHLkV1nP)Gk^d9 diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index fbee083c27b89c09bb02db99ff28491b820ebd92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5103 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 diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico deleted file mode 100644 index 3c01d69713f9c184e92b74f5799e6dff2f500825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20373 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 diff --git a/g3tierxe.patch b/g3tierxe.patch deleted file mode 100644 index a5102b8..0000000 --- a/g3tierxe.patch +++ /dev/null @@ -1,643 +0,0 @@ -diff --git a/.github/workflows/quality-gate.yml b/.github/workflows/quality-gate.yml -index efce425..1c24a15 100644 ---- a/.github/workflows/quality-gate.yml -+++ b/.github/workflows/quality-gate.yml -@@ -139,6 +139,9 @@ jobs: - bash build/deploy_all.sh "$env" - done - -+ - name: Evals — Tiers X, E (post-deploy) -+ run: python3 evals/runner.py --tiers x,e --verbose -+ - # Prints a final block accounting for every test: PASSED / FAILED / - # ERROR / SKIPPED (with reasons) / NOT RUN (deselected). --strict fails - # the build on any skip. -@@ -280,6 +283,9 @@ jobs: - bash build/deploy_all.sh "$env" - done - -+ - name: Evals — Tiers X, E (post-deploy) -+ run: python3 evals/runner.py --tiers x,e --verbose -+ - - name: Full test suite — final result with skip accounting - run: python3 scripts/test_report.py --strict - -diff --git a/GAP_ANALYSIS.md b/GAP_ANALYSIS.md -index 6034d0e..409fc23 100644 ---- a/GAP_ANALYSIS.md -+++ b/GAP_ANALYSIS.md -@@ -20,7 +20,7 @@ claim below was reproduced, not inferred from reading code. - |---|---|---|---| - | G1 | ~~`config.env.example` names do not match `setup.sh` / loaders~~ | **Closed** | Renamed to `PG_*_` scheme | - | G2 | ~~Windows CI cannot run database-backed tests~~ | **Closed** | Added `windows-postgres` job to `quality-gate.yml` | --| G3 | Tiers X and E remain unimplemented | Medium | No — deferred by design | -+| G3 | ~~Tiers X and E remain unimplemented~~ | **Closed** | Implemented Tier X (CSV round-trip) and Tier E (cross-env parity) | - | G4 | ~~Runtime artifacts are not gitignored~~ | **Closed** | Added to `.gitignore` | - | G5 | ~~`VCRM.md` BR-20 assertion count edited~~ | **Closed** | Confirmed: 142 matches suite output and Tier S JSON | - -@@ -48,15 +48,25 @@ The existing `python-validator-tests.yml` Windows job continues to run - database-free markers as a fast signal; the new quality-gate job covers the - full surface. - --### G3 — Tiers X and E unimplemented (Medium) -+### G3 — Tiers X and E unimplemented (Closed) - --`evals/PLAN.md` defines five tiers; P, I and S are implemented. **X** --(cross-engine schema equivalence) and **E** (cross-environment structural --parity) remain deferred, so cross-engine claims for MariaDB, SQLite, InfluxDB, --Redis and Teradata rest on code review rather than execution. -+**Resolution:** Implemented both remaining eval tiers in `evals/runner.py`: - --Partially mitigated: `tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables` --now runs against all four PostgreSQL environments. -+- **Tier X** — CSV round-trip fidelity: loads each sample CSV into PostgreSQL -+ via `csv_loader.sh`, exports it back via `csv_utilise.sh export`, and diffs -+ data columns against the original. Proves the full load → DB → export -+ pipeline preserves data for arbitrary CSV shapes (including quoted commas -+ and UTF-8 characters). -+ -+- **Tier E** — Cross-environment structural parity: queries -+ `information_schema.columns` for all four environments (dev, test, staging, -+ prod) and asserts they have identical table names, column names, column -+ types, and column order. -+ -+Run with: `python3 evals/runner.py --tiers x,e --verbose` -+ -+The existing `tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables` -+provides complementary coverage at the pytest level. - - ### G4 — Runtime artifacts not gitignored (Closed) - -@@ -91,6 +101,6 @@ update to 142 is correct. No revert needed. - | Python unit / regression / security / snapshot | 54 tests, 0 skipped | `05_test_report_full.log` | - | SQL assertions | 142 / 142, 100% | `03_sql_test_suite.log` | - | Eval tiers P, I, S | 25 / 25, 0 skipped | `04_evals_p_i_s.log` | --| Eval tiers X, E | Not implemented | G3 | -+| Eval tiers X, E | Implemented (PostgreSQL) | `evals/runner.py --tiers x,e` | - | PostgreSQL engine | Fully exercised | above | - | Other five engines | Code review only | G3 | -diff --git a/evals/FAILURE_MODES.md b/evals/FAILURE_MODES.md -index 75e264f..c6868b0 100644 ---- a/evals/FAILURE_MODES.md -+++ b/evals/FAILURE_MODES.md -@@ -68,23 +68,48 @@ Tier S initial scope: only S1. - - --- - -+## Tier X — CSV round-trip fidelity -+ -+| # | Failure mode | Example scenario | Expected behaviour | Current | Eval ID | -+|---|--------------|------------------|--------------------|---------|---------| -+| X1 | Load → export round-trip loses data | Load customers.csv, export back, diff | All data columns match original exactly; marker columns excluded from diff | ✅ | 01 | -+| X2 | Round-trip with quoted commas and special chars | Load orders.csv (has quoted commas) | Quoted fields survive load/export cycle intact | ✅ | 01 | -+| X3 | Round-trip with UTF-8 special characters | Load inventory.csv (has en-dash) | UTF-8 preserved through PostgreSQL TEXT columns | ✅ | 01 | -+ -+Tier X initial scope: X1–X3 are all covered by scenario 01 which loops over all sample CSVs. -+ -+--- -+ -+## Tier E — Cross-environment structural parity -+ -+| # | Failure mode | Example scenario | Expected behaviour | Current | Eval ID | -+|---|--------------|------------------|--------------------|---------|---------| -+| E1 | Dev and test have different table sets | Compare information_schema across envs | All four envs have identical table names | ✅ | 01 | -+| E2 | Column type drift between environments | Dev has TEXT, staging has VARCHAR | Column names, types, and order match across all envs | ✅ | 01 | -+| E3 | Missing table in one environment | prod missing evidence_artifacts | Detected and reported as structural mismatch | ✅ | 01 | -+ -+Tier E initial scope: E1–E3 are all covered by scenario 01 which compares schema fingerprints. -+ -+--- -+ - ## What this catalogue does NOT yet cover - --- **Multi-DB equivalence** (cross-engine schema parity) — deferred until PG is locked in. - - **Performance / scale** (1M-row load timing) — separate suite if needed later. --- **Cross-environment structural equivalence** (Dev vs Test vs Staging vs Prod) — Tier E, future. - - **Domain-rule deep dives beyond suite 05** — Tier D, future. - - **Validator behaviour on >128KB single field** — beyond the current 50KB eval and Python `csv` default field-size assumptions. -+- **Cross-engine CSV round-trip** (MariaDB, SQLite) — Tier X currently covers PostgreSQL only. - - --- - - ## Summary - --| Tier | Modes catalogued | Modes in initial eval set | Deferred | --|------|------------------|---------------------------|----------| -+| Tier | Modes catalogued | Modes in eval set | Deferred | -+|------|------------------|-------------------|----------| - | P | 22 | 22 | 0 | - | I | 4 | 1 | 3 | - | S | 3 | 1 | 2 | --| **Total** | **29** | **21** | **7** | -+| X | 3 | 3 | 0 | -+| E | 3 | 3 | 0 | -+| **Total** | **35** | **30** | **5** | - --The current eval set covers every catalogued Tier P mode plus the initial Tier I and Tier S operational scenarios. The remaining deferred items are PostgreSQL oper -+The eval set now covers all five tiers. Tier X and E require a live PostgreSQL instance with all four environment databases deployed; they fail (not skip) when prerequisites are unavailable. -diff --git a/evals/PLAN.md b/evals/PLAN.md -index b59b544..ef9c885 100644 ---- a/evals/PLAN.md -+++ b/evals/PLAN.md -@@ -22,9 +22,10 @@ In short: `tests/` proves the **code is correct**; `evals/` proves the **framewo - - **Tier P** — Python CSV validator (`build/csv/validator.py`). Pure data-in / files-out. No DB. - - **Tier I** — Idempotency of `deploy_all.sh` against a clean Dev PostgreSQL. - - **Tier S** — SQL test suite integration: deploy fresh + run all 5 suites and assert 142/142. --- **Tiers deferred:** -- - **Tier X** — Cross-DB schema equivalence (MariaDB/SQLite). Out until Postgres is locked in. -+- **Tiers added (G3 closure):** -+ - **Tier X** — CSV round-trip fidelity: load → export → diff against original (PostgreSQL). - - **Tier E** — Cross-environment (Dev/Test/Staging/Prod) structural equivalence. -+- **Tiers deferred:** - - **Tier D** — Extended domain-rule evals beyond what suite 05 already covers. - - ## Folder layout -@@ -47,8 +48,16 @@ PostgreDataMigrationApp/ - │ │ └── 01_deploy_dev_twice/ - │ │ └── NOTES.txt ← what the runner does (no CSV needed) - │ │ -- │ └── tier_s/ ← SQL suite integration -- │ └── 01_fresh_deploy_then_all_tests_pass/ -+ │ ├── tier_s/ ← SQL suite integration -+ │ │ └── 01_fresh_deploy_then_all_tests_pass/ -+ │ │ └── NOTES.txt -+ │ │ -+ │ ├── tier_x/ ← CSV round-trip fidelity -+ │ │ └── 01_csv_round_trip_postgresql/ -+ │ │ └── NOTES.txt -+ │ │ -+ │ └── tier_e/ ← cross-environment parity -+ │ └── 01_all_envs_same_tables/ - │ └── NOTES.txt - │ - ├── expected/ -@@ -58,8 +67,12 @@ PostgreDataMigrationApp/ - │ │ └── … - │ ├── tier_i/ - │ │ └── 01_deploy_dev_twice.json -- │ └── tier_s/ -- │ └── 01_fresh_deploy_then_all_tests_pass.json -+ │ ├── tier_s/ -+ │ │ └── 01_fresh_deploy_then_all_tests_pass.json -+ │ ├── tier_x/ -+ │ │ └── 01_csv_round_trip_postgresql.json -+ │ └── tier_e/ -+ │ └── 01_all_envs_same_tables.json - │ - └── reports/ ← runtime output (gitignored) - └── / -@@ -117,7 +130,8 @@ Exit code: 0 if all scenarios in selected tiers pass, 1 otherwise. CI-friendly. - | 3 | Execute Tier P locally; show results | DONE / awaiting your review | - | 4 | Tier I scaffolding + runner extension | next | - | 5 | Tier S scaffolding + runner extension | next | --| 6 | (Future) Tier X across MariaDB/SQLite once Postgres is locked in | deferred | -+| 6 | Tier X (CSV round-trip fidelity, PostgreSQL) | DONE | -+| 7 | Tier E (cross-environment structural parity) | DONE | - - ## What this DOES NOT do - -diff --git a/evals/datasets/tier_e/01_all_envs_same_tables/NOTES.txt b/evals/datasets/tier_e/01_all_envs_same_tables/NOTES.txt -new file mode 100644 -index 0000000..df167be ---- /dev/null -+++ b/evals/datasets/tier_e/01_all_envs_same_tables/NOTES.txt -@@ -0,0 +1,10 @@ -+Tier E — Cross-environment structural parity. -+ -+After all four environments (dev, test, staging, prod) have been deployed, -+their te_core_schema tables must be structurally identical: same table names, -+same column names, same column types, same column order. -+ -+This scenario queries information_schema.columns for each environment and -+asserts the structural fingerprints match. -+ -+Requires: PostgreSQL reachable, all four environment databases deployed. -diff --git a/evals/datasets/tier_x/01_csv_round_trip_postgresql/NOTES.txt b/evals/datasets/tier_x/01_csv_round_trip_postgresql/NOTES.txt -new file mode 100644 -index 0000000..54bad3a ---- /dev/null -+++ b/evals/datasets/tier_x/01_csv_round_trip_postgresql/NOTES.txt -@@ -0,0 +1,11 @@ -+Tier X — CSV round-trip through PostgreSQL. -+ -+Loads each sample CSV (build/csv/samples/*.csv) into the dev database via -+csv_loader.sh, exports it back via csv_utilise.sh export, and diffs the -+data columns against the original. Marker columns (_csv_row_id, _loaded_at) -+are excluded from the diff. -+ -+Proves that the loader → DB → export pipeline preserves data fidelity for -+arbitrary CSV shapes. -+ -+Requires: PostgreSQL reachable via psql, config.local.env present. -diff --git a/evals/expected/tier_e/01_all_envs_same_tables.json b/evals/expected/tier_e/01_all_envs_same_tables.json -new file mode 100644 -index 0000000..16cff95 ---- /dev/null -+++ b/evals/expected/tier_e/01_all_envs_same_tables.json -@@ -0,0 +1,9 @@ -+{ -+ "scenario": "01_all_envs_same_tables", -+ "description": "All four environments must have identical table structure (names, columns, types).", -+ "expected": { -+ "all_envs_match": true, -+ "min_envs_compared": 4, -+ "min_tables_checked": 12 -+ } -+} -diff --git a/evals/expected/tier_x/01_csv_round_trip_postgresql.json b/evals/expected/tier_x/01_csv_round_trip_postgresql.json -new file mode 100644 -index 0000000..b9263e7 ---- /dev/null -+++ b/evals/expected/tier_x/01_csv_round_trip_postgresql.json -@@ -0,0 +1,8 @@ -+{ -+ "scenario": "01_csv_round_trip_postgresql", -+ "description": "Load sample CSVs into PostgreSQL, export back, and diff data columns against originals.", -+ "expected": { -+ "all_round_trips_match": true, -+ "min_csvs_tested": 3 -+ } -+} -diff --git a/evals/runner.py b/evals/runner.py -index 2e330fa..8547a31 100644 ---- a/evals/runner.py -+++ b/evals/runner.py -@@ -34,6 +34,9 @@ from typing import Any, Dict, List, Optional - EVALS_DIR = Path(__file__).resolve().parent - PROJECT_ROOT = EVALS_DIR.parent - VALIDATOR = PROJECT_ROOT / "build" / "csv" / "validator.py" -+CSV_LOADER = PROJECT_ROOT / "build" / "csv_loader.sh" -+CSV_UTILISE = PROJECT_ROOT / "build" / "csv_utilise.sh" -+SAMPLES_DIR = PROJECT_ROOT / "build" / "csv" / "samples" - - DATASETS_DIR = EVALS_DIR / "datasets" - EXPECTED_DIR = EVALS_DIR / "expected" -@@ -541,6 +544,359 @@ def _run_fresh_deploy_then_tests( - return result - - -+# --------------------------------------------------------------------------- -+# Tier X — CSV round-trip (load → export → diff) -+ -+_ENV_CONFIG = { -+ "dev": ("te_mgmt_dev", "te_dev"), -+ "test": ("te_mgmt_test", "te_test"), -+ "staging": ("te_mgmt_staging", "te_staging"), -+ "prod": ("te_mgmt_prod", "te_prod"), -+} -+ -+_REQUIRED_TABLES = [ -+ "organisations", "personnel", "test_programs", "temp_documents", -+ "test_phases", "requirements", "test_cases", "vcrm_entries", -+ "test_events", "test_results", "defect_reports", "evidence_artifacts", -+] -+ -+ -+def _find_bash() -> Optional[str]: -+ if sys.platform == "win32": -+ for c in (r"C:\Program Files\Git\bin\bash.exe", -+ r"C:\Program Files (x86)\Git\bin\bash.exe"): -+ if Path(c).exists(): -+ return c -+ which = shutil.which("bash") -+ if which and "system32" not in which.lower(): -+ return which -+ return None -+ return shutil.which("bash") or "bash" -+ -+ -+def _round_trip_one_csv( -+ csv_path: Path, bash: str, env: Dict[str, str] -+) -> Dict[str, Any]: -+ """Load a CSV into dev, export it, compare data columns.""" -+ table_name = csv_path.stem.lower().replace(" ", "_").replace("-", "_") -+ result: Dict[str, Any] = {"csv": csv_path.name, "table": table_name} -+ -+ load = subprocess.run( -+ [bash, str(CSV_LOADER), str(csv_path), "--env", "dev"], -+ capture_output=True, text=True, cwd=PROJECT_ROOT, -+ env=env, timeout=60, -+ ) -+ if load.returncode != 0: -+ result["error"] = "loader failed: " + load.stderr[-300:] -+ return result -+ -+ with tempfile.NamedTemporaryFile( -+ suffix=".csv", delete=False, mode="w" -+ ) as tmp: -+ export_path = tmp.name -+ -+ try: -+ export = subprocess.run( -+ [bash, str(CSV_UTILISE), "export", table_name, export_path, -+ "--env", "dev"], -+ capture_output=True, text=True, cwd=PROJECT_ROOT, -+ env=env, timeout=30, -+ ) -+ if export.returncode != 0: -+ result["error"] = "export failed: " + export.stderr[-300:] -+ return result -+ -+ original_rows = _read_csv_rows(csv_path) -+ exported_rows = _read_csv_rows(Path(export_path)) -+ -+ if not exported_rows: -+ result["error"] = "exported CSV is empty" -+ return result -+ -+ exported_header = exported_rows[0] -+ orig_header = original_rows[0] if original_rows else [] -+ -+ orig_col_names = [h.strip().lower().replace(" ", "_") for h in orig_header] -+ marker_indices = set() -+ data_indices = [] -+ for i, col in enumerate(exported_header): -+ if col in ("_csv_row_id", "_loaded_at"): -+ marker_indices.add(i) -+ else: -+ data_indices.add(i) -+ -+ exported_data_header = [exported_header[i] for i in data_indices] -+ if exported_data_header != orig_col_names: -+ result["error"] = ( -+ "column name mismatch: original=" + str(orig_col_names) -+ + " exported=" + str(exported_data_header) -+ ) -+ return result -+ -+ orig_data = [row for row in original_rows[1:]] -+ exported_data = [ -+ [row[i] for i in data_indices] -+ for row in exported_rows[1:] -+ ] -+ -+ if len(orig_data) != len(exported_data): -+ result["error"] = ( -+ "row count mismatch: original=" + str(len(orig_data)) -+ + " exported=" + str(len(exported_data)) -+ ) -+ return result -+ -+ mismatches = [] -+ for row_idx, (orig_row, exp_row) in enumerate( -+ zip(orig_data, exported_data) -+ ): -+ if orig_row != exp_row: -+ mismatches.append({ -+ "row": row_idx + 1, -+ "original": orig_row, -+ "exported": exp_row, -+ }) -+ if mismatches: -+ result["error"] = "data mismatch in " + str(len(mismatches)) + " row(s)" -+ result["mismatches"] = mismatches[:5] -+ return result -+ -+ result["match"] = True -+ result["rows_compared"] = len(orig_data) -+ finally: -+ subprocess.run( -+ [bash, str(CSV_UTILISE), "drop", table_name, "--yes", "--env", "dev"], -+ capture_output=True, text=True, cwd=PROJECT_ROOT, -+ env=env, timeout=15, -+ ) -+ try: -+ os.unlink(export_path) -+ except OSError: -+ pass -+ -+ return result -+ -+ -+def run_tier_x_scenario(scenario_dir: Path) -> ScenarioResult: -+ name = scenario_dir.name -+ result = ScenarioResult(tier="x", name=name) -+ -+ expected = _load_expected("x", name) -+ if expected is None: -+ result.errors.append("No expected file at expected/tier_x/" + name + ".json") -+ return result -+ result.expected = expected -+ -+ if not _can_connect_pg(): -+ result.errors.append( -+ "PostgreSQL not reachable via psql — needed for round-trip eval." -+ ) -+ return result -+ -+ bash = _find_bash() -+ if bash is None: -+ result.errors.append("No working bash found.") -+ return result -+ -+ if name == "01_csv_round_trip_postgresql": -+ return _run_csv_round_trip(result, expected, bash) -+ -+ result.errors.append("Unknown tier-X scenario: " + name) -+ return result -+ -+ -+def _run_csv_round_trip( -+ result: ScenarioResult, expected: Dict[str, Any], bash: str -+) -> ScenarioResult: -+ sample_csvs = sorted(SAMPLES_DIR.glob("*.csv")) -+ if not sample_csvs: -+ result.errors.append("No sample CSVs in " + str(SAMPLES_DIR)) -+ return result -+ -+ env = _pg_env() -+ trip_results = [] -+ for csv_path in sample_csvs: -+ trip = _round_trip_one_csv(csv_path, bash, env) -+ trip_results.append(trip) -+ -+ actual = { -+ "csvs_tested": len(trip_results), -+ "all_round_trips_match": all(t.get("match") for t in trip_results), -+ "details": trip_results, -+ } -+ result.actual = actual -+ -+ exp = expected.get("expected", {}) -+ errors: List[str] = [] -+ -+ if exp.get("all_round_trips_match") and not actual["all_round_trips_match"]: -+ failed = [t for t in trip_results if not t.get("match")] -+ for t in failed: -+ errors.append(t["csv"] + ": " + t.get("error", "unknown failure")) -+ -+ min_csvs = exp.get("min_csvs_tested", 0) -+ if actual["csvs_tested"] < min_csvs: -+ errors.append( -+ "csvs_tested: expected >= " + str(min_csvs) -+ + ", got " + str(actual["csvs_tested"]) -+ ) -+ -+ result.errors = errors -+ result.passed = not errors -+ return result -+ -+ -+# --------------------------------------------------------------------------- -+# Tier E — Cross-environment structural parity -+ -+ -+def _get_schema_fingerprint( -+ db: str, schema: str -+) -> Optional[List[Dict[str, str]]]: -+ # schema comes from the hardcoded _ENV_CONFIG constant — not injectable -+ query = ( -+ "SELECT table_name, column_name, data_type, ordinal_position " -+ "FROM information_schema.columns " -+ "WHERE table_schema = '" + schema + "' " # nosec B608 -+ "ORDER BY table_name, ordinal_position;" -+ ) -+ r = subprocess.run( -+ ["psql", "-tA", "-F", "|", "-d", db, "-c", query], -+ env=_pg_env(), capture_output=True, text=True, timeout=10, -+ ) -+ if r.returncode != 0: -+ return None -+ rows = [] -+ for line in r.stdout.strip().splitlines(): -+ parts = line.split("|") -+ if len(parts) >= 4: -+ rows.append({ -+ "table": parts[0], -+ "column": parts[1], -+ "type": parts[2], -+ "position": parts[3], -+ }) -+ return rows -+ -+ -+def run_tier_e_scenario(scenario_dir: Path) -> ScenarioResult: -+ name = scenario_dir.name -+ result = ScenarioResult(tier="e", name=name) -+ -+ expected = _load_expected("e", name) -+ if expected is None: -+ result.errors.append("No expected file at expected/tier_e/" + name + ".json") -+ return result -+ result.expected = expected -+ -+ if not _can_connect_pg(): -+ result.errors.append( -+ "PostgreSQL not reachable via psql — needed for cross-env parity eval." -+ ) -+ return result -+ -+ if name == "01_all_envs_same_tables": -+ return _run_all_envs_same_tables(result, expected) -+ -+ result.errors.append("Unknown tier-E scenario: " + name) -+ return result -+ -+ -+def _run_all_envs_same_tables( -+ result: ScenarioResult, expected: Dict[str, Any] -+) -> ScenarioResult: -+ fingerprints: Dict[str, Optional[List[Dict[str, str]]]] = {} -+ for env_name, (db, schema) in _ENV_CONFIG.items(): -+ fingerprints[env_name] = _get_schema_fingerprint(db, schema) -+ -+ available = {k: v for k, v in fingerprints.items() if v is not None} -+ unavailable = [k for k, v in fingerprints.items() if v is None] -+ -+ tables_per_env = {} -+ for env_name, cols in available.items(): -+ tables_per_env[env_name] = sorted(set(c["table"] for c in cols)) -+ -+ ref_env = "dev" if "dev" in available else next(iter(available), None) -+ -+ actual: Dict[str, Any] = { -+ "envs_compared": len(available), -+ "envs_unavailable": unavailable, -+ "tables_per_env": {k: len(v) for k, v in tables_per_env.items()}, -+ } -+ -+ errors: List[str] = [] -+ exp = expected.get("expected", {}) -+ -+ if not ref_env: -+ errors.append("No environments reachable.") -+ result.actual = actual -+ result.errors = errors -+ return result -+ -+ ref_fingerprint = available[ref_env] -+ ref_tables = tables_per_env[ref_env] -+ -+ def _cols_for_table(fp: List[Dict[str, str]], tbl: str) -> List[Dict[str, str]]: -+ return [c for c in fp if c["table"] == tbl] -+ -+ all_match = True -+ diffs: List[str] = [] -+ for env_name, fp in available.items(): -+ if env_name == ref_env: -+ continue -+ env_tables = tables_per_env[env_name] -+ missing_in_env = set(ref_tables) - set(env_tables) -+ extra_in_env = set(env_tables) - set(ref_tables) -+ if missing_in_env: -+ all_match = False -+ diffs.append( -+ env_name + " missing tables vs " + ref_env + ": " -+ + ", ".join(sorted(missing_in_env)) -+ ) -+ if extra_in_env: -+ all_match = False -+ diffs.append( -+ env_name + " has extra tables vs " + ref_env + ": " -+ + ", ".join(sorted(extra_in_env)) -+ ) -+ for tbl in set(ref_tables) & set(env_tables): -+ ref_cols = _cols_for_table(ref_fingerprint, tbl) -+ env_cols = _cols_for_table(fp, tbl) -+ if ref_cols != env_cols: -+ all_match = False -+ diffs.append( -+ env_name + "." + tbl + " columns differ from " -+ + ref_env + "." + tbl -+ ) -+ -+ actual["all_envs_match"] = all_match -+ actual["diffs"] = diffs -+ actual["tables_checked"] = len(ref_tables) -+ result.actual = actual -+ -+ if exp.get("all_envs_match") and not all_match: -+ for d in diffs: -+ errors.append(d) -+ -+ min_envs = exp.get("min_envs_compared", 0) -+ if len(available) < min_envs: -+ errors.append( -+ "envs_compared: expected >= " + str(min_envs) -+ + ", got " + str(len(available)) -+ ) -+ -+ min_tables = exp.get("min_tables_checked", 0) -+ if actual["tables_checked"] < min_tables: -+ errors.append( -+ "tables_checked: expected >= " + str(min_tables) -+ + ", got " + str(actual["tables_checked"]) -+ ) -+ -+ result.errors = errors -+ result.passed = not errors -+ return result -+ -+ - # --------------------------------------------------------------------------- - # Orchestration - -@@ -548,6 +904,8 @@ TIER_RUNNERS = { - "p": run_tier_p_scenario, - "i": run_tier_i_scenario, - "s": run_tier_s_scenario, -+ "x": run_tier_x_scenario, -+ "e": run_tier_e_scenario, - } - - diff --git a/postgres-migration-icon.svg b/postgres-migration-icon.svg deleted file mode 100644 index 42617e8..0000000 --- a/postgres-migration-icon.svg +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/preview-512.png b/preview-512.png deleted file mode 100644 index f4aa1e8abafba8e8faacfbee7d06fdb1d1eeb0f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30694 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 D>yxw7 diff --git a/test-artifacts/00_SUMMARY.md b/test-artifacts/00_SUMMARY.md deleted file mode 100644 index 21fbec1..0000000 --- a/test-artifacts/00_SUMMARY.md +++ /dev/null @@ -1,43 +0,0 @@ -# Test Artifacts — Verification Run - -**Run:** `20260721T080414Z` -**Commit:** `b255262ad97b` (base `b255262` + audit changes) -**PostgreSQL:** 16.14 (Ubuntu 16.14-0ubuntu0.24.04.1) -**Python:** Python 3.12.3 -**Platform:** Ubuntu 24.04 container, clean clone - -## Results - -| # | Artifact | What it proves | Result | -|---|---|---|---| -| 01 | `01_provision.log` | All 4 environments provisioned from committed templates | PASS | -| 02 | `02_deploy_dev.log` | Fresh-clone deploy succeeds: 12 tables, seed loaded | PASS | -| 03 | `03_sql_test_suite.log` | Full SQL suite | **142 / 142 — 100%** | -| 04 | `04_evals_p_i_s.log` | Eval tiers P, I, S | **25 / 25, 0 skipped** | -| 05 | `05_test_report_full.log` | Full suite with skip accounting | **54 / 54, 0 skipped, 0 not run** | -| 06 | `06_lint.log` | flake8 + bandit | PASS | -| 07 | `07_health_check.log` | Repository health check | PASS | -| 08 | `08_test_report_dbfree_markers.log` | Windows-job scope; 15 not-run listed by name | PASS | -| 09 | `09_negative_control_unprovisioned.log` | Missing prerequisites FAIL, never skip | **RESULT: FAIL (intended)** | -| 10 | `10_evals_summary.json` | Machine-readable eval outcomes | 25 / 25 | -| 11 | `11_vcrm_gap_report.md` | Per-run VCRM traceability | generated | - -## Reading these - -Artifacts **01–08** are the green path: every gate passes, nothing is skipped. - -Artifact **09 is a deliberate failure** and is the most important one. It runs -the suite with no environment files, no `config.local.env` and no deployed -databases. It reports `RESULT: FAIL` with **0 skipped** — proving that an -unavailable prerequisite fails loudly instead of quietly skipping. Before this -change, that same state reported green. - -Artifact **08** shows `NOT RUN : 15`, each named. Those are deselected by the -marker filter (they run in the Linux integration job), not skipped. - -## Reproduce - -```bash -bash scripts/provision_full_test_env.sh -python3 scripts/test_report.py --strict -``` diff --git a/test-artifacts/01_provision.log b/test-artifacts/01_provision.log deleted file mode 100644 index 507d3fa..0000000 --- a/test-artifacts/01_provision.log +++ /dev/null @@ -1,17 +0,0 @@ -[✓] PostgreSQL reachable -[✓] env_dev.sql created from template -[✓] env_test.sql created from template -[✓] env_staging.sql created from template -[✓] env_prod.sql created from template -[✓] config.local.env generated (PG_*_ names the loaders expect) -[»] Deploying dev… -[✓] dev deployed -[»] Deploying test… -[✓] test deployed -[»] Deploying staging… -[✓] staging deployed -[»] Deploying prod… -[✓] prod deployed - -[✓] All prerequisites provisioned. The suite should now skip nothing: - python3 -m unittest discover -s tests -p "test*.py" diff --git a/test-artifacts/02_deploy_dev.log b/test-artifacts/02_deploy_dev.log deleted file mode 100644 index ae50d9d..0000000 --- a/test-artifacts/02_deploy_dev.log +++ /dev/null @@ -1,195 +0,0 @@ -──────────────────────────────────────────────────────────── - Defence T&E Database Deployment - Host : localhost:5432 - User : postgres - Targets : dev -──────────────────────────────────────────────────────────── - -[⚠] Deploying environment: DEV (database: te_mgmt_dev) -[✓] Database te_mgmt_dev already exists — skipping CREATE. - -============================================================ - DEFENCE T&E DATABASE SETUP - Environment : DEV - Database : te_mgmt_dev - Schema : te_dev - App User : te_dev_user - Seed Data : true -============================================================ - - set_config | set_config | set_config | set_config | set_config -------------+-------------+-------------+----------------------+------------ - DEV | te_mgmt_dev | te_dev_user | __INJECT_AT_DEPLOY__ | 10 -(1 row) - ->> [1/6] Creating database: te_mgmt_dev ->> [2/6] Creating application user: te_dev_user -psql:/home/claude/audit/build/te_core_schema.sql:67: NOTICE: [DEV] Role "te_dev_user" already exists — password and conn_limit refreshed. -DO -GRANT -You are now connected to database "te_mgmt_dev" as user "postgres". - set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config | set_config -------------+------------+-------------+---------------+------------+---------------+----------------+-------------+--------------+------------+--------------+-------------+--------------+----------------+-------------------- - DEV | te_dev | te_dev_user | organisations | personnel | test_programs | temp_documents | test_phases | requirements | test_cases | vcrm_entries | test_events | test_results | defect_reports | evidence_artifacts -(1 row) - ->> [3/6] Setting up schema: te_dev -psql:/home/claude/audit/build/te_core_schema.sql:98: NOTICE: extension "uuid-ossp" already exists, skipping -CREATE EXTENSION -psql:/home/claude/audit/build/te_core_schema.sql:99: NOTICE: extension "pg_trgm" already exists, skipping -CREATE EXTENSION -psql:/home/claude/audit/build/te_core_schema.sql:100: NOTICE: extension "dblink" already exists, skipping -CREATE EXTENSION -psql:/home/claude/audit/build/te_core_schema.sql:102: NOTICE: schema "te_dev" already exists, skipping -CREATE SCHEMA - set_config ---------------- - te_dev,public -(1 row) - -GRANT -GRANT -ALTER DEFAULT PRIVILEGES ->> [4/6] Creating tables -psql:/home/claude/audit/build/te_core_schema.sql:128: NOTICE: relation "organisations" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:153: NOTICE: relation "personnel" already exists, skipping -CREATE TABLE -COMMENT -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:177: NOTICE: relation "test_programs" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:199: NOTICE: relation "temp_documents" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:223: NOTICE: relation "test_phases" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:247: NOTICE: relation "requirements" already exists, skipping -CREATE TABLE -COMMENT -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:273: NOTICE: relation "test_cases" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:293: NOTICE: relation "vcrm_entries" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:319: NOTICE: relation "test_events" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:340: NOTICE: relation "test_results" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:366: NOTICE: relation "defect_reports" already exists, skipping -CREATE TABLE -COMMENT -psql:/home/claude/audit/build/te_core_schema.sql:386: NOTICE: relation "evidence_artifacts" already exists, skipping -CREATE TABLE -COMMENT ->> [4/6] Creating indexes -psql:/home/claude/audit/build/te_core_schema.sql:398: NOTICE: relation "idx_personnel_org" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:400: NOTICE: relation "idx_personnel_email_trgm" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:403: NOTICE: relation "idx_programs_org" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:405: NOTICE: relation "idx_programs_status" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:407: NOTICE: relation "idx_programs_code_trgm" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:410: NOTICE: relation "idx_phases_program" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:412: NOTICE: relation "idx_phases_status" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:415: NOTICE: relation "idx_requirements_program" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:417: NOTICE: relation "idx_requirements_type" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:420: NOTICE: relation "idx_testcases_phase" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:422: NOTICE: relation "idx_testcases_status" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:425: NOTICE: relation "idx_vcrm_req" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:427: NOTICE: relation "idx_vcrm_tc" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:430: NOTICE: relation "idx_events_phase" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:432: NOTICE: relation "idx_events_status" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:435: NOTICE: relation "idx_results_event" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:437: NOTICE: relation "idx_results_verdict" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:440: NOTICE: relation "idx_defects_program" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:442: NOTICE: relation "idx_defects_severity" already exists, skipping -CREATE INDEX -psql:/home/claude/audit/build/te_core_schema.sql:444: NOTICE: relation "idx_defects_status" already exists, skipping -CREATE INDEX -CREATE FUNCTION -DO ->> [5/6] Seeding realistic T&E data -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 -INSERT 0 0 ->> [6/6] Verification — row counts for DEV - table_name | rows | status ---------------------+------+--------- - defect_reports | 3 | ✓ OK - evidence_artifacts | 0 | ⚠ EMPTY - organisations | 5 | ✓ OK - personnel | 6 | ✓ OK - requirements | 8 | ✓ OK - temp_documents | 3 | ✓ OK - test_cases | 8 | ✓ OK - test_events | 3 | ✓ OK - test_phases | 3 | ✓ OK - test_programs | 2 | ✓ OK - test_results | 7 | ✓ OK - vcrm_entries | 8 | ✓ OK -(12 rows) - - req_identifier | title | req_type | test_cases_mapped | coverage_status -----------------+-----------------------------------------------+-------------+-------------------+----------------- - IFV-PERF-001 | Cross-Country Speed — 40 km/h Minimum | performance | 0 | ✗ NO COVERAGE - IFV-SAF-001 | Crew Survivability — STANAG 4569 Level 4 | safety | 0 | ✗ NO COVERAGE - SYS-COMP-001 | ISM Control Compliance — Section 3 (Gateways) | compliance | 1 | ✓ COVERED - SYS-FUNC-001 | Audit Log — All User Actions Captured | functional | 1 | ✓ COVERED - SYS-FUNC-002 | Role-Based Access Control (RBAC) Enforcement | functional | 1 | ✓ COVERED - SYS-PERF-001 | System Availability — 99.5% Uptime SLA | performance | 1 | ✓ COVERED - SYS-SEC-001 | Multi-Factor Authentication Enforcement | security | 2 | ✓ COVERED - SYS-SEC-002 | Data-at-Rest Encryption (AES-256) | security | 2 | ✓ COVERED -(8 rows) - - severity | status | count -----------+-------------+------- - major | in_progress | 1 - major | open | 1 - minor | open | 1 -(3 rows) - - -============================================================ - Setup complete for environment: DEV - Database : te_mgmt_dev | Schema: te_dev -============================================================ - -[✓] Environment DEV deployed successfully. -──────────────────────────────────────────────────────────── - - Deployment Summary -──────────────────────────────────────────────────────────── -[✓] Succeeded : dev - diff --git a/test-artifacts/03_sql_test_suite.log b/test-artifacts/03_sql_test_suite.log deleted file mode 100644 index c0481ae..0000000 --- a/test-artifacts/03_sql_test_suite.log +++ /dev/null @@ -1,254 +0,0 @@ -──────────────────────────────────────────────────────────── - Defence T&E — Test Suite Runner - Host : localhost:5432 - User : postgres - Targets : dev -──────────────────────────────────────────────────────────── -──────────────────────────────────────────────────────────── -[i] Running tests against: DEV (db=te_mgmt_dev schema=te_dev) -──────────────────────────────────────────────────────────── - -============================================================ - DEFENCE T&E TEST SUITE - Schema: te_dev -============================================================ - - set_config | set_config | set_config | set_config ----------------+------------+-------------+------------ - te_dev,public | te_dev | te_dev_user | 10 -(1 row) - ->> Loading test framework... -CREATE TABLE -COMMENT -TRUNCATE TABLE -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION -CREATE FUNCTION - [framework] Test framework loaded. - ->> Running test suites... - - [suite 01] organisations & personnel -DO - [suite 02] programs, TEMP documents & test phases -DO - [suite 03] requirements & VCRM coverage -DO - [suite 04] test cases, events, results & defect reports -DO - [suite 05] schema structure, indexes, triggers & business rules -DO - -============================================================ - REPORT 1: Suite Summary -============================================================ - suite | total | passed | failed | skipped | pass_rate | suite_status -----------------+-------+--------+--------+---------+-----------+-------------- - business_rules | 10 | 10 | 0 | 0 | 100.0% | ✓ ALL PASS - defect_reports | 12 | 12 | 0 | 0 | 100.0% | ✓ ALL PASS - organisations | 11 | 11 | 0 | 0 | 100.0% | ✓ ALL PASS - personnel | 12 | 12 | 0 | 0 | 100.0% | ✓ ALL PASS - programs | 13 | 13 | 0 | 0 | 100.0% | ✓ ALL PASS - requirements | 13 | 13 | 0 | 0 | 100.0% | ✓ ALL PASS - schema | 23 | 23 | 0 | 0 | 100.0% | ✓ ALL PASS - temp_documents | 6 | 6 | 0 | 0 | 100.0% | ✓ ALL PASS - test_cases | 9 | 9 | 0 | 0 | 100.0% | ✓ ALL PASS - test_events | 8 | 8 | 0 | 0 | 100.0% | ✓ ALL PASS - test_phases | 6 | 6 | 0 | 0 | 100.0% | ✓ ALL PASS - test_results | 9 | 9 | 0 | 0 | 100.0% | ✓ ALL PASS - vcrm | 10 | 10 | 0 | 0 | 100.0% | ✓ ALL PASS -(13 rows) - - -============================================================ - REPORT 2: Failures Only (empty = all green) -============================================================ - suite | test_name | expected | actual | message --------+-----------+----------+--------+--------- -(0 rows) - - -============================================================ - REPORT 3: Full Detail (all assertions) -============================================================ - suite | test_name | status | expected | actual | message -----------------+----------------------------------------------------------------------------+--------+------------------+--------------------------------------------------------------------------------------------------------+--------- - business_rules | S01 — All results: test case phase matches event phase | PASS | 0 | 0 | - business_rules | S02 — All fail verdicts have a matching DR raised | PASS | 0 | 0 | - business_rules | S03 — No results recorded against planned (future) events | PASS | 0 | 0 | - business_rules | S04 — All open DRs belong to an active program | PASS | 0 | 0 | - business_rules | S05 — No baseline-cleared personnel authoring cases in PROTECTED+ programs | PASS | 0 | 0 | - business_rules | S06 — All VCRM entries: requirement and test case share same program | PASS | 0 | 0 | - business_rules | S07 — No test events have planned_end before planned_start | PASS | 0 | 0 | - business_rules | S08 — evidence_artifacts table is empty (no files uploaded yet) | PASS | 0 | 0 | - business_rules | S09 — App role exists in pg_roles | PASS | 1 | 1 | - business_rules | S10 — App role conn limit matches env config | PASS | 10 | 10 | - defect_reports | O01 — Row count = 3 | PASS | 3 | 3 | - defect_reports | O02 — DR-CYB-0001 (Audit Log gap) exists | PASS | 1 | 1 | - defect_reports | O03 — DR-CYB-0002 (TLS 1.2 gap) exists | PASS | 1 | 1 | - defect_reports | O04 — DR-CYB-0003 (Session Timeout) exists | PASS | 1 | 1 | - defect_reports | O05 — No critical-severity defects in seed data | PASS | 0 | 0 | - defect_reports | O06 — 2 major-severity defects seeded | PASS | 2 | 2 | - defect_reports | O07 — No closed/resolved defects (all active) | PASS | 0 | 0 | - defect_reports | O08 — All defects reference a valid program (FK check) | PASS | 0 | 0 | - defect_reports | O09 — All defect raisers exist in personnel (FK check) | PASS | 0 | 0 | - defect_reports | O10 — All defect_ref values are unique (UNIQUE enforced) | PASS | 0 | 0 | - defect_reports | O11 — All resolved defects have a resolved_at timestamp | PASS | 0 | 0 | - defect_reports | O12 — All severity values are valid | PASS | 0 | 0 | - organisations | A01 — Row count = 5 | PASS | 5 | 5 | - organisations | A02 — CASG record exists | PASS | 1 | 1 | - organisations | A03 — All organisations active by default | PASS | 0 | 0 | - organisations | A04 — All country codes are 2 chars (ISO 3166-1) | PASS | 0 | 0 | - organisations | A05 — All org_type values are valid | PASS | 0 | 0 | - organisations | A06 — No duplicate organisation names | PASS | 0 | 0 | - organisations | A07 — At least one test_unit organisation exists | PASS | TRUE | TRUE | - organisations | A08 — created_at populated on all organisations | PASS | 0 | 0 | - organisations | B01 — Invalid org_type rejected by CHECK constraint | PASS | exception raised | new row for relation "organisations" violates check constraint "organisations_org_type_check" | - organisations | B02 — NULL name rejected by NOT NULL constraint | PASS | exception raised | null value in column "name" of relation "organisations" violates not-null constraint | - organisations | B03 — Duplicate org name rejected by UNIQUE constraint | PASS | exception raised | duplicate key value violates unique constraint "organisations_name_key" | - personnel | C01 — Row count = 6 | PASS | 6 | 6 | - personnel | C02 — No orphaned personnel (all linked to valid org) | PASS | 0 | 0 | - personnel | C03 — At least one NV2-cleared person exists | PASS | TRUE | TRUE | - personnel | C04 — All clearance values are within allowed set | PASS | 0 | 0 | - personnel | C05 — All emails contain @ | PASS | 0 | 0 | - personnel | C06 — No duplicate email addresses | PASS | 0 | 0 | - personnel | C07 — All password hashes are bcrypt format ($2b$/$2a$) | PASS | 0 | 0 | - personnel | C08 — All te_role values are valid | PASS | 0 | 0 | - personnel | C09 — All personnel active by default | PASS | 0 | 0 | - personnel | D01 — Invalid clearance level rejected by CHECK | PASS | exception raised | new row for relation "personnel" violates check constraint "personnel_clearance_check" | - personnel | D02 — Invalid te_role rejected by CHECK | PASS | exception raised | new row for relation "personnel" violates check constraint "personnel_te_role_check" | - personnel | D03 — Invalid org_id rejected by FK constraint | PASS | exception raised | insert or update on table "personnel" violates foreign key constraint "personnel_org_id_fkey" | - programs | E01 — Row count = 2 | PASS | 2 | 2 | - programs | E02 — CYB9131 program present | PASS | 1 | 1 | - programs | E03 — LAND400-P3 program present | PASS | 1 | 1 | - programs | E04 — All programs have a director assigned | PASS | 0 | 0 | - programs | E05 — All program directors exist in personnel table | PASS | 0 | 0 | - programs | E06 — All program status values are valid | PASS | 0 | 0 | - programs | E07 — All classification markings are valid | PASS | 0 | 0 | - programs | E08 — No programs have end_date before start_date | PASS | 0 | 0 | - programs | E09 — All program_codes are unique | PASS | 0 | 0 | - programs | E10 — CYB9131 classification is PROTECTED | PASS | PROTECTED | PROTECTED | - programs | F01 — Inverted date range rejected by CHECK constraint | PASS | exception raised | new row for relation "test_programs" violates check constraint "chk_program_dates" | - programs | F02 — Invalid classification rejected by CHECK constraint | PASS | exception raised | new row for relation "test_programs" violates check constraint "test_programs_classification_check" | - programs | F03 — Duplicate program_code rejected by UNIQUE constraint | PASS | exception raised | duplicate key value violates unique constraint "test_programs_program_code_key" | - requirements | I01 — Row count = 8 | PASS | 8 | 8 | - requirements | I02 — CYB9131 has 6 requirements | PASS | 6 | 6 | - requirements | I03 — LAND400-P3 has 2 requirements | PASS | 2 | 2 | - requirements | I04 — All requirements have a non-empty req_identifier | PASS | 0 | 0 | - requirements | I05 — All mandatory requirements have a verification method | PASS | 0 | 0 | - requirements | I06 — All verification_method values are valid | PASS | 0 | 0 | - requirements | I07 — All req_type values are valid | PASS | 0 | 0 | - requirements | I08 — All priority values are between 1 and 3 | PASS | 0 | 0 | - requirements | I09 — No duplicate req_identifier per program (UNIQUE enforced) | PASS | 0 | 0 | - requirements | I10 — All requirements reference a valid program (FK check) | PASS | 0 | 0 | - requirements | I11 — SYS-SEC-001 (MFA Enforcement) requirement exists | PASS | 1 | 1 | - requirements | J01 — Priority outside 1–3 rejected by CHECK constraint | PASS | exception raised | new row for relation "requirements" violates check constraint "requirements_priority_check" | - requirements | J02 — Invalid verification_method rejected by CHECK | PASS | exception raised | new row for relation "requirements" violates check constraint "requirements_verification_method_check" | - schema | P01 — Table organisations exists | PASS | 1 | 1 | - schema | P02 — Table personnel exists | PASS | 1 | 1 | - schema | P03 — Table test_programs exists | PASS | 1 | 1 | - schema | P04 — Table temp_documents exists | PASS | 1 | 1 | - schema | P05 — Table test_phases exists | PASS | 1 | 1 | - schema | P06 — Table requirements exists | PASS | 1 | 1 | - schema | P07 — Table test_cases exists | PASS | 1 | 1 | - schema | P08 — Table vcrm_entries exists | PASS | 1 | 1 | - schema | P09 — Table test_events exists | PASS | 1 | 1 | - schema | P10 — Table test_results exists | PASS | 1 | 1 | - schema | P11 — Table defect_reports exists | PASS | 1 | 1 | - schema | P12 — Table evidence_artifacts exists | PASS | 1 | 1 | - schema | Q01 — Index idx_personnel_org exists | PASS | 1 | 1 | - schema | Q02 — Index idx_programs_status exists | PASS | 1 | 1 | - schema | Q03 — Index idx_testcases_phase exists | PASS | 1 | 1 | - schema | Q04 — Index idx_results_verdict exists | PASS | 1 | 1 | - schema | Q05 — Index idx_defects_severity exists | PASS | 1 | 1 | - schema | Q06 — Index idx_vcrm_req exists | PASS | 1 | 1 | - schema | Q07 — GIN trigram index idx_personnel_email_trgm exists | PASS | 1 | 1 | - schema | R01 — Trigger fires: organisations.updated_at advances on UPDATE | PASS | TRUE | TRUE | - schema | R02 — Trigger fires: test_programs.updated_at advances on UPDATE | PASS | TRUE | TRUE | - schema | R03 — Trigger trg_updated_at registered on personnel | PASS | 1 | 1 | - schema | R04 — Trigger trg_updated_at registered on defect_reports | PASS | 1 | 1 | - temp_documents | G01 — Row count = 3 | PASS | 3 | 3 | - temp_documents | G02 — CYB9131 has an approved TEMP | PASS | 1 | 1 | - temp_documents | G03 — All TEMP authors exist in personnel | PASS | 0 | 0 | - temp_documents | G04 — No duplicate version per program (UNIQUE enforced) | PASS | 0 | 0 | - temp_documents | G05 — All TEMP status values are valid | PASS | 0 | 0 | - temp_documents | G06 — At least one TEMP in active draft/review state | PASS | TRUE | TRUE | - test_cases | L01 — Row count = 8 | PASS | 8 | 8 | - test_cases | L02 — All 8 test cases belong to CYB9131 OT&E phase | PASS | 8 | 8 | - test_cases | L03 — All seeded test cases are in approved status | PASS | 0 | 0 | - test_cases | L04 — TC-OTE-001 (MFA valid TOTP) exists | PASS | 1 | 1 | - test_cases | L05 — All test cases have a non-empty title | PASS | 0 | 0 | - test_cases | L06 — All tc_type values are valid | PASS | 0 | 0 | - test_cases | L07 — All test case authors exist in personnel (FK check) | PASS | 0 | 0 | - test_cases | L08 — No duplicate tc_identifier per phase (UNIQUE enforced) | PASS | 0 | 0 | - test_cases | L09 — All test cases have a defined objective | PASS | 0 | 0 | - test_events | M01 — Row count = 3 | PASS | 3 | 3 | - test_events | M02 — All event_codes are unique (UNIQUE enforced) | PASS | 0 | 0 | - test_events | M03 — CYB9131-OTE-EV01 status is completed | PASS | completed | completed | - test_events | M04 — CYB9131-OTE-EV02 status is in_progress | PASS | in_progress | in_progress | - test_events | M05 — CYB9131-OTE-EV03 status is planned | PASS | planned | planned | - test_events | M06 — All completed events have actual_start and actual_end | PASS | 0 | 0 | - test_events | M07 — Planned events have no actual_end date | PASS | 0 | 0 | - test_events | M08 — All test events reference a valid phase (FK check) | PASS | 0 | 0 | - test_phases | H01 — Row count = 3 | PASS | 3 | 3 | - test_phases | H02 — CYB9131 has DT&E and OT&E phases | PASS | 2 | 2 | - test_phases | H03 — All completed phases have an actual_start date | PASS | 0 | 0 | - test_phases | H04 — All phase_type values are valid | PASS | 0 | 0 | - test_phases | H05 — No duplicate phase_code per program (UNIQUE enforced) | PASS | 0 | 0 | - test_phases | H06 — Planned phases have no actual_start date | PASS | 0 | 0 | - test_results | N01 — Row count = 7 | PASS | 7 | 7 | - test_results | N02 — EV01 has 6 test results | PASS | 6 | 6 | - test_results | N03 — EV02 has 1 test result so far | PASS | 1 | 1 | - test_results | N04 — EV01 has 4 pass verdicts | PASS | 4 | 4 | - test_results | N05 — EV01 has 2 fail verdicts | PASS | 2 | 2 | - test_results | N06 — EV02 result verdict is inconclusive | PASS | 1 | 1 | - test_results | N07 — All verdict values are valid | PASS | 0 | 0 | - test_results | N08 — All test results reference a valid test case (FK check) | PASS | 0 | 0 | - test_results | N09 — All results have actual_result or notes recorded | PASS | 0 | 0 | - vcrm | K01 — VCRM row count = 8 | PASS | 8 | 8 | - vcrm | K02 — All CYB9131 requirements have VCRM coverage | PASS | 0 | 0 | - vcrm | K03 — SYS-SEC-001 (MFA) mapped to exactly 2 test cases | PASS | 2 | 2 | - vcrm | K04 — SYS-PERF-001 (Availability) mapped to exactly 1 test case | PASS | 1 | 1 | - vcrm | K05 — No duplicate req↔tc entries in VCRM (UNIQUE enforced) | PASS | 0 | 0 | - vcrm | K06 — All VCRM entries reference a valid requirement (FK check) | PASS | 0 | 0 | - vcrm | K07 — All VCRM entries reference a valid test case (FK check) | PASS | 0 | 0 | - vcrm | K08 — All coverage_type values are valid | PASS | 0 | 0 | - vcrm | K09 — LAND400-P3 requirements correctly have no VCRM entries yet | PASS | 0 | 0 | - vcrm | K10 — CYB9131 VCRM coverage is 100% | PASS | 100.0 | 100.0 | -(142 rows) - - -============================================================ - REPORT 4: Overall Result -============================================================ - total_tests | passed | failed | skipped | pass_rate | overall --------------+--------+--------+---------+-----------+-------------------- - 142 | 142 | 0 | 0 | 100.0% | ✓ ALL TESTS PASSED -(1 row) - - -============================================================ - Test run complete. -============================================================ - -[✓] Test run for DEV completed. - -──────────────────────────────────────────────────────────── - OVERALL TEST SUMMARY -──────────────────────────────────────────────────────────── - Environment Result - ----------- ------ - DEV 142 | 142 | 0 | 0 | 100.0% | ✓ ALL TESTS PASSED -──────────────────────────────────────────────────────────── -[✓] All test runs completed successfully. diff --git a/test-artifacts/04_evals_p_i_s.log b/test-artifacts/04_evals_p_i_s.log deleted file mode 100644 index b0258ab..0000000 --- a/test-artifacts/04_evals_p_i_s.log +++ /dev/null @@ -1,40 +0,0 @@ - -=== Tier P - 23 scenarios === -PASS tier_p/01_happy_path -PASS tier_p/02_empty_file -PASS tier_p/03_empty_header_only_newline -PASS tier_p/04_no_valid_rows -PASS tier_p/05_mixed_valid_skipped -PASS tier_p/06_duplicate_headers -PASS tier_p/07_column_mismatch_short -PASS tier_p/08_column_mismatch_long -PASS tier_p/09_empty_row -PASS tier_p/10_utf8_bom -PASS tier_p/11_utf8_emoji -PASS tier_p/12_crlf_line_endings -PASS tier_p/13_quoted_comma -PASS tier_p/14_quoted_newline -PASS tier_p/15_quoted_quote -PASS tier_p/16_whitespace_only_row -PASS tier_p/17_header_whitespace -PASS tier_p/18_utf8_cjk -PASS tier_p/19_missing_env_vars -PASS tier_p/20_missing_csv_file -PASS tier_p/21_utf8_arabic -PASS tier_p/22_very_long_field -PASS tier_p/23_invalid_utf8_bytes - -=== Tier I - 1 scenarios === -PASS tier_i/01_deploy_dev_twice - -=== Tier S - 1 scenarios === -PASS tier_s/01_fresh_deploy_then_all_tests_pass - -=== Summary === - total: 25 - passed: 25 - failed: 0 - skipped: 0 - - report: /home/claude/audit/evals/reports/20260721T080526Z-5372c3/summary.json - gap report: /home/claude/audit/evals/reports/20260721T080526Z-5372c3/VCRM_GAPS_20260721T080526Z-5372c3.md diff --git a/test-artifacts/05_test_report_full.log b/test-artifacts/05_test_report_full.log deleted file mode 100644 index d97a351..0000000 --- a/test-artifacts/05_test_report_full.log +++ /dev/null @@ -1,23 +0,0 @@ -...................................................... [100%] - -================================================================== - FINAL RESULT — every test accounted for -================================================================== - collected : 54 - executed : 54 - PASSED : 54 - FAILED : 0 - ERROR : 0 - SKIPPED : 0 - NOT RUN : 0 (deselected by the marker filter) - - SKIPPED (0) - none — no test was skipped - - NOT RUN (0) - none — every collected test was executed - -================================================================== - RESULT: PASS -================================================================== - diff --git a/test-artifacts/06_lint.log b/test-artifacts/06_lint.log deleted file mode 100644 index 5409f49..0000000 --- a/test-artifacts/06_lint.log +++ /dev/null @@ -1,10 +0,0 @@ - -=== flake8 (style + logic) === -✓ flake8 clean - -=== bandit (security) === -[tester] WARNING nosec encountered (B608), but no failed test on file ./evals/runner.py:309 -✓ bandit clean - -All lint checks passed. - diff --git a/test-artifacts/07_health_check.log b/test-artifacts/07_health_check.log deleted file mode 100644 index 253a1f6..0000000 --- a/test-artifacts/07_health_check.log +++ /dev/null @@ -1,94 +0,0 @@ - -PostgreDataMigrationApp — Health Dashboard -============================================================ - - PASS validator.py syntax - PASS runner.py syntax - PASS gap_report.py syntax - PASS build/deploy_all.sh - PASS build/setup.sh - PASS build/csv_loader.sh - PASS preflight.sh - PASS build/adapters/adapter_postgresql.sh - PASS build/adapters/adapter_sqlite.sh - PASS build/adapters/adapter_redis.sh - PASS build/adapters/adapter_mariadb.sh - PASS build/adapters/adapter_teradata.sh - PASS build/adapters/adapter_influxdb.sh - PASS build/csv/loader_sqlite.sh - PASS build/csv/loader_influxdb.sh - PASS build/csv/loader_postgresql.sh - PASS build/csv/loader_teradata.sh - PASS build/csv/loader_mariadb.sh - PASS build/csv/loader_redis.sh - PASS postgresql schema - PASS env template (env_dev.example.sql) - PASS env_dev.sql (local, gitignored) - PASS env_test.sql (local, gitignored) - PASS env_staging.sql (local, gitignored) - PASS env_prod.sql (local, gitignored) - PASS test suite: test_01_organisations_personnel.sql - PASS test suite: test_02_programs_phases.sql - PASS test suite: test_03_requirements_vcrm.sql - PASS test suite: test_04_execution_defects.sql - PASS test suite: test_05_schema_and_business_rules.sql - PASS test_framework.sql - PASS tier_i/01_deploy_dev_twice: expected file - PASS tier_p/01_happy_path: expected file - PASS tier_p/01_happy_path: input.csv - PASS tier_p/02_empty_file: expected file - PASS tier_p/02_empty_file: input.csv - PASS tier_p/03_empty_header_only_newline: expected file - PASS tier_p/03_empty_header_only_newline: input.csv - PASS tier_p/04_no_valid_rows: expected file - PASS tier_p/04_no_valid_rows: input.csv - PASS tier_p/05_mixed_valid_skipped: expected file - PASS tier_p/05_mixed_valid_skipped: input.csv - PASS tier_p/06_duplicate_headers: expected file - PASS tier_p/06_duplicate_headers: input.csv - PASS tier_p/07_column_mismatch_short: expected file - PASS tier_p/07_column_mismatch_short: input.csv - PASS tier_p/08_column_mismatch_long: expected file - PASS tier_p/08_column_mismatch_long: input.csv - PASS tier_p/09_empty_row: expected file - PASS tier_p/09_empty_row: input.csv - PASS tier_p/10_utf8_bom: expected file - PASS tier_p/10_utf8_bom: input.csv - PASS tier_p/11_utf8_emoji: expected file - PASS tier_p/11_utf8_emoji: input.csv - PASS tier_p/12_crlf_line_endings: expected file - PASS tier_p/12_crlf_line_endings: input.csv - PASS tier_p/13_quoted_comma: expected file - PASS tier_p/13_quoted_comma: input.csv - PASS tier_p/14_quoted_newline: expected file - PASS tier_p/14_quoted_newline: input.csv - PASS tier_p/15_quoted_quote: expected file - PASS tier_p/15_quoted_quote: input.csv - PASS tier_p/16_whitespace_only_row: expected file - PASS tier_p/16_whitespace_only_row: input.csv - PASS tier_p/17_header_whitespace: expected file - PASS tier_p/17_header_whitespace: input.csv - PASS tier_p/18_utf8_cjk: expected file - PASS tier_p/18_utf8_cjk: input.csv - PASS tier_p/19_missing_env_vars: expected file - PASS tier_p/19_missing_env_vars: input.csv (generated by runner_action=omit_env_vars) - PASS tier_p/20_missing_csv_file: expected file - PASS tier_p/20_missing_csv_file: input.csv (generated by runner_action=point_at_missing_file) - PASS tier_p/21_utf8_arabic: expected file - PASS tier_p/21_utf8_arabic: input.csv - PASS tier_p/22_very_long_field: expected file - PASS tier_p/22_very_long_field: input.csv (generated by runner_action=write_long_field_file) - PASS tier_p/23_invalid_utf8_bytes: expected file - PASS tier_p/23_invalid_utf8_bytes: input.csv (generated by runner_action=write_invalid_utf8_file) - PASS tier_s/01_fresh_deploy_then_all_tests_pass: expected file - PASS pytest.ini - PASS conftest.py - PASS requirements-dev - PASS Makefile - PASS run_qa.ps1 - PASS python test files (9 found) - PASS config.env.example: PG_PASSWORD is empty (safe default) - -============================================================ - 86 passed 0 warnings 0 failed - diff --git a/test-artifacts/08_test_report_dbfree_markers.log b/test-artifacts/08_test_report_dbfree_markers.log deleted file mode 100644 index d4fac72..0000000 --- a/test-artifacts/08_test_report_dbfree_markers.log +++ /dev/null @@ -1,39 +0,0 @@ -....................................... [100%] - -================================================================== - FINAL RESULT — every test accounted for -================================================================== - marker filter : -m "unit or regression or security or snapshot" - collected : 54 - executed : 39 - PASSED : 39 - FAILED : 0 - ERROR : 0 - SKIPPED : 0 - NOT RUN : 15 (deselected by the marker filter) - - SKIPPED (0) - none — no test was skipped - - NOT RUN (15) - - tests/test_csv_loader_arbitrary_shapes.py::CsvLoaderArbitraryShapes::test_shape_medium - - tests/test_csv_loader_arbitrary_shapes.py::CsvLoaderArbitraryShapes::test_shape_skinny - - tests/test_csv_loader_arbitrary_shapes.py::CsvLoaderArbitraryShapes::test_shape_tiny - - tests/test_e2e_pipeline.py::E2EPipelineValidateOnly::test_all_invalid_rows_exit_nonzero - - tests/test_e2e_pipeline.py::E2EPipelineValidateOnly::test_happy_path_two_valid_rows - - tests/test_e2e_pipeline.py::E2EPipelineValidateOnly::test_mixed_rows_splits_correctly - - tests/test_e2e_pipeline.py::E2EPipelineValidateOnly::test_output_directory_is_created_automatically - - tests/test_e2e_pipeline.py::E2EPipelineWithDatabase::test_tier_i_idempotency - - tests/test_e2e_pipeline.py::E2EPipelineWithDatabase::test_tier_p_scenarios_all_pass - - tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_dev_has_required_tables - - tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_prod_has_required_tables - - tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_staging_has_required_tables - - tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_test_has_required_tables - - tests/test_parity.py::TestDevSeedCounts::test_dev_seed_row_counts - - tests/test_parity.py::TestIdempotentDeployParity::test_dev_row_counts_stable_after_second_deploy - Deselected by the marker filter, not skipped. They must run in another job. - -================================================================== - RESULT: PASS -================================================================== - diff --git a/test-artifacts/09_negative_control_unprovisioned.log b/test-artifacts/09_negative_control_unprovisioned.log deleted file mode 100644 index 94f2014..0000000 --- a/test-artifacts/09_negative_control_unprovisioned.log +++ /dev/null @@ -1,225 +0,0 @@ -EEE.................F........EFFFFF................... [100%] -==================================== ERRORS ==================================== -_________ ERROR at setup of CsvLoaderArbitraryShapes.test_shape_medium _________ - -cls = - - @classmethod - def setUpClass(cls): - if not (_PG_AVAILABLE and _CONFIG_PRESENT): -> raise AssertionError( - f"{_SKIP_REASON}. Run 'bash scripts/provision_full_test_env.sh'.") -E AssertionError: build/config.local.env not present — run ./build/setup.sh. Run 'bash scripts/provision_full_test_env.sh'. - -tests/test_csv_loader_arbitrary_shapes.py:82: AssertionError -_________ ERROR at setup of CsvLoaderArbitraryShapes.test_shape_skinny _________ - -cls = - - @classmethod - def setUpClass(cls): - if not (_PG_AVAILABLE and _CONFIG_PRESENT): -> raise AssertionError( - f"{_SKIP_REASON}. Run 'bash scripts/provision_full_test_env.sh'.") -E AssertionError: build/config.local.env not present — run ./build/setup.sh. Run 'bash scripts/provision_full_test_env.sh'. - -tests/test_csv_loader_arbitrary_shapes.py:82: AssertionError -__________ ERROR at setup of CsvLoaderArbitraryShapes.test_shape_tiny __________ - -cls = - - @classmethod - def setUpClass(cls): - if not (_PG_AVAILABLE and _CONFIG_PRESENT): -> raise AssertionError( - f"{_SKIP_REASON}. Run 'bash scripts/provision_full_test_env.sh'.") -E AssertionError: build/config.local.env not present — run ./build/setup.sh. Run 'bash scripts/provision_full_test_env.sh'. - -tests/test_csv_loader_arbitrary_shapes.py:82: AssertionError -_________ ERROR at setup of TestDevSeedCounts.test_dev_seed_row_counts _________ - -cls = - -> setUpClass = classmethod(lambda cls: _require_deployed()) - ^^^^^^^^^^^^^^^^^^^ - -tests/test_parity.py:135: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - - def _require_deployed(): - _require_pg() - if not _DEV_DEPLOYED: -> raise AssertionError(f"Dev database not deployed. {_HELP}") -E AssertionError: Dev database not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a reachable PostgreSQL and PGUSER/PGHOST/PGPORT set). - -tests/test_parity.py:131: AssertionError -=================================== FAILURES =================================== -_______________ E2EPipelineWithDatabase.test_tier_i_idempotency ________________ - -self = - - def test_tier_i_idempotency(self): - """Tier I (idempotency) scenarios must pass against the running PostgreSQL.""" - r = subprocess.run( - [sys.executable, str(RUNNER), "--tiers", "i"], - capture_output=True, text=True, cwd=ROOT, - ) -> self.assertEqual(r.returncode, 0, - f"Tier I eval run failed:\n{r.stdout[-2000:]}\n{r.stderr[-500:]}") -E AssertionError: 1 != 0 : Tier I eval run failed: -E -E === Tier I - 1 scenarios === -E FAIL tier_i/01_deploy_dev_twice -E first_run_exit_code: expected 0, got 2; stderr: it/build/te_core_schema.sql:67: NOTICE: [DEV] Role "te_dev_user" already exists — password and conn_limit refreshed. -E psql:/home/claude/audit/build/te_core_schema.sql:69: ERROR: database "te_mgmt_dev" does not exist -E psql:/home/claude/audit/build/te_core_schema.sql:76: error: \connect: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: database "te_mgmt_dev" does not exist -E -E second_run_exit_code: expected 0, got 2; stderr: it/build/te_core_schema.sql:67: NOTICE: [DEV] Role "te_dev_user" already exists — password and conn_limit refreshed. -E psql:/home/claude/audit/build/te_core_schema.sql:69: ERROR: database "te_mgmt_dev" does not exist -E psql:/home/claude/audit/build/te_core_schema.sql:76: error: \connect: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: database "te_mgmt_dev" does not exist -E -E tables_present: expected >= 11, got 0 -E -E === Summary === -E total: 1 -E passed: 0 -E failed: 1 -E skipped: 0 -E -E report: /home/claude/audit/evals/reports/20260721T080448Z-f4b944/summary.json -E gap report: /home/claude/audit/evals/reports/20260721T080448Z-f4b944/VCRM_GAPS_20260721T080448Z-f4b944.md - -tests/test_e2e_pipeline.py:187: AssertionError -______ TestAllEnvironmentsHaveRequiredTables.test_dev_has_required_tables ______ - -self = - - def test_dev_has_required_tables(self): -> self._check_env("dev") - -tests/test_parity.py:178: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/test_parity.py:165: in _check_env - self.fail(f"Database {db!r} not deployed. {_HELP}") -E AssertionError: Database 'te_mgmt_dev' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a reachable PostgreSQL and PGUSER/PGHOST/PGPORT set). -_____ TestAllEnvironmentsHaveRequiredTables.test_prod_has_required_tables ______ - -self = - - def test_prod_has_required_tables(self): -> self._check_env("prod") - -tests/test_parity.py:187: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/test_parity.py:165: in _check_env - self.fail(f"Database {db!r} not deployed. {_HELP}") -E AssertionError: Database 'te_mgmt_prod' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a reachable PostgreSQL and PGUSER/PGHOST/PGPORT set). -____ TestAllEnvironmentsHaveRequiredTables.test_staging_has_required_tables ____ - -self = - - def test_staging_has_required_tables(self): -> self._check_env("staging") - -tests/test_parity.py:184: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/test_parity.py:165: in _check_env - self.fail(f"Database {db!r} not deployed. {_HELP}") -E AssertionError: Database 'te_mgmt_staging' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a reachable PostgreSQL and PGUSER/PGHOST/PGPORT set). -_____ TestAllEnvironmentsHaveRequiredTables.test_test_has_required_tables ______ - -self = - - def test_test_has_required_tables(self): -> self._check_env("test") - -tests/test_parity.py:181: -_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -tests/test_parity.py:165: in _check_env - self.fail(f"Database {db!r} not deployed. {_HELP}") -E AssertionError: Database 'te_mgmt_test' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a reachable PostgreSQL and PGUSER/PGHOST/PGPORT set). -__ TestIdempotentDeployParity.test_dev_row_counts_stable_after_second_deploy ___ - -self = - - def test_dev_row_counts_stable_after_second_deploy(self): - env_sql = ROOT / "build" / "environments" / "env_dev.sql" - if not env_sql.exists(): - self.fail(f"env_dev.sql not found at {env_sql}. {_HELP}") - - db, schema = _ENV_CONFIG["dev"] - - def _snapshot() -> dict[str, int | None]: - return {t: _count_rows(db, schema, t) for t in _REQUIRED_TABLES} - - counts_before = _snapshot() - - r = subprocess.run( - ["psql", "-f", str(env_sql)], - env=_pg_env(), capture_output=True, text=True, timeout=180, - ) - if r.returncode != 0: -> self.fail(f"Second deploy failed:\n{r.stderr[-500:]}") -E AssertionError: Second deploy failed: -E psql:/home/claude/audit/build/te_core_schema.sql:67: NOTICE: [DEV] Role "te_dev_user" already exists — password and conn_limit refreshed. -E psql:/home/claude/audit/build/te_core_schema.sql:69: ERROR: database "te_mgmt_dev" does not exist -E psql:/home/claude/audit/build/te_core_schema.sql:76: error: \connect: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: database "te_mgmt_dev" does not exist - -tests/test_parity.py:215: AssertionError -=========================== short test summary info ============================ -ERROR tests/test_csv_loader_arbitrary_shapes.py::CsvLoaderArbitraryShapes::test_shape_medium -ERROR tests/test_csv_loader_arbitrary_shapes.py::CsvLoaderArbitraryShapes::test_shape_skinny -ERROR tests/test_csv_loader_arbitrary_shapes.py::CsvLoaderArbitraryShapes::test_shape_tiny -ERROR tests/test_parity.py::TestDevSeedCounts::test_dev_seed_row_counts - Ass... -FAILED tests/test_e2e_pipeline.py::E2EPipelineWithDatabase::test_tier_i_idempotency -FAILED tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_dev_has_required_tables -FAILED tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_prod_has_required_tables -FAILED tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_staging_has_required_tables -FAILED tests/test_parity.py::TestAllEnvironmentsHaveRequiredTables::test_test_has_required_tables -FAILED tests/test_parity.py::TestIdempotentDeployParity::test_dev_row_counts_stable_after_second_deploy - -================================================================== - FINAL RESULT — every test accounted for -================================================================== - collected : 54 - executed : 54 - PASSED : 44 - FAILED : 6 - ERROR : 4 - SKIPPED : 0 - NOT RUN : 0 (deselected by the marker filter) - - FAILED - - tests.test_e2e_pipeline.E2EPipelineWithDatabase::test_tier_i_idempotency - AssertionError: 1 != 0 : Tier I eval run failed: - - tests.test_parity.TestAllEnvironmentsHaveRequiredTables::test_dev_has_required_tables - AssertionError: Database 'te_mgmt_dev' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a re - - tests.test_parity.TestAllEnvironmentsHaveRequiredTables::test_prod_has_required_tables - AssertionError: Database 'te_mgmt_prod' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a r - - tests.test_parity.TestAllEnvironmentsHaveRequiredTables::test_staging_has_required_tables - AssertionError: Database 'te_mgmt_staging' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs - - tests.test_parity.TestAllEnvironmentsHaveRequiredTables::test_test_has_required_tables - AssertionError: Database 'te_mgmt_test' not deployed. Run 'bash scripts/provision_full_test_env.sh' (needs a r - - tests.test_parity.TestIdempotentDeployParity::test_dev_row_counts_stable_after_second_deploy - AssertionError: Second deploy failed: - - ERROR - - tests.test_csv_loader_arbitrary_shapes.CsvLoaderArbitraryShapes::test_shape_medium - failed on setup with "AssertionError: build/config.local.env not present — run ./build/setup.sh. Run 'bash scr - - tests.test_csv_loader_arbitrary_shapes.CsvLoaderArbitraryShapes::test_shape_skinny - failed on setup with "AssertionError: build/config.local.env not present — run ./build/setup.sh. Run 'bash scr - - tests.test_csv_loader_arbitrary_shapes.CsvLoaderArbitraryShapes::test_shape_tiny - failed on setup with "AssertionError: build/config.local.env not present — run ./build/setup.sh. Run 'bash scr - - tests.test_parity.TestDevSeedCounts::test_dev_seed_row_counts - failed on setup with "AssertionError: Dev database not deployed. Run 'bash scripts/provision_full_test_env.sh' - - SKIPPED (0) - none — no test was skipped - - NOT RUN (0) - none — every collected test was executed - -================================================================== - RESULT: FAIL -================================================================== - diff --git a/test-artifacts/10_evals_summary.json b/test-artifacts/10_evals_summary.json deleted file mode 100644 index adbf289..0000000 --- a/test-artifacts/10_evals_summary.json +++ /dev/null @@ -1,1422 +0,0 @@ -{ - "run_id": "20260721T080526Z-5372c3", - "started_at": "2026-07-21T08:05:28.379784+00:00", - "tiers": [ - "p", - "i", - "s" - ], - "totals": { - "total": 25, - "passed": 25, - "failed": 0, - "skipped": 0 - }, - "scenarios": [ - { - "tier": "p", - "name": "01_happy_path", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 3 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 3\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ], - [ - "3", - "Carol" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "01_happy_path", - "description": "Three valid rows, no headers issues.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 3" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ], - [ - "3", - "Carol" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "02_empty_file", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 1, - "stdout": "", - "stderr": "\u001b[0;31m [validator ERR]\u001b[0m CSV file is empty — no header row found.\n", - "valid_csv_rows": [], - "skip_csv_rows": [], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "02_empty_file", - "description": "0-byte CSV.", - "runner_action": "default", - "expected": { - "exit_code": 1, - "stdout_contains": [], - "stderr_contains": [ - "CSV file is empty" - ], - "valid_csv_rows": null, - "skip_csv_row_count": null, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "03_empty_header_only_newline", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 1, - "stdout": "", - "stderr": "\u001b[0;31m [validator ERR]\u001b[0m Header row is empty.\n", - "valid_csv_rows": [], - "skip_csv_rows": [], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "03_empty_header_only_newline", - "description": "File contains only a newline — header row exists but has zero columns.", - "runner_action": "default", - "expected": { - "exit_code": 1, - "stdout_contains": [], - "stderr_contains": [ - "Header row is empty" - ], - "valid_csv_rows": null, - "skip_csv_row_count": null, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "04_no_valid_rows", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 1, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 0\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 2 — written to: /tmp/eval_04_no_valid_rows_2h785vht/skip.csv\n", - "stderr": "\u001b[0;31m [validator ERR]\u001b[0m No valid rows found. Nothing to load.\n", - "valid_csv_rows": [ - [ - "id", - "name" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ], - [ - "empty row — all values blank" - ], - [ - "", - "", - "empty row — all values blank" - ] - ], - "skip_csv_row_count": 2 - }, - "expected": { - "scenario": "04_no_valid_rows", - "description": "Header present, but every data row is empty/blank.", - "runner_action": "default", - "expected": { - "exit_code": 1, - "stdout_contains": [], - "stderr_contains": [ - "No valid rows found" - ], - "valid_csv_rows": [ - [ - "id", - "name" - ] - ], - "skip_csv_row_count": 2, - "skip_reasons_contain": [ - "empty row" - ] - } - } - }, - { - "tier": "p", - "name": "05_mixed_valid_skipped", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 4 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 2 — written to: /tmp/eval_05_mixed_valid_skipped_mc1hth__/skip.csv\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "3", - "Bob" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ], - [ - "empty row — all values blank" - ], - [ - "oops", - "too", - "many", - "fields", - "column mismatch — expected 2, got 4" - ] - ], - "skip_csv_row_count": 2 - }, - "expected": { - "scenario": "05_mixed_valid_skipped", - "description": "Two valid rows, one empty, one with too many fields.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2", - "Skipped rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "3", - "Bob" - ] - ], - "skip_csv_row_count": 2, - "skip_reasons_contain": [ - "empty row", - "column mismatch" - ] - } - } - }, - { - "tier": "p", - "name": "06_duplicate_headers", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 3 columns — id | id | name\n\u001b[1;33m [validator WARN]\u001b[0m Duplicate column names: id\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 1 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 1\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "id", - "name" - ], - [ - "1", - "2", - "Alice" - ] - ], - "skip_csv_rows": [ - [ - "id", - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "06_duplicate_headers", - "description": "Duplicate column name in header — validator warns but still processes row.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Duplicate column names", - "id" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "id", - "name" - ], - [ - "1", - "2", - "Alice" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "07_column_mismatch_short", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 3 columns — id | first | last\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 3 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 1 — written to: /tmp/eval_07_column_mismatch_short_cdk64d5u/skip.csv\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "first", - "last" - ], - [ - "1", - "Alice", - "Anderson" - ], - [ - "3", - "Carol", - "Smith" - ] - ], - "skip_csv_rows": [ - [ - "id", - "first", - "last", - "_skip_reason" - ], - [ - "2", - "Bob", - "column mismatch — expected 3, got 2" - ] - ], - "skip_csv_row_count": 1 - }, - "expected": { - "scenario": "07_column_mismatch_short", - "description": "Header has 3 columns; one data row has only 2.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2", - "Skipped rows : 1" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "first", - "last" - ], - [ - "1", - "Alice", - "Anderson" - ], - [ - "3", - "Carol", - "Smith" - ] - ], - "skip_csv_row_count": 1, - "skip_reasons_contain": [ - "column mismatch — expected 3, got 2" - ] - } - } - }, - { - "tier": "p", - "name": "08_column_mismatch_long", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 3 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 1 — written to: /tmp/eval_08_column_mismatch_long_m5gh8fm2/skip.csv\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "3", - "Carol" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ], - [ - "2", - "Bob", - "extra", - "extra", - "extra", - "column mismatch — expected 2, got 5" - ] - ], - "skip_csv_row_count": 1 - }, - "expected": { - "scenario": "08_column_mismatch_long", - "description": "Header has 2 columns; one data row has 5.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2", - "Skipped rows : 1" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "3", - "Carol" - ] - ], - "skip_csv_row_count": 1, - "skip_reasons_contain": [ - "column mismatch — expected 2, got 5" - ] - } - } - }, - { - "tier": "p", - "name": "09_empty_row", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 3 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 1 — written to: /tmp/eval_09_empty_row_7exit5kj/skip.csv\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ], - [ - "", - "", - "empty row — all values blank" - ] - ], - "skip_csv_row_count": 1 - }, - "expected": { - "scenario": "09_empty_row", - "description": "A row with only commas (every cell empty) should be skipped.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2", - "Skipped rows : 1" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_row_count": 1, - "skip_reasons_contain": [ - "empty row" - ] - } - } - }, - { - "tier": "p", - "name": "10_utf8_bom", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "10_utf8_bom", - "description": "File starts with the UTF-8 BOM — utf-8-sig should consume it so headers parse cleanly.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "11_utf8_emoji", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice 👋" - ], - [ - "2", - "Bob 🚀" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "11_utf8_emoji", - "description": "Emoji in text values — must survive round-trip through the validator.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice 👋" - ], - [ - "2", - "Bob 🚀" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "12_crlf_line_endings", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "12_crlf_line_endings", - "description": "CRLF (Windows) line endings — csv module handles them natively.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "13_quoted_comma", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | note\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "note" - ], - [ - "1", - "Smith, John" - ], - [ - "2", - "Doe, Jane" - ] - ], - "skip_csv_rows": [ - [ - "id", - "note", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "13_quoted_comma", - "description": "Quoted field containing a comma must be preserved as a single field.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "note" - ], - [ - "1", - "Smith, John" - ], - [ - "2", - "Doe, Jane" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "14_quoted_newline", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | note\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "note" - ], - [ - "1", - "line1\nline2" - ], - [ - "2", - "single line" - ] - ], - "skip_csv_rows": [ - [ - "id", - "note", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "14_quoted_newline", - "description": "Quoted field containing an embedded newline must be parsed as one row.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "note" - ], - [ - "1", - "line1\nline2" - ], - [ - "2", - "single line" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "15_quoted_quote", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | note\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "note" - ], - [ - "1", - "she said \"hi\"" - ], - [ - "2", - "plain" - ] - ], - "skip_csv_rows": [ - [ - "id", - "note", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "15_quoted_quote", - "description": "Quoted field with escaped double-quote becomes a literal quote in the value.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "note" - ], - [ - "1", - "she said \"hi\"" - ], - [ - "2", - "plain" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "16_whitespace_only_row", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 3 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 1 — written to: /tmp/eval_16_whitespace_only_row_h21f61qs/skip.csv\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ], - [ - " ", - "", - "empty row — all values blank" - ] - ], - "skip_csv_row_count": 1 - }, - "expected": { - "scenario": "16_whitespace_only_row", - "description": "A row with only whitespace in every cell should be treated as empty (cell.strip()).", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2", - "Skipped rows : 1" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_row_count": 1, - "skip_reasons_contain": [ - "empty row" - ] - } - } - }, - { - "tier": "p", - "name": "17_header_whitespace", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "17_header_whitespace", - "description": "Leading/trailing whitespace in header cells should be stripped.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ], - [ - "2", - "Bob" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "18_utf8_cjk", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "田中花子" - ], - [ - "2", - "佐藤一郎" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "18_utf8_cjk", - "description": "CJK characters must survive the round-trip.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "田中花子" - ], - [ - "2", - "佐藤一郎" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "19_missing_env_vars", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 1, - "stdout": "", - "stderr": "\u001b[0;31m [validator ERR]\u001b[0m Missing required environment variables: CSV_FILE, VALID_CSV, SKIP_FILE\n", - "valid_csv_rows": null, - "skip_csv_rows": null, - "skip_csv_row_count": null - }, - "expected": { - "scenario": "19_missing_env_vars", - "description": "Runner intentionally omits CSV_FILE, VALID_CSV, SKIP_FILE — validator should reject.", - "runner_action": "omit_env_vars", - "expected": { - "exit_code": 1, - "stdout_contains": [], - "stderr_contains": [ - "Missing required environment variables" - ], - "valid_csv_rows": null, - "skip_csv_row_count": null, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "20_missing_csv_file", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 1, - "stdout": "", - "stderr": "\u001b[0;31m [validator ERR]\u001b[0m CSV file not found: /tmp/eval_20_missing_csv_file_qwta_esp/does_not_exist.csv\n", - "valid_csv_rows": null, - "skip_csv_rows": null, - "skip_csv_row_count": null - }, - "expected": { - "scenario": "20_missing_csv_file", - "description": "Runner sets CSV_FILE to a path that does not exist.", - "runner_action": "point_at_missing_file", - "expected": { - "exit_code": 1, - "stdout_contains": [], - "stderr_contains": [ - "CSV file not found" - ], - "valid_csv_rows": null, - "skip_csv_row_count": null, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "21_utf8_arabic", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 2\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "محمد" - ], - [ - "2", - "فاطمة" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "21_utf8_arabic", - "description": "Arabic / RTL Unicode text must survive the round-trip.", - "runner_action": "default", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 2" - ], - "stderr_contains": [], - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "محمد" - ], - [ - "2", - "فاطمة" - ] - ], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "22_very_long_field", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | payload\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 1 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 1\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "payload" - ], - [ - "1", - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" - ] - ], - "skip_csv_rows": [ - [ - "id", - "payload", - "_skip_reason" - ] - ], - "skip_csv_row_count": 0 - }, - "expected": { - "scenario": "22_very_long_field", - "description": "A 50KB single-field value should be accepted as one valid row.", - "runner_action": "write_long_field_file", - "field_size_bytes": 50000, - "table_name": "payloads", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 1" - ], - "stderr_contains": [], - "skip_csv_row_count": 0, - "skip_reasons_contain": [] - } - } - }, - { - "tier": "p", - "name": "23_invalid_utf8_bytes", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "exit_code": 0, - "stdout": "\u001b[0;32m [validator OK]\u001b[0m Delimiter: comma\n\u001b[0;32m [validator OK]\u001b[0m Header: 2 columns — id | name\n\u001b[0;32m [validator OK]\u001b[0m Validation complete — 2 rows processed.\n\u001b[0;32m [validator OK]\u001b[0m Valid rows : 1\n\u001b[1;33m [validator WARN]\u001b[0m Skipped rows : 1 — written to: /tmp/eval_23_invalid_utf8_bytes_810kv0l9/skip.csv\n", - "stderr": "", - "valid_csv_rows": [ - [ - "id", - "name" - ], - [ - "1", - "Alice" - ] - ], - "skip_csv_rows": [ - [ - "id", - "name", - "_skip_reason" - ], - [ - "2", - "?", - "invalid UTF-8 bytes at line 3" - ] - ], - "skip_csv_row_count": 1 - }, - "expected": { - "scenario": "23_invalid_utf8_bytes", - "description": "Invalid UTF-8 bytes in a data row are skipped with a reason; valid rows still pass. Only an undecodable header aborts the file.", - "runner_action": "write_invalid_utf8_file", - "expected": { - "exit_code": 0, - "stdout_contains": [ - "Valid rows : 1", - "Skipped rows : 1" - ], - "stderr_contains": [], - "skip_csv_row_count": 1, - "skip_reasons_contain": [ - "invalid UTF-8 bytes" - ] - } - } - }, - { - "tier": "i", - "name": "01_deploy_dev_twice", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "first_run_exit_code": 0, - "second_run_exit_code": 0, - "row_counts_first": { - "organisations": 5, - "personnel": 6, - "test_programs": 2, - "temp_documents": 3, - "test_phases": 3, - "requirements": 8, - "test_cases": 8, - "vcrm_entries": 8, - "test_events": 3, - "test_results": 7, - "defect_reports": 3 - }, - "row_counts_second": { - "organisations": 5, - "personnel": 6, - "test_programs": 2, - "temp_documents": 3, - "test_phases": 3, - "requirements": 8, - "test_cases": 8, - "vcrm_entries": 8, - "test_events": 3, - "test_results": 7, - "defect_reports": 3 - }, - "row_counts_unchanged": true, - "tables_present": 11 - }, - "expected": { - "scenario": "01_deploy_dev_twice", - "description": "Deploy env_dev.sql twice; row counts must not change between runs.", - "expected": { - "first_run_exit_code": 0, - "second_run_exit_code": 0, - "row_counts_unchanged": true, - "min_seeded_tables_present": 11 - } - } - }, - { - "tier": "s", - "name": "01_fresh_deploy_then_all_tests_pass", - "passed": true, - "skipped": false, - "errors": [], - "actual": { - "deploy_exit_code": 0, - "tests_exit_code": 0, - "stdout_tail": " | \n vcrm | K05 — No duplicate req↔tc entries in VCRM (UNIQUE enforced) | PASS | 0 | 0 | \n vcrm | K06 — All VCRM entries reference a valid requirement (FK check) | PASS | 0 | 0 | \n vcrm | K07 — All VCRM entries reference a valid test case (FK check) | PASS | 0 | 0 | \n vcrm | K08 — All coverage_type values are valid | PASS | 0 | 0 | \n vcrm | K09 — LAND400-P3 requirements correctly have no VCRM entries yet | PASS | 0 | 0 | \n vcrm | K10 — CYB9131 VCRM coverage is 100% | PASS | 100.0 | 100.0 | \n(142 rows)\n\n\n============================================================\n REPORT 4: Overall Result\n============================================================\n total_tests | passed | failed | skipped | pass_rate | overall \n-------------+--------+--------+---------+-----------+--------------------\n 142 | 142 | 0 | 0 | 100.0% | ✓ ALL TESTS PASSED\n(1 row)\n\n\n============================================================\n Test run complete.\n============================================================\n\n", - "stderr_tail": "", - "total_assertions": 142, - "pass_rate": 100.0 - }, - "expected": { - "scenario": "01_fresh_deploy_then_all_tests_pass", - "description": "Fresh Dev deploy followed by run_all_tests.sql must report 142/142 pass.", - "expected": { - "deploy_exit_code": 0, - "tests_exit_code": 0, - "stdout_contains": [ - "ALL TESTS PASSED" - ], - "min_total_assertions": 142, - "min_pass_rate_percent": 100.0 - } - } - } - ] -} \ No newline at end of file diff --git a/test-artifacts/11_vcrm_gap_report.md b/test-artifacts/11_vcrm_gap_report.md deleted file mode 100644 index 665fd2f..0000000 --- a/test-artifacts/11_vcrm_gap_report.md +++ /dev/null @@ -1,60 +0,0 @@ -# VCRM Gap Report - run 20260721T080526Z-5372c3 - -Generated: 2026-07-21T08:05:28.383412+00:00 -Run started: 2026-07-21T08:05:28.379784+00:00 -Tier eval totals: {"total": 25, "passed": 25, "failed": 0, "skipped": 0} - -Auto-generated by `evals/gap_report.py` at the end of `evals/runner.py`. -Reflects this run's outcomes only. For the static catalogue see `VCRM.md` and `VCRM_GAPS.md`. - ---- - -## Summary - -| Status | Count | Meaning | -|--------|------:|---------| -| VERIFIED | 17 | Baseline=full and >=1 covering eval passed | -| PARTIAL | 1 | Baseline=partial; some aspects verified | -| REGRESSION | 0 | A covering eval FAILED this run - investigate | -| SKIPPED | 0 | All covering evals skipped (e.g. PG unavailable) | -| UNVERIFIED | 2 | No covering eval - this is a real gap | -| OUT-OF-BAND | 0 | Verified by PU/SQL suites, not by evals | -| DEFERRED | 2 | Out-of-scope by project decision | - -## Unverified - no eval coverage - -- **BR-02** Six DB engines supported via adapters - - No non-PG engine has any test coverage (Tier X gap) -- **BR-15** Per-environment connection limits enforced - - No test asserts pg_roles.rolconnlimit. 1-hour fix available. - -## Per-requirement status (all 22 BRs) - -| ID | Status | Title | Evidence (this run) | -|----|--------|-------|---------------------| -| BR-01 | PARTIAL | Multi-environment deployment (Dev/Test/Staging/Prod isolated) | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-02 | GAP | Six DB engines supported via adapters | No eval covers this BR | -| BR-03 | OK | Schema is fully parameterised via \set | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-04 | OK | 12-table T&E data model present | tier_i/01_deploy_dev_twice: PASS; tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-05 | OK | 100% VCRM coverage for CYB9131 + gap detection for LAND400 | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-06 | OK | TEMP versioning (draft -> approved -> superseded) | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-07 | OK | Test result verdict enum + linkage | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-08 | OK | DR severity + resolved_at lifecycle | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-09 | OK | Idempotent deployment | tier_i/01_deploy_dev_twice: PASS; tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-10 | OK | CSV pre-ingestion validation rejects malformed input | tier_p/02_empty_file: PASS; tier_p/03_empty_header_only_newline: PASS; tier_p/04_no_valid_rows: PASS; tier_p/07_column_mismatch_short: PASS; tier_p/08_column_mismatch_long: PASS; tier_p/19_missing_env_vars: PASS; tier_p/20_missing_csv_file: PASS; tier_p/23_invalid_utf8_bytes: PASS | -| BR-11 | OK | Valid / skip row separation with reasons | tier_p/05_mixed_valid_skipped: PASS; tier_p/09_empty_row: PASS; tier_p/16_whitespace_only_row: PASS | -| BR-12 | OK | Clearance enum {baseline,NV1,NV2,PV} | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-13 | OK | ISM classification marking enum | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-14 | OK | Phase type enum (DT&E/AT&E/OT&E/...) | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-15 | GAP | Per-environment connection limits enforced | No eval covers this BR | -| BR-16 | OK | Automated single-command regression | tier_p/(any scenario): PASS; tier_i/(any scenario): PASS; tier_s/(any scenario): PASS | -| BR-17 | OK | Graceful degradation when PG unavailable | tier_i/01_deploy_dev_twice: PASS; tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-18 | OK | Machine-readable JSON report per run | Implicit (Inspection) | -| BR-19 | OK | Build/tests/evals physically segregated | Implicit (Inspection) | -| BR-20 | OK | 142/142 SQL assertions pass | tier_s/01_fresh_deploy_then_all_tests_pass: PASS | -| BR-21 | DEFERRED | Cross-engine schema equivalence | - | -| BR-22 | DEFERRED | Performance at >= 1M rows | - | - ---- - -Companion: `VCRM.md` (catalogue), `VCRM_GAPS.md` (static gap analysis), `TEST_CONDITIONS.md` (every test). From 77e96f1a0c7f297a6355eb08e86fddd358c86303 Mon Sep 17 00:00:00 2001 From: amar-python Date: Mon, 10 Aug 2026 11:18:03 +1000 Subject: [PATCH 2/5] Fix: format csv-preview & use-local-storage to satisfy frontend lint; add agent run tasks Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- frontend/src/hooks/use-local-storage.ts | 4 +- frontend/src/lib/csv-preview.ts | 49 ++++++++++++++++++++----- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/frontend/src/hooks/use-local-storage.ts b/frontend/src/hooks/use-local-storage.ts index 409c850..1179540 100644 --- a/frontend/src/hooks/use-local-storage.ts +++ b/frontend/src/hooks/use-local-storage.ts @@ -2,7 +2,9 @@ import { useCallback, useEffect, useRef, useState } from "react"; const KEY = "csv-migrator:jobs:v1"; -export function useLocalStorageState(defaultValue: T): [T, (updater: T | ((prev: T) => T)) => void, () => void] { +export function useLocalStorageState( + defaultValue: T +): [T, (updater: T | ((prev: T) => T)) => void, () => void] { const [state, setState] = useState(defaultValue); const hydrated = useRef(false); diff --git a/frontend/src/lib/csv-preview.ts b/frontend/src/lib/csv-preview.ts index 1c2b4e4..ba54157 100644 --- a/frontend/src/lib/csv-preview.ts +++ b/frontend/src/lib/csv-preview.ts @@ -23,18 +23,49 @@ function parseCsv(text: string): string[][] { const ch = src[i]; if (inQuotes) { if (ch === '"') { - if (src[i + 1] === '"') { field += '"'; i += 2; continue; } - inQuotes = false; i++; continue; + if (src[i + 1] === '"') { + field += '"'; + i += 2; + continue; + } + inQuotes = false; + i++; + continue; } - field += ch; i++; continue; + field += ch; + i++; + continue; } - if (ch === '"') { inQuotes = true; i++; continue; } - if (ch === ",") { row.push(field); field = ""; i++; continue; } - if (ch === "\r") { i++; continue; } - if (ch === "\n") { row.push(field); rows.push(row); row = []; field = ""; i++; continue; } - field += ch; i++; + if (ch === '"') { + inQuotes = true; + i++; + continue; + } + if (ch === ",") { + row.push(field); + field = ""; + i++; + continue; + } + if (ch === "\r") { + i++; + continue; + } + if (ch === "\n") { + row.push(field); + rows.push(row); + row = []; + field = ""; + i++; + continue; + } + field += ch; + i++; + } + if (field.length > 0 || row.length > 0) { + row.push(field); + rows.push(row); } - if (field.length > 0 || row.length > 0) { row.push(field); rows.push(row); } while (rows.length && rows[rows.length - 1].every((c) => c === "")) rows.pop(); return rows; } From 1fac25f181e002e54f4aa4e6d4ec455d65463254 Mon Sep 17 00:00:00 2001 From: amar-python Date: Mon, 10 Aug 2026 11:36:29 +1000 Subject: [PATCH 3/5] ci: rerun checks after fixes From a148817ec22ad373ebfd90f7dc616149ec9ccdd8 Mon Sep 17 00:00:00 2001 From: amar-python Date: Mon, 10 Aug 2026 12:53:00 +1000 Subject: [PATCH 4/5] ci: upgrade Node.js from 20 to 24 in workflows Removes GitHub Actions deprecation warning for Node 20. Updates actions/setup-node@v4 to target Node 24. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/quality-gate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality-gate.yml b/.github/workflows/quality-gate.yml index 35a048e..e0f32a8 100644 --- a/.github/workflows/quality-gate.yml +++ b/.github/workflows/quality-gate.yml @@ -24,7 +24,7 @@ jobs: - name: Setup Node uses: actions/setup-node@v4 with: - node-version: '20' + node-version: '24' cache: 'npm' cache-dependency-path: frontend/package-lock.json From a32b423b12de02a2f2a6e20ec67d2524db43e641 Mon Sep 17 00:00:00 2001 From: amar-python Date: Mon, 10 Aug 2026 12:57:19 +1000 Subject: [PATCH 5/5] fix: frontend formatting to satisfy Prettier/ESLint rules Expand object literals and function signatures to multi-line format as required by the project's Prettier configuration. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- frontend/src/hooks/use-local-storage.ts | 2 +- frontend/src/lib/csv-preview.ts | 37 ++++++++++++++++---- frontend/src/routes/_authenticated/index.tsx | 9 ++++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/frontend/src/hooks/use-local-storage.ts b/frontend/src/hooks/use-local-storage.ts index 1179540..df0ef54 100644 --- a/frontend/src/hooks/use-local-storage.ts +++ b/frontend/src/hooks/use-local-storage.ts @@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; const KEY = "csv-migrator:jobs:v1"; export function useLocalStorageState( - defaultValue: T + defaultValue: T, ): [T, (updater: T | ((prev: T) => T)) => void, () => void] { const [state, setState] = useState(defaultValue); const hydrated = useRef(false); diff --git a/frontend/src/lib/csv-preview.ts b/frontend/src/lib/csv-preview.ts index ba54157..6ecd0ac 100644 --- a/frontend/src/lib/csv-preview.ts +++ b/frontend/src/lib/csv-preview.ts @@ -122,7 +122,10 @@ function pickType(candidates: Set): ColumnType { return "text"; } -export async function parseCsvPreview(file: File, opts?: { sampleRows?: number; maxBytes?: number }): Promise { +export async function parseCsvPreview( + file: File, + opts?: { sampleRows?: number; maxBytes?: number }, +): Promise { const maxBytes = opts?.maxBytes ?? 512 * 1024; // 512KB for preview const sampleCount = opts?.sampleRows ?? 10; const inferRowLimit = 200; @@ -136,8 +139,14 @@ export async function parseCsvPreview(file: File, opts?: { sampleRows?: number; if (rows.length === 0) { return { - headers: [], sanitizedHeaders: [], sampleRows: [], inferredTypes: [], - totalRowsApprox: 0, bytesRead: slice.size, bytesTotal: file.size, truncated, + headers: [], + sanitizedHeaders: [], + sampleRows: [], + inferredTypes: [], + totalRowsApprox: 0, + bytesRead: slice.size, + bytesTotal: file.size, + truncated, }; } @@ -147,7 +156,17 @@ export async function parseCsvPreview(file: File, opts?: { sampleRows?: number; const sample = dataRows.slice(0, sampleCount); // Infer types - const perCol: Set[] = headers.map(() => new Set(["int8", "numeric", "date", "timestamptz", "boolean", "text"])); + const perCol: Set[] = headers.map( + () => + new Set([ + "int8", + "numeric", + "date", + "timestamptz", + "boolean", + "text", + ]), + ); for (let r = 0; r < Math.min(dataRows.length, inferRowLimit); r++) { const row = dataRows[r]; for (let c = 0; c < headers.length; c++) { @@ -169,8 +188,14 @@ export async function parseCsvPreview(file: File, opts?: { sampleRows?: number; } return { - headers, sanitizedHeaders: sanitized, sampleRows: sample, inferredTypes, - totalRowsApprox, bytesRead: slice.size, bytesTotal: file.size, truncated, + headers, + sanitizedHeaders: sanitized, + sampleRows: sample, + inferredTypes, + totalRowsApprox, + bytesRead: slice.size, + bytesTotal: file.size, + truncated, }; } diff --git a/frontend/src/routes/_authenticated/index.tsx b/frontend/src/routes/_authenticated/index.tsx index eb23f7d..f99bbe5 100644 --- a/frontend/src/routes/_authenticated/index.tsx +++ b/frontend/src/routes/_authenticated/index.tsx @@ -30,7 +30,14 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { toast, Toaster } from "sonner"; import {