Files
jarca-ledger-mcp/docs/evidence/issue-9-dashboard-menu-transition/rework-verification-plan.json
T

123 lines
5.5 KiB
JSON

{
"environment": [
"os",
"kernel",
"architecture",
"python",
"uv"
],
"command_env_allowlist": [
"PATH",
"HOME",
"TMPDIR",
"LANG",
"VIRTUAL_ENV",
"UV_CACHE_DIR"
],
"secret_env_names": [],
"forbidden_regexes": [],
"hash_paths": [
"docs/evidence/issue-9-dashboard-menu-transition/README.md",
"docs/evidence/issue-9-dashboard-menu-transition/browser-observations.json",
"docs/evidence/issue-9-dashboard-menu-transition/final-state.jpg",
"docs/evidence/issue-9-dashboard-menu-transition/manifest.json",
"docs/project-structure.md",
"docs/requirements/req-002_dashboard-menu-transition.md",
"docs/runtime-flow.md",
"scripts/streamlit_browser_evidence.py",
"tests/test_streamlit_browser_evidence.py"
],
"commands": [
{
"id": "full-suite",
"purpose": "Run the repository full test suite at the rework source revision",
"argv": [
"uv",
"run",
"--extra",
"dashboard",
"--extra",
"dev",
"pytest"
],
"expected_exit_code": 0,
"max_output_bytes": 65536,
"claims": [
"full-suite-result"
]
},
{
"id": "browser-evidence-validator",
"purpose": "Validate checked-in authenticated browser evidence, source and artifact hashes",
"argv": [
"python3",
"-c",
"import hashlib,json,math,pathlib; r=pathlib.Path('.'); e=r/'docs/evidence/issue-9-dashboard-menu-transition'; m=json.loads((e/'manifest.json').read_text()); d=json.loads((e/'browser-observations.json').read_text()); frames=d['frames']; surfaces=('stAppViewContainer','stSidebar'); assert all(hashlib.sha256((r/p).read_bytes()).hexdigest()==h for p,h in m['source']['files_sha256'].items()); assert all(hashlib.sha256((e/p).read_bytes()).hexdigest()==h for p,h in m['artifacts_sha256'].items()); assert all(d['checks'].values()) and not d['document_load_events'] and len(frames)==35; assert all(isinstance(f['previous_body_visible'],bool) for f in frames); assert any(f['loading'] and f['previous_body_visible'] is False for f in frames); valid=lambda x: isinstance(x,dict) and str(x.get('backgroundImage','')).strip().lower() not in ('','none') and bool(str(x.get('backgroundColor','')).strip()) and x.get('visibility')=='visible' and x.get('display')!='none' and math.isfinite(float(x.get('opacity','nan'))) and float(x['opacity'])>0 and x.get('rendered') is True; assert all(valid(f['surfaces'][s]) for f in frames for s in surfaces); ss=d['stable_shell']; assert all(isinstance(ss[k]['pre'],str) and ss[k]['pre'] and ss[k]['pre']==ss[k]['post'] for k in ('document_marker','sidebar_marker','background')); assert ss['surfaces']['pre']==frames[0]['surfaces'] and ss['surfaces']['post']==d['post']['surfaces'] and ss['surfaces']['pre']==ss['surfaces']['post']; print('PASS source_hashes=5 artifact_hashes=2 checks=12/12 frames=%d full_document_loads=0 surfaces=2' % len(frames))"
],
"expected_exit_code": 0,
"max_output_bytes": 8192,
"claims": [
"browser-evidence-result"
]
},
{
"id": "documentation-inventory",
"purpose": "Validate canonical requirement and documentation remediation coverage",
"argv": [
"python3",
"-c",
"from pathlib import Path\nimport re\nq=Path('docs/requirements/req-002_dashboard-menu-transition.md').read_text(); p=Path('docs/project-structure.md').read_text(); f=Path('docs/runtime-flow.md').read_text()\nrb=re.split(r'(?=^### REQ-002\\.\\d{2}(?!-AC)\\b)',q,flags=re.M)[1:]; ab=re.split(r'(?=^### REQ-002\\.\\d{2}-AC01\\b)',q,flags=re.M)[1:]\nassert len(rb)==len(ab)==9 and all('**Impact**' in x for x in rb) and all('**Cases**' in x and '**State Invariants**' in x for x in ab)\nassert all(x in q for x in ('REQ-001.05-AC01','REQ-001.07-AC01','REQ-001.08-AC01','REQ-001.09-AC01'))\nassert all(x in p for x in ('dashboard/common.py','inject_app_css()','JARCA_COLORS','JARCA_PLOTLY_TEMPLATE','outside the replaceable body'))\nassert all(x in f for x in ('do not initiate or replay financial writes or external calls','explicit page user actions','no new idempotency contract'))\nprint('PASS requirements=9 impact=9 acceptance_criteria=9 cases=9 state_invariants=9 missing=0 ambiguous=0')"
],
"expected_exit_code": 0,
"max_output_bytes": 8192,
"claims": [
"documentation-contract-result"
]
},
{
"id": "ruff",
"purpose": "Run static lint checks",
"argv": [
"uv",
"run",
"--extra",
"dashboard",
"--extra",
"dev",
"ruff",
"check",
"dashboard",
"tests",
"scripts"
],
"expected_exit_code": 0,
"max_output_bytes": 8192,
"claims": [
"lint-result"
]
},
{
"id": "compile",
"purpose": "Compile Python sources and tests",
"argv": [
"python3",
"-m",
"compileall",
"-q",
"dashboard",
"tests",
"scripts"
],
"expected_exit_code": 0,
"max_output_bytes": 8192,
"claims": [
"compile-result"
]
}
],
"limitations": [
"The authenticated browser transition was captured before this clean source commit from byte-identical hashed files; this manifest validates the tracked browser artifacts and their exact source hashes rather than rerunning the browser.",
"Gitea commit status and Actions state are authoritative external readbacks and are not produced by this local manifest."
]
}