docs(evidence): bind PR 10 rework verification
This commit is contained in:
@@ -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
Reference in New Issue
Block a user