WARP connected Laguna reachable (free) single-judge
Idle Elapsed 0.0s · ETA to finish · healthy
0% · idle — the bar/ETA track the live SSE heartbeat; if no progress arrives for >4s it flags a possible stall/crash.
A
Parse
read 10-PAPER.txt
B
Resolve cites
source map
C
Body QC loop
loop ② · multi-viewpoint
D
Figures
loop ③ · author + geometry QC
E
Assemble HTML
cite-style + gate
Ensemble
Laguna·Devstral·Gemma
free jury · 3 models
Sections
7
enforced from config
Figures kept
— / 19
large fonts, 0 hard defects
Citations
author-year, STM-only
GPT spend
$0.00
Laguna = free
Status
Idle
Press Run pipeline to simulate a full pass. Stages animate through the same A→E flow the backend executes; the QC, Figures, Citations and Audit tabs fill in as it runs.
Full front-to-back data flow. Stages 0-1 build the KNOWLEDGE from RawInput: an LLM-planned, Tavily-backed search engine acquires the corpus and reads how each source relates, then topology / direction / refinement scripts distil it into KnowledgeRepresentation (source maps, topology, LTM + STM). Stages 2-4 (run by this web backend) draft → render → export. Amber ⟲ = bounded self-improvement / QC loops. Stages 0-1 are run offline via CLI (Tavily cost / long); the web UI operates on the already-built knowledge.
ActionEngram pipeline — acquire → build knowledge → draft → render → export Stages 0-1 (Tavily acquisition + knowledge build) run offline via CLI; this web backend runs stages 2-4 on the built knowledge. A · PREPROCESSING — RawInput → KnowledgeRepresentation Tavily (external) web search + extract 0 · Acquire engine.py · find_web · find_linkedin • LLM search planner (16-28 queries) • Tavily search + extract • LLM relationship reader + keep-gate • curate → tiers (author / external) RawInput corpus LinkedIn 134 · Research 64 ShortTerm 61 · Method 24 + author articles, topic-input, findings 1 · Build knowledge build_topology · build_directions build_voice_profile · build_refinement • concepts · relationships · themes • domains · directions · evaluations • refine vs rubrics (knowledge QC) KnowledgeRepresentation source maps 02·04·06·09 topology nodes (50+) STM (08) · source-of-truth LTM style nodes (5) ~27,695-char pkg B · GENERATION — this web backend (stages 2-4) Ensemble (free) Laguna — synth Devstral — critic Gemma — jury TAMU gateway task-anchored ×4 2 · build_research Draft engine formulate → draft (grounded) REFINE ↻ ① --max-rounds 3 · render_paper Body QC ↻ ② · temperature-rotated Figure QC ↻ ③ (per figure) OUTPUT GATE · author-year cites → .html 4 · to_format export (optional) HTML→DOCX/PDF ↻ ④ --passes · QC vs source rsvg + pandoc / WeasyPrint → .docx / .pdf .txt .html knowledge package → drafter (grounding + style) drives loops ①②③ Tavily also grounds directions/refinement ↻ QC / self-improvement loop pipeline step external service (Tavily) ensemble / knowledge / grounding feed
Where QC is applied — 4 bounded loops
#LoopEngine · scriptRound capWhat it does
Draft REFINEbuild_research.py--max-rounds (3)ensemble judge→correct on prose sections; converges when gain < ε for K rounds
Body QCrender_paper.py · run_qc--qc-rounds (5)ensemble judge→correct on the whole paper's prose; temperature-rotated (multi-viewpoint)
Figure geometry QCrender_paper.py · author_figures--qc-rounds, per figuredeterministic geometry lint → LLM fix → re-lint, for EACH figure independently
Format conversionto_format.py--passes, per formatconvert HTML→docx/pdf, diff against the HTML, fix, repeat
Is “QC rounds” cumulative? No. --qc-rounds is a per-application cap, not a total. The same value independently bounds ② the body-QC loop (once over the whole paper) and ③ each figure's geometry-QC loop. Worst-case figure-fix calls ≈ figures × qc-rounds (e.g. 19 × 5), though every loop stops early on convergence or an anti-thrash freeze, so actual rounds are usually fewer. Loop ① (draft) uses a separate --max-rounds; loop ④ (conversion) uses a separate --passes. These are three different knobs in the config.
Judge→correct loop on a working copy. The synthesist temperature rotates each round (0.2, 0.5, 0.8, 0.4, 0.7) for diverse revisions; a revision is rejected if it changes the section set or reintroduces symbolic notation.
QC log will stream here on run…
Each figure: draft (varied temperature) → safety/well-formedness gate → deterministic geometry lint (out-of-bounds = hard drop; small font <14px / text-collision = soft, auto-fixed).
Rendered inline as (Short name, year), external STM only (internal author corpus dropped). Keys are knowledge-driven from LTM-citation-style.txt [CITATION-KEYS].
KeySTM idYearIn-text
These are the ACTUAL long-term knowledge nodes injected into the pipeline's LLM prompts (drafter, reviser, figure author, citation renderer). The backend serves the FULL file via GET /api/knowledge/:node; the boxes below show representative excerpts. Edits + PUT take effect next run and are replicated when you create a new workspace.
Two knowledge layers. The 5 LTM nodes below are the distilled STYLE layer. The bulk CONTENT knowledge (source maps 02/04/06/09, topology concepts/relationships/themes/domains/directions, STM 08) is built from RawInput by the Tavily search engine + topology/direction/refinement scripts (see the Architecture tab, stages 0-1) — not hand-written. Verified populated: 63/64/24/60 source ids; render resolves ~73 sources every run.
Context injected into every draft / revise prompt 27,695 / 28,000 chars
5 LTM nodes are concatenated (hard cap 28,000). Each large-context prompt repeats the task ≥4× (task anchoring) so the model stays focused across this context. These files are the distilled result of the whole 10-PAPER-new.html optimization — not shallow summaries; the excerpts here are abridged for display only.
LTM-writing-style.txt 198 lines · 12.9 KB — voice, zero-notation, term discipline, section hygiene
Full file loaded via GET /api/knowledge/LTM-writing-style. Excerpt:
LTM-figure-style.txt 135 lines · 8.5 KB — visual-first, LARGE text, geometry QC, artifact hygiene
Full file via GET /api/knowledge/LTM-figure-style. Excerpt:
LTM-citation-style.txt 112 lines · 6.1 KB — author-year, STM-only, [CITATION-KEYS] (44)
Full file via GET /api/knowledge/LTM-citation-style. Excerpt:
LTM-author-voice.txt 80 lines · 8.4 KB — thesis + voice from the internal corpus (informs, not cited)
Full file via GET /api/knowledge/LTM-author-voice. Excerpt:
LTM-paper-profile.txt 79 lines · 5.3 KB — descriptive target template (measured from 10-PAPER-new.html)
Full file via GET /api/knowledge/LTM-paper-profile. Excerpt:
rubrics/RUB-paper.txt 37 lines · 2.0 KB — K1-K6 criteria + house-style gates (regenerated each run)
Seeded from build_research._seed_criteria() each run. Excerpt:
Rendered output preview — the HTML is the primary, high-fidelity source. DOCX/PDF are derived from it over self-improving conversion passes.
Deterministic invariants checked on every render, compared against the hand-tuned target 10-PAPER-new.html.
Invariant / metricThis runTargetStatus
Symbolic notation ($ / greek / LaTeX)0
MathJax script presentno
"RReferences" artifactnone
Numeric superscript citations0
Internal-corpus refs (P-/S-)0
Author-year citations~19
Figures19
Section headings (h2)8
Word count~5276
Well-formed HTMLyes
REST endpoints (thin wrapper)
Method + pathPurpose
GET /api/healthWARP + gateway reachability, ensemble attribution
GET /api/configread search_config.json (ensemble, paper, gate)
PUT /api/configupdate pool / temperatures / rounds / min+max figures / budget
POST /api/workspacescreate a NEW paper dir; replicate KnowledgeRepresentation/ + augment; engine stays shared
POST /api/uploadsupload one or more local source papers into a workspace
POST /api/runsstart build_research and/or render_paper over the input list
GET /api/runs/:id/eventsSSE stream: stage, %, ETA, heartbeat, QC rounds, figure results
POST /api/convertHTML → docx/pdf, self-improving over N passes
GET /api/runs/:id/output?fmt=rendered html / docx / pdf
GET /api/runs/:id/auditdeterministic invariant report
GET /api/knowledge/:nodeFULL knowledge node text (writing/figure/citation/author/profile + rubric)
PUT /api/knowledge/:nodeedit a knowledge node (takes effect next run; replicated to new workspaces)
POST /api/runs — request body
{ "workspace": "papers-vince/ActionEngram", "new_workspace": false, "replicate_knowledge": true, "augment_knowledge": "", "inputs": ["KnowledgeRepresentation/10-PAPER.txt"], "formats": ["html","docx"], "conversion_passes": 3, "pool": ["poolside/Laguna-S-2.1"], "max_rounds": 3, // ① draft REFINE (build_research) "qc_rounds": 5, // ② body QC + ③ figure QC, per-application "min_figures": 12, "max_figures": 19, "qc_temperatures": [0.2,0.5,0.8,0.4,0.7], "figure_temperatures":[0.3,0.7], "daily_usd_cap": 15, "no_qc": false, "no_figures": false, "dry_run": false }
SSE event shape (drives the progress bar / ETA / stall)
event: stage data: {"stage":"qc","pct":42,"eta_s":95} event: heartbeat data: {"t":1699,"alive":true} event: qc data: {"round":2,"temp":0.5,"accept":true,"gain":3} event: figure data: {"n":7,"title":"Anatomy…","kept":true,"soft":1} event: convert data: {"fmt":"docx","pass":2,"of":3} event: done data: {"audit":{"dollar":0,"figs":19,...}}
The client watches heartbeat; if none arrives for >4s it flags a stall/crash. The wrapper shells out to build_research.py + render_paper.py (and a to_format.py converter) and tails stdout + 12-QC-LOG.txt; no pipeline logic is duplicated.