# Verification record

**Date:** 14 October 2026, UTC. **Package version:** 2026-10-14.3. **Scope:** original course content, supplied reference code, fixed synthetic fixtures and selected runs in the public lab. No production website files were edited or deployed.

## Local execution

Environment actually used: Linux, Python 3.12.14, NumPy 2.3.5, pandas 2.2.3, Matplotlib 3.10.8. Matplotlib used its non-interactive Agg backend for automated checks. The exact package versions are declared in `requirements.txt`. This is an observed environment, not a new clean-install test on every operating system.

- 79 unittest test methods passed, including normal and boundary inputs, empty collections, invalid numeric values, CSV quoting, array axes/copies, table policies, chart data/labels, exact duplicates, conflicting IDs, impossible and malformed dates, missing/unexpected columns, multiple rejection reasons, changed valid data, non-finite/oversized values and row limits. Revision 2 adds extra-leading/trailing-field and short/blank-record errors, malformed quoting, lexical integer validation, supported date boundaries, changed chart values above the original range, zero/empty charts and a data-derived printed subtotal.
- 33 standalone reference scripts passed smoke execution: 23 worked examples and 10 exercise-answer scripts. Numeric/text checks included in those scripts also passed. Smoke execution alone is not a claim that every possible output was visually reviewed.
- 62 Python files passed syntax parsing, including intentionally incomplete learner starters. Starters and the readiness diagnostic were not reported as solved; they are expected to fail until a learner implements them.
- The local capstone exported accepted, rejected, duplicate and category-summary CSVs and a PNG. Its audit was 16 raw = 1 duplicate extra + 5 rejected + 10 accepted, totaling 6,690 accepted cents and 46 units.
- SHA-256 hashes of all three raw CSV datasets were unchanged by the test and example runs.

Evidence files: `outputs/unit-tests.txt`, `outputs/script-smoke-results.json`, `outputs/capstone-run.txt` and `outputs/verification-summary.json`. Re-run with `python verify_package.py` from this folder's environment. This verifier checks supplied references; it does not grade every learner starter.

## Browser execution

Used the cloud browser at [Aabha Code Lab](https://lab.aabhaai.com/) on the same date. These were actual UI editor submissions, not claims inferred only from package documentation.

- Python basics: ran a combined standard-library check covering a list total, version output and `csv.DictReader(StringIO(...))`. Observed Python 3.14.2, total 60 and parsed minutes 20.
- Data profile: ran NumPy axis reduction and pandas normalization/conversion/grouping together. Observed NumPy 2.4.6 and pandas 3.0.2; day totals [60, 90] and group totals data/30, python/45 matched.
- Data profile: ran the complete `examples/10_capstone_data.py`. Its audit assertion passed. The printed accepted/rejected/duplicate/summary CSV sections matched the expected records and category totals.
- Charts profile: ran the complete `examples/09_charts.py` and final `examples/10_capstone_chart.py`. The page showed generated chart images and a Download chart link for each run. Observed Matplotlib 3.10.8 and NumPy 2.4.6. The capstone printed 66.90 fictional currency units.

The first chart trial used `plt.show()`, which produced a non-interactive-backend warning even though the image appeared. The delivered reference now saves PNG explicitly. Browser chart runs still emitted MatplotlibDeprecationWarning messages about float x/y parameters during image output. Those warnings did not prevent the tested chart images or download links; they remain a lab-runtime maintenance issue and are not suppressed or represented as fixed.

Not every exercise was individually rerun in the browser. The full unittest suite was run locally, not in the lab. Stop, Reset, timeout, generated-file persistence, browser reload recovery, download/reopen round-trips, mobile editing, accessibility assistive-technology behavior and multi-file browser imports were not verified in this pass. The course avoids relying on these unverified behaviors. It tells learners to download their code and uses self-contained in-memory examples.

## Visual and structural review

Five original SVG diagrams were rendered to PNG with Inkscape and visually inspected for legibility, arrow meaning, clipping and consistency with the lesson values. The local capstone PNG was inspected; a caption/axis overlap found in the initial render was corrected and the regenerated output rechecked.

`course.html` and `solutions.html` are static Pandoc-generated reading guides with local assets, selectable code, a table of contents, semantic headings, a skip link and responsive CSS. Local file/anchor references and manifest paths were checked programmatically. A cloud-browser preview of the local reading guide could not reach the workspace's loopback HTTP server, so full HTML visual/mobile browser QA is not claimed. Perform that check in the actual integration environment before release.

## Remaining release checks

- A real beginner pilot for comprehension and pacing; no learner study or outcome validation has occurred.
- Fresh-environment installation on supported Windows/macOS/Linux targets if the local route is advertised for those systems.
- Final-site rendering, download permissions, links, keyboard/assistive-technology support and mobile reading.
- Lab-runtime warning review and confirmation that actual completion/enrolment copy matches the product behavior.

The package is ready for content integration and review. It is not evidence that a public course has launched, enrolled learners, awarded completion or received accreditation.

## Independent review corrections · version 2026-10-14.2

An independent technical review exposed two defects in version 1: pandas could silently treat an extra leading CSV field as an index, and a fixed chart upper bound could clip a valid changed-input result. The corrected capstone strictly parses CSV records and validates field counts before DataFrame construction; malformed structure stops with an explicit error retaining record details. Charts derive their range and printed subtotal from current data. Regression tests cover both failures.

The review also led to a pre-exercise DictWriter export example, consistent Module 6C wording, an explicit exhausted-input branch in the loop diagram, lexical integer validation to prevent float rounding from hiding a fractional source value, and an explicit 2000–2099 supported date range. The original 51-test result remains historical evidence for version 1; the version 2 result was 65 passing tests; version 3 is recorded below.

An independent recheck of version 2026-10-14.2 in a fresh temporary copy passed 65 tests, 25 reference scripts and 50 Python parses, with unchanged raw CSV hashes. It reproduced the repaired malformed-field case and verified an 80-unit chart fits a 0–96 range. The review additionally checked empty/zero charts, lexical integer rejection, date boundaries, the maximum 1,000-row aggregate, identical local/browser cleaning functions, HTML references, export teaching, exercise wording and the revised diagram. No remaining content/code blocker was found within that review's scope; this does not replace the final-site accessibility/mobile checks or beginner pilot.

The revised full data-capstone reference was rerun in the public Data profile on Python 3.14.2 / NumPy 2.4.6 / pandas 3.0.2. The original fixture totals passed, followed by explicit browser regressions for extra leading/trailing fields, malformed quoting, fractional-source precision and an out-of-range year. The browser printed `Revision 2 browser regressions passed`.

The revised Charts script was then run in the public Charts profile with changed values `[8000, 0, 0]` cents. It printed 80.00 fictional currency units, asserted a non-clipping range and reported a y-axis range of 0–96. A rendered chart and download link appeared. The existing browser Matplotlib deprecation warnings remained, so warning-free behavior is still not claimed.

## Narrative-enrichment verification · version 2026-10-14.3

Version 3 adds guided structural/value, duplicate/conflict and aligned-reason checkpoints before the assessed capstone, with different toy data, predicted intermediate outputs and separate changed-input answers. A supplied ingestion helper and five named TODO stages replace the empty capstone starter. The new public checker calls the learner function on nine contract scenarios; `check_capstone.py` loads the exercise file, and the browser starter embeds the identical checker without importing a solution.

New tests verify that the public checker invokes the function supplied to it, rejects a constant-answer implementation and detects altered rejection evidence. They check identical browser/local checking code, unfinished-stage failure, the supplied ingestion helper, bridge masks/labels/source preservation, before/after inspection counts, robust high/zero/empty charts and an explicit empty-capstone chart label. The reference capstone's date pattern now uses explicit ASCII digits, consistent with its documented policy.

All 79 current unit tests, 33 reference-script runs and 62 Python syntax parses pass locally. This does not mean unfinished learner starters pass: they deliberately retain five NotImplementedError stages. New teaching additions have not been learner-piloted; the revised 24–32-hour course and 5–7-hour capstone estimates are planning estimates only. Earlier version 1/2 execution and independent-review records above remain historical; they do not independently review version 3's new teaching material.

The narrative recheck identified and corrected two scaffold ambiguities: already-conflicting rows still receive every field check, and reduced-column conceptual examples are not passed to full-schema capstone stages. The added five-row stage fixture is embedded in both starters and has explicit intermediate results. CHECKPOINT_STAGE 1–5 runs only the implemented prefix, while 6 runs the full project. Two additional tests verify the full-schema expected evidence and prefix-only preview, bringing the current unit count to 79.

A combined public Data-profile browser run of the new inspection example and all four capstone bridge examples completed on Python 3.14.2 / NumPy 2.4.6 / pandas 3.0.2. Observed source/converted missingness, masks, source labels, conflict decisions, integer/date acceptance and multi-reason evidence matched the lesson's stated intermediate outputs. This was a combined smoke run, not a learner pilot.

The final narrative recheck accepted version 2026-10-14.3 after verifying the full-schema checkpoint, embedded fixture consistency, prefix-only preview, aligned stage contracts and all previously requested teaching changes. No major narrative blocker remained in that audit. This is an editorial review, not a beginner usability pilot.

A separate Data-profile browser check loaded the final starter's definitions and five-row supplied-ingestion fixture, confirmed that the learner's unfinished stage still raises NotImplementedError, and ran the nine public checker scenarios against the reference function to verify checker/runtime compatibility. The browser reported all nine checks passed. This does not claim that an unfinished learner submission passes or that a human learner completed the capstone. The local tests separately verify that the checker invokes the supplied function and rejects constant answers and altered evidence.

The new robust-chart teaching example was also run in the Charts profile with high, empty and all-zero cases. It reported a 160.00 subtotal and upper bound 168 for [14000, 2000] cents, and a nonzero 0–1 display range for empty/zero cases. Three chart images and download links appeared. Existing Matplotlib output deprecation warnings remain disclosed. A subsequent local-only formatting simplification replaced the inspection example's dtype dictionary comprehension with dtypes.to_string; its data operations and observed decisions are unchanged.

The Python basics profile ran the new scope and traceback teaching examples together. It printed the quoted total 60, unchanged caller price 100, repeated explicit quote 60, and the deliberate ValueError for converting "twenty" to an integer. The expected error was caught for the demonstration and the browser reported completion on Python 3.14.2.
