6.9 KiB
WikiSkill — Web UI Design Document
Companion to design.md. Describes the interactive web application that lets users
run the WikiSkill evolution loop, watch it live, inspect every produced artifact, and
evaluate the evolved skills — a visual, testable harness for the paper's Algorithm 1.
1. Goals
- Run: configure a WikiSkill evolution run (dataset, iterations, LLM backend) and start/stop it from the browser.
- Watch: stream the evolution live (logs, ReAct proposer steps, gating decisions).
- Inspect: browse the complete three-layer workspace (
raw/,wiki/,skills/) produced by the run. - Evaluate: compare final evolved skills vs. no-skill baseline on the test split with paired-bootstrap significance.
- Understand: an "How it works" view that maps the UI to the paper's architecture (Figure 2 / Algorithm 1).
Non-goals: skill editing, wiki pruning, multi-user auth. This is a local study tool.
2. User workflows
- Explore — open
http://127.0.0.1:5000, read How-it-works, browse an existing workspace from disk. - Run — Configure → Start → watch live events → switch to Dashboard/Workspace.
- Analyze — inspect the evolution curve, accepted/rejected proposals, wiki patterns, raw traces, then Evaluate on the test split.
- Repeat — tweak parameters (iterations, ReAct turns), start a new run in a fresh workspace, compare.
3. Information architecture (single page, six tabs)
| Tab | Purpose |
|---|---|
| Run | Configuration form + live console + status pill; start/cancel |
| Dashboard | R_best curve, per-iteration acceptance bars, history table |
| Evaluation | Test-split comparison (skilled vs baseline), bootstrap p-value |
| Workspace | File tree + viewer for raw/wiki/skills/run_state.json |
| Knowledge | Wiki index, pattern pages, evolution log, skill-impact tracker, skills |
| How it works | Layer diagram + Algorithm 1 pseudocode + glossary |
4. Screen details
4.1 Run tab
- Config form: LLM backend (
mock|openai), model, base URL, API key (password field), temperature, max iterations (K), max ReAct turns, workspace root (empty = autoruns/run_<timestamp>).
4.3 Evaluation tab
- Big-number cards: Skilled accuracy, Baseline accuracy, Δ, bootstrap p-value.
- Horizontal bar comparison + verdict ("Skilled is significantly better", etc.).
- Re-evaluate button (re-runs
evaluate_test()for the current workspace).
4.4 Workspace tab
- Left: collapsible file tree starting at the workspace root.
- Right: content viewer — JSON pretty-printed, markdown shown in raw + rendered form, diffs monospace.
4.5 Knowledge tab
- Sub-tabs: Skills (cards with SKILL.md + PURPOSE.md), Wiki patterns (list + pages), Evolution log, Skill-impact history.
4.6 How-it-works tab
- Static annotated pipeline of the three layers and four components, Algorithm 1 pseudocode, and definitions table (S_k, W_k, P_k, T_train, R_best…).
5. Design system
- Dark-on-light ("paper" feel): background
#f7f7f5, panels white#fff, ink#1a1a1a. - Accent: indigo
#3b5bdb(brand), success#099268, danger#e03131, warn#f59f00. - Type: system stack; headings 600, mono stack for code/traces.
- Badges/pills for Accept/Reject and status; cards with 1px border, 10px radius.
- Charts rendered as inline SVG (zero JS chart libraries → works offline).
6. Backend contract
| Method/Path | Body/Query | Returns |
|---|---|---|
GET / |
— | SPA HTML |
GET /api/health |
— | {ok, version} |
POST /api/run |
config JSON | 202 {run_id}; 400 validation; 409 busy |
GET /api/status |
— | {active, state:{status, events[], result, error}} |
GET /api/stream |
— | Server-Sent Events (log/status/react/done/error) |
POST /api/cancel |
— | 200 {cancelled} |
GET /api/workspace?root= |
query | {root, tree, files} (text files) |
POST /api/evaluate |
{workspace_root, llm_backend, …} |
evaluation report JSON |
Validation rules: workspace_root must be a relative path (no abs, no ..); run
rejected with 409 if another run is active; run rejected if root already contains
evolution history (choose a fresh root to avoid clobbering the immutable raw layer).
SSE protocol
Events: {type:"log", message}, {type:"react", turn, kind, path?, found?},
{type:"status", phase}, {type:"done", result}, {type:"error", error}.
Heartbeat comments every 15 s; stream closes after done/error.
7. State model
Server (single flask app):
RunManager— one active run; holdsRunState {run_id, status, events, result, error}and an SSE queue; background daemon thread executes theEvolutionOrchestrator(MockLLM or OpenAICompatLLM) and wireslog+ proposeron_stepto the queue;cancel_eventlets the orchestrator stop between iterations.
Client (vanilla JS):
state = {config, status, events[], result, evaluation}; tab rendering is pure functions overstate;EventSource('/api/stream')drives updates.
8. Error handling & resilience
- JSON payloads only; unknown/invalid fields → 400 with message.
- Proposal failures / malformed LLM JSON are absorbed by the orchestrator (logged).
- Run exceptions →
type:"error"event + statuserror(traceback stored, exposed via status). - EventSource auto-reconnect on transient drops.
- All file reads limited to 200 kB per file and whitelisted extension set.
9. Accessibility & usability
- Semantic HTML (tabs as buttons with aria), keyboard navigation for tree, focus states, sufficient contrast, no motion-only information.
10. Testing strategy
- Backend: Flask test client (mock backend) — run lifecycle, status, workspace tree, evaluation, single-flight 409, validation 400s, cancel.
- Runner: unit test RunManager concurrency (double-start raises).
- E2E smoke: boot
wikiskill serveon a port; fetch/,/api/health, run/api/runwith mock, poll status to completion, verify workspace artifacts. - Regression: full
pytestsuite (core + UI) must stay green.
11. Non-functional targets
- Zero CDN dependencies (offline usable).
- Startup < 1 s; mock run completes in seconds; UI remains responsive during runs (threaded Flask).
- Flask is the single new runtime dependency, grouped under
[project.optional-dependencies] ui. - Actions: Start, Cancel (appears while running). Status pill: idle | starting | running | evaluating | done | error.
- Live console: appended log lines; SSE-driven; auto-scrolls; monospace.
- ReAct event log: marks
read_filecalls (path + found/not-found) and final proposal, rendered inline in the console with icons.
4.2 Dashboard tab
- R_best curve: SVG polyline (x = iteration incl. baseline, y = R_best value).
- Validation bars: one bar per evaluated proposal, colored green=Accepted / red=Rejected; dashed baseline marker.
- History table: iteration, action, target skill, validation score, outcome.