Visus 부록 A — 최종 구조Visus Appendix A — Final architectureVisus Phụ lục A — Kiến trúc cuối cùng
A최종 구조 — 받은 질문에 대한 답 · Final architecture — answering the questions receivedKiến trúc cuối cùng — trả lời các câu hỏi đã nhận
이 부록은 본 문서와 섞지 않고 따로 둔다. 본 문서는 경위다 — 무엇을 시도했고 무엇이 왜 실패했는가. 이 부록은 명세다 — 지금 무엇이 있는가. 둘은 읽는 방식이 다르므로 한 곳에 두면 둘 다 나빠진다.
This appendix is kept separate from the main document on purpose. That document is a history — what was tried and why it failed. This one is a specification — what exists now. They are read differently, and merging them would damage both.
Phụ lục này được chủ ý tách riêng khỏi tài liệu chính. Tài liệu chính ghi lại lịch sử — đã thử gì, vì sao thất bại. Phụ lục là đặc tả — hiện có những gì. Hai tài liệu phục vụ cách đọc khác nhau; gộp lại sẽ làm cả hai kém rõ ràng.
「1. 프로젝트 Git 같은 리포지토리는 어딘가요? (코드 관련한 사항이 어디에, 어떻게 정리되어 있는지 알려주시길)
2. final version architecture 문서 정리 — 히스토리는 글이 많은데 그래서 final version architecture 문서가 필요해 보입니다. 어떤 모델로 segmentation 같은걸 하는지 어떤 flow로 end-to-end 진행되는건지.
Project Structure · Logic Architecture · 각 로직별로 사용된 Model들의 스팩과 지표 · Logic Flow · Serving Architecture」"1. Where is the project repository, and how is the code organised?
2. A final-version architecture document — the history is long, so a settled architecture document is needed: which model does things like segmentation, and what is the end-to-end flow.
Project Structure · Logic Architecture · the spec and the metrics of the models used by each logic · Logic Flow · Serving Architecture"“1. Kho mã của dự án ở đâu, mã nguồn được tổ chức như thế nào?
2. Cần tài liệu kiến trúc phiên bản cuối cùng — lịch sử khá dài, nên cần một tài liệu mô tả kiến trúc đã chốt: mô hình nào thực hiện phân đoạn, luồng xử lý từ đầu đến cuối ra sao.
Cấu trúc dự án · Kiến trúc xử lý · Thông số và chỉ số của mô hình ở từng bước · Luồng xử lý · Kiến trúc vận hành”
| 질문questioncâu hỏi | 답은 여기answered invị trí trả lời |
|---|---|
| 저장소는 어디인가 · 코드는 어떻게 정리되어 있나where the repository is, how the code is organisedkho mã ở đâu, mã nguồn được tổ chức thế nào | A1 저장소repositorieskho mã · A2 프로젝트 구조project structurecấu trúc dự án |
| Project StructureProject StructureCấu trúc dự án | A2 |
| Logic ArchitectureLogic ArchitectureKiến trúc xử lý | A3 |
| Logic Flow (end-to-end)Logic Flow (end-to-end)Luồng xử lý (từ đầu đến cuối) | A4 |
| 로직별 모델의 스펙과 지표model spec and metrics per logicthông số và chỉ số mô hình theo từng bước xử lý | A5 — segmentation 모델명·리비전 포함including the segmentation model and its revisionbao gồm tên và bản sửa đổi của mô hình phân đoạn |
| Serving ArchitectureServing ArchitectureKiến trúc vận hành | A6 |
stage가 최종이다. KB 접근이 종료되었으므로 prod(= KB가 보던 데모)는 동결된 과거이고, stage가 그 자리를 이어받는다. 두 환경은 한동안 나란히 있었고 구조가 다르다 — stage가 더 정리되어 있다. 이 부록이 기술하는 구조는 stage의 것이다. prod는 A6에 무엇이었는지만 적는다.
Stage is the final state. KB's access has ended, so prod — the demo KB was looking at — is a frozen past, and stage takes over from it. The two ran side by side for a while and their structure differs; stage is the more organised of the two. What this appendix describes is stage. prod appears in A6 only as what it was.
Stage là trạng thái cuối cùng. Quyền truy cập của KB đã kết thúc, nên prod — bản demo KB từng xem — đã đóng băng, và stage tiếp quản. Hai môi trường từng hoạt động song song và có cấu trúc khác nhau; stage được tổ chức tốt hơn. Phụ lục này mô tả stage. prod chỉ xuất hiện trong A6 để ghi lại trạng thái trước đây.
⚠️ 그리고 「최종」이 아닌 것은 최종이라고 적지 않는다. 확정되지 않았거나 레포 문서와 코드가 어긋나는 자리는 A7에 모아 두었다. 깨끗한 그림을 그리려고 사실이 아닌 것을 그리지는 않았다.
⚠️ And nothing is called final that is not. Where something is unsettled, or where the repository's own documents disagree with its code, it is collected in A7 rather than smoothed into a clean diagram.
⚠️ Điều gì chưa hoàn tất thì không được gọi là cuối cùng. Các điểm chưa chốt, hoặc chỗ tài liệu trong kho mã khác với mã nguồn, được tập hợp ở A7; không sửa thành một sơ đồ đẹp nhưng sai thực tế.
근거. 이 부록의 모든 경로·모델명·상수는 origin/stage의 코드를 직접 열어 확인했다(2026-10-27, HEAD 4b901f0). 지표는 전부 본 문서에서 가져왔고 각 행이 출처를 달고 있다. 확인하지 못한 것은 그렇게 적었다.
Provenance. Every path, model name and constant here was read directly from the code at origin/stage (2026-10-27, HEAD 4b901f0). Every metric comes from the main document and carries its source. What could not be verified says so.
Nguồn gốc bằng chứng. Mọi đường dẫn, tên mô hình và hằng số ở đây đều được đọc trực tiếp từ mã nguồn tại origin/stage (2026-10-27, HEAD 4b901f0). Mọi chỉ số lấy từ tài liệu chính, kèm nguồn. Điểm nào chưa xác minh đều được ghi rõ.
A1저장소 — 어디에, 무엇이 · Repositories — where, and what is in themKho mã — vị trí và nội dung
GitHub 조직 smt-privacy, 전부 비공개. 접근 권한은 조직 관리자가 준다. 아래 표에서 지금 돌아가는 것은 visus 하나이고, 나머지는 조상·연구·보조 저장소다.
GitHub organisation smt-privacy, all private. Access is granted by an organisation admin. Of the repositories below only visus is the running system; the rest are predecessors, research and support.
Tổ chức GitHub smt-privacy, tất cả đều riêng tư. Quản trị viên tổ chức cấp quyền truy cập. Trong các kho bên dưới, chỉ visus là hệ thống đang vận hành; phần còn lại là các thế hệ trước, nghiên cứu và công cụ hỗ trợ.
| 저장소repositorykho mã | 무엇인가what it isnội dung | 먼저 열 파일open this firstmở trước tiên |
|---|---|---|
| visus 운영liveđang vận hành | 제품 전체 — API · 워커 · 웹 · CV 서비스 · 책(인정기준) · 배포 코드the whole product — API, worker, web, CV service, the book, deploymenttoàn bộ sản phẩm — API, worker, web, dịch vụ CV, sách quy chuẩn, triển khai | docs/ARCHITECTURE.md |
| knia-api | 인정기준 크롤러 — visus/data/knia/를 만든다(도표 201 · 분쟁심의 결정문 2,460)the crawler that builds visus/data/knia/ — 201 charts, 2,460 dispute decisionstrình thu thập dữ liệu tạo visus/data/knia/ — 201 biểu đồ, 2,460 quyết định giải quyết tranh chấp | README.md |
| new-knia | 온톨로지·술어·리서치 16편 — 인쇄본 대조 감사가 여기 있다the ontology, the predicates and 16 research memos — the audit against the printed book lives hereontology, các vị từ và 16 bản ghi nhớ nghiên cứu — bản đối chiếu với sách in nằm ở đây | docs/audit-printed-standard.md |
| question-ledger | 규칙 엔진과 질문 원장(= ql-re)the rule engine and the question ledger (= ql-re)bộ máy quy tắc và sổ câu hỏi (= ql-re) | README.md |
| resolve-questions | 질문 집합을 자료구조로 — proposal/rules.v2.json(분기 284)the question set as a data structure — proposal/rules.v2.json, 284 branchestập câu hỏi dưới dạng cấu trúc dữ liệu — proposal/rules.v2.json, 284 nhánh | proposal/rules.v2.json |
| lense | 전임 CV 파이프라인 — 지금은 visus/vendor/lense/로 벤더링되어 있다(아래 A2)the predecessor CV pipeline — now vendored into visus/vendor/lense/ (see A2)quy trình CV thế hệ trước — hiện đã tích hợp vào visus/vendor/lense/ (xem A2) | vehicles/tracks.py |
| cv-processing | 라벨 말뭉치 688편과 타임라인 · 분할(splits_v2.jsonl)the 688-clip labelled corpus, its timelines and splitsbộ dữ liệu 688 video đã gán nhãn, các mốc thời gian và tập chia | splits_v2.jsonl |
| ams-1080 | 라벨링 UI와 정답 상자 — 상대차 채점의 정답the labelling UI and the ground-truth boxes used to score counterpart selectiongiao diện gán nhãn và các hộp chuẩn dùng để chấm việc chọn xe đối phương | README.md |
| vlm · vlm2 · acci-vlm · fault-lab · knia-dag · knia-analysis · hd-map · labeling · ams-demo-0 | 연구·조상 — 측정된 결론만 본 문서 8·9장에 정리되어 있다research and predecessors — their measured conclusions are in chapters 8 and 9 of the main documentnghiên cứu và các thế hệ trước — kết luận đã đo được nằm ở chương 8 và 9 của tài liệu chính | 본 문서 §8 · §9main document §8, §9tài liệu chính §8, §9 |
| ams-booth 신규newmới | 공개 부스 데모 — 별도 저장소이고 /booth/*로 연결된다(2026-10-26)the public booth demo — a separate repository, routed at /booth/* (2026-10-26)bản demo tại gian hàng công khai — một kho mã riêng, được định tuyến tại /booth/* (2026-10-26) | — |
| stage | 이것이 최종이자 진실이다. 모든 작업이 여기 들어오고, 여기서 측정된다. 마지막 커밋 2026-10-26this is the final state and the truth. All work lands and is measured here. Last commit 2026-10-26đây là trạng thái cuối cùng, nguồn sự thật. Mọi thay đổi được tích hợp và đo tại đây. Commit cuối 2026-10-26 |
| master | ⚠️ stage보다 178 커밋 뒤(2026-10-06에 멈춤). origin/HEAD가 이것을 가리키므로 gh repo clone은 기본으로 이 낡은 가지를 체크아웃한다 — 반드시 git checkout stage⚠️ 178 commits behind stage (stopped 2026-10-06). origin/HEAD points at it, so gh repo clone gives you the stale branch by default — always git checkout stage⚠️ chậm hơn stage 178 commit (dừng ở 2026-10-06). origin/HEAD trỏ đến nhánh này, nên gh repo clone mặc định lấy nhánh cũ — luôn chạy git checkout stage |
| prod/backend · prod/preview-web | 동결된 KB 데모가 올라가 있던 가지. 이어받을 코드는 여기가 아니다the branches the frozen KB demo ran from. Not the code to inheritcác nhánh từng chạy bản demo KB đã đóng băng. Không phải mã nguồn cần tiếp quản |
첫 명령 세 줄:
The first three commands:
Ba lệnh đầu tiên:
gh repo clone smt-privacy/visus && cd visus git checkout stage sed -n '1,120p' docs/ARCHITECTURE.md # 무엇이 있고 어떻게 맞물리는가 / what exists and how it fits
gh repo clone smt-privacy/visus && cd visus
git checkout stage
sed -n '1,120p' docs/ARCHITECTURE.md # có những gì, kết nối với nhau thế nàoA1.1코드 관련 자료가 정리되어 있는 곳 · Where the code-related material is written downNơi lưu tài liệu liên quan đến mã nguồn
전부 visus 저장소 안에 있다. 별도 위키나 공유 드라이브는 쓰지 않는다 — 문서가 코드와 같은 커밋에 들어간다는 것이 이 프로젝트의 규칙이었다.
All of it is inside the visus repository. There is no wiki and no shared drive — documentation lands in the same commit as the code, which was the rule here.
Tất cả nằm trong kho mã visus. Không có wiki hay ổ đĩa dùng chung — quy tắc của dự án là tài liệu được đưa vào cùng commit với mã nguồn.
| 파일filetệp | 무엇whatnội dung | 분량 · 상태size, statequy mô, trạng thái |
|---|---|---|
| docs/ARCHITECTURE.md | 구조와 오리엔테이션 — 도메인 10분 요약, 레포 맵, 사건 생애주기, 엔진 셋, 모델과 비용, 불변식architecture and orientation — the domain in ten minutes, repo map, case lifecycle, the three engines, models and cost, invariantskiến trúc và định hướng — lĩnh vực trong mười phút, sơ đồ kho mã, vòng đời hồ sơ, ba bộ máy xử lý, mô hình và chi phí, các bất biến | 752줄 · ⚠️ 헤더가 2026-09-23 검토로 찍혀 있고 일부가 낡았다(A7)752 lines · ⚠️ stamped last reviewed 2026-09-23, and parts have gone stale (A7)752 dòng · ⚠️ ghi lần rà soát cuối 2026-09-23, một số phần đã lỗi thời (A7) |
| docs/PLATFORM-v2.md | 플랫폼 명세 — 컨테이너·ECR·Terraform·ECS 풀·무상태 워크스페이스the platform spec — containers, ECR, Terraform, the ECS pools, stateless workspacesđặc tả nền tảng — container, ECR, Terraform, các nhóm ECS, không gian làm việc không lưu trạng thái | 644줄 · 현행644 lines · current644 dòng · hiện hành |
| docs/ENVIRONMENTS.md | 환경과 명령 — prod/stage 대조표, 배포·전력·풀 명령 전부environments and commands — the prod/stage table and every deploy, power and pool commandmôi trường và lệnh — bảng prod/stage, mọi lệnh triển khai, bật/tắt và quản lý nhóm tài nguyên | 70줄 · 현행(단, prod 종료 전 기준)70 lines · current, but written before prod was frozen70 dòng · hiện hành, nhưng được viết trước khi prod đóng băng |
| docs/DEPLOY.md | 배포 절차와 박스 설정the deployment procedure and box configurationquy trình triển khai và cấu hình máy chủ | 304줄304 lines304 dòng |
| docs/DESIGN.md · docs/OBJECTIVES.md · docs/FINDINGS.md | 설계 의도 · 목표와 제약 · 측정된 발견design intent, objectives and constraints, measured findingsý đồ thiết kế, mục tiêu và ràng buộc, các phát hiện qua đo lường | 125줄 외125 lines and others125 dòng và các tài liệu khác |
| DECISIONS.md | 결정 기록 V-D1…V-D27 — 무엇을 왜 골랐는가the decision log, V-D1…V-D27 — what was chosen and whynhật ký quyết định, V-D1…V-D27 — đã chọn gì, vì sao | 현행currenthiện hành |
| EXPERIMENTS.md | 실험 원장 E-V-001…E-V-036 — 돌리기 전에 행을 적는다the experiment ledger, E-V-001…E-V-036 — the row is written before the runsổ thí nghiệm, E-V-001…E-V-036 — ghi một dòng trước khi chạy | 현행currenthiện hành |
| docs/results/ | 실행 산출물(JSON) — 지표의 원자료run outputs in JSON — the raw material behind the metricskết quả chạy dạng JSON — dữ liệu gốc tạo nên các chỉ số | 196개 파일(docs/ 전체)196 files across docs/196 tệp trong docs/ |
| CLAUDE.md | 작업 규칙 — 용어, 보고 방식, 자격증명 취급the working rules — vocabulary, how to report, how credentials are handledquy tắc làm việc — thuật ngữ, cách báo cáo, cách quản lý thông tin xác thực | 현행currenthiện hành |
A2Project Structure — 저장소 안의 배치 · Project StructureCấu trúc dự án
하나의 파이썬 패키지와 하나의 Next.js 앱. 서비스로 쪼개지 않았다 — 책도, CV도, 판정도 같은 프로세스 안에 있거나(V-D18) 한 HTTP 홉 뒤에 있다. 아래는 origin/stage를 그대로 센 것이다.
One Python package and one Next.js app. It was not split into services — the book, the CV and the judge live in the same process (V-D18) or one HTTP hop away. The counts below are from origin/stage as it stands.
Một gói Python và một ứng dụng Next.js. Không tách thành nhiều dịch vụ — sách quy chuẩn, CV và bộ phán định nằm trong cùng tiến trình (V-D18) hoặc cách một lần gọi HTTP. Các số lượng dưới đây lấy từ trạng thái hiện tại của origin/stage.
| 디렉터리directorythư mục | 파일filessố tệp | 무엇whatnội dung |
|---|---|---|
| visus/ | 113 | 애플리케이션 전부 — 약 28,900줄의 파이썬the whole application — about 28,900 lines of Pythontoàn bộ ứng dụng — khoảng 28,900 dòng Python |
| web/ | 138 | Next.js 16 앱(web/src 98 파일)the Next.js 16 app (98 files under web/src)ứng dụng Next.js 16 (98 tệp trong web/src) |
| scripts/ | 98 | 측정·배포·운영 CLI(scripts/deploy 26)measurement, deployment and operations CLIs (26 under scripts/deploy)các CLI đo lường, triển khai và vận hành (26 tệp trong scripts/deploy) |
| tests/ | 97 | 95개 파이썬 테스트 파일95 Python test files95 tệp kiểm thử Python |
| docs/ | 196 | 명세·설계·실행 산출물(docs/results/)specs, design notes and run outputs (docs/results/)đặc tả, ghi chú thiết kế và kết quả chạy (docs/results/) |
| data/ | 101 | 책·정답셋·어휘 — 아래the book, the gold set, the vocabulary — belowsách quy chuẩn, tập chuẩn, bộ từ vựng — xem bên dưới |
| docker/ · infra/ | 7 · 20 | 이미지 4종 + Caddy · Terraform(부트스트랩·stage·풀 모듈)four images plus Caddy; Terraform for bootstrap, stage and the pool modulebốn image và Caddy; Terraform cho khởi tạo, stage và mô-đun nhóm tài nguyên |
A2.1애플리케이션 — visus/ · The applicationỨng dụng
visus/ api.py HTTP 표면 · 60 routes. 인증과 모양만, SQL 없음 the HTTP surface; auth and shape only, no SQL service.py 생애주기 전부 — API와 워커가 부르는 유일한 층 THE lifecycle layer; everything api and worker call worker.py 작업 루프: screen · analyze (FOR UPDATE SKIP LOCKED) the job loop db.py 31개 테이블의 DDL + one/all/exec DDL for 31 tables model.py 모든 모델을 부르는 하나의 클라이언트 ONE client for every model knia.py 책을 프로세스 안에서 (V-D18 — 서비스도 HTTP도 없다) the book, in-process decide.py 사실 → 후보 랭킹 (v1 경로) facts → ranked candidates (the v1 path) screening.py 범위 판정(라벨을 보지 않는다) scope triage, label-blind intake.py 원본 클립 → 실행 가능한 작업공간 raw clip → a runnable workspace free.py 엔진 v1 런타임 (에이전트 루프) engine v1 runtime chat.py 기존 사건 위의 채팅 턴 — 같은 도구, 같은 추적 a chat turn over an existing case engines/ v2.py (문장+책) · reader_tree.py (v3) · tree.py (책의 분류 트리) · condition_check.py … 8 files tools/ 에이전트의 도구 10종 — frames · zoom · chart_text · candidates · ego_timeline · impact_candidates … skills/ 방법을 글로 — 14편의 프롬프트가 도메인 판단을 담는다 method as text: 14 prompts cvsvc/ CV 서비스 — server.py · client.py · ops.py (GPU를 쥔 유일한 프로세스) the CV service vendor/lense/ 벤더링된 CV 체인 33파일 — vehicles/ (검출·추적·ReID·보닛) · motion/ (ego·lanes·approach) · impact/ (audio·motion peak) negotiation.py 협의 준비 원장 notice_ledger.py 고객 안내문 원장과 발행 activity.py 사건 타임라인 store.py 연구용 runs/sessions (별도 스키마) autoscale.py · ecs.py · weights.py · spend.py · pii.py · auth.py · routing.py …
visus/
api.py Giao diện HTTP · 60 route. Chỉ xác thực và hình dạng dữ liệu, không có SQL
service.py Toàn bộ vòng đời — lớp duy nhất được API và worker gọi
worker.py Vòng lặp tác vụ: screen · analyze (FOR UPDATE SKIP LOCKED)
db.py DDL của 31 bảng + one/all/exec
model.py Một client duy nhất cho mọi mô hình
knia.py Sách quy chuẩn trong tiến trình (V-D18 — không dịch vụ, không HTTP)
decide.py Dữ kiện → ứng viên xếp hạng (luồng v1)
screening.py Sàng lọc phạm vi, không xem nhãn
intake.py Video gốc → không gian làm việc chạy được
free.py Runtime bộ máy v1 (vòng lặp agent)
chat.py Một lượt chat trên hồ sơ hiện có — cùng công cụ, cùng theo dõi
engines/ v2.py (phát biểu+sách) · reader_tree.py (v3) · tree.py (cây phân loại của sách) · condition_check.py … 8 tệp
tools/ 10 công cụ agent — frames · zoom · chart_text · candidates · ego_timeline · impact_candidates …
skills/ Phương pháp bằng văn bản — 14 prompt chứa phán đoán theo lĩnh vực
cvsvc/ Dịch vụ CV — server.py · client.py · ops.py (tiến trình duy nhất giữ GPU)
vendor/lense/ Chuỗi CV tích hợp, 33 tệp — vehicles/ (phát hiện·theo dõi·ReID·ca-pô) · motion/ (ego·lanes·approach) · impact/ (audio·motion peak)
negotiation.py Sổ chuẩn bị thương lượng notice_ledger.py Sổ thông báo khách hàng và xuất bản
activity.py Dòng thời gian hồ sơ store.py runs/sessions nghiên cứu (schema riêng)
autoscale.py · ecs.py · weights.py · spend.py · pii.py · auth.py · routing.py …
① api.py는 SQL을 쓰지 않는다. 모든 생애주기 로직이 service.py 한 층에 있다 — 새 기능을 넣을 자리를 찾는다면 거기다. ② skills/는 코드가 아니라 글이다. 도메인 판단(어느 도표인지, 무엇을 근거로 삼는지)이 프롬프트로 적혀 있고, 모델을 바꿔도 그대로 쓰인다. ③ vendor/lense/는 복사본이 아니라 의존이다. 전임 CV 파이프라인을 저장소 안으로 들여왔고, tests/test_vendored_lense.py가 외부 ~/projects/lense를 쓰지 못하게 막는다.
① api.py contains no SQL. Every piece of lifecycle logic sits in one layer, service.py — that is where a new feature goes. ② skills/ is prose, not code. The domain judgement — which chart, what counts as evidence — is written as prompts and survives a change of model. ③ vendor/lense/ is a dependency, not a copy. The predecessor CV pipeline was brought inside the repository, and tests/test_vendored_lense.py stops anything reaching for an external ~/projects/lense.
① api.py không chứa SQL. Toàn bộ logic vòng đời nằm ở một lớp, service.py — tính năng mới được bổ sung tại đây. ② skills/ là văn bản, không phải mã nguồn. Phán đoán theo lĩnh vực — chọn biểu đồ nào, điều gì được tính là bằng chứng — được viết thành prompt, giữ nguyên khi đổi mô hình. ③ vendor/lense/ là phụ thuộc, không phải bản sao độc lập. Quy trình CV thế hệ trước được đưa vào kho mã; tests/test_vendored_lense.py ngăn mọi truy cập tới ~/projects/lense bên ngoài.
A2.2자료 — data/ · DataDữ liệu
| data/knia/ | 책 — charts.json 도표 201개(차대차 108 · 차대자전거 55 · 차대보행자 38), 분쟁심의 결정문 2,460건, 미디어 매니페스트. 차대차 108만 트리를 걷는다the book — charts.json with 201 charts (108 car↔car, 55 car↔bicycle, 38 car↔pedestrian) and 2,460 dispute decisions. Only the 108 car↔car charts are walkedsách quy chuẩn — charts.json có 201 biểu đồ (108 ô tô↔ô tô, 55 ô tô↔xe đạp, 38 ô tô↔người đi bộ) và 2,460 quyết định tranh chấp. Chỉ duyệt 108 biểu đồ ô tô↔ô tô |
| data/chart_table.tsv | 책을 납작하게 편 표 — 108행 · 7열, v1의 검색the book as a flat table — 108 rows, 7 columns; v1's retrievalsách dưới dạng bảng phẳng — 108 dòng, 7 cột; truy xuất của v1 |
| data/fact_vocab.json | 결정에 쓰이는 7개 사실의 통제 어휘the controlled vocabulary for the seven decision factsbộ từ vựng kiểm soát cho bảy dữ kiện quyết định |
| data/goldset/goldset.tsv | 273편(파일은 560행이나 중복) — 채점용 라벨셋273 clips (the file has 560 rows but they duplicate) — the labelled set used for scoring273 video (tệp có 560 dòng nhưng trùng lặp) — tập đã gán nhãn dùng để chấm điểm |
| data/cache/ · data/lab/ | 프레임·확대 캐시, CV 산출물 — git에 들어가지 않는다frame and zoom caches, CV outputs — git-ignoredbộ nhớ đệm khung hình và phóng to, đầu ra CV — được git bỏ qua |
A3Logic Architecture — 무엇이 무엇을 결정하는가 · Logic ArchitectureKiến trúc xử lý
시스템은 네 개의 결정을 순서대로 내린다. 각 결정은 자기 입력과 자기 실패 양식을 가지며, 앞 단계가 틀리면 뒤 단계는 복구하지 못한다 — 이것이 전체 구조를 이해하는 한 문장이다.
The system makes four decisions in order. Each has its own input and its own failure mode, and a later stage cannot recover from an earlier one being wrong — which is the one sentence that explains the whole shape.
Hệ thống đưa ra bốn quyết định theo thứ tự. Mỗi quyết định có đầu vào và kiểu lỗi riêng; bước sau không thể cứu được bước trước bị sai — câu này giải thích toàn bộ hình dạng hệ thống.
| 결정decisionquyết định | 코드codemã nguồn | 입력 → 출력in → outđầu vào → đầu ra | 틀리면when it is wrongkhi sai |
|---|---|---|---|
| 1 · 범위scopephạm vi | screening.py | 클립 + 사고개요 → 다룰 수 있는 사건인가clip + intake text → is this a case we can handlevideo + văn bản tiếp nhận → đây có phải hồ sơ có thể xử lý | 다룰 수 없는 영상에 자신 있는 답을 낸다a confident answer on footage that cannot carry onetrả lời tự tin trên video không đủ để kết luận |
| 2 · 사실factsdữ kiện | free.py · engines/v2.py · engines/reader_tree.py | 프레임 + 계측 → 진술 s1…sN(등급·근거 포함)frames + measurements → statements s1…sN, each with a tier and its evidencekhung hình + phép đo → các phát biểu s1…sN, mỗi phát biểu có cấp độ và bằng chứng | 여기가 천장이다 — 도표 하나가 사실 4~6개를 동시에 요구한다this is the ceiling — one chart needs four to six facts at onceđây là trần hiệu quả — một biểu đồ cần đồng thời bốn đến sáu dữ kiện |
| 3 · 도표chartbiểu đồ | engines/v2.judge · engines/tree.py | 진술 → 도표 + 역할(A/B) + 절 대조statements → a chart, a role binding and a clause tablecác phát biểu → biểu đồ, gán vai trò và bảng đối chiếu điều khoản | 사실이 비면 좁히지도 변별하지도 못한다with thin facts it neither narrows nor discriminatesdữ kiện ít thì không thu hẹp được và không phân biệt được |
| 4 · 비율과 문서ratio and documentstỷ lệ và tài liệu | negotiation.py · notice_ledger.py | 도표 → 협의 준비 원장 · 고객 안내문the chart → the negotiation ledger and the customer noticebiểu đồ → sổ thương lượng và thông báo khách hàng | 숫자를 코드가 통제한다 — 모델이 비율을 쓰지 않는다numbers are controlled by code; the model does not write a ratiomã nguồn kiểm soát con số; mô hình không tự viết tỷ lệ |
A3.1판독 엔진 셋 — 나란히, 측정됨 (V-D20) · Three reading engines, side by sideBa bộ máy phân tích đặt cạnh nhau
visus/engines/__init__.py에 등록되어 있고 분석마다·채팅마다 고를 수 있다. 기본값은 DEFAULT_ENGINE = "v3", 채팅은 CHAT_DEFAULT_ENGINE = "v2"(조사자의 문장을 책에 그대로 보내기 위해).
Registered in visus/engines/__init__.py and selectable per analysis and per chat. The defaults are DEFAULT_ENGINE = "v3" and CHAT_DEFAULT_ENGINE = "v2" — chat goes to v2 so the adjuster's own sentences reach the book verbatim.
Được đăng ký trong visus/engines/__init__.py và có thể chọn cho từng lần phân tích, từng cuộc trò chuyện. Mặc định là DEFAULT_ENGINE = "v3" và CHAT_DEFAULT_ENGINE = "v2" — chat dùng v2 để câu chữ nguyên văn của giám định viên đến được sách quy chuẩn.
| id | 접근approachcách tiếp cận | 코드 · 버전code and versionmã nguồn và phiên bản |
|---|---|---|
| v1 어휘+표 | 7개 사실을 통제 어휘로 채우고 → 납작한 표를 부드러운 랭커로 → 근거 판정fill seven facts from a controlled vocabulary, use the flat table as a soft ranker, then judge on evidenceđiền bảy dữ kiện từ bộ từ vựng kiểm soát, dùng bảng phẳng làm bộ xếp hạng mềm, rồi phán định theo bằng chứng | free.py + decide.py · 1.0.0 |
| v2 문장+책 읽기 | 근거가 붙은 진술을 쓰고 → 책 본문을 검색해 → 절 단위로 대조write statements with evidence, search the book's text, then fit clause by clauseviết các phát biểu có bằng chứng, tìm văn bản trong sách, rồi đối chiếu từng điều khoản | engines/v2.py · 2.0.0 |
| v3 트리 판독 기본tree reading defaultphân tích theo cây mặc định | 책의 질문을 책의 순서대로 묻고, CV 계측을 먼저 넣은 뒤, 판정은 v2의 것을 쓴다ask the book's questions in the book's order, with CV measurements first, over v2's judgehỏi câu hỏi của sách theo thứ tự trong sách, với phép đo CV đưa ra trước, trên bộ phán định của v2 | engines/reader_tree.py · 3.5.0-dev |
A3.2판정기 — v2.judge(v2와 v3가 함께 쓴다) · The judge, shared by v2 and v3Bộ phán định dùng chung cho v2 và v3
판정의 구조는 코드가 잡고, 그 안의 선택은 결정 모델이 한다. 그 모델이 typesafe/jev-1.13(Jev)이고, OpenRouter의 Decisions API로 불린다 — 선택지와 확률만 돌아오고 산문은 오지 않는다. 판독 1건에 decide 호출이 8~25회, 채팅 턴당 12~30회다.
The structure of the verdict is code; the choices inside it are made by a decision model. That model is typesafe/jev-1.13 (Jev), called through OpenRouter’s Decisions API — typed options with probabilities, no prose. A reading makes 8–25 decide calls; a chat turn makes 12–30.
Cấu trúc của kết luận là mã nguồn; các lựa chọn bên trong do mô hình quyết định thực hiện. Mô hình đó là typesafe/jev-1.13 (Jev), được gọi qua Decisions API của OpenRouter — các lựa chọn có kiểu dữ liệu, kèm xác suất, không có văn xuôi. Một lần phân tích thực hiện 8–25 lệnh decide; một lượt chat thực hiện 12–30.
1 search_charts(진술) → 상위 k개 후보 top-k candidates
2 engines/tree.py 의 트리 하강 단계마다 Jev decide 호출 → 잎의 형제가 후보 집합이 된다 a Jev decide call at each step
CONFIDENT_P = 0.6 · CONFIDENT_MARGIN = 0.2
↳ 못 넘으면 그 단계가 조사자에게 묻는 질문이 된다 (자식 노드가 선택 버튼)
↳ 역행하지 않는다 (no backtracking) — RESIDUAL 게이트(V-D21)가 「기타·특수」를 2차 패스로 미룬다
3 절 대조 (clause fit) Jev가 사고상황·적용범위의 각 절을 matched / contradicted / unknown 으로
↳ 모순이 하나도 없고 matched가 가장 많은 도표를 고른다. 동점이면 묻는다
4 역할 결속 (고객차 = A 인가 B 인가) 기각된 결속도 모순과 함께 접어서 화면에 남긴다 (절 대조)
1 search_charts(phát biểu) → top k ứng viên
2 Đi xuống cây trong engines/tree.py gọi Jev decide ở mỗi bước → các nút lá cùng cha tạo tập ứng viên
CONFIDENT_P = 0.6 · CONFIDENT_MARGIN = 0.2
↳ Nếu không vượt ngưỡng, bước đó thành câu hỏi dành cho người điều tra (nút con là nút lựa chọn)
↳ Không quay lui — cổng RESIDUAL (V-D21) để “khác·đặc biệt” sang lượt thứ hai
3 Đối chiếu điều khoản (clause fit) Jev đánh dấu mỗi điều khoản tình huống/phạm vi là matched / contradicted / unknown
↳ Chọn biểu đồ không có mâu thuẫn, có nhiều matched nhất. Hòa thì hỏi
4 Gán vai trò (xe khách hàng = A hay B) Vai trò bị loại vẫn hiển thị dạng thu gọn cùng mâu thuẫn (đối chiếu điều khoản)
| VISUS_JUDGE_MODEL | typesafe/jev-1.13으로 두면 모든 판정(분석·채팅·재도출)이 결정 모델로 간다. 비워 두면 그 사건의 채팅 모델이 판정한다 — 즉 판독 모델과 독립된 자리다(E-V-021)set to typesafe/jev-1.13, every judge — analysis, chat and re-derive — goes to the decision model. Left empty, the case’s chat model judges instead: it is a slot of its own, independent of the reader (E-V-021)khi đặt thành typesafe/jev-1.13, mọi phán định — phân tích, chat và suy ra lại — đều chuyển đến mô hình quyết định. Để trống thì mô hình chat của hồ sơ phán định: đây là vị trí riêng, độc lập với bộ phân tích (E-V-021) |
| VISUS_JUDGE_ESCALATE | 기본 켜짐. 확신이 낮은 판정은 채팅·분석 모델로 넘긴다default on: a low-confidence verdict is handed to the chat/analysis modelmặc định bật: kết luận có độ tin cậy thấp được chuyển đến mô hình chat/phân tích |
| Jev가 실제로 하는 일what Jev actually doesJev thực sự làm gì | 트리의 단계별 선택 · 절 대조표(matched / contradicted / unknown) · 역할 결속. 도표는 문서가 아니라 질문으로 도착한다 — 어떤 사건에서는 54개 조항을 배치 호출 3번으로the step choices in the tree, the clause table (matched / contradicted / unknown) and the role binding. The chart reaches it as questions, not as a document — in one case, 54 clauses in three batched callschọn nhánh ở mỗi bước trong cây, bảng đối chiếu điều khoản (matched / contradicted / unknown) và gán vai trò. Biểu đồ được đưa đến dưới dạng câu hỏi, không phải tài liệu — một hồ sơ có 54 điều khoản trong ba lệnh gọi theo lô |
⭐ 왜 이 구성인가 — E-V-022가 세 팔을 나란히 쟀다(조사자 문장 9세트, 채점 가능 8건): A. Jev + 에스컬레이션 ○6, 중앙값 1.9초(운영 구성) · B. 채팅 모델이 매 단계 ○5, 중앙값 54.8초(29배 느리고 비용 약 10배) · C. Jev 단독 ○4. 정확도를 가져오는 것은 에스컬레이션이고, 속도를 가져오는 것은 Jev다.
⭐ Why it is built this way — E-V-022 measured three arms side by side (nine sets of adjuster sentences, eight scorable): A. Jev with escalation, ○6, median 1.9 s (the production configuration); B. the chat model at every step, ○5, median 54.8 s — 29× slower at roughly ten times the cost; C. Jev alone, ○4. Escalation buys the accuracy; Jev buys the speed.
⭐ Vì sao thiết kế như vậy — E-V-022 đo ba phương án cạnh nhau (chín tập câu của giám định viên, tám tập chấm được): A. Jev có chuyển cấp, ○6, trung vị 1.9 s (cấu hình vận hành); B. mô hình chat ở mọi bước, ○5, trung vị 54.8 s — chậm hơn 29×, chi phí khoảng gấp mười; C. chỉ Jev, ○4. Chuyển cấp đem lại độ chính xác; Jev đem lại tốc độ.
🚨 그래서 Jev를 바꾸는 것은 모델 교체가 아니라 빠른 경로를 통째로 바꾸는 일이다. E-V-023이 그 대가를 쟀다 — 공개 모델에는 값싼 결정 모델이 없어서 전부 공개 스택으로 가면 중앙값 1.9초가 44~55초로, 25배 느려진다.
🚨 So replacing Jev is not swapping a model — it is replacing the fast path. E-V-023 measured what that costs: an open stack has no cheap decision model, and the median goes from 1.9 s to 44–55 s, about 25× slower.
🚨 Thay Jev vì thế không chỉ là đổi mô hình — mà là thay đường xử lý nhanh. E-V-023 đã đo chi phí: bộ mô hình mở không có mô hình quyết định giá rẻ, trung vị tăng từ 1.9 s lên 44–55 s, chậm hơn khoảng 25×.
⚠️ 짧게 끝나는 경로 둘: 진술이 2개 미만이고 조사자 입력도 없으면 묻는다. 조사자가 「사고가 영상에 없다」고 하면 판단 불가로 끝나고 그 사유가 적힌다.
⚠️ Two short circuits: fewer than two statements and no adjuster input → it asks. The adjuster saying the accident is not in the clip → 판단 불가, with that recorded as the reason.
⚠️ Hai nhánh xử lý sớm: ít hơn hai phát biểu, không có đầu vào của giám định viên → hệ thống hỏi. Giám định viên nói tai nạn không xuất hiện trong video → không thể phán định (판단 불가), đồng thời ghi nhận lý do này.
A3.3사실 원장 — 시스템 전체가 그 위에 세워져 있다 · The fact ledger everything turns onSổ dữ kiện làm nền cho toàn bộ hệ thống
모든 판독은 facts.jsonl에 진술을 쓴다. 각 줄은 id · 문장 · 등급(tier) · 근거(파일명) · 확신도 · 누가 썼는가를 들고 있고, id로 upsert된다 — 턴이 언급하지 않은 사실은 살아남는다.
Every reader writes statements into facts.jsonl. Each line carries an id, the sentence, a tier, its evidence (file names), a confidence and who wrote it, and is upserted by id — a turn that does not mention a fact does not erase it.
Mọi bộ phân tích ghi các phát biểu vào facts.jsonl. Mỗi dòng chứa ID, câu phát biểu, cấp độ, bằng chứng (tên tệp), độ tin cậy và tác giả, được thêm/cập nhật theo ID — lượt không nhắc tới một dữ kiện sẽ không xóa dữ kiện đó.
| 등급tiercấp độ | 뜻meaningý nghĩa |
|---|---|
| read | 모델이 영상에서 읽었다the model read it from the videomô hình đọc được từ video |
| measured | 도구가 쟀다(CV)a tool measured it (CV)công cụ đo được (CV) |
| confirmed | 조사자가 확인했다the adjuster confirmed itgiám định viên xác nhận |
| claimed | 보고서·진술에서 왔다it came from the report or a statementlấy từ báo cáo hoặc lời khai |
| undeterminable | 판단 불가 — 답이다판단 불가 — this is an answerKhông thể phán định (판단 불가) — đây là một câu trả lời |
| not_applicable | 해당 없음 — 역시 답이다해당 없음 — also an answerKhông áp dụng (해당 없음) — cũng là một câu trả lời |
⚠️ 불변식(V-D19): 기록은 덮어쓰지 않는다 — 판정이 바뀌면 새 행이 생기고 이전 행은 남는다. 사건 화면의 활동 기록이 그 위에서 만들어진다.
⚠️ The immutability rule (V-D19): records are not overwritten — a changed verdict makes a new row and the old one stays. The case's activity timeline is assembled from exactly that.
⚠️ Quy tắc bất biến (V-D19): không ghi đè bản ghi — thay đổi kết luận tạo một dòng mới, dòng cũ vẫn còn. Dòng thời gian hoạt động của hồ sơ được tổng hợp từ chính các dòng này.
A4Logic Flow — 업로드에서 판정까지 · Logic Flow, end to endLuồng xử lý từ đầu đến cuối
사건 하나가 지나가는 길 전부. 왼쪽이 코드, 오른쪽이 그 단계에서 디스크와 DB에 생기는 것이다.
The whole path of one case. The code is on the left; what appears on disk and in the database at each step is on the right.
Toàn bộ hành trình của một hồ sơ. Bên trái là mã nguồn; bên phải là dữ liệu xuất hiện trên ổ đĩa và trong cơ sở dữ liệu ở mỗi bước.
POST /clips (multipart)
└─ service.ingest_upload sha256 중복 제거 → clips 행 → cases 행 → `screen` 작업 적재
초기 보고가 있으면 조사자 진술 r1..rN 으로 쪼개 둔다
worker: run_screen ① 범위 결정
├─ S3에서 내려받기 → ffprobe
├─ 거절: 비디오가 아님 · 길이 > 180 s (MAX_DURATION_S) · 길이를 읽을 수 없음
├─ 브라우저가 못 여는 코덱이면 H.264 로 트랜스코드 → h264 버킷에 업로드
├─ clips.status = ready
└─ `analyze` 작업 적재 (사건의 엔진, 분석 기본 모델)
worker: run_analyze ② 사실 ③ 도표
├─ analyses 행 insert (running) → case.status = analyzing
├─ build_workspace() runs/scratch/<analysis_id>/ : clip · frames/ · grid.jpg · case.json
│ facts.jsonl 에 초기 보고 진술을 심어 둔다
├─ reader_for(engine) v1 free.run_case │ v2 v2.run_case │ v3 reader_tree.run_case
│ └─ 쓴다: facts.jsonl · chart.json · fit.json · notes.md · trace.jsonl
├─ ingest_analysis() 파일 → analysis_facts / analysis_trace / analyses (비용·토큰·이미지·턴 수)
├─ upload_assets() grid · frames · zoom → S3, analysis_assets 행
├─ analyses.status = done
├─ case.active_analysis_id = coalesce(기존, 이번) ← 첫 분석만 활성이 된다
└─ derive_verdict() 이번 분석이 활성일 때만 — 비교 실행이 화면을 움직이면 안 된다
화면 ④ 비율과 문서
├─ 사건 페이지가 2초마다 폴링 → 대기 → 검사 → 분석 → 판정 → 완료 (5단계 바)
├─ 채팅 턴 (chat.py, 기본 v2) 조사자의 문장이 진술이 되고, 도표가 다시 도출된다
├─ 협의 준비 (negotiation.py) 행마다 상태: off 제외 · potential 협의 중 · fixed 합의
└─ 고객 안내문 (notice_ledger.py) 블록 원장 → 발행 → 공개 링크 (회수 가능)
POST /clips (multipart)
└─ service.ingest_upload khử trùng sha256 → dòng clips → dòng cases → xếp tác vụ `screen`
nếu có báo cáo ban đầu, tách thành phát biểu giám định viên r1..rN
worker: run_screen ① Quyết định phạm vi
├─ Tải từ S3 → ffprobe
├─ Từ chối: không phải video · dài > 180 s (MAX_DURATION_S) · không đọc được thời lượng
├─ Codec trình duyệt không mở được thì chuyển mã H.264 → tải lên bucket h264
├─ clips.status = ready
└─ Xếp tác vụ `analyze` (bộ máy của hồ sơ, mô hình phân tích mặc định)
worker: run_analyze ② Dữ kiện ③ Biểu đồ
├─ insert dòng analyses (running) → case.status = analyzing
├─ build_workspace() runs/scratch/<analysis_id>/ : clip · frames/ · grid.jpg · case.json
│ đưa các phát biểu báo cáo ban đầu vào facts.jsonl
├─ reader_for(engine) v1 free.run_case │ v2 v2.run_case │ v3 reader_tree.run_case
│ └─ ghi: facts.jsonl · chart.json · fit.json · notes.md · trace.jsonl
├─ ingest_analysis() tệp → analysis_facts / analysis_trace / analyses (chi phí·token·ảnh·lượt)
├─ upload_assets() grid · frames · zoom → S3, dòng analysis_assets
├─ analyses.status = done
├─ case.active_analysis_id = coalesce(hiện có, lần này) ← chỉ phân tích đầu tiên được kích hoạt
└─ derive_verdict() chỉ khi phân tích này đang hoạt động — lượt so sánh không được đổi màn hình
Giao diện ④ Tỷ lệ và tài liệu
├─ Trang hồ sơ kiểm tra mỗi 2 giây → chờ → sàng lọc → phân tích → phán định → xong (thanh 5 bước)
├─ Lượt chat (chat.py, mặc định v2) lời giám định viên thành phát biểu, suy ra lại biểu đồ
├─ Thương lượng (negotiation.py) trạng thái từng dòng: off loại trừ · potential đang thương lượng · fixed đồng thuận
└─ Thông báo khách hàng (notice_ledger.py) sổ các khối → xuất bản → liên kết công khai (có thể thu hồi)
분석 행에 status=failed와 오류가 남고, 작업에도 남고, 루프는 계속된다. 걷다가 멈춘 판독도 돌아온다 — 그때까지의 진술은 적재되고 판정은 판단 불가가 되며, failed가 아니라 done으로 적힌다. 화면에는 읽은 데까지가 보인다.
The analysis row gets status=failed with the error, so does the job, and the loop continues. A reader that stopped mid-walk still returns — its partial statements are ingested and the verdict becomes 판단 불가, marked done, not failed, so the screen shows what was read.
Dòng phân tích nhận status=failed kèm lỗi, công việc cũng vậy, rồi vòng lặp tiếp tục. Bộ phân tích dừng giữa chừng vẫn trả kết quả — các phát biểu từng phần được nạp vào, kết luận thành không thể phán định (판단 불가), được đánh dấu done, không phải failed, để màn hình hiển thị phần đã đọc.
A4.1v3의 판독 순서 — 「어떤 flow로 end-to-end 진행되는가」의 답 · v3's reading order — the end-to-end flow inside the readerThứ tự phân tích của v3 — luồng bên trong bộ phân tích
v3는 자유롭게 도는 에이전트가 아니다. 런타임이 책의 분류 트리를 본뜬 고정 순서로 몰고, 단계마다 필요한 이미지를 보내며, 모델은 단계당 JSON 하나로 답한다.
v3 is not a free-running agent. The runtime drives a fixed order that mirrors the book's classification tree, sends the images each step needs, and the model answers one JSON per step.
v3 không phải agent chạy tự do. Runtime điều khiển thứ tự cố định theo cây phân loại của sách, gửi các ảnh cần cho từng bước; mô hình trả một JSON ở mỗi bước.
0 · 계측 CV가 먼저 — ego_heading · other_path. 모델 호출 없음
tracks 는 배경 스레드로 시작해 step 4 전에 합류한다 (예산: 180 s 바닥, 최대 600 s)
1 · 장면 장소 종류와 신호 — grid.jpg + 넓은 프레임 2~3장 (WIDE_PX = 1280)
2 · 충돌 순간 grid 에서 위치를 잡고 → −2.0 s … +0.5 s 를 0.2 s 간격 연속열로 읽는다
3 · 고객차 기동 연속열 + 접근 프레임. 헤딩 계측과 맞춰 본다
↳ 계측이 ≥ 30°(TURN_MIN_DEG) 회전인데 모델이 「직진」이면 한 번 되돌린다
4 · 상대차 첫 등장 · 상대 운동 · 기동 · 진입/진출 · 선행/후행
5 · 카메라 전방인가 후방인가 — 후방이면 좌/우와 앞/뒤가 규칙으로 뒤집힌다
6 · 진술 s1..sN 을 v2 의 모양으로 — 각 진술에 등급과 근거 파일명
↓ v2.judge (A3.2) → 도표 · 역할 · 절 대조 → derive_verdict()
0 · Đo lường CV chạy trước — ego_heading · other_path. Không gọi mô hình
tracks bắt đầu trên luồng nền, nhập kết quả trước bước 4 (ngân sách: tối thiểu 180 s, tối đa 600 s)
1 · Bối cảnh Loại địa điểm và tín hiệu — grid.jpg + 2~3 khung hình rộng (WIDE_PX = 1280)
2 · Lúc va chạm Định vị trên grid → đọc chuỗi từ −2.0 s … +0.5 s với bước 0.2 s
3 · Xe khách hàng Chuỗi khung hình + khung tiếp cận. Đối chiếu phép đo hướng
↳ Phép đo xoay ≥ 30° (TURN_MIN_DEG) nhưng mô hình nói “đi thẳng” thì yêu cầu xét lại một lần
4 · Xe đối phương Lần đầu xuất hiện · chuyển động tương đối · thao tác lái · vào/ra · trước/sau
5 · Camera Trước hay sau — nếu sau, đảo trái/phải và trước/sau theo quy tắc
6 · Phát biểu s1..sN theo định dạng v2 — mỗi phát biểu có cấp độ và tên tệp bằng chứng
↓ v2.judge (A3.2) → Biểu đồ · Vai trò · Đối chiếu điều khoản → derive_verdict()
⭐ 계측은 힌트가 아니라 「모델이 맞춰야 할 선언된 전제」다. 이것이 v1·v2와 v3를 가르는 설계 차이다 — v1은 도구를 부를 수 있었고, v3는 도구의 답을 먼저 책상에 올려놓는다. 그리고 걷는 중 예외가 나면 앞 단계의 답을 진술로 쓰고 판단 불가를 붙인다 — 잃지 않는다.
⭐ A measurement is a stated prior the model must reconcile with, not a hint. That is the design difference between v3 and its predecessors: v1 could call a tool, while v3 puts the tool's answer on the table first. And an exception at any step writes the earlier answers as statements plus 판단 불가 rather than losing them.
⭐ Phép đo là thông tin tiên nghiệm được nêu rõ để mô hình đối chiếu, không chỉ là gợi ý. Đây là khác biệt thiết kế của v3 so với các thế hệ trước: v1 có thể gọi công cụ, còn v3 đặt sẵn câu trả lời của công cụ lên bàn. Ngoại lệ ở bất kỳ bước nào cũng ghi các câu trả lời trước đó thành phát biểu, kèm không thể phán định (판단 불가), tránh mất kết quả.
A4.2채팅 턴 — 조사자가 사건을 고치는 길 · The chat turn — how an adjuster edits a caseLượt chat — cách giám định viên sửa hồ sơ
조사자 문장 → chat.py (기본 엔진 v2) ① 이 말이 대기 중인 질문에 대한 답인가? 메시지만 보고 판단한다 (앞 문맥으로 끌어오지 않는다) ② 답이라면 어느 선택지인가? 이번에는 앞선 진술과 함께 읽는다 ③ 조사자의 말을 원문 그대로 진술로 기록 who = adjuster-said, 충돌하는 판독 진술은 철회 ④ 답은 어떻게 읽었는지부터 말한다 「…에 대한 답을 「예」로 읽어 기록했습니다」 ⑤ 도표를 다시 도출한다 chart.json 을 직접 쓰지 않는다 — 사실이 바뀌면 도표가 따라온다
Lời giám định viên → chat.py (bộ máy mặc định v2)
① Có phải câu trả lời cho câu hỏi đang chờ? Chỉ xét tin nhắn, không kéo ngữ cảnh trước vào
② Nếu đúng, thuộc lựa chọn nào? Lần này đọc cùng các phát biểu trước
③ Ghi nguyên văn lời giám định viên làm phát biểu who = adjuster-said, rút lại phát biểu phân tích mâu thuẫn
④ Câu trả lời nói đã hiểu thế nào trước tiên “Đã hiểu câu trả lời cho … là ‘có’ và ghi nhận”
⑤ Suy ra lại biểu đồ Không viết trực tiếp chart.json — dữ kiện đổi, biểu đồ đổi theo
⚠️ 규칙 하나가 이 설계를 지탱한다: 모델은 chart.json을 쓰지 않는다. 사실을 바꾸면 시스템이 규칙과 판정으로 도표를 도출한다 — 「조사자를 기쁘게 하려고 도표가 정해지지 않는다」.
⚠️ One rule holds this design up: the model never writes chart.json. Change the facts and the system derives the chart through its rules and its judge — "the chart is not settled in order to please the investigator."
⚠️ Một quy tắc nâng đỡ thiết kế này: mô hình không bao giờ viết chart.json. Thay đổi dữ kiện, hệ thống suy ra biểu đồ qua quy tắc và bộ phán định — “không chốt biểu đồ chỉ để làm hài lòng người điều tra.”
A5로직별 모델 — 스펙과 지표 · The model behind each logic — spec and metricsMô hình cho từng bước xử lý — thông số và chỉ số
모델은 세 자리에 있다. ① 판독 모델(상용 VLM, OpenRouter 경유) ② 판정 모델(결정 모델 Jev — 판독 모델과 별도의 자리다) ③ CV 모델 셋(GPU에서 돌아가는 분할·검출·재식별). 판정의 구조는 코드이고, 그 안의 선택이 ②다.
Models sit in three slots. ① the reading model (a commercial VLM through OpenRouter), ② the judge (the decision model Jev, a slot of its own, separate from the reader) and ③ three CV models (segmentation, detection and re-identification, on the GPU). The structure of the verdict is code; the choices inside it are ②.
Các mô hình nằm ở ba vị trí. ① mô hình phân tích (VLM thương mại qua OpenRouter), ② bộ phán định (mô hình quyết định Jev, vị trí riêng, tách khỏi bộ phân tích) và ③ ba mô hình CV (phân đoạn, phát hiện và tái định danh trên GPU). Cấu trúc của kết luận là mã nguồn; các lựa chọn bên trong do ② thực hiện.
A5.1판독 모델 — 영상을 읽는 것 · The reading modelMô hình phân tích
| 모델modelmô hình | anthropic/claude-opus-5.5 — service.ANALYSIS_DEFAULT_MODEL(분석)과 DEFAULT_MODEL(채팅·원장)이 같은 값— both ANALYSIS_DEFAULT_MODEL and DEFAULT_MODEL in service.py, the same value— cả ANALYSIS_DEFAULT_MODEL và DEFAULT_MODEL trong service.py, cùng một giá trị |
| 경유viathông qua | OpenRouter. 모델을 부르는 코드는 visus/model.py 하나뿐이고 표준 라이브러리 urllib만 쓴다OpenRouter. visus/model.py is the only code that calls a model, and it uses stdlib urllib onlyOpenRouter. visus/model.py là phần mã duy nhất gọi mô hình, chỉ sử dụng urllib của thư viện chuẩn |
| 두 가지 호출two call shapeshai dạng gọi | chat() — 글을 받는다(usage·캐시 토큰·라우팅된 제공자·이미지 수를 함께)— prose back, with usage, cached tokens, the routed provider and image counts— trả văn bản, kèm mức sử dụng, token được lưu đệm, nhà cung cấp được định tuyến và số ảnh · decide() — OpenRouter Decisions API, 선택지와 확률만 받는다. 트리 하강과 여러 판정이 이쪽이고 산문은 오지 않는다— the OpenRouter Decisions API: typed choices with probabilities. The tree walk and several judges use this, and no prose comes back— OpenRouter Decisions API: lựa chọn có kiểu dữ liệu kèm xác suất. Quá trình duyệt cây và một số bộ phán định dùng cách này, không trả văn xuôi |
| 입력inputđầu vào | grid.jpg + 0.5초 간격 프레임. 충돌 구간은 −2.0 s … +0.5 s 를 0.2 s 간격. 장면 단계 프레임은 1280 px 전폭(섬·차선 호·표지가 살아남도록)grid.jpg plus frames at 0.5 s. The impact window is read at 0.2 s from −2.0 s to +0.5 s. The scene step gets full-width 1280 px frames so islands, lane arcs and signs survivegrid.jpg cùng khung hình cách nhau 0.5 s. Vùng thời gian va chạm được đọc với bước 0.2 s từ −2.0 s đến +0.5 s. Bước đọc bối cảnh nhận các khung hình rộng đủ 1280 px để giữ đảo giao thông, đường cong làn và biển báo |
| 예산budgetngân sách | STEP_MAX_TOKENS = 4000 · STATEMENTS_MAX_TOKENS = 4000 · 추론 예산 기본 4000reasoning budget default 4000ngân sách suy luận mặc định 4000 |
| 신뢰성reliabilityđộ tin cậy | 429/5xx에 지수 후퇴로 5회 재시도 · 240초 타임아웃 · 빈 응답이면 max_tokens를 늘려 재시도(finish_reason == "length"일 때) — 한 모델이 하룻밤에 다섯 번 중간에 빈 응답을 냈고 200토큰 상한이 잘랐던 일이 있다5 attempts with exponential backoff on 429/5xx, a 240 s timeout, and an empty-response retry that grows max_tokens when finish_reason == "length" — one model returned empty mid-run five times in a night, and a 200-token cap had cut it off5 lần thử, tăng thời gian chờ theo cấp số nhân khi gặp 429/5xx, timeout 240 s, và thử lại phản hồi rỗng bằng cách tăng max_tokens khi finish_reason == "length" — một mô hình từng trả rỗng giữa chừng năm lần trong một đêm do trần 200 token đã cắt mất phản hồi |
| 제공자 고정provider pinningcố định nhà cung cấp | 라우팅을 고정하고 폴백을 끌 수 있다. 이유는 측정이다 — E-V-007: 같은 이미지를 두 제공자가 한 실행 안에서 3,672 대 2,570 토큰으로 셌다. 고정하지 않은 비교는 같은 조건이 아니다routing can be pinned with fallbacks off, for a measured reason: E-V-007 found the same image tokenised 3,672 against 2,570 by two providers inside one run. An unpinned comparison is not like for likecó thể cố định tuyến, tắt phương án dự phòng, vì lý do đã đo: E-V-007 thấy cùng một ảnh bị tính thành 3,672 và 2,570 token bởi hai nhà cung cấp trong một lần chạy. So sánh không cố định nhà cung cấp không giữ cùng điều kiện |
| 캐싱cachinglưu đệm | Anthropic 모델에 프롬프트 캐시를 명시적으로 표시(시스템 프롬프트 + 최신 사용자 메시지) → 25턴 사건에서 입력 비용이 3~5배 내려간다prompt caching is marked explicitly for Anthropic models (system prompt plus newest user message), which drops the input bill 3–5× on a 25-turn caselưu đệm prompt được đánh dấu rõ ràng cho mô hình Anthropic (system prompt và tin nhắn người dùng mới nhất), giảm chi phí đầu vào 3–5× trên hồ sơ 25 lượt |
지표 — KB 실제 사건 300건, 블라인드, KB가 접수한 도표를 정답으로 엄격 채점.
Metrics — 300 real KB cases, blind, scored strictly against the chart KB itself filed.
Chỉ số — 300 hồ sơ KB thật, chấm mù, đối chiếu nghiêm ngặt với biểu đồ do chính KB ghi nhận.
| 무엇whatchỉ số | 값valuegiá trị | 반드시 함께 말할 것what must be said with itđiều kiện phải nêu kèm |
|---|---|---|
| 도표 일치 (top-1)chart match, top-1khớp biểu đồ, top-1 | 209 / 300 = 69.7% | 이것이 엄격 채점이다. 위의 모든 숫자에는 「무엇을 제외했는가」가 붙는다this is the strict figure; every number above it carries an exclusionđây là con số nghiêm ngặt; mọi con số cao hơn đều có loại trừ |
| 상위 5 후보 안chart in top 5biểu đồ nằm trong top 5 | 238 / 300 = 79.3% | 제품이 후보를 보여 주므로 조사자가 겪는 수치에 가깝다the product shows candidates, so this is closer to what an adjuster experiencessản phẩm hiển thị ứng viên, nên chỉ số này gần trải nghiệm giám định viên hơn |
| 기본 과실 일치base ratio matchkhớp tỷ lệ cơ sở | 219 / 300 = 73.0% | 도표가 달라도 비율이 같을 수 있다a different chart can give the same ratiobiểu đồ khác vẫn có thể cho cùng tỷ lệ |
| 사정사 재검토 기준re-scored by adjustersgiám định viên chấm lại | 76.7 – 86.7% | ⚠️ 불일치 91건을 두 사정사가 각각 검토한 결과다. 엄격 채점과 섞어 말하지 말 것⚠️ two adjusters reviewed all 91 mismatches independently. Do not mix this with the strict figure⚠️ hai giám định viên độc lập xem lại cả 91 trường hợp lệch. Không trộn con số này với chỉ số nghiêm ngặt |
| 영상만(보고서 없이)video only, without the reportchỉ video, không có báo cáo | 26.3% | 86건이 판정에 이르지 못한다86 cases reach no verdict at all86 hồ sơ không có kết luận nào |
| 보고서만(영상 없이)report only, without the videochỉ báo cáo, không có video | 192 / 300 = 64.0% | 🚨 영상 체인 전체의 측정된 기여는 +17건(5.7포인트)이다. 이 두 줄은 함께 읽어야 한다🚨 the measured contribution of the entire video chain is +17 cases, 5.7 points. The two rows belong together🚨 đóng góp đo được của toàn bộ chuỗi video là +17 hồ sơ, 5.7 điểm phần trăm. Hai dòng này phải đọc cùng nhau |
| 범위 — 다룰 수 있는 입력scope — handleable inputphạm vi — đầu vào xử lý được | 약 56%about 56%khoảng 56% | KB 접수분 50건을 눈으로 선별한 결과, 전방 블랙박스 차대차는 절반 남짓이다eye-screening 50 KB intakes: only about half are front-dashcam car-to-carxem thủ công 50 hồ sơ KB tiếp nhận: chỉ khoảng một nửa là camera hành trình trước, ô tô va chạm ô tô |
⭐ 천장이 왜 거기인지도 측정되어 있다. 도표 하나는 사실 4~6개가 함께 결정하고, 판독기는 각각을 55~85%로 맞힌다. 다섯 개가 각각 80%라도 0.8⁵ ≈ 33%다. 직접적인 증거도 있다 — 기동을 맞힌 경우에도 도표는 58%에서 여전히 틀렸다(다른 사실이 틀려서). 그래서 사실 하나짜리 도구로는 top-1이 움직이지 않는다.
⭐ Why the ceiling sits there is measured too. A chart is decided by four to six facts together, and the reader gets each right 55–85% of the time; even 80% on five gives 0.8⁵ ≈ 33%. The direct evidence: when the manoeuvre was right, the chart was still wrong 58% of the time, because a different fact was wrong. So a single-fact instrument cannot move top-1.
⭐ Nguyên nhân của trần hiệu quả cũng đã được đo. Một biểu đồ được quyết định bởi đồng thời bốn đến sáu dữ kiện; bộ phân tích đọc đúng từng dữ kiện 55–85%; ngay cả mức 80% cho năm dữ kiện cũng chỉ cho 0.8⁵ ≈ 33%. Bằng chứng trực tiếp: khi đọc đúng thao tác lái, biểu đồ vẫn sai 58% số lần, vì dữ kiện khác sai. Vì vậy công cụ đo một dữ kiện không thể làm thay đổi top-1.
A5.2판독 모델을 바꾸면 — 같은 300건, 나머지 전부 동일 · Swapping the reading model, same 300 casesĐổi mô hình phân tích trên cùng 300 hồ sơ
| 판독 모델reading modelmô hình phân tích | 운영 방식how it runscách chạy | 도표 일치chart matchkhớp biểu đồ | 건당per casemỗi hồ sơ |
|---|---|---|---|
| Claude Opus 5.5 | 상용 · 외부 APIcommercial, external APIthương mại, API bên ngoài | 69.7% | 620원620 KRW |
| Kimi K3 | 공개 · 다중 GPUopen, multi-GPUmở, nhiều GPU | 62.0% | 390원390 KRW |
| Gemma 4 31B | 공개 · GPU 1장open, a single GPUmở, một GPU | 56.3% | 14원14 KRW |
| Qwen3.8-27B | 공개 · GPU 1장open, a single GPUmở, một GPU | 55.3% | 100원100 KRW |
⚠️ 기준선 행을 조심해서 읽을 것. 세 공개 모델은 각각 한 번의 통제된 배치이고 건별 CSV가 커밋되어 있다. 그런데 69.7%는 그런 배치가 아니라 어느 시점에 각 사건이 들고 있던 활성 분석을 모은 것이고, 그 기간에 판독 모델이 바뀌었다. 비율(80~90%)은 분자가 깨끗하므로 방향으로는 유효하다.
⚠️ Read the baseline row with care. The three open models are each one controlled batch with committed per-case data. The 69.7% is not: it is whatever active analysis each case happened to hold at the time, accumulated across a change of reading model. The ratios (80–90%) remain valid as a direction, since the numerators are clean.
⚠️ Đọc dòng cơ sở cẩn thận. Mỗi mô hình mở là một lô có kiểm soát, dữ liệu từng hồ sơ đã commit. Con số 69.7% thì khác: đó là phân tích đang hoạt động mà mỗi hồ sơ tình cờ có lúc đo, tích lũy qua một lần đổi mô hình phân tích. Tỷ lệ so sánh (80–90%) vẫn cho thấy xu hướng, vì các tử số là sạch.
A5.2b판정 모델 — Jev · The judge model — JevMô hình phán định — Jev
| 모델modelmô hình | typesafe/jev-1.13 — 「System One」 결정 모델. VISUS_JUDGE_MODEL으로 지정한다— a "System One" decision model, named in VISUS_JUDGE_MODEL— mô hình quyết định “Hệ thống Một”, được đặt trong VISUS_JUDGE_MODEL |
| 호출calllệnh gọi | Model.decide(state, questions) → OpenRouter Decisions API(alpha). 질문 유형은 choice · noul · score이고 확률이 함께 온다. 25초 타임아웃에 재시도 1회 — 「결정은 1초 미만이다. 멈춰 있다면 그것은 기다릴 일이 아니라 공급자 쪽 문제다」→ the OpenRouter Decisions API (alpha). Question types are choice, noul and score, and probabilities come back with the answers. A 25 s timeout with one retry — "a decision is sub-second; a stall is a vendor problem, not something to wait out"→ Decisions API của OpenRouter (alpha). Các kiểu câu hỏi là choice, noul và score; xác suất được trả cùng câu trả lời. Timeout 25 s, thử lại một lần — “một quyết định mất chưa tới một giây; bị treo là lỗi nhà cung cấp, không đáng ngồi chờ” |
| 맡는 일what it decidesquyết định gì | 트리의 단계별 선택 · 절 대조표 · 역할 결속the tree's step choices, the clause table and the role bindinglựa chọn ở mỗi bước của cây, bảng đối chiếu điều khoản và gán vai trò |
| 호출량volumesố lượt gọi | 판독 1건에 8~25회 · 채팅 턴당 12~30회8–25 per reading, 12–30 per chat turn8–25 cho một lần phân tích, 12–30 cho một lượt chat |
| 지표metricschỉ số | E-V-022(8건 채점): Jev + 에스컬레이션 ○6 · 중앙값 1.9초 · 채팅 모델이 매 단계 ○5 · 54.8초 · Jev 단독 ○4. E-V-023: 공개 스택에는 값싼 결정 모델이 없어 25배 느려진다E-V-022, eight scorable: Jev with escalation ○6 at a median of 1.9 s; the chat model at every step ○5 at 54.8 s; Jev alone ○4. E-V-023: an open stack has no cheap decision model and runs 25× slowerE-V-022, tám tập chấm được: Jev có chuyển cấp ○6, trung vị 1.9 s; mô hình chat ở mọi bước ○5, 54.8 s; chỉ Jev ○4. E-V-023: bộ mô hình mở không có mô hình quyết định giá rẻ, chạy chậm hơn 25× |
| 알려진 공백known gaphạn chế đã biết | ⚠️ 바꾸어 말한 문장을 조항에 잘 붙이지 못한다(E-V-021의 「paraphrase gap」) — 조사자가 조항과 다른 말로 같은 사실을 말하면 그 절이 unknown으로 남는다. 지금은 턴마다 질문 하나로 메운다⚠️ it attaches a paraphrase to the clause it answers poorly (E-V-021's "paraphrase gap") — when an adjuster states a fact in words unlike the clause's, that clause stays unknown. It is covered today by asking one question per turn⚠️ khả năng gắn câu diễn đạt lại vào điều khoản tương ứng còn kém (“khoảng trống diễn đạt lại” của E-V-021) — khi giám định viên dùng từ khác với điều khoản, điều khoản đó vẫn là unknown. Hiện xử lý bằng cách hỏi một câu mỗi lượt |
A5.3CV 모델 셋 — 「어떤 모델로 segmentation 을 하는가」 · The three CV models — which model does the segmentationBa mô hình CV — mô hình nào thực hiện phân đoạn
하나의 프로세스(visus/cvsvc)만 GPU를 쥔다. 아래는 실제 적재 기록에서 그대로 가져온 값이다(프로파일 exact, cuda:0).
Only one process (visus/cvsvc) holds the GPU. The values below are taken from an actual load record (profile exact, cuda:0).
Chỉ một tiến trình (visus/cvsvc) giữ GPU. Các giá trị dưới đây lấy từ bản ghi nạp thực tế (profile exact, cuda:0).
| 역할rolevai trò | 모델 · 가중치model / weightsmô hình / trọng số | 스펙specthông số | 적재loadkhi nạp |
|---|---|---|---|
| 분할 (자차 보닛 마스크)segmentation — the ego hood maskphân đoạn — mặt nạ nắp ca-pô xe gắn camera | facebook/mask2former-swin-large-mapillary-vistas-semantic revision 4772b6bf101d91f2534c106dc524d906aeb3c68a | Mask2Former · Swin-Large 백본 · Mapillary Vistas 시맨틱. 자차의 전면 경계(hood_row_at_axis)를 찾는 데 쓴다Mask2Former with a Swin-Large backbone, Mapillary Vistas semantic. Used to find the ego car's front edge (hood_row_at_axis)Mask2Former với backbone Swin-Large, phân đoạn ngữ nghĩa Mapillary Vistas. Dùng để tìm mép trước xe gắn camera (hood_row_at_axis) | 4.8 s |
| 검출detectionphát hiện | yolo26x.pt | imgsz 1280 · half precision(fp16)half precision (fp16)độ chính xác một nửa (fp16) | 0.6 s |
| 재식별 · 연결re-identification and linkingtái định danh và nối theo dõi | yolo26x-reid.onnx | ONNX 재식별기. 추적기는 BoT-SORT이고 추적기 자체의 ReID는 꺼져 있다 — 연결은 이 ONNX가 한다an ONNX re-identifier. The tracker is BoT-SORT with its own ReID switched off; the linking is done by this modelmô hình tái định danh ONNX. Bộ theo dõi là BoT-SORT, tắt ReID riêng; mô hình này thực hiện việc nối | 0.7 s |
| 장치devicethiết bị | T4 (15.64 GB). 세 모델 적재 후 장치 사용 1.31 GB, 프로세스 할당 0.87 GBa T4 (15.64 GB). With all three loaded, 1.31 GB in use on the device and 0.87 GB allocated in-processT4 (15.64 GB). Khi nạp cả ba, thiết bị dùng 1.31 GB, tiến trình cấp phát 0.87 GB |
| 처리량throughputthông lượng | tracks는 영상 1초당 약 2.48초(박스에서 단독 실행). 요청 마감은 VISUS_CV_TRACKS_S_PER_VIDEO_S=3으로 잡아, 판독기의 180초 예산을 넘겨 기다리지 않게 한다tracks runs at about 2.48 s per second of video alone on the box. Each request's deadline is sized from VISUS_CV_TRACKS_S_PER_VIDEO_S=3 so it never waits past what the reader's 180 s budget can still usetracks chạy riêng trên máy mất khoảng 2.48 s cho mỗi giây video. Hạn chót mỗi yêu cầu được tính từ VISUS_CV_TRACKS_S_PER_VIDEO_S=3, để không chờ quá khoảng mà ngân sách 180 s của bộ phân tích còn dùng được |
| 프로파일profileprofile | exact (VISUS_TRACKS_PROFILE). 서비스와 로컬 실행의 동등성은 scripts/cv_parity.py가 확인한다(VISUS_TRACKS_PROFILE). Parity between the service and a local run is checked by scripts/cv_parity.py(VISUS_TRACKS_PROFILE). scripts/cv_parity.py kiểm tra tính tương đương giữa dịch vụ và lần chạy cục bộ |
A5.4CV가 내는 사실 — 각각의 지표 · The facts CV produces, and what each scoresCác dữ kiện CV tạo ra và điểm số từng loại
| 사실factdữ kiện | 방법methodphương pháp | 측정된 값measuredkết quả đo |
|---|---|---|
| 상대차 선택counterpart selectionchọn xe đối phương | 접촉 전 1.5초의 상자 크기 적분 + 후보 목록integrated box size over the 1.5 s before contact, plus a candidate listkích thước hộp tích lũy trong 1.5 s trước tiếp xúc, kèm danh sách ứng viên | E-V-034(라벨 상자를 정답으로, 177편): 오늘 쓰는 픽 62% top-1 · 면적 기준 71 / 81 · near-first(제안) 74 / 85 · 천장(트랙이 이미 담고 있는 최선) 89%. 🚨 열려 있는 27포인트이고 고치는 방법도 이미 측정되어 있다E-V-034, 177 clips against the labelled boxes: today's pick 62% top-1; by area 71 / 81; near-first (proposed) 74 / 85; ceiling, the best the tracks already contain, 89%. 🚨 27 points are open, and the way to close them is already measuredE-V-034, 177 video đối chiếu hộp đã gán nhãn: cách chọn hiện tại 62% top-1; theo diện tích 71 / 81; ưu tiên xe gần (đề xuất) 74 / 85; trần — kết quả tốt nhất đã có trong các vệt theo dõi — 89%. 🚨 Còn khoảng trống 27 điểm, cách thu hẹp đã được đo |
| 마진 경고the margin warningcảnh báo độ chênh | 마진 ≥3배면 89%(34/38), <3배면 38%(9/24) — 경고가 실제로 틀릴 때를 가리킨다. 부분 채점(200편 중 62편)with a margin ≥3× it is 89% (34/38) and <3× it is 38% (9/24) — the warning really does point at the wrong ones. Partial scoring, 62 of 200khi độ chênh ≥3×, độ đúng là 89% (34/38); <3× là 38% (9/24) — cảnh báo thực sự chỉ ra những trường hợp sai. Chấm một phần, 62 trên 200 | |
| 자차 회전ego turnhướng rẽ xe gắn camera | 헤딩 프로파일(motion.ego) + 게이트a heading profile (motion.ego) behind a gatechuỗi hướng chuyển động (motion.ego) sau một cổng lọc | 게이트 통과 시 보류셋 86.7%(52/60, 상수 73.3%) · 좌·우만 78.6%(11/14, CI 52–92, 단일 라벨러) · 게이트 없이 3분류 62.2%(자기 상수보다 아래)at gate pass, 86.7% held out (52/60 against a 73.3% constant); left/right only 78.6% (11/14, CI 52–92, single annotator); ungated three-class 62.2%, below its own constantkhi qua cổng, 86.7% trên tập kiểm tra giữ riêng (52/60 so với hằng số 73.3%); chỉ trái/phải 78.6% (11/14, CI 52–92, một người gán nhãn); ba lớp không lọc 62.2%, thấp hơn chính hằng số cơ sở |
| 알려진 결함known defectslỗi đã biết | 🚨 클립 안의 모든 회전을 더한다 — 좌회전이 −166~−189°로 나와 「유턴」으로 표기된다. 그리고 10~30°에서 기권하는데 차로 변경이 정확히 그 구간이다🚨 it sums every rotation in the clip, so a left turn comes out at −166° to −189° and is labelled a U-turn; and it abstains between 10° and 30°, which is exactly where lane changes live🚨 cộng mọi góc xoay trong video, nên một lần rẽ trái thành −166° đến −189°, bị gán nhãn quay đầu; và không kết luận trong khoảng 10° đến 30°, đúng vùng của chuyển làn | |
| 접촉 시각contact timethời điểm tiếp xúc | 결정론적 4종(광학흐름 저크·근접·오디오 등) + 후보 제시four deterministic methods (optical-flow jerk, proximity, audio …) offering candidatesbốn phương pháp tất định (biến thiên đột ngột của luồng quang học, độ gần, âm thanh…) đưa ra ứng viên | ⭐ 네 방법이 0.3초 안에 모이면 31/34, 흩어지면 30/66. 보류셋에서 25/30 대 28/59로 재현됐다 — 이 말뭉치에서 재현된 몇 안 되는 결과다. 기권 규칙을 숫자로 세울 수 있다⭐ when the four land within 0.3 s, 31 of 34 are right; when they scatter, 30 of 66. It replicated held out at 25/30 against 28/59 — one of very few results here that does. An abstention rule can be set from it⭐ khi bốn kết quả nằm trong 0.3 s, đúng 31 trên 34; khi phân tán, đúng 30 trên 66. Kết quả được tái lập trên tập giữ riêng ở mức 25/30 so với 28/59 — một trong rất ít kết quả ở đây làm được điều đó. Có thể đặt quy tắc không kết luận từ chỉ số này |
| 노면 표시 종류lane-marking typeloại vạch kẻ làn | ——— | 🚨 없다. 실선/점선·색을 읽는 검출기는 만들어지지 않았다. 차45-6 대 차43-2가 백색 실선 대 백색 점선에서 갈리므로(100:0 대 30:70) 가장 큰 공백이다🚨 none. No detector reads solid versus dashed or colour. Since 차45-6 against 차43-2 turns on a solid versus a dashed white line (100:0 against 30:70), this is the largest gap🚨 chưa có. Không có bộ phát hiện vạch liền/đứt hoặc màu. Vì 차45-6 và 차43-2 khác nhau ở vạch trắng liền hay đứt (100:0 so với 30:70), đây là khoảng trống lớn nhất |
⭐ 영상만으로 읽는 것의 한계도 측정되어 있다 — 읽는 방식을 여섯 번 바꿔도 전부 100건 중 29~35에 들어간다. 같은 100건에서 출동 보고 텍스트 한 줄은 58, 운영(둘 다)은 66이다.
⭐ The ceiling of reading from video alone is measured too: six different reading methods all land between 29 and 35 out of 100. On the same 100, the dispatch report's text alone reaches 58, and production — with both — reaches 66.
⭐ Trần của việc chỉ phân tích video cũng đã được đo: sáu cách phân tích khác nhau đều đạt 29 đến 35 trên 100. Trên cùng 100 hồ sơ, chỉ văn bản báo cáo hiện trường đạt 58, còn hệ thống vận hành — dùng cả hai — đạt 66.
A6Serving Architecture — stage, 즉 최종 · Serving Architecture — stage, which is the final stateKiến trúc vận hành — stage, trạng thái cuối cùng
2026-10-12부터 stage는 컨테이너로 돈다. 이미지는 ECR에, 인프라는 Terraform에, 배포는 docker compose 롤아웃이다. 이것이 최종 구조다.
Since 2026-10-12 stage runs as containers. Images in ECR, infrastructure in Terraform, deployment a docker compose roll-out. This is the final architecture.
Từ 2026-10-12, stage chạy bằng container. Image trong ECR, hạ tầng trong Terraform, triển khai bằng docker compose. Đây là kiến trúc cuối cùng.
브라우저 / browser
│ 쿠키 visus_session (same-site)
▼
┌──────────────────────── caddy :80/:443 ─────────────────────────┐
│ /api/* → api:8020 /booth/* → ams-booth:8080 │ 단일 오리진
│ /demo* → web-demo:3000 그 외 → web:3000 │ one origin
└───────────────┬──────────────────────────┬─────────────────────┘
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ api :8020 │ │ web :3000 │
│ FastAPI │ │ Next.js 16 │
│ 60 routes │ │ SSR │
│ SQL 없음 │ └─────────────────┘
└────────┬────────┘
│ visus/service.py — 생애주기 전부 / all lifecycle logic
▼
┌──────────────────────────────┐ jobs ┌──────────────────────────────┐
│ Postgres (RDS) │◀─────────▶│ worker ×N │
│ schema visus_app · 31 tables│ FOR │ --parallel 4 readings │
│ private, 인터넷에서 닿지 않음 │ UPDATE │ CPU 전용 / CPU only │
└──────────────────────────────┘ SKIP └───────────────┬──────────────┘
LOCKED │ HTTP VISUS_CV_URL
▼
┌──────────────────────┐
│ cv :8030 │ GPU를 쥔 유일한 프로세스
│ visus/cvsvc │ the only process on the GPU
│ Mask2Former · YOLO │
│ · ONNX ReID │
└──────────────────────┘
┌───────────────────────────┬────────────────────────────┐
▼ ▼ ▼
OpenRouter (모델/models) S3 (클립·프레임·도표 미디어) SSM (/visus-stage/env)
migrate 한 번 돌고 끝난다 — api·worker·reap 은 성공한 뒤에야 시작
reap 하루 한 번 — 로컬 캐시 크기 상한 (VISUS_CACHE_CAP_GB, 기본 40)
Trình duyệt
│ cookie visus_session (same-site)
▼
┌──────────────────────── caddy :80/:443 ─────────────────────────┐
│ /api/* → api:8020 /booth/* → ams-booth:8080 │ một origin
│ /demo* → web-demo:3000 còn lại → web:3000 │
└───────────────┬──────────────────────────┬─────────────────────┘
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ api :8020 │ │ web :3000 │
│ FastAPI │ │ Next.js 16 │
│ 60 route │ │ SSR │
│ không SQL │ └─────────────────┘
└────────┬────────┘
│ visus/service.py — toàn bộ logic vòng đời
▼
┌──────────────────────────────┐ jobs ┌──────────────────────────────┐
│ Postgres (RDS) │◀─────────▶│ worker ×N │
│ schema visus_app · 31 bảng │ FOR │ --parallel 4 readings │
│ riêng tư, không qua Internet │ UPDATE │ chỉ CPU │
└──────────────────────────────┘ SKIP └───────────────┬──────────────┘
LOCKED │ HTTP VISUS_CV_URL
▼
┌──────────────────────┐
│ cv :8030 │ tiến trình duy nhất giữ GPU
│ visus/cvsvc │
│ Mask2Former · YOLO │
│ · ONNX ReID │
└──────────────────────┘
┌───────────────────────────┬────────────────────────────┐
▼ ▼ ▼
OpenRouter (mô hình) S3 (video·khung hình·ảnh biểu đồ) SSM (/visus-stage/env)
migrate chạy một lần rồi kết thúc — api·worker·reap chỉ khởi động sau khi thành công
reap mỗi ngày một lần — giới hạn bộ đệm cục bộ (VISUS_CACHE_CAP_GB, mặc định 40)
A6.1컨테이너와 배포 · Containers and deploymentContainer và triển khai
| 이미지imagesimage | 4종 — api · worker · web · cv. docker/의 Dockerfile 네 개로 만들고 ECR에 커밋 단축 sha를 태그로 올린다four — api, worker, web, cv — built from the four Dockerfiles in docker/ and pushed to ECR tagged with the commit's short shabốn loại — api, worker, web, cv — dựng từ bốn Dockerfile trong docker/, đẩy lên ECR, gắn thẻ bằng SHA rút gọn của commit |
| 박스 위의 배치on the boxtrên máy chủ | /opt/visus-compose/에 compose 파일과 비밀이 아닌 .env가 놓인다. 설정은 이미지가 아니라 환경에서 온다 holds the compose file and a non-secret .env. Configuration comes from the environment, never from the image chứa tệp compose và .env không có bí mật. Cấu hình lấy từ môi trường, không lấy từ image |
| 비밀secretsbí mật | SSM /visus-stage/env — 컨테이너가 뜰 때 인스턴스 역할로 읽는다(docker/entrypoint.sh). 값은 이미지에도 레포에도 없다SSM /visus-stage/env, read at container start with the instance role (docker/entrypoint.sh). No value is in an image or in the repositorySSM /visus-stage/env, đọc lúc container khởi động bằng vai trò của instance (docker/entrypoint.sh). Giá trị không nằm trong image hoặc kho mã |
| 배포 한 줄one commandmột lệnh | .venv/bin/python -m scripts.deploy.ship — 빌드·푸시·롤아웃. --status로 배포된 태그 대 커밋된 것을 본다— build, push, roll out. --status shows the deployed tag against what is committed— dựng, đẩy lên, triển khai. --status cho thấy thẻ đã triển khai so với trạng thái commit |
| 되돌리기rollbackkhôi phục phiên bản | ship_images --rollback → compose를 내리고 남겨 둔 systemd 유닛으로. --forward로 같은 태그에 다시 올린다 takes compose down and returns to the systemd units that were kept; --forward goes back onto compose at the same tag dừng compose, trở lại các unit systemd được giữ sẵn; --forward quay lại compose với cùng thẻ |
| 상태 디렉터리state directoriesthư mục trạng thái | VISUS_STATE_DIR(사건·채팅 작업공간) · VISUS_SCRATCH_DIR = NVMe(판독 작업공간, 심볼릭 링크 금지 — 바인드 마운트여야 한다) · VISUS_DATA_DIR(가중치·HF 캐시·KB 파일)VISUS_STATE_DIR for case and chat workspaces; VISUS_SCRATCH_DIR on the NVMe for reading workspaces (a bind, never a symlink); VISUS_DATA_DIR for weights, the HF cache and KB's filesVISUS_STATE_DIR cho không gian hồ sơ và chat; VISUS_SCRATCH_DIR trên NVMe cho không gian phân tích (bind mount, không dùng symlink); VISUS_DATA_DIR cho trọng số, bộ đệm HF và tệp KB |
A6.2GPU를 늘리는 법 — ECS 풀 둘 · Scaling the GPU — the two ECS poolsMở rộng GPU — hai nhóm ECS
박스 자신의 cv + worker가 감당하는 동시 판독은 4건이다. 그 위는 풀이 받는다.
The box's own cv and worker carry four concurrent readings. Above that, the pools take over.
cv và worker trên máy chủ tự xử lý bốn lần phân tích đồng thời. Vượt mức này, các nhóm tài nguyên tiếp quản.
| 실험 풀experiment poolnhóm thí nghiệm | Fargate Spot 워커가 Spot L4 CV 풀을 부른다. 큐 깊이로 스케일하고 0으로 돌아간다 — kb_open 배치에는 풀 명령이 필요 없다: 스케일러가 큐 깊이를 올리고, 첫 복제본이 7~8분 뒤 건강해지며, 큐가 빈 뒤 10분이면 0이다Fargate Spot workers calling a Spot L4 CV pool. It scales on queue depth and returns to zero — a kb_open batch needs no pool command: the scaler publishes the depth, the first replica is healthy 7–8 minutes later, and ten minutes after the queue empties it is back to zeroworker Fargate Spot gọi nhóm CV Spot L4. Nhóm co giãn theo độ sâu hàng đợi, thu về 0 — lô kb_open không cần lệnh điều khiển nhóm: bộ co giãn công bố độ sâu, bản sao đầu tiên sẵn sàng sau 7–8 phút; mười phút sau khi hàng đợi rỗng thì về 0 |
| 라이브 버스트live burst poolnhóm tăng tải trực tiếp | 실시간 판독이 4건을 넘으면 L4 복제본 최대 2개와 워커가 합류한다when live readings exceed four, up to two L4 replicas and their workers joinkhi số lần phân tích trực tiếp vượt bốn, tối đa hai bản sao L4 và các worker tương ứng tham gia |
| 보는 법watching ittheo dõi | python -m scripts.deploy.pool status — 복제본·큐 깊이·진행 중·호스트·시간당 비용·알람 — replicas, queue depths, in-flight, hosts, cost per hour, alarms — số bản sao, độ sâu hàng đợi, tác vụ đang chạy, máy chủ, chi phí mỗi giờ, cảnh báo |
| 인프라infrastructurehạ tầng | Terraform — infra/terraform/envs/stage(ECR·IAM·launch·pool)와 modules/pool. 풀 배포는 pool.auto.tfvars의 이미지 태그를 바꾸고 make -C infra/terraform plan applyTerraform — infra/terraform/envs/stage (ECR, IAM, launch, pool) and modules/pool. A pool deploy changes the image tag in pool.auto.tfvars and runs make -C infra/terraform plan applyTerraform — infra/terraform/envs/stage (ECR, IAM, khởi chạy, nhóm tài nguyên) và modules/pool. Triển khai nhóm bằng cách đổi thẻ image trong pool.auto.tfvars, chạy make -C infra/terraform plan apply |
A6.3자료가 사는 곳 · Where the data livesNơi lưu dữ liệu
| RDS visus-stage-db | PostgreSQL · 스키마 visus_app 31 테이블 · 공개 접근 꺼짐(VPC 안에서만) · 2026-10-12에 운영 백업에서 복원 · 꺼 둘 수 있다(최대 7일)PostgreSQL, schema visus_app with 31 tables, not publicly accessible, restored from prod's backup on 2026-10-12, and can be stopped (up to 7 days)PostgreSQL, schema visus_app có 31 bảng, không cho truy cập công khai, khôi phục từ bản sao lưu prod ngày 2026-10-12, có thể tắt (tối đa 7 ngày) |
| S3 | ams-user-uploads-h264(브라우저용 변환본) · ams-knia-media(도표 미디어) · 원본 업로드 버킷 · CV 덤프는 cv/*로 흘려보낸다ams-user-uploads-h264 (browser-ready transcodes), ams-knia-media (chart media), the raw upload bucket, and CV dumps written through to cv/*ams-user-uploads-h264 (bản chuyển mã dùng trên trình duyệt), ams-knia-media (ảnh biểu đồ), bucket tải lên bản gốc; dữ liệu CV được ghi sang cv/* |
| 디스크diskổ đĩa | 판독 작업공간은 NVMe에. 로컬 캐시는 크기 상한이 걸려 있고 reap이 하루 한 번 줄인다 — 자라는 디스크를 끝내려는 설계(무상태 작업공간)reading workspaces on the NVMe; the local cache has a size cap that reap enforces daily — the design that ends the growing disk (stateless workspaces)không gian phân tích trên NVMe; bộ nhớ đệm cục bộ có giới hạn dung lượng, được reap thực thi hằng ngày — thiết kế chấm dứt việc ổ đĩa tăng mãi (không gian làm việc không lưu trạng thái) |
KB가 보던 데모는 같은 코드의 다른 운영 방식이었다 — systemd 유닛 + 호스트 Caddy, 코드는 tar 묶음으로 올라갔고 RDS visus-db를 썼다. 가지는 prod/backend와 prod/preview-web. KB 접근이 끝났으므로 이 경로는 더 이상 쓰이지 않는다. 같은 박스 위에 /preview(새 디자인)가 운영과 같은 데이터베이스로 떠 있었다는 점은 기록해 둔다 — 프리뷰에서 도표를 잠그면 실제 사건이 바뀌었다.
The demo KB was looking at was the same code run a different way: systemd units behind a host Caddy, code shipped as a tarball, against RDS visus-db, from prod/backend and prod/preview-web. With KB's access ended, that path is no longer used. Worth recording: a /preview build of the new UI ran on the same box against the production database — locking a chart in the preview changed the real case.
Bản demo KB từng xem là cùng mã nguồn, cách vận hành khác: các unit systemd sau Caddy trên máy chủ, mã nguồn chuyển lên dưới dạng tệp tar, dùng RDS visus-db, từ prod/backend và prod/preview-web. KB đã hết quyền truy cập, nên không còn dùng cách này. Cần ghi nhớ: bản giao diện mới tại /preview từng chạy trên cùng máy, dùng cơ sở dữ liệu production — khóa biểu đồ ở preview làm thay đổi hồ sơ thật.
⭐ stage가 이어받는다는 것의 실제 의미: 배포는 ship 한 줄이고, 되돌리기가 있고, 인프라가 코드로 적혀 있으며, GPU가 큐에 따라 늘었다 줄고, 비밀이 이미지 밖에 있다. prod에는 그중 어느 것도 없었다.
⭐ What stage taking over actually means: deployment is one command, there is a rollback, the infrastructure is written as code, the GPU scales with the queue and back to zero, and the secrets live outside the images. Prod had none of those.
⭐ Ý nghĩa thực tế của việc stage tiếp quản: triển khai bằng một lệnh, có khôi phục phiên bản, hạ tầng được viết thành mã, GPU co giãn theo hàng đợi và thu về 0, bí mật nằm ngoài image. Prod không có những khả năng này.
A7아직 「최종」이 아닌 것 — 그리고 레포 문서가 어긋나는 자리 · What is not final, and where the repo's own docs disagreeNhững gì chưa hoàn tất, chỗ tài liệu trong kho mã còn mâu thuẫn
이 절이 이 부록을 믿을 수 있게 만든다. 아래는 코드를 직접 열어 확인한 불일치와 미결 항목이다.
This section is what makes the rest of the appendix trustworthy. Below are the disagreements and open items found by opening the code.
Mục này tạo nền tảng tin cậy cho phần còn lại của phụ lục. Dưới đây là các điểm mâu thuẫn và việc còn mở được tìm thấy khi đọc mã nguồn.
| 항목itemhạng mục | 상태statetrạng thái |
|---|---|
| docs/ARCHITECTURE.md의 모델 기본값the model defaults in docs/ARCHITECTURE.mdmô hình mặc định trong docs/ARCHITECTURE.md | 🚨 문서와 코드가 다르다. 문서는 ANALYSIS_DEFAULT_MODEL = claude-fable-5.1, DEFAULT_MODEL = gpt-4o라고 적지만, origin/stage의 service.py는 둘 다 anthropic/claude-opus-5.5다. 코드가 맞다(이 부록 A5.1). 문서 헤더는 2026-09-23 검토로 찍혀 있다🚨 the document and the code disagree. It says ANALYSIS_DEFAULT_MODEL = claude-fable-5.1 and DEFAULT_MODEL = gpt-4o; service.py at origin/stage has both at anthropic/claude-opus-5.5. The code is right (A5.1). The document is stamped last reviewed 2026-09-23🚨 tài liệu và mã nguồn khác nhau. Tài liệu ghi ANALYSIS_DEFAULT_MODEL = claude-fable-5.1 và DEFAULT_MODEL = gpt-4o; service.py tại origin/stage đặt cả hai thành anthropic/claude-opus-5.5. Mã nguồn là đúng (A5.1). Tài liệu ghi lần rà soát cuối 2026-09-23 |
| 같은 문서의 저장 계층 그림the storage layer in the same documentlớp lưu trữ trong cùng tài liệu | ⚠️ Supabase로 그려져 있다. 지금은 RDS다(A6.3). 결정 기록도 V-D21까지만 적혀 있고 실제로는 V-D27까지 있다⚠️ drawn as Supabase; it is RDS now (A6.3). It also lists decisions to V-D21 where the ledger runs to V-D27⚠️ được vẽ là Supabase; hiện là RDS (A6.3). Tài liệu cũng chỉ liệt kê quyết định đến V-D21, trong khi sổ đã đến V-D27 |
| prod → stage 승격promotion from prodđưa thay đổi từ prod lên | ⚠️ docs/ENVIRONMENTS.md의 승격 절차는 KB 데모가 살아 있을 때의 규칙이다. 데모가 끝났으므로 지금은 stage 한 곳만 있다 — 문서의 「승격」 문단은 과거형으로 읽을 것⚠️ the promotion procedure in docs/ENVIRONMENTS.md is the rule from when the demo was live. With the demo over, there is only stage — read that paragraph in the past tense⚠️ quy trình đưa thay đổi lên trong docs/ENVIRONMENTS.md là quy tắc khi demo còn hoạt động. Demo đã kết thúc, chỉ còn stage — đọc đoạn đó như lịch sử |
| v3 버전the v3 version stringchuỗi phiên bản v3 | HARNESS_VERSION["v3"] = "3.5.0-dev" — 기본 엔진이 아직 -dev로 표시된다. 동작은 운영이지만 버전 문자열은 확정되지 않았다HARNESS_VERSION["v3"] = "3.5.0-dev" — the default engine still carries -dev. It runs in production; the version string was never settledHARNESS_VERSION["v3"] = "3.5.0-dev" — bộ máy mặc định vẫn mang -dev. Đang vận hành thật nhưng chuỗi phiên bản chưa được chốt |
| 노면 표시 검출lane-marking detectionphát hiện vạch kẻ làn | 🚨 없다. 실선/점선·색을 읽는 모델이 없고, 그것이 가르는 도표가 있다(A5.4). 가장 큰 공백🚨 it does not exist. No model reads solid versus dashed or colour, and charts turn on it (A5.4). The largest gap🚨 chưa có. Không có mô hình đọc vạch liền/đứt hoặc màu, trong khi các biểu đồ phụ thuộc yếu tố này (A5.4). Khoảng trống lớn nhất |
| 상대차 선택 27포인트27 open points on counterpart selectionkhoảng trống 27 điểm khi chọn xe đối phương | 오늘 62%, 상한 89% — 고치는 방법(near-first)이 이미 측정되어 74/85인데 아직 기본값이 아니다62% today against an 89% ceiling — the fix (near-first) is already measured at 74/85 and is not yet the defaulthiện tại 62%, trần 89% — cách sửa (near-first) đã được đo ở 74/85 nhưng chưa là mặc định |
| 증거 표 _with_fitsthe evidence table, _with_fitsbảng bằng chứng, _with_fits | ⚠️ 채팅으로 다시 도출된 판정이 절 대조 표 없이 저장되던 결함이 있었다. 수정이 들어갔는지 확인되지 않았다 — 인수 첫 주에 볼 것⚠️ chat-derived verdicts were being stored without their clause table. Whether the fix landed is unconfirmed — check it in week one⚠️ các kết luận suy ra lại từ chat từng được lưu không kèm bảng điều khoản. Chưa xác nhận bản sửa đã tích hợp hay chưa — kiểm tra trong tuần đầu tiếp quản |
| 공유 계정 자격증명credentials in a shared accountthông tin xác thực của tài khoản dùng chung | 🚨 전사 기록에 따르면 전임 저장소의 .env가 계정 전체 권한의 정적 키였고, 범위를 좁힌 정책이 적용된 기록이 없다. 현재 상태는 확인되지 않았다 — 확인하고 교체할 것🚨 the transcripts record that a predecessor repository's .env held account-wide static keys, with a scoped replacement never recorded as applied. Current state unverified — check and rotate🚨 bản ghi hội thoại cho thấy .env của kho mã tiền nhiệm chứa khóa tĩnh có quyền toàn tài khoản; không có ghi nhận áp dụng bản thay thế giới hạn quyền. Chưa xác minh trạng thái hiện tại — kiểm tra và thay khóa |
⭐ 이 표를 읽는 법: 위 셋은 문서를 고치면 끝나는 것이고, 아래 넷은 일이 남아 있는 것이다. 본 문서 §7.3에 무엇부터 할지가 측정치와 함께 적혀 있다 — 요약하면 모델을 바꾸는 것보다 사고 위치(좌표)와 도로 등급을 보험사에게서 받는 것이 가장 큰 지렛대다.
⭐ How to read this table: the first three are fixed by editing a document; the last four are work. §7.3 of the main document says what to do first, with the measurements behind it — in short, asking the insurer for the accident's coordinates and road class is a bigger lever than changing the model.
⭐ Cách đọc bảng: ba mục đầu sửa tài liệu là xong; bốn mục cuối còn việc phải làm. §7.3 của tài liệu chính nêu việc nên làm trước, kèm phép đo — xin tọa độ tai nạn và cấp đường từ công ty bảo hiểm tạo tác động lớn hơn đổi mô hình.
본 문서로 돌아가기 — Visus 인수인계.
Back to the main document — the Visus handover.
Quay lại tài liệu chính — bàn giao Visus.