Replace document navigation with native Streamlit state transitions, preserve dashboard contracts, and add regression plus authenticated browser evidence for Issue #9.
62 lines
3.5 KiB
JSON
62 lines
3.5 KiB
JSON
{
|
|
"schema": "jarca.issue9.evidence-manifest.v1",
|
|
"issue": "jsfamily/jarca-ledger-mcp#9",
|
|
"captured_at": "2026-10-04T16:18:18.832Z",
|
|
"source": {
|
|
"base_revision": "ffd943fe65875e67148c28ba44bae32918e338c9",
|
|
"working_tree": true,
|
|
"files_sha256": {
|
|
"dashboard/app.py": "4c7b3a6264b4fb4ae0e445ddc04c625b295443816b198aa5a60615ac44846ff2",
|
|
"dashboard/common.py": "9a0b9dbb4ca88f27757fc293173821c48a56a30bc23f16b0f24731f246411c5a",
|
|
"scripts/streamlit_browser_evidence.py": "766beefb0d861ea6b08561c3aaa0c6d8915c9166e4221725e27b5e26cea63798",
|
|
"tests/test_dashboard_menu_transition.py": "d23c35d88f6289b7c7e84a271df6ff3f6ff1f25a3a885aa696cc93db0b37035e",
|
|
"tests/test_streamlit_browser_evidence.py": "b922593f96da5af9a0b1fe33cacbe3abe139ef00554e7c535fe7cc8f24679b23"
|
|
}
|
|
},
|
|
"execution": {
|
|
"browser_tool": "mcp__playwright__browser_run_code_unsafe",
|
|
"tool_status": "success",
|
|
"exit_code": null,
|
|
"exit_code_note": "The Playwright MCP call is not a process and exposes success/error status rather than a numeric exit code.",
|
|
"transition": "요약 -> 분류 규칙",
|
|
"sampling_interval_ms": 50,
|
|
"frame_count": 35,
|
|
"viewport": {
|
|
"width": 1280,
|
|
"height": 720
|
|
},
|
|
"browser": "HeadlessChrome/154.0.0.0",
|
|
"browser_architecture": "Linux x86_64",
|
|
"fixture_host_architecture": "aarch64",
|
|
"python": "3.13.5",
|
|
"streamlit": "1.58.0",
|
|
"uvicorn": "0.49.0"
|
|
},
|
|
"checks": {
|
|
"document_identity_stable": true,
|
|
"sidebar_identity_stable": true,
|
|
"background_stable": true,
|
|
"zero_full_document_loads": true,
|
|
"loading_observed": true,
|
|
"previous_body_absent_while_loading": true,
|
|
"query_sibling_preserved": true,
|
|
"final_agreement": true
|
|
},
|
|
"artifacts_sha256": {
|
|
"browser-observations.json": "d5dcd18f074b0f3e44e1b46eb9cf685f028b0f229957d35dc2330bedca5f0cbb",
|
|
"final-state.jpg": "5a9c94598776a9ddaf4bb1aed1c758f6d1c489c320f7a81ecb3acd0cb702760d"
|
|
},
|
|
"validator": {
|
|
"command": "python3 -c \"import hashlib,json,pathlib; root=pathlib.Path('.'); m=json.loads((root/'docs/evidence/issue-9-dashboard-menu-transition/manifest.json').read_text()); assert all(hashlib.sha256((root/p).read_bytes()).hexdigest()==h for p,h in m['source']['files_sha256'].items()); evidence=root/'docs/evidence/issue-9-dashboard-menu-transition'; assert all(hashlib.sha256((evidence/p).read_bytes()).hexdigest()==h for p,h in m['artifacts_sha256'].items()); d=json.loads((evidence/'browser-observations.json').read_text()); assert all(d['checks'].values()) and not d['document_load_events']; assert any(f['loading'] and not f['previous_body_visible'] for f in d['frames']); print('PASS source_hashes=5 artifact_hashes=2 checks=8/8 frames=%d full_document_loads=0' % len(d['frames']))\"",
|
|
"exit_code": 0,
|
|
"output": "PASS source_hashes=5 artifact_hashes=2 checks=8/8 frames=35 full_document_loads=0"
|
|
},
|
|
"limitations": [
|
|
"The browser run used only a generated synthetic SQLite fixture; no operating ledger data was used.",
|
|
"A fixture-only external module wrapper delayed the rules renderer by two seconds to expose the loading interval; repository source was not modified for the delay.",
|
|
"A temporary HTTPS ingress adapter normalized trusted proxy scheme and Host metadata; repository authentication and same-origin checks remained active.",
|
|
"The ephemeral tunnel URL in browser-observations.json is expired and is retained only as provenance.",
|
|
"Playwright same-document URL events are recorded separately from full document load events."
|
|
]
|
|
}
|