Skip to main content
APPLIED PYTHON / FINAL CAPSTONE / NORTHSTAR SERVICES

Northstar Fleet Audit.

A fictional MSP has one requirement: create an automation report operators can actually trust. Build the Python engine independently, defend the outcome across failures, then package your own local multi-file implementation.

8 scenario groupsReal Python12 local unit testsMulti-file projectNo live access
NORTHSTAR SERVICES / NOC AUTOMATION WORK ORDER

Build the tool. Prove the evidence.

Northstar Services needs an unattended, read-only inventory audit that correlates a validated local CSV export with paginated fictional API responses. Build the engine yourself. The scheduler only supplies a trigger; your code must validate configuration and approval gates, retry limited transient failures, prove all expected hosts were observed, and preserve the previous verified report whenever evidence is incomplete.

Independent assessment: This capstone provides a contract, a starter interface and test cases—not the completed algorithm. The in-browser editor executes Python against entirely fictional, injected data. It has no access to your workstation, network, tenant, scheduled tasks or credentials.
ACCEPTANCE CONTRACT / READ BEFORE CODING
01

Write build_audit(csv_text, fetch_page, settings, previous, seen) to the exact return contract. No global variables, network access, filesystem mutation, or prints inside the function.

02

Validate settings: nonblank site, mode 'plan' or 'simulate', and integer max_pages between 1 and 5 (reject booleans). In simulate mode, require a trusted injected approval with exact site, approval True, nonblank ID and an open aware datetime interval. Reject before fetching when authorization fails.

03

Parse UTF-8 CSV text using csv.DictReader. Require exactly host,site headers. Normalize hosts/sites, reject malformed rows and case-insensitive duplicates across the inventory rather than silently ignoring evidence.

04

Call the injected fetch_page(page_number) starting at 1. Accept valid HTTP-200 pages with devices and next; retry TimeoutError and HTTP 503 at most once per page. Stop on 401/403/429, malformed replies, unsafe next values or an exhausted page budget.

05

Reject missing/duplicate/malformed API hosts, unsupported online/offline statuses and any mismatch between the selected site's CSV hosts and the fully collected API hosts. A valid empty inventory is different from a failed collection.

06

Return a deterministic report with site, total, and sorted offline_hosts only after collecting every required page. Never change the previous verified report or mutate inputs.

07

In simulate mode, return sorted, previously unseen stable action keys for offline hosts using approval_id:review:HOST. Plan mode returns no new keys. Neither mode performs actual IT changes.

08

On failure return {'ok':False,'reason':CODE,'previous':previous}; on success return {'ok':True,'state':MODE,'report':REPORT,'new_keys':KEYS,'previous':previous}. Never produce a success-looking partial report.

ASSESSMENT SPECIFICATION / LEARNER REFERENCE

Know the exact contract before writing the algorithm.

The final project is independent, not a guessing game. These shapes and failure reasons are the requirements tested by the fictional scenarios. You are responsible for implementing them yourself; no completed solution is provided.

Function arguments

InputType and contract
csv_textPython strCSV text with exactly host,site headers. Normalize host/site for matching; reject missing fields and repeated hosts across the entire file.
fetch_pageCallable(page_number)An injected fake responder. Start at page 1, pass integer page numbers, and never call a real URL or import a network client.
settingsPython dictRequired site (nonblank str), mode ('plan' or 'simulate') and max_pages (strict int, 1–5). Simulate additionally requires now and approval.
previousAny prior report objectKeep the previous verified value unchanged and return it under previous in all blocked or successful results.
seenCollection of stringsPreviously processed action keys. Only unseen, normalized keys appear in simulated results; don't modify the collection.

Required settings (fictional approval)

from datetime import datetime, timezone, timedelta

now = datetime(2026, 11, 10, 2, tzinfo=timezone.utc)
settings = {
    'site': 'HQ',
    'mode': 'simulate',
    'max_pages': 3,
    'now': now,
    'approval': {
        'id': 'CHG-1042',
        'site': 'HQ',
        'approved': True,
        'start': now - timedelta(hours=1),
        'end': now + timedelta(hours=1),
    },
}

Plan mode requires only site, mode and max_pages. Simulate mode additionally checks approval before any fetch. The injected approval is a training fixture, not a real approved ticket. Real operations would also require independent identity, action-scope and revocation verification as taught in Lesson 06.

API response and pagination

# Call fetch_page(1), then fetch_page(2) if next == 2.
# This capstone uses page NUMBERS, not the URL links from Lesson 04.
page1 = {
    'status': 200,
    'devices': [
        {'host': 'SW-01', 'status': 'online'}
    ],
    'next': 2,
}
page2 = {
    'status': 200,
    'devices': [
        {'host': 'AP-02', 'status': 'offline'}
    ],
    'next': None,
}

Each page must be valid before use. Accept next=None only when collection is complete, or the exact next integer page within the configured budget. Retry TimeoutError and HTTP 503 once per page; do not retry 401, 403 or 429. A valid zero-device response is not a failure.

Exact return shapes

# Successful plan:
{
    'ok': True,
    'state': 'planned',
    'report': {
        'site': 'HQ',
        'total': 2,
        'offline_hosts': ['AP-02']
    },
    'new_keys': [],
    'previous': previous
}

# Input 'simulate' returns state 'simulated'.
# Successful simulation may return new action keys:
# ['CHG-1042:review:AP-02']
# No device changes occur.

# Failure, with NO partial report:
{'ok': False, 'reason': 'page', 'previous': previous}

Sort offline hostnames and unseen action keys consistently. Normalize names to uppercase. The output state is planned or simulated, not the input mode name. Keep prior input records, settings and seen keys unchanged.

Exact failure-code reference · open before implementing error paths
config

settings is missing/invalid, site is blank, mode is unsupported, max_pages is not a strict integer from 1–5 (True is not valid), or other required configuration is wrong.

Before calling fetch_page
approval

Simulate mode lacks an injected approval with approved exactly True, matching site, nonblank ID, and aware start ≤ now < end. An expired or naive window is invalid.

Before calling fetch_page
csv

CSV lacks the exact required host/site header contract or contains malformed/blank rows or values.

Before calling fetch_page
duplicate

A hostname repeats after stripping whitespace and uppercasing, including a duplicate in a different site.

Before calling fetch_page
timeout

A page raises TimeoutError on both permitted attempts; never publish a partial report.

After at most two calls for that page
http-NNN

The response has a non-200 HTTP status; 401, 403 and 429 stop immediately, while 503 may be retried once before returning http-503.

HTTP response classification
page

next is an unsafe or unexpected page number: repeated, skipped, wrong type, or beyond max_pages.

Pagination / collection
schema

An API envelope or device is malformed, status is not online/offline, or an API hostname appears twice across pages.

Response validation
mismatch

After all pages are collected, the API hostname set does not exactly match the selected site's validated CSV hostname set.

Final reconciliation
Understand Run versus Check

Run executes only your editable starter and its displayed two-host example; after you implement the function, this example should print AUDIT READY. Check runs your solution with the additional eight independent scenario groups, then expects the scenario-check summary. The combined Check output is not what a plain Run should print. The hidden changed-input cases remain an assessment of your own logic.

Prerequisite recap: Need a refresher before coding? Review DictReader and CSV validation, pagination, injected fake responders, or aware maintenance windows. This reference supplies the contract, not the algorithm.

NORTHSTAR / CASE BRIEFING CONSOLE

Inspect the evidence before writing the solution.

Review what each independent scenario is designed to reveal. The console is a static fictional briefing: it does not run Python or disclose solution code.

01 / 8
LOCAL INVENTORY SOURCE
host,site
SW-01,HQ
AP-02,HQ
Fictional CSV excerpt · no real devices
INJECTED API RESPONSE
page 1: SW-01 online, next=2
page 2: AP-02 offline, next=None
Models responses without contacting any endpoint
OPERATOR QUESTION

01 · Complete two-page inventory

Can the auditor prove all HQ hosts were seen before accepting the result?

Evidence requirement

A complete, ordered page walk and exact inventory coverage

INDEPENDENT SKILL DEMONSTRATION

Write one implementation. Check eight operating conditions.

Your function must generalize across datasets instead of copying the displayed sample. Run to inspect your output, then Check to execute the independent scenarios. Error reasons, retry counts, exact host coverage and preservation of the old report are all part of the contract.

How to approach this:

Implement a small validator, a bounded page collector, a deterministic report builder and the approval/replay gate. Use the two optional hints only when needed. Run/Check/Trace operate in an isolated browser Python runtime. If you want actual local files or a runnable CLI, continue into the local project below after your browser result is correct.

JOELEARNS / PYTHON WORKBENCH

Write it. Run it. Understand it.

Independently build a complete read-only NOC audit and verify eight failure groups, approval gates, paging limits and safe replay behavior.

Python 3.14 · in-browser
CHALLENGE FINAL / 1 · CAPSTONE

Northstar Fleet Audit — Independent Applied Python Capstone

Implement build_audit(csv_text, fetch_page, settings, previous, seen). Validate the complete CSV inventory and bounded, numbered injected API responses; stop on unauthorized or malformed evidence; retry only transient timeouts/503 once per page; prove full host coverage and emit deterministic read-only reports. The final simulated mode requires an in-scope, unexpired aware-datetime approval and returns only unseen stable action keys. No real network, filesystem effects or live tickets. Eight independent fixture groups test the exact failure reasons and unchanged prior report. Read the assignment contract above before coding.

EXPECTED OUTPUTAUDIT READY 8 scenario checks completed
script.py editableCtrl / Cmd + Enter to run
Your code is stored only in session storage when enabled. Never paste secrets. Clearing this option clears saved drafts, not the editor.
Code executes only when you choose Run or Check. No account needed.
HINTS · OPTIONAL

Try solving it before asking for help. Hints never show a completed program.

PYTHON OUTPUTReady

Your printed output and errors will appear here.

VARIABLE TRACER

Run the code, then step through the executed lines to watch variable values change.

About this environment: The Python runtime is loaded on demand from a version-pinned CDN and runs inside a sandboxed, opaque-origin browser frame. Runs have a time limit. OS/network automation is outside this introductory workbench. If your code calls input(), a response panel appears to supply text to those calls. Don't paste secrets or untrusted scripts.

OPTIONAL LOCAL PROJECT / PROFESSIONAL HANDOFF

Turn your completed function into a multi-file Python project.

The browser tests the core engine. A real local project also needs a CLI, fixtures, tests, documentation and an explicit output policy. Copy the files below into a disposable directory. The engine intentionally starts with a NotImplementedError; paste and refactor your own solution from the browser. The 12 local tests are supposed to fail until you've completed the project.

Local practice only

Python 3.10+, standard library, fictional CSV/API responses. No internet, packages, credentials or administrative privileges needed.

No writes by default

The CLI prints JSON only on success. Optional --save-report explicitly writes a local JSON file; existing output requires --replace.

Test failures deliberately

Run unittest, change an expected value and confirm a failing test is detected. Check the blocked scenarios produce a nonzero exit and leave previous output intact.

01audit_core.pyYour implementation
PYTHON / COPY TO A LOCAL PROJECT
"""Northstar Fleet Audit: YOU implement the pure, offline audit engine.

Do not use network clients, OS commands, persistent writes, or global state here.
The browser capstone and local tests share this function signature.
"""
import csv
import io
from datetime import datetime

def build_audit(csv_text, fetch_page, settings, previous, seen):
    """Return the exact documented success or blocked dictionary.

    Block: {'ok': False, 'reason': REASON, 'previous': previous}
    Success: {'ok': True, 'state': 'planned' | 'simulated',
              'report': {'site': SITE, 'total': N, 'offline_hosts': SORTED},
              'new_keys': SORTED, 'previous': previous}

    REASON: config, approval, csv, duplicate, timeout,
            http-NNN, page, schema, mismatch.

    fetch_page(n) is an injected fictional responder. No live API calls.
    """
    # TODO: Move your completed browser solution here, refactor into helpers,
    #       and run the test suite. Returning fake success is not an answer.
    raise NotImplementedError("Implement the Northstar audit engine")
02fixtures.pyOffline simulated responses
PYTHON / COPY TO A LOCAL PROJECT
"""Fictional response sequences only: no HTTP and no external dependencies."""
from copy import deepcopy
from datetime import datetime, timezone, timedelta

BASE_NOW = datetime(2026, 11, 10, 2, tzinfo=timezone.utc)
BASE_CSV = "host,site\nSW-01,HQ\nAP-02,HQ\n"
APPROVAL = {
    "id": "CHG-1042", "site": "HQ", "approved": True,
    "start": BASE_NOW - timedelta(hours=1),
    "end": BASE_NOW + timedelta(hours=1),
}
SCENARIOS = (
    "complete", "empty", "duplicate", "timeout", "unavailable",
    "unauthorized", "throttled", "bad-page", "bad-schema",
    "expired", "replay",
)

class FakeFetcher:
    """A callable, repeatable page responder. No network connection."""
    def __init__(self, pages):
        self.pages = {page: list(replies) for page, replies in pages.items()}
        self.calls = []
    def __call__(self, number):
        self.calls.append(number)
        if number not in self.pages or not self.pages[number]:
            raise ValueError("unexpected-page")
        reply = self.pages[number].pop(0)
        if isinstance(reply, Exception):
            raise reply
        return deepcopy(reply)

def scenario(name='complete'):
    if name not in SCENARIOS:
        raise ValueError("unrecognized-scenario")
    csv_text, now, approval, seen = BASE_CSV, BASE_NOW, deepcopy(APPROVAL), set()
    pages = {
        1: [{"status":200,
             "devices":[{"host":"SW-01","status":"online"}],
             "next":2}],
        2: [{"status":200,
             "devices":[{"host":"AP-02","status":"offline"}],
             "next":None}],
    }
    if name == "empty":
        csv_text = "host,site\n"
        pages = {1:[{"status":200,"devices":[],"next":None}]}
    elif name == "duplicate":
        csv_text += "sw-01,REMOTE\n"
    elif name == "timeout":
        pages[1].insert(0, TimeoutError("fictional-timeout"))
    elif name == "unavailable":
        pages = {1:[{"status":503},{"status":503}]}
    elif name == "unauthorized":
        pages = {1:[{"status":401}]}
    elif name == "throttled":
        pages = {1:[{"status":429}]}
    elif name == "bad-page":
        pages = {1:[{"status":200,"devices":[],"next":1}]}
    elif name == "bad-schema":
        pages = {1:[{"status":200,
                      "devices":[{"host":"SW-01","status":"broken"}],
                      "next":None}]}
    elif name == "expired":
        now = approval["end"]
    elif name == "replay":
        seen.add("CHG-1042:review:AP-02")
    return csv_text, FakeFetcher(pages), approval, now, seen
03run_audit.pyLocal CLI and optional report output
PYTHON / COPY TO A LOCAL PROJECT
"""Command-line wrapper for a LOCAL fictional audit; safe by default."""
import argparse
import json
import os
from pathlib import Path
import sys
import tempfile
from audit_core import build_audit
from fixtures import SCENARIOS, scenario

ROOT = Path(__file__).resolve().parent
REPORT_DIR = ROOT / "reports"
MAX_CSV_BYTES = 65536

def load_sample_csv():
    source = ROOT / "samples" / "inventory.csv"
    if not source.is_file() or source.stat().st_size > MAX_CSV_BYTES:
        raise ValueError("invalid-sample-file")
    return source.read_text(encoding="utf-8-sig")

def write_local_report(report, replace=False):
    """Explicit local-only output. No file is created by the default CLI."""
    REPORT_DIR.mkdir(parents=True, exist_ok=True)
    destination = REPORT_DIR / "audit.json"
    if destination.exists() and not replace:
        raise FileExistsError("report-exists-use-replace")
    temp_path = None
    try:
        with tempfile.NamedTemporaryFile(
                "w", encoding="utf-8", dir=REPORT_DIR,
                prefix=".audit-", suffix=".tmp", delete=False) as handle:
            temp_path = Path(handle.name)
            json.dump(report, handle, indent=2, sort_keys=True)
            handle.write("\n")
            handle.flush()
            os.fsync(handle.fileno())
        if destination.exists() and not replace:
            raise FileExistsError("report-exists-use-replace")
        os.replace(temp_path, destination)
        temp_path = None
        return destination
    finally:
        if temp_path is not None:
            temp_path.unlink(missing_ok=True)

def main(argv=None):
    parser = argparse.ArgumentParser(description="Northstar offline fleet audit")
    parser.add_argument("--scenario", choices=SCENARIOS, default="complete")
    parser.add_argument("--mode", choices=("plan","simulate"), default="plan")
    parser.add_argument("--site", default="HQ")
    parser.add_argument("--max-pages", type=int, default=3)
    parser.add_argument("--save-report", action="store_true",
                        help="explicitly save LOCAL verified JSON under reports/")
    parser.add_argument("--replace", action="store_true",
                        help="allow replacing an existing LOCAL report with --save-report")
    args = parser.parse_args(argv)
    previous = {"report_id":"last-known-good"}
    if args.replace and not args.save_report:
        print("Blocked: --replace requires --save-report", file=sys.stderr)
        return 2
    if args.save_report and args.mode != "plan":
        print("Blocked: only plan mode can save a local report", file=sys.stderr)
        return 2
    try:
        csv_text, fetch, approval, now, seen = scenario(args.scenario)
        if args.scenario == "complete":
            csv_text = load_sample_csv()
        settings = {"site":args.site, "mode":args.mode, "max_pages":args.max_pages}
        if args.mode == "simulate":
            settings.update({"now":now,"approval":approval})
        outcome = build_audit(csv_text, fetch, settings, previous, seen)
        if not isinstance(outcome, dict) or outcome.get("ok") is not True:
            reason = outcome.get("reason","invalid-result") if isinstance(outcome,dict) else "invalid-result"
            print("Blocked: "+str(reason),file=sys.stderr)
            return 2
        if args.save_report:
            destination=write_local_report(outcome["report"],replace=args.replace)
            print("Local report: "+str(destination),file=sys.stderr)
        print(json.dumps(outcome,sort_keys=True,default=str))
        return 0
    except (OSError,ValueError,TypeError,KeyError,NotImplementedError) as exc:
        print("Blocked: "+type(exc).__name__+" "+str(exc),file=sys.stderr)
        return 2

if __name__ == "__main__":
    raise SystemExit(main())
04test_audit.py12 independent unit tests
PYTHON / COPY TO A LOCAL PROJECT
"""Learner-owned acceptance tests: fail at first until build_audit is implemented."""
import copy
import unittest
from datetime import timedelta
from unittest.mock import Mock
from audit_core import build_audit
from fixtures import BASE_CSV, BASE_NOW, APPROVAL, scenario

PREVIOUS = {"report_id":"last-known-good"}
PLAN = {"site":"HQ","mode":"plan","max_pages":3}

class NorthstarAuditTests(unittest.TestCase):
    def audit(self, name="complete", settings=None, previous=None, seen=None):
        csv_text, fetch, approval, now, sample_seen = scenario(name)
        chosen = settings or PLAN
        previous = PREVIOUS if previous is None else previous
        answer = build_audit(csv_text,fetch,chosen,previous, sample_seen if seen is None else seen)
        return answer,fetch,approval,now

    def test_complete_multi_page_report(self):
        actual,fetch,_,_=self.audit()
        self.assertEqual(actual,{'ok':True,'state':'planned',
            'report':{'site':'HQ','total':2,'offline_hosts':['AP-02']},
            'new_keys':[],'previous':PREVIOUS})
        self.assertEqual(fetch.calls,[1,2])

    def test_valid_empty_inventory(self):
        actual,fetch,_,_=self.audit("empty")
        self.assertEqual(actual["report"],{'site':'HQ','total':0,'offline_hosts':[]})
        self.assertEqual(fetch.calls,[1])

    def test_duplicate_csv_blocks_before_fetch(self):
        actual,fetch,_,_=self.audit("duplicate")
        self.assertEqual(actual,{'ok':False,'reason':'duplicate','previous':PREVIOUS})
        self.assertEqual(fetch.calls,[])

    def test_invalid_configuration_fails_closed(self):
        actual,fetch,_,_=self.audit(settings={**PLAN,'max_pages':True})
        self.assertEqual(actual["reason"],"config")
        self.assertEqual(fetch.calls,[])

    def test_unauthorized_does_not_retry(self):
        actual,fetch,_,_=self.audit("unauthorized")
        self.assertEqual(actual["reason"],"http-401")
        self.assertEqual(fetch.calls,[1])

    def test_rate_limited_does_not_retry(self):
        actual,fetch,_,_=self.audit("throttled")
        self.assertEqual(actual["reason"],"http-429")
        self.assertEqual(fetch.calls,[1])

    def test_timeout_recovers_once(self):
        actual,fetch,_,_=self.audit("timeout")
        self.assertTrue(actual["ok"])
        self.assertEqual(fetch.calls,[1,1,2])

    def test_503_exhaustion_preserves_prior(self):
        previous={'report_id':'must-not-overwrite'}
        actual,fetch,_,_=self.audit("unavailable",previous=previous)
        self.assertEqual(actual,{'ok':False,'reason':'http-503','previous':previous})
        self.assertIs(actual["previous"],previous)
        self.assertEqual(fetch.calls,[1,1])

    def test_unsafe_page_and_schema_are_rejected(self):
        bad_page,_,_,_=self.audit("bad-page")
        bad_schema,_,_,_=self.audit("bad-schema")
        self.assertEqual(bad_page["reason"],"page")
        self.assertEqual(bad_schema["reason"],"schema")

    def test_expired_simulation_blocks_before_fetch(self):
        csv_text,fetch,approval,now,_=scenario("expired")
        settings={**PLAN,"mode":"simulate","now":now,"approval":approval}
        actual=build_audit(csv_text,fetch,settings,PREVIOUS,set())
        self.assertEqual(actual["reason"],"approval")
        self.assertEqual(fetch.calls,[])

    def test_simulation_replay_keys_and_input_immutability(self):
        csv_text,fetch,approval,now,seen=scenario("replay")
        settings={**PLAN,"mode":"simulate","now":now,"approval":approval}
        before=(copy.deepcopy(settings),copy.deepcopy(seen),copy.deepcopy(PREVIOUS))
        actual=build_audit(csv_text,fetch,settings,PREVIOUS,seen)
        self.assertEqual(actual["state"],"simulated")
        self.assertEqual(actual["new_keys"],[])
        self.assertEqual((settings,seen,PREVIOUS),before)

    def test_wrong_scope_and_missing_api_host_block(self):
        csv_text,fetch,approval,now,_=scenario()
        wrong={**PLAN,"mode":"simulate","now":now,"approval":{**approval,"site":"OTHER"}}
        self.assertEqual(build_audit(csv_text,fetch,wrong,PREVIOUS,set())["reason"],"approval")
        mismatched=Mock(return_value={'status':200,
                                      'devices':[{'host':'STRANGER','status':'online'}],
                                      'next':None})
        self.assertEqual(build_audit(csv_text,mismatched,PLAN,PREVIOUS,set())["reason"],"mismatch")

if __name__ == "__main__":
    unittest.main()
05samples/inventory.csvFictional inventory
CSV / FICTIONAL DATA
host,site
SW-01,HQ
AP-02,HQ
06README.mdOperating instructions
MARKDOWN / LOCAL README
# Northstar Fleet Audit — Applied Python Capstone

This is a learner-owned, offline, standard-library-only project. Copy the files
shown on the capstone page into one disposable folder, with `samples/inventory.csv`.
Do not use real customer records, credentials, networks or devices.

## Directory
- audit_core.py — YOUR implementation of build_audit()
- fixtures.py — deterministic, injected HTTP and failure sequences (never network)
- run_audit.py — local argparse entry point; no writes by default
- test_audit.py — 12 independent unittest acceptance checks
- samples/inventory.csv — fictional source data
- reports/ — created only after explicit --save-report

## Start
python -m unittest test_audit.py -v
python run_audit.py --scenario complete
python run_audit.py --scenario unauthorized
python run_audit.py --scenario timeout
python run_audit.py --mode simulate --scenario replay

The tests intentionally FAIL until you implement audit_core.py.
Once the tests pass, also deliberately change an expected value so a test fails;
restore it before calling the project complete.

Plan and simulate modes make no real IT changes. If you explicitly want a LOCAL
JSON artifact after successful plan validation:
python run_audit.py --save-report
python run_audit.py --save-report --replace

The CLI rejects failed/incomplete results and never saves reports in simulate
mode. The local output directory is for training, NOT a production data store.
A file-existence check plus atomic replace is not an inter-process lock; do not
run overlapping writers or treat this project as hardened production software.

## Readiness
Document input contract, supported Python, exact interpreter, scheduling context,
status/exit codes, retry limit, expected host completeness, logs, incident owner,
change approval checks, replay keys and rollback/reconciliation decisions.
LOCAL COMMANDS / YOUR OWN TERMINALpython -m unittest test_audit.py -vpython run_audit.py --scenario completepython run_audit.py --scenario timeoutpython run_audit.py --mode simulate --scenario expiredpython run_audit.py --save-report

The local project is a training scaffold, not a production-hardened scheduler or approval system. Real deployment requires independently trusted approvals, credentials handling, an atomic concurrency policy, controlled error reporting and change-management review.

FINAL REVIEW / EXPLAIN YOUR DECISIONS

What would you defend in a change review?

01

Data integrity

No accepted duplicates, malformed records, ambiguous empty results or incomplete pagination.

02

Operational resilience

Bounded transient retries; terminal HTTP responses stop; prior verified output remains intact.

03

Authorization and repeatability

Time- and site-scoped simulation approval, no external effects, stable replay keys and immutable inputs.

04

Professional handoff

A multi-file local version, repeatable unittest checks, CLI contract, runbook, and documented failure codes.

Before treating this as ready to operate, explain why a valid empty report differs from a failed fetch, which errors are safe to retry, what an approval actually authorizes, why run IDs are not replay keys, and why the previous verified report must survive incomplete collection.

About verification: Browser checks are self-guided learning feedback, not a proctored exam or accredited certification. Completing the local project and documenting an operational runbook is encouraged but not automatically verified by JoeLearns.