You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+7-5Lines changed: 7 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -84,14 +84,14 @@ See [Grouped Review Application](docs/GROUPED_REVIEW_APP.md) for the queue contr
84
84
85
85
The repository now includes a deployable web platform for teams that outgrow the portable desktop reviewer. A Vue 3 + TypeScript client talks to a Spring Boot 4 REST API backed by MySQL and Flyway. JWT authentication, `ADMIN / REVIEWER / AUDITOR` RBAC, project membership, pessimistic task claiming, renewable leases, optimistic versions and immutable audit events prevent duplicate work and stale decisions. The Python bridge streams the existing `review_queue.csv` into the API in bounded, idempotent batches.
86
86
87
-

<imgsrc="docs/assets/platform-admin-console.png"width="49%"alt="Administrator account and project-member management">
90
+
<imgsrc="docs/assets/platform-review.png"width="49%"alt="Real joint-scene web review workspace">
91
+
<imgsrc="docs/assets/platform-admin.png"width="49%"alt="Reviewer account and project assignment panel">
92
92
</p>
93
93
94
-
These are captures of the actual Vue + Spring Boot application running against seeded local collaboration data, not design mockups. The workspace shows a claimed task, real review visual, class confidence, constrained decisions and live project progress; the admin view demonstrates account creation and project membership assignment.
94
+
These are captures of the actual Vue + Spring Boot application, not design mockups. The workspace shows a claimed task, real review visual, class confidence, constrained decisions and live project progress; the admin view demonstrates account creation and project membership assignment.
95
95
96
96
```mermaid
97
97
flowchart LR
@@ -101,7 +101,9 @@ flowchart LR
101
101
A --> R["Read-only review visuals"]
102
102
```
103
103
104
-
See [Collaboration Platform](docs/COLLABORATION_PLATFORM.md) for deployment, API contracts, concurrency design and interview walkthrough.
104
+
The workflow has been validated on a trusted campus LAN with two independent reviewer accounts working concurrently. It imported `30,183` tasks and migrated `4,465` historical desktop decisions through an idempotent endpoint while keeping the real review package read-only. This verifies the allocation, migration and audit workflow; it is not a large-scale load-test or model-accuracy claim.
105
+
106
+
See [Collaboration Platform](docs/COLLABORATION_PLATFORM.md) for screenshots, deployment, API contracts, concurrency design and interview walkthrough.
<imgsrc="assets/platform-login.png"width="49%"alt="Login and role entry">
15
-
<imgsrc="assets/platform-admin-console.png"width="49%"alt="Admin account and membership management">
15
+
<imgsrc="assets/platform-admin.png"width="49%"alt="Admin account and membership management">
16
16
</p>
17
17
18
-
The screenshots above were captured from the actual Vue and Spring Boot services with seeded local collaboration records. They demonstrate the real login flow, project progress, atomic task claim, read-only review visual delivery, constrained decisions, account creation and member assignment. They are not UI mockups.
以上截图由真实运行的 Vue 与 Spring Boot 服务生成,并加载了本地演示协作记录。截图覆盖登录、项目进度、原子领取任务、只读审核图加载、受约束决策、账号创建和成员分配,不是界面示意图。
20
+
The screenshots above were captured from the actual Vue and Spring Boot services against a real, user-approved review package. They demonstrate the real login flow, project progress, atomic task claim, read-only review visual delivery, constrained decisions, account creation and member assignment. They are not UI mockups and do not represent model-accuracy evidence.
21
+
22
+
以上截图由真实运行的 Vue 与 Spring Boot 服务生成,并加载了经许可使用的真实审核包。截图覆盖登录、项目进度、原子领取任务、只读审核图加载、受约束决策、账号创建和成员分配,不是界面示意图,也不作为模型精度证据。
21
23
22
24
## 3. Architecture / 架构
23
25
@@ -42,7 +44,7 @@ flowchart TB
42
44
| Web client | Vue 3, TypeScript, Vite | Login, project progress, real-image review, heartbeat, constrained decisions |
43
45
| API | Java 21, Spring Boot 4, Spring Security | Authentication, authorization, leasing, decisions, audit and visual access |
| Delivery | Docker Compose, Nginx | One-command three-service deployment and same-origin API proxy|
47
+
| Delivery | Docker Compose or Windows JAR | Containerized three-service deployment, or a trusted-LAN host with optional VM-hosted MySQL|
46
48
47
49
## 4. Authorization model / 权限模型
48
50
@@ -74,6 +76,16 @@ Every task carries JPA `@Version`. The client submits `expectedVersion` with a d
74
76
75
77
`(project_id, candidate_id)` is unique, so importing the same queue again safely skips existing candidates. `review_decisions.task_id` is also unique, so one task cannot obtain two final decisions even if a client retries.
76
78
79
+
### Validated concurrent workflow / 已验证的并发流程
80
+
81
+
The platform was exercised on a trusted campus LAN with two independent accounts reviewing at the same time. The production-shaped project contained `30,183` candidates. A previous desktop review file containing `4,465` decisions was migrated after task import; at migration time this became `4,464` completed tasks and `1` escalated task. Re-running the migration skipped existing decisions instead of duplicating them.
This test verified atomic allocation, lease ownership, historical migration, real-image access and audit attribution. It did not attempt to establish a maximum concurrent-user capacity.
The importer reads one CSV row at a time and uploads at most 500 rows per request. It does not load the full queue or all images into memory. Re-running the same command is safe because candidate IDs are idempotent.
133
+
The importer reads one CSV row at a time and uploads at most 500 rows per request. It does not load the full queue or all images into memory. After tasks exist, `--decisions` migrates historical desktop outcomes in bounded batches. Both phases are idempotent: candidate IDs and existing decisions are skipped safely on retries.
After creating reviewer accounts in the admin drawer, assign each username to the selected project. Reviewers then see only their assigned projects.
123
138
@@ -137,6 +152,14 @@ npm run dev
137
152
138
153
The Vite development server proxies `/api` to `localhost:8080`. Tests use H2 in MySQL compatibility mode; production uses MySQL and Flyway.
139
154
155
+
### Trusted LAN deployment / 可信局域网部署
156
+
157
+
For a small team on the same trusted network, the platform can run directly on a Windows host while MySQL runs locally, in VMware, or on another LAN server. The scripts check database reachability, optionally start the VM without a visible window, launch the JAR, poll the health endpoint and expose only a configurable URL and subnet.
158
+
159
+
同一可信局域网内的小团队可以直接使用 Windows 主机部署,MySQL 可运行在本机、VMware 或局域网数据库服务器。配套脚本会检查数据库、按需无界面启动虚拟机、启动 JAR、轮询健康状态,并通过本机忽略配置指定访问地址和允许网段。
160
+
161
+
See [campus-deploy/README.md](../platform/campus-deploy/README.md). Local passwords, database addresses, VM paths, logs and PID files are Git-ignored.
162
+
140
163
## 10. API surface / 主要接口
141
164
142
165
| Method | Path | Meaning |
@@ -145,21 +168,35 @@ The Vite development server proxies `/api` to `localhost:8080`. Tests use H2 in
145
168
| GET |`/api/projects`| List visible projects |
146
169
| POST |`/api/projects/{id}/members`| Assign a project member, admin only |
147
170
| POST |`/api/projects/{id}/tasks:batch`| Idempotent task import, admin only |
171
+
| POST |`/api/projects/{id}/decisions:history`| Idempotent historical-decision migration, admin only |
148
172
| POST |`/api/tasks/claim-next?projectId={id}`| Atomically lease one task |
149
173
| POST |`/api/tasks/{id}/heartbeat`| Renew current user's lease |
150
174
| POST |`/api/tasks/{id}/decision`| Submit constrained decision and expected version |
151
175
| GET |`/api/tasks/{id}/visual`| Read an authorized real review image |
152
176
| GET |`/api/projects/{id}/audit`| Read project audit trail, admin/auditor |
The screenshot tool uses Chrome DevTools directly and adds no browser-automation dependency to the application. Credentials are supplied only through process environment variables; the script waits for animations and images, captures four pages, and releases the temporary claimed task.
1. Start from the data problem: incomplete labels make true objects become false background supervision.
157
194
2. Explain why offline inference and online review are separated: GPU jobs are expensive and bursty; human review is concurrent and stateful.
158
195
3. Draw the claim transaction and lease timeline; emphasize pessimistic locking for allocation and optimistic locking for stale clients.
159
196
4. Explain dual authorization: RBAC handles capability while project membership handles data scope.
160
197
5. Show bounded idempotent import and read-only visual mounts as memory-safety and data-safety decisions.
161
-
6. Close with evidence: production queue scale, real grouped images, automated Java/Python tests and reproducible Docker deployment.
198
+
6. Close with evidence: `30,183` imported candidates, `4,465` migrated decisions, two-account concurrent validation, real screenshots, automated Java/Python tests and two reproducible deployment modes.
162
199
163
-
## 12. Production hardening / 生产加固
200
+
## 13. Production hardening / 生产加固
164
201
165
202
Before exposing the service beyond a trusted LAN, terminate TLS at a reverse proxy, rotate JWT/database secrets, disable bootstrap admin after first setup, back up MySQL, centralize logs and metrics, and define account disable/password-reset procedures. Docker Compose is an auditable single-host baseline; Kubernetes or managed databases are deployment choices, not prerequisites for the core workflow.
Copy file name to clipboardExpand all lines: docs/INTERVIEW_STORY.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,6 +12,8 @@ Long scans are checkpointed after every committed batch. Resume validates a run
12
12
13
13
Production review showed that confidence and IoU alone were not enough for automatic writes. I added an exhaustive GT/AUTO gate using IoU, IoS, normalized center distance and area ratio, then separated model evidence, company review and safe apply into three auditable stages. The apply stage blocks unfinished decisions, detects source-label drift and creates a new dataset without changing the original.
14
14
15
+
When review moved from one person to a team, I added a Vue and Spring Boot collaboration layer rather than forcing concurrent reviewers to exchange CSV files. MySQL row locks allocate different tasks atomically, renewable leases recover abandoned work, optimistic versions reject stale pages, and project membership separates data scope from global roles. In a trusted-LAN validation, two independent accounts reviewed concurrently while `30,183` tasks and `4,465` migrated desktop decisions remained auditable and idempotent.
16
+
15
17
## Strong technical points
16
18
17
19
-`6 x N` inference work is accepted as the cost of specialist evidence; peak memory is controlled independently.
@@ -26,6 +28,7 @@ Production review showed that confidence and IoU alone were not enough for autom
26
28
-`doctor` and `manifest.json` make environment differences visible instead of leaving CUDA and dependency drift implicit.
27
29
- GT/AUTO review makes the authority boundary explicit: models propose evidence, humans authorize label changes.
28
30
- Same-target box disagreement is replaced transactionally rather than adding two contradictory boxes.
31
+
- The collaboration platform separates offline GPU evidence generation from online stateful review, and validates concurrency with real accounts instead of claiming correctness from UI screenshots alone.
@@ -38,6 +39,7 @@ The difficult part was operational reliability on a long `K x N` scan. I added t
38
39
7. Open `examples/near_duplicates/output/near_duplicate_report.html` to show review compression and split leakage.
39
40
8. Open `examples/prioritization/output/prioritization_report.html` to show a limited-budget six-class review queue.
40
41
9. Run `yolo-label-recovery doctor` to show environment diagnostics.
42
+
10. Open `docs/assets/platform-dashboard.png` and `docs/assets/platform-review.png` to explain the validated two-account web workflow without requiring a live server.
41
43
42
44
This demonstration works without a GPU or private model weights. A full teacher scan remains an optional second demonstration when suitable public weights and data are available.
0 commit comments