{ "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." ] }