docs(evidence): bind PR 10 rework verification

This commit is contained in:
2026-10-05 08:45:31 +00:00
parent f01dc182ec
commit 1ebc53d152
2 changed files with 123 additions and 0 deletions
@@ -0,0 +1,122 @@
{
"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."
]
}
File diff suppressed because one or more lines are too long