lazycodex-ai 5.1.32 → 5.1.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/README.zh-cn.md +1 -1
- package/dist/cli/account-keys/commands.d.ts +9 -0
- package/dist/cli/account-keys/keyring.d.ts +16 -0
- package/dist/cli/account-keys/keystore.d.ts +34 -0
- package/dist/cli/index.js +91401 -90585
- package/dist/cli/service-auth/accounts-closed.fixture.d.ts +1 -0
- package/dist/cli/service-auth/commands.d.ts +4 -1
- package/dist/cli/worktree-sweep/types.d.ts +3 -1
- package/dist/cli-node/index.js +91521 -90705
- package/package.json +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1 -0
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +6 -5
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +3 -3
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +9 -6
- package/packages/omo-codex/plugin/skills/ulw-research/AGENTS.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +7 -5
- package/packages/omo-codex/plugin/skills/ulw-research/references/deliverable-phase.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +2 -0
- package/packages/omo-codex/plugin/skills/ulw-research/references/report-visualization.md +126 -0
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/contracts.mjs +3 -1
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-figures.mjs +33 -1
- package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-static.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +3 -2
- package/packages/shared-skills/skills/browser/runtime/omowright/index.js +6 -5
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +3 -3
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +9 -6
- package/packages/shared-skills/skills/ulw-research/AGENTS.md +3 -2
- package/packages/shared-skills/skills/ulw-research/SKILL.md +7 -5
- package/packages/shared-skills/skills/ulw-research/references/deliverable-phase.md +1 -1
- package/packages/shared-skills/skills/ulw-research/references/report-gates.md +2 -0
- package/packages/shared-skills/skills/ulw-research/references/report-visualization.md +126 -0
- package/packages/shared-skills/skills/ulw-research/scripts/contracts.mjs +3 -1
- package/packages/shared-skills/skills/ulw-research/scripts/contracts.test.ts +2 -0
- package/packages/shared-skills/skills/ulw-research/scripts/gates-figures.mjs +33 -1
- package/packages/shared-skills/skills/ulw-research/scripts/gates-static.mjs +2 -2
- package/packages/shared-skills/skills/ulw-research/scripts/gates-static.test.ts +56 -3
- package/packages/shared-skills/skills/ulw-research/scripts/tests/fixtures/bad-report.html +4 -0
|
@@ -43,7 +43,7 @@ Plan and reviewer agents may run for a long time: spawn them in the background a
|
|
|
43
43
|
|
|
44
44
|
# ulw-execute
|
|
45
45
|
|
|
46
|
-
Execute a work plan until every top-level checkbox is
|
|
46
|
+
Execute a work plan until every top-level checkbox is `[x]` or `[~]`. This skill pairs with the harness's ulw-execute continuation hook, which re-injects the next turn while `.omo/boulder.json` says this `codex:<session_id>` still has unchecked plan work.
|
|
47
47
|
|
|
48
48
|
## Usage
|
|
49
49
|
|
|
@@ -62,7 +62,7 @@ Do ALL of this immediately after the plan is selected, BEFORE the first implemen
|
|
|
62
62
|
|
|
63
63
|
1. **Set the goal, in detail.** When a goal tool is available (`create_goal`), call it with a DETAILED objective: the plan name and path, the concrete end state, the phase and task counts, the delivery mode (direct, `--make-pr`, or `--ship`), and how completion will be verified. One work session = one registered goal (the goal tool holds one active goal); each phase then carries its own concrete goal — the ledger entry Phase 2 records before the wave's first dispatch, defined from the previous phase's landed and verified evidence. No goal tool -> record the same objective as the first ledger entry.
|
|
64
64
|
2. **Register every phase and task as todos.** Mirror the plan into the todo/plan tool of your harness: one phase per plan wave, one todo per column-zero checkbox (including the final verification wave). Register ALL of them up front - never keep tasks in memory only.
|
|
65
|
-
3. **Keep them current at every moment.** Mark a todo in_progress when its work dispatches and done immediately after its verification passes. Never batch-complete at the end, never execute work that is not a registered todo; discovered work inside the change's blast radius — the request not delivered, a regression this change introduces, an invalid proof, a failing test or stale doc of touched code — is appended to the plan as a checkbox, mirrored as a todo
|
|
65
|
+
3. **Keep them current at every moment.** Mark a todo in_progress when its work dispatches and done immediately after its verification passes. Never batch-complete at the end, never execute work that is not a registered todo; discovered work inside the change's blast radius — the request not delivered, a regression this change introduces, an invalid proof, a failing test or stale doc of touched code — is appended to the plan as a follow-up checkbox after the checkpoint in progress, mirrored as a todo, and fixed to the ideal state once that checkpoint closes; it joins the open checkpoint only when it blocks that checkpoint's acceptance; a defect outside it gets a tracked issue with reproduction and evidence and a line in the final report. A worker that meets a defect outside its assigned files reports it instead of fixing it; only the orchestrator appends the checkbox and dispatches it to a correctly scoped unit. The todo list, Boulder state, and plan checkboxes must always tell the same story.
|
|
66
66
|
|
|
67
67
|
## Phase 1: Select the plan
|
|
68
68
|
|
|
@@ -105,14 +105,14 @@ Write `.omo/boulder.json` before implementation starts. Prefix session ids with
|
|
|
105
105
|
}
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
Every phase (plan wave) runs in its own task-owned worktree with its own goal: before the wave's first dispatch, record the wave's goal — its checkboxes and their acceptance criteria — as a ledger entry, then `git worktree add <repo>-wt/<plan>-<wave> <branch off the integration base>` (or verify a `--worktree` path with `git worktree list --porcelain`), store the absolute path as `worktree_path`, run every edit, command, test, and evidence capture inside it; the wave lands on the integration base once its checkboxes
|
|
108
|
+
Every phase (plan wave) runs in its own task-owned worktree with its own goal: before the wave's first dispatch, record the wave's goal — its checkboxes and their acceptance criteria — as a ledger entry, then `git worktree add <repo>-wt/<plan>-<wave> <branch off the integration base>` (or verify a `--worktree` path with `git worktree list --porcelain`), store the absolute path as `worktree_path`, run every edit, command, test, and evidence capture inside it; the wave lands on the integration base once each of its checkboxes is verified or `[~]` (direct merge, or the PR under `--make-pr`/`--ship`; a `[~]` row's unverified changes do not land: a dispatched worker reverts them in the wave worktree before landing, and the `unmet` entry records the revert), and the next wave branches from that landed base. Use the bundled ultrawork directive’s Task resources and todo rules at wave/worktree creation; read those sections if absent from context.
|
|
109
109
|
|
|
110
110
|
## Parallel delivery lanes (teams and worktrees)
|
|
111
111
|
|
|
112
112
|
Solo orchestration with parallel background workers is the default topology. Decide once, when the wave's lanes are known, and record the verdict in the ledger:
|
|
113
113
|
|
|
114
114
|
- **Independent lanes -> parallel workers.** Separate files, no shared contract: one parallel spawn burst; no team.
|
|
115
|
-
- **Dependency-ordered lanes -> one `workflow` run per wave.** Sub-tasks with real ordering between them (C needs A and B finished first) and a harness with a native `workflow` tool: dispatch the wave as ONE run (one producer node per lane plus a verification node); recover inside it with `retry`/`amend`/`send`; let
|
|
115
|
+
- **Dependency-ordered lanes -> one `workflow` run per wave.** Sub-tasks with real ordering between them (C needs A and B finished first) and a harness with a native `workflow` tool: dispatch the wave as ONE run (one producer node per lane plus a verification node); recover inside it with `retry`/`amend`/`send`; let the run's settle wake you instead of arming per-lane watchers; the next wave is a NEW run (or `amend` when only the definition changed) — never one graph for the whole plan. Read the `mass-ulw` skill's `SKILL.md` and `references/planning.md` IN FULL before defining any graph.
|
|
116
116
|
- **Overlapping lanes -> a team.** The lanes touch the same module or contract AND running them concurrently actually finishes sooner: stand up a team (where the harness has one) so one lane's discoveries relay through you mid-flight.
|
|
117
117
|
- **PR-mode independent lanes -> a worktree per lane.** Under `--make-pr`/`--ship`, when a wave holds independent checkboxes, give each lane its own branch and task-owned worktree, delivered as its own PR.
|
|
118
118
|
|
|
@@ -190,7 +190,7 @@ For each checkbox, complete all five gates before marking it done:
|
|
|
190
190
|
4. Adversarial QA: exercise every class the Phase 3 trigger map marks applicable and capture the observable result for each.
|
|
191
191
|
5. Cleanup: register every QA resource teardown as its own todo when spawned (QA scripts, tmux assets, browser sessions, PIDs, ports, containers, temp dirs), execute each, and capture the receipt. No QA asset is left running.
|
|
192
192
|
|
|
193
|
-
Append evidence to `.omo/ulw-execute/ledger.jsonl`, one JSON object per line. Include at least `event`, `plan`, `task`, `session_id`, `commands`, `artifact`, `adversarial_classes`, and `cleanup` fields. `adversarial_classes` lists each probed class with its observable result and each ruled-out class with a one-line reason.
|
|
193
|
+
Append evidence to `.omo/ulw-execute/ledger.jsonl`, one JSON object per line. Include at least `event`, `plan`, `task`, `session_id`, `commands`, `artifact`, `adversarial_classes`, and `cleanup` fields, plus `attempt` and `checkpoint_opened_at` on every entry tied to a checkbox. `adversarial_classes` lists each probed class with its observable result and each ruled-out class with a one-line reason.
|
|
194
194
|
|
|
195
195
|
### Completion contract
|
|
196
196
|
|
|
@@ -208,6 +208,7 @@ A worker done claim is never final: each implementation sub-task returns a `Done
|
|
|
208
208
|
},
|
|
209
209
|
"AdversarialVerify": {
|
|
210
210
|
"verdict": "confirmed | false-positive | needs-fix | needs-human-review",
|
|
211
|
+
"failure_class": "none | product | harness",
|
|
211
212
|
"evidence": ["file path, command, log, artifact, or explicit not inspected"],
|
|
212
213
|
"repro": "exact command or manual steps when available",
|
|
213
214
|
"confidence": 0.0
|
|
@@ -219,7 +220,9 @@ Rules:
|
|
|
219
220
|
- `confirmed` is the only pass verdict. `false-positive`, `needs-fix`, and `needs-human-review` all block checkbox completion.
|
|
220
221
|
- The verifier must be independent from the executor: use the harness's gate reviewer (see the harness compatibility section) or a fresh reviewer worker on a strong model, or root only when root did not implement or materially rewrite that task.
|
|
221
222
|
- A worker done claim must be independently verified before it becomes checkbox completion.
|
|
222
|
-
- On
|
|
223
|
+
- On a non-confirmed verdict, append the feedback to the ledger with the attempt number and its failure signature (the failing check plus its first error line, with volatile values stripped: temp-dir paths, timestamps, process and run ids, durations). Attempts count per checkbox across all its sub-tasks and re-splits, timed from its first dispatch (`checkpoint_opened_at`). STOP when the same signature repeats on consecutive attempts, on the third failed attempt, or 4 hours after the first dispatch (a plan may change these numbers, never remove the stop). Check the 4-hour bound also when a lane's watcher fires or the turn resumes without a verdict; when it has passed, cancel that lane and stop the same way: mark the checkbox `- [~]` (the plan grammar's blocked state) with a one-line gap naming what is unmet and the last evidence, mark every checkbox that depends on it, directly or through another `[~]` row, `- [~]` with the gap `blocked by <id>`, close the todo of every row marked `[~]` here labelled `blocked: <gap>`, append an `unmet` ledger entry listing what each attempt changed, and continue in the same turn with the next checkpoint that depends on none of them, or with Completion when none remains. Otherwise leave the checkbox `- [ ]` and re-dispatch the executor with the exact failure.
|
|
224
|
+
- A `[~]` row counts as closed, never as a met dependency: Phase 3 skips it, Completion starts once every top-level row is `[x]` or `[~]`, and the `ORCHESTRATION COMPLETE` block names each `[~]` row with its gap. Final Verification Wave rows are never dependents of a `[~]` row: they verify the landed work and report each `[~]` row as a known gap, which alone never fails a final-wave row. A `[~]` gap is never re-queued as a new checkbox in this run, by the blast-radius rule or by a final-wave verdict; the one harness-repair follow-up in the next rule is the only exception.
|
|
225
|
+
- The verifier sets `failure_class`. A `harness` failure (the runner, fixture, CI job or environment failed and the product behavior was never exercised) gets one repair dispatch inside the checkpoint, which does not count as an attempt; when it recurs, stop as above with the harness gap named and append the harness repair once as a follow-up checkbox; a harness-repair follow-up that stops is reported, not re-appended.
|
|
223
226
|
- The verifier must probe the applicable adversarial keys, including `stale_state`, `dirty_worktree`, and `misleading_success_output`, before allowing `FullyDone`.
|
|
224
227
|
|
|
225
228
|
## Phase 5: Mark progress
|
|
@@ -12,6 +12,7 @@ ulw-research/
|
|
|
12
12
|
├── references/
|
|
13
13
|
│ ├── deliverable-phase.md # lanes, state, destination defaults, interview, memory episodes, design spec, gates, repair, manifest, command reference
|
|
14
14
|
│ ├── report-gates.md # one row per defect code: severity, integrity, what it detects, how to fix
|
|
15
|
+
│ ├── report-visualization.md # which visual fits which finding, render commands (charts, Mermaid, PlotNeuralNet), quality bar, visual QA checklist
|
|
15
16
|
│ └── latex-report.md
|
|
16
17
|
└── scripts/
|
|
17
18
|
├── report-tools.mjs # CLI entry + dispatcher (COMMANDS, run, main)
|
|
@@ -22,7 +23,7 @@ ulw-research/
|
|
|
22
23
|
├── repair-tracker.mjs # bounded repair decisions (attempts, plateau, oscillation, wall clock, integrity codes)
|
|
23
24
|
├── html-lite.mjs / entities.mjs # HTML tokenizer, selector paths, prose text
|
|
24
25
|
├── css-lite.mjs / design-spec.mjs # CSS scanning, palette + lineage parsing, design-spec rendering
|
|
25
|
-
├── gates-static.mjs + gates-text.mjs / gates-figures.mjs / gates-structure.mjs # static gates G1-
|
|
26
|
+
├── gates-static.mjs + gates-text.mjs / gates-figures.mjs / gates-structure.mjs # static gates G1-G17
|
|
26
27
|
├── layout-probe.mjs / gates-layout.mjs # in-page probe source + layout gates L1-L5 over its output
|
|
27
28
|
├── format-extract.mjs / format-extract-css.mjs # design-spec draft from a pointed-at HTML or Markdown document
|
|
28
29
|
├── *.test.ts # co-located bun tests, one per module (unshipped)
|
|
@@ -40,7 +41,7 @@ ulw-research/
|
|
|
40
41
|
- The CLI never launches a browser. The layout probe is printed as one async expression; the orchestrator evaluates it through the browser skill's owned headless engine and passes the result back with `check --layout`.
|
|
41
42
|
- Time is always injected (`--now`, `startedAt`); no module reads the clock inside a decision.
|
|
42
43
|
- Tests are co-located given/when/then bun tests; CLI tests spawn `node` with bun removed from `PATH`. Fixtures live only under `scripts/tests/fixtures/`, are depersonalized, and never ship.
|
|
43
|
-
- The senpi source dir (`packages/omo-senpi/skills/ulw-research/`) intentionally has no `scripts/`, `references/report-gates.md`,
|
|
44
|
+
- The senpi source dir (`packages/omo-senpi/skills/ulw-research/`) intentionally has no `scripts/`, `references/report-gates.md`, `references/deliverable-phase.md`, or `references/report-visualization.md`: the senpi sync overlays them from here byte-for-byte (`sharedAssets` in `packages/omo-senpi/plugin/scripts/native-skill-sources.mjs`), and both editions' sync suites assert the shipped copies equal these sources.
|
|
44
45
|
- References and scripts carry no Hangul (Korean match strings are `\u` escapes) and never three consecutive newlines (the senpi sync normalizes those and would break byte equality).
|
|
45
46
|
|
|
46
47
|
## ANTI-PATTERNS
|
|
@@ -134,7 +134,7 @@ Then create the session directory:
|
|
|
134
134
|
mkdir -p .omo/ulw-research/$(date +%Y%m%d-%H%M%S)
|
|
135
135
|
```
|
|
136
136
|
|
|
137
|
-
This is `$SESSION_DIR`. The orchestrator owns the journal: you write every file in it; workers never do. Maintain:
|
|
137
|
+
This is `$SESSION_DIR`. The orchestrator owns the journal: you write every file in it; workers never do (a mass-research dag node writes only its own `waves/<run-key>/<node-id>.md` handoff file, which carries its EXPAND tail and claim candidates; you journal from it). Maintain:
|
|
138
138
|
|
|
139
139
|
- `brief.md` — the analysis block, the axis list, the expected truths, and the `## Deliverable` record from the interview below (lane, state, formats, each field with `answered_by`).
|
|
140
140
|
- `sources-ledger.md` — one line per source the moment it is read: `[S<n>] <url> — <what it is>`. The closing briefing counts sources and domains from this file.
|
|
@@ -167,7 +167,7 @@ Phase 5 opens by turning the recorded fields into `design-spec.md`.
|
|
|
167
167
|
|
|
168
168
|
## Phase 1 — Saturation wave
|
|
169
169
|
|
|
170
|
-
**When the user asked for MASS research, the wave is sized by the topic's angles, not by the roster ceiling.** "mass ulw research", "mulw research", "ulw mass research" — in any language — order over-collection that a team of 8 cannot produce. Where the harness has a dependency-graph surface (the `mass-ulw` skill and its `references/planning.md`), run collection through it instead:
|
|
170
|
+
**When the user asked for MASS research, the wave is sized by the topic's angles, not by the roster ceiling.** "mass ulw research", "mulw research", "ulw mass research" — in any language — order over-collection that a team of 8 cannot produce. Where the harness has a dependency-graph surface (the `mass-ulw` skill and its `references/planning.md`), run collection through it instead: 60+ angles covering every angle the topic has, routed across the whole difficulty ladder — mechanical sweeps and per-item harvest batches on the cheapest tier, judgment-shaped angles a step up, cross-territory angles a step above that, and the deepest tier reserved for genuinely hairy contradictions. Define each angle as a harvest -> expand -> verify chain before the run starts, each stage reading the previous stage's handoff file; open leads re-enter as new chains in each cluster of angles the moment that cluster settles, and the synthesis reduces through per-cluster architect-tier slice reducers into ONE architect-tier reducer (the strongest reasoning tier substitutes wherever no architect tier exists). Absent that surface, run the same per-angle chains with background workers, pasting each worker's reply into its angle's next-stage prompt the moment it reports. Everything else in this skill still binds: the deliverable interview, the journal, the claim graph, the convergence rules, and the delivery gates.
|
|
171
171
|
|
|
172
172
|
Otherwise launch the entire first wave in one turn — every axis at once, as team members if you formed a team, else as background workers. Sequential launches and "start with one and see" defeat the mode.
|
|
173
173
|
|
|
@@ -268,7 +268,7 @@ Journal each verdict to `verify-<slug>.md`.
|
|
|
268
268
|
|
|
269
269
|
Code settles code-shaped claims (Phase 3). Numeric, market-share, legal, dated, causal, and financial claims cannot be run — so they pass through a data-flow-lock instead (the verification idea adapted from fivetaku/insane-research): the synthesis may assert a high-risk non-code claim **only** if it cleared this gate, and the gate's output is the sole allowlist the synthesis draws from. Skip the gate and there is nothing to synthesize — the lock is self-enforcing.
|
|
270
270
|
|
|
271
|
-
The claim graph is orchestrator-owned. Workers only return verified-claim markers, observation candidates, and claim candidates as message text, the same channel as EXPAND markers — never a file. As leads resolve, you record one node per asserted claim in `claim-graph.md` and compute its status; workers report claim candidates in their replies, and you decide. The graph is the single claim store: final synthesis may not draw from free-form claims that skipped it.
|
|
271
|
+
The claim graph is orchestrator-owned. Workers only return verified-claim markers, observation candidates, and claim candidates as message text, the same channel as EXPAND markers — never a file (except a mass-research dag node's handoff file). As leads resolve, you record one node per asserted claim in `claim-graph.md` and compute its status; workers report claim candidates in their replies, and you decide. The graph is the single claim store: final synthesis may not draw from free-form claims that skipped it.
|
|
272
272
|
|
|
273
273
|
A high-risk claim clears the gate to `verified-claims` only when all hold:
|
|
274
274
|
|
|
@@ -334,6 +334,8 @@ Asset workers (background, parallel, each fed `design-spec.md`) — visuals are
|
|
|
334
334
|
- **Generated visuals through the imagegen skill whenever the session has it:** a cover plus a concept illustration per major theme, prompted from the spec's style, palette, and mood — document-styled illustration, never generic stock art dropped into a designed page.
|
|
335
335
|
- **Full-page screenshots** of the top 5-10 sources, saved by the web workers while reading, as provenance you can show.
|
|
336
336
|
|
|
337
|
+
**Every final report is visual — binding.** It carries at least one data visualization of the run's own findings (a chart drawn from the data table, next to the claim it supports), a diagram wherever structure matters, and the topic's own screenshots and video, embedded or linked with attribution; every figure is captioned, sourced, and given alt text. Mermaid for flows, timelines, and relations; generated charts for numbers; image generation only where an illustration genuinely helps; PlotNeuralNet for paper-format reports that describe model architectures. Every asset lane reads [references/report-visualization.md](references/report-visualization.md) first: which tool fits which finding, the render commands, the quality bar, and the checklist the gates apply. A light-tier post still carries one visual when it reports numbers or structure.
|
|
338
|
+
|
|
337
339
|
**Verify the asset manifest before rendering.** List every asset the document references, assert each file exists and is non-empty on disk, and re-render whatever is missing. A document that renders with three broken diagrams is a document you will publish twice.
|
|
338
340
|
|
|
339
341
|
Assembly worker — `task(category="deep-low", load_skills=["frontend", "visual-qa", "open-design", "data-scientist", "imagegen", "ulw-loop"], run_in_background=true, ...)`: before writing, read every available design and visualization skill and apply it — the report is a designed artifact, not a text dump; the worker's prompt carries `design-spec.md`. Use the template the user approved; absent a stronger house style the default skeleton is executive summary → key findings by theme → detailed analysis (quotes under 20 words with attribution, charts, Mermaid graphs, generated visuals, SHA-pinned permalinks, verification results) → comparative analysis when options compete → numbered sources with access dates → methodology appendix (workers, waves, searches, verifications, debate rounds) → correction log naming what verification overturned. Write it long and specific: every claim cites `[Source N]`, and the sources section lists every source the run actually used rather than a curated few.
|
|
@@ -342,7 +344,7 @@ Assembly worker — `task(category="deep-low", load_skills=["frontend", "visual-
|
|
|
342
344
|
|
|
343
345
|
Nothing reaches the user until the gates pass. Record each result with `node "$SKILL_DIR/scripts/report-tools.mjs" outcome gate <static|layout|visual|proofread> <pass|fail|not_run> --session-dir "$SESSION_DIR"`; a gate this harness does not provide is recorded `not_run`. A chat or post answer (light tier) runs the static gates and one render; every paginated or web deliverable runs them all (the reference's sections 3 and 7).
|
|
344
346
|
|
|
345
|
-
1. **Static gates (always, before anyone looks at pixels).** `node "$SKILL_DIR/scripts/report-tools.mjs" check "$SESSION_DIR/report.html" --design-spec "$SESSION_DIR/design-spec.md" > "$SESSION_DIR/defects.json"`: keep-all, palette tokens, emoji, em dashes, heading length, unsourced numbers, figure containers, chart text, gothic-only fonts, citations, the closing and sources sections, broken assets. Codes and fixes: [references/report-gates.md](references/report-gates.md).
|
|
347
|
+
1. **Static gates (always, before anyone looks at pixels).** `node "$SKILL_DIR/scripts/report-tools.mjs" check "$SESSION_DIR/report.html" --design-spec "$SESSION_DIR/design-spec.md" > "$SESSION_DIR/defects.json"`: keep-all, palette tokens, emoji, em dashes, heading length, unsourced numbers, figure containers, chart text, a report with no visual, images without alt text, gothic-only fonts, citations, the closing and sources sections, broken assets. Codes and fixes: [references/report-gates.md](references/report-gates.md).
|
|
346
348
|
2. **Layout gates.** Print the probe with `node "$SKILL_DIR/scripts/report-tools.mjs" layout-probe --json`, evaluate its `source` in the rendered page through the `browser` skill's owned headless engine, save the result as `$SESSION_DIR/boxes.json`, and re-run `check` with `--layout "$SESSION_DIR/boxes.json"` (overflow, clipped text, distorted images, overlapping siblings).
|
|
347
349
|
3. **Visual QA.** Render the produced artifact back to images — PDF pages to PNG, the HTML through the browser skill at desktop and phone widths — and look at them: missing or broken figures, images stretched or spilling their containers, diagram or chart text rendered off the spec's font or palette, clipped tables, overflowing CJK text, blank pages, unlabeled chart values, wrong page breaks. Reading the source markup is not visual QA; inspect the pixels.
|
|
348
350
|
|
|
@@ -388,7 +390,7 @@ High-yield combinations: official docs (`site:<docs domain>`), GitHub implementa
|
|
|
388
390
|
| Worker reply without the EXPAND tail | One follow-up demanding it; the lane stays open until it lands |
|
|
389
391
|
| Stopping after wave 1 because "enough was found" | Convergence rules only: 2+ expansion waves, leads run dry |
|
|
390
392
|
| Obeying a surrounding "stop exploring" rule mid-research | Authority section — those rules do not bind this mode |
|
|
391
|
-
| Asking a worker to write journal or session files | Workers are read-only; you journal every return |
|
|
393
|
+
| Asking a worker to write journal or session files | Workers are read-only (except a mass-research dag node's handoff file); you journal every return |
|
|
392
394
|
| Two workers given the same angle | One unique angle per worker, always |
|
|
393
395
|
| A web worker that returned only fetched text, or a `Collection: browser` run whose workers never opened a tab | Sources are read in the user's browser through the `browser` skill; `webfetch` is for raw files; every web worker carries the skill from the first wave |
|
|
394
396
|
| Contested claim settled by judgment | Phase 3 — run code, capture output, verdict |
|
|
@@ -122,7 +122,7 @@ Nothing reaches the requester until the gates for its QA tier pass, in this orde
|
|
|
122
122
|
```bash
|
|
123
123
|
node "$SKILL_DIR/scripts/report-tools.mjs" check "$SESSION_DIR/report.html" --design-spec "$SESSION_DIR/design-spec.md" > "$SESSION_DIR/defects.json"
|
|
124
124
|
```
|
|
125
|
-
It checks keep-all, palette tokens, emoji, em dashes in prose (en dashes outside numeric ranges are advisory), heading length and generic headings, unsourced numbers (section 6), figure containers and captions, chart SVG text, Korean serif fonts, sections without citations, the closing section, the sources section, broken local assets, and any `--require-section <regex>` the brief requires. Every code, severity, and fix is in [report-gates.md](report-gates.md).
|
|
125
|
+
It checks keep-all, palette tokens, emoji, em dashes in prose (en dashes outside numeric ranges are advisory), heading length and generic headings, unsourced numbers (section 6), figure containers and captions, chart SVG text, a report with no visual at all, images without alt text, Korean serif fonts, sections without citations, the closing section, the sources section, broken local assets, and any `--require-section <regex>` the brief requires. Every code, severity, and fix is in [report-gates.md](report-gates.md).
|
|
126
126
|
2. **Layout gates.** Print the probe, evaluate it in the rendered page through the browser skill's owned headless engine, save the returned object as `$SESSION_DIR/boxes.json`, and re-run `check` with `--layout "$SESSION_DIR/boxes.json"`. It adds overflow past the container, clipped text, scroll containers, distorted images, and overlapping siblings.
|
|
127
127
|
```bash
|
|
128
128
|
node "$SKILL_DIR/scripts/report-tools.mjs" layout-probe --json # .source is one async expression
|
|
@@ -19,6 +19,8 @@ This reference catalogs every defect code the report gates (`static`, `layout`,
|
|
|
19
19
|
| `chart_without_figure` | major | false | An image or chart lacks a figure wrapper with a caption. Uncaptioned charts isolate visuals from narrative flow. | Wrap the image or chart in a figure container with a caption. |
|
|
20
20
|
| `chart_svg_no_text` | major | false | An SVG chart or diagram lacks a title, axis labels, units, or value labels. Visuals cannot stand alone without text guidance. | Give the chart a title, axis labels, units, and value labels as SVG text. |
|
|
21
21
|
| `chart_svg_missing_labels` | minor | false | An SVG chart has some labels (e.g., title) but is missing others (e.g., axis ticks or unit). | Add the missing title, axis ticks, or unit label to the chart. |
|
|
22
|
+
| `report_without_visual` | major | false | The report body has no chart, diagram, or figure image at all (header logos, icons, and images marked decorative do not count; only rendered output counts, so a Mermaid source block or a zero-size image does not). A text-only report hides structure and trends the reader would see at a glance. | Add at least one captioned visual of the findings: a chart from the data table, a rendered Mermaid diagram, or a figure image (references/report-visualization.md). |
|
|
23
|
+
| `image_missing_alt` | minor | false | A figure image has a missing or empty `alt` and is not marked decorative. Screen readers and failed image loads leave the reader with nothing. An image is decorative only with an empty `alt` plus `role="presentation"` (or `role="none"`, or `aria-hidden="true"`): it raises nothing here and does not count as a visual. | Give the image an alt attribute that states what it shows, not its file name; mark a purely decorative image alt="" with role="presentation". |
|
|
22
24
|
| `korean_serif_font` | major | false | A serif or brush Korean font family is applied to Korean text. The design spec mandates gothic (sans) Korean typefaces. | Use a gothic (sans) Korean family; serif and brush families are banned by the design spec. |
|
|
23
25
|
| `section_without_citation` | major | false | A major section or subsection contains no in-text citations or reference marks. Source attribution is missing. | Cite at least one source inside this section or merge it into a cited one. |
|
|
24
26
|
| `missing_closing_section` | blocker | true | The report lacks a closing section explaining the methodology, sources, and gate outcomes. Delivery is incomplete without narrative closure. | Add the closing section that explains how the report was made (method, sources, gates). |
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# ulw-research - report visualization playbook
|
|
2
|
+
|
|
3
|
+
Read this before the asset lanes start in the final-materials phase. A report the reader has to dig through as plain text has failed even when every claim is right: people understand structure from a diagram and a trend from a chart faster than from prose. Every final report therefore carries visuals, and this file says which visual fits which finding, how to make each one, and how the gates check them.
|
|
4
|
+
|
|
5
|
+
## 1. The binding minimum
|
|
6
|
+
|
|
7
|
+
- At least one data visualization of the report's own findings (a chart drawn from the run's data table), placed next to the claim it supports. The executive summary carries the headline visual.
|
|
8
|
+
- A diagram wherever structure matters: a process, an architecture, a timeline, a dependency or influence graph, a comparison of options, the evidence flow behind a contested claim.
|
|
9
|
+
- When the topic has visual or video source material (product screenshots, demo videos, talks, viral posts with media), the report embeds or links it with attribution. In a paginated format, use a captioned still frame plus the link and timestamp.
|
|
10
|
+
- Every visual sits in a `<figure>` with a caption that says what it shows and where the data came from (`[S<n>]` or a lineage tag), and every `<img>` has alt text.
|
|
11
|
+
- A light-tier answer (a chat or thread post) still carries one visual when it reports numbers or structure: a Mermaid block the destination renders, or a single chart image.
|
|
12
|
+
|
|
13
|
+
A report that ships with none of these is incomplete. The static gate raises `report_without_visual` for it and `image_missing_alt` for an image without alt text (section 6).
|
|
14
|
+
|
|
15
|
+
## 2. Which tool for which finding
|
|
16
|
+
|
|
17
|
+
| Finding | Tool | Output |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| Numbers: trends, comparisons, distributions, shares, rankings | A chart computed from a real data table | SVG with live text (PNG only for DOCX or slides) |
|
|
20
|
+
| Process, pipeline, decision flow, sequence of calls | Mermaid `flowchart` or `sequenceDiagram` | SVG |
|
|
21
|
+
| Timeline or history | Mermaid `timeline` or `gantt` | SVG |
|
|
22
|
+
| Relationships: who builds on whom, ownership, influence, dependency | Mermaid `flowchart` or `graph`; `mindmap` for a topic tree | SVG |
|
|
23
|
+
| System or product architecture | Mermaid `flowchart` with subgraphs, or `architecture-beta` where the renderer supports it | SVG |
|
|
24
|
+
| Neural-network architecture in a paper-format (LaTeX) report | PlotNeuralNet | PDF for LaTeX, SVG or PNG for HTML |
|
|
25
|
+
| A product, interface, or page the report discusses | A screenshot captured while reading the source, through the browser skill | PNG |
|
|
26
|
+
| A concept that has no data and no structure, a cover | The image-generation skill, only when it helps the reader understand | PNG |
|
|
27
|
+
| A source video or talk | An embed (web) or a still frame plus link and timestamp (paginated) | iframe or PNG |
|
|
28
|
+
|
|
29
|
+
Image generation never draws data, numbers, diagrams with labels, or anything the reader could mistake for evidence. Its caption says it is an illustration.
|
|
30
|
+
|
|
31
|
+
## 3. How to make each one
|
|
32
|
+
|
|
33
|
+
Save every asset under `$SESSION_DIR/assets/` and confirm the file exists and is non-empty before the document references it.
|
|
34
|
+
|
|
35
|
+
### Charts from data
|
|
36
|
+
|
|
37
|
+
Put the numbers in a table first (`$SESSION_DIR/data/<name>.csv`), then plot from the table, never from prose. Follow the data-scientist doctrine in SKILL.md (numpy, Polars, DuckDB, no pandas).
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
uv run --with numpy --with polars --with matplotlib python plot_<name>.py
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- Keep chart text as real text: set `matplotlib.rcParams["svg.fonttype"] = "none"` before saving an SVG. The default converts text to paths, and the static gate then sees a chart with no title, ticks, or labels.
|
|
44
|
+
- Use the design spec's font family and palette tokens (`rcParams["font.family"]`, explicit colors from the spec). One accent color for the series that carries the finding; neutral tones for the rest.
|
|
45
|
+
- Title, axis labels with units, value labels on bars or end points, ticks at round values computed from the data range.
|
|
46
|
+
- One message per chart. A chart that needs a paragraph to explain is two charts.
|
|
47
|
+
- For a web deliverable, HTML/CSS bars or an inline SVG built from the same table are preferred over an image.
|
|
48
|
+
|
|
49
|
+
### Mermaid diagrams
|
|
50
|
+
|
|
51
|
+
Write the source to `assets/<name>.mmd` and render it to SVG with the design spec's font and palette:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
cat > "$SESSION_DIR/assets/mermaid-config.json" <<'EOF'
|
|
55
|
+
{ "theme": "base", "htmlLabels": false, "flowchart": { "htmlLabels": false }, "themeVariables": { "fontFamily": "<spec body font>", "primaryColor": "<spec surface>", "primaryTextColor": "<spec text>", "primaryBorderColor": "<spec accent>", "lineColor": "<spec rule>", "arrowheadColor": "<spec rule>" } }
|
|
56
|
+
EOF
|
|
57
|
+
npx -y @mermaid-js/mermaid-cli -i "$SESSION_DIR/assets/<name>.mmd" -o "$SESSION_DIR/assets/<name>.svg" -c "$SESSION_DIR/assets/mermaid-config.json" -b transparent
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- Keep `htmlLabels` off. With HTML labels the node text lands in `foreignObject` HTML instead of SVG `<text>`, so the static gate sees a diagram with no labels, and PDF and DOCX converters often drop it.
|
|
61
|
+
- The CLI drives its own headless renderer. When it cannot start in this session, keep the `.mmd` source, deliver the diagram as a Mermaid code block only where the destination renders Mermaid (GitHub, Notion, many Markdown viewers), and record the render as not run in the closing section. The static gate counts only rendered figures, so an HTML report still needs another rendered visual.
|
|
62
|
+
- Keep a diagram to about 15 nodes. Split a bigger one by subgraph or by step.
|
|
63
|
+
- Lay a chain of more than about five nodes out top to bottom (`flowchart TB`). A wide left-to-right diagram scaled down to the page width shrinks its labels below legible size, worst on a phone.
|
|
64
|
+
- Label every edge whose meaning is not obvious. Node text is short nouns; the caption carries the explanation.
|
|
65
|
+
- Inline the rendered SVG in HTML reports (the gates read its text) or reference the file inside a `<figure>`.
|
|
66
|
+
|
|
67
|
+
### PlotNeuralNet (paper-format reports)
|
|
68
|
+
|
|
69
|
+
Use it when the deliverable is LaTeX or a paper-style PDF and the report describes a convolutional or encoder-decoder model whose layer shapes matter. It draws 3D layer blocks with TikZ from a short Python description. It needs a LaTeX toolchain (`pdflatex` with TikZ; on Debian or Ubuntu `texlive-latex-base`, `texlive-latex-extra`, `texlive-fonts-recommended`, `texlive-fonts-extra`; on macOS a TeX distribution) and Python 3. Source: https://github.com/HarisIqbal88/PlotNeuralNet
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git clone --depth 1 https://github.com/HarisIqbal88/PlotNeuralNet "$SESSION_DIR/tools/PlotNeuralNet"
|
|
73
|
+
mkdir -p "$SESSION_DIR/tools/PlotNeuralNet/report" && cd "$SESSION_DIR/tools/PlotNeuralNet/report"
|
|
74
|
+
# write arch.py from the README's Python example: to_head(".."), to_cor(), to_begin(), layers, to_connection(...), to_end()
|
|
75
|
+
python3 arch.py # writes arch.tex
|
|
76
|
+
pdflatex -interaction=nonstopmode arch.tex
|
|
77
|
+
pdftocairo -svg arch.pdf "$SESSION_DIR/assets/arch.svg" # for an HTML report; LaTeX reports \input the .tex or include the PDF
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
- Run `pdflatex` directly instead of the repository's `tikzmake.sh`: that script deletes the generated `.tex` (which a LaTeX report needs to `\input`) and opens a PDF viewer. The repository has had no commits since 2020; pin the cloned commit in the closing section.
|
|
81
|
+
- Layer captions carry the real shapes and channel counts from the cited paper or code, with the citation in the figure caption.
|
|
82
|
+
- It does not fit transformers, graph models, or training pipelines well. Draw those with Mermaid or a hand-built TikZ figure instead.
|
|
83
|
+
|
|
84
|
+
### Screenshots and video
|
|
85
|
+
|
|
86
|
+
- Capture product and page screenshots through the browser skill while the source is open, at a readable width, and crop to the part the claim is about. Caption with the source and the access date.
|
|
87
|
+
- Embed a video in a web report with the platform's embed and a timestamp; in a paginated report, use a still frame from the moment the claim refers to, with the link and timestamp in the caption.
|
|
88
|
+
|
|
89
|
+
### Generated illustrations
|
|
90
|
+
|
|
91
|
+
Use the image-generation skill only for a cover or a concept illustration that helps the reader, prompted from the design spec's palette and register. Never let generated images carry text, numbers, or logos the reader could read as fact.
|
|
92
|
+
|
|
93
|
+
## 4. Choosing the output format
|
|
94
|
+
|
|
95
|
+
A post by Andrej Karpathy on 2026-10-02 ranks the formats that make model output easier to understand, each better than the last: controlled clean writing, diagrams and images, interactive web pages, and custom explainer videos (https://x.com/karpathy/status/2105819303471976479). Apply it as follows:
|
|
96
|
+
|
|
97
|
+
- Prose: write in the direction of ASD-STE100 (simplified technical English): short sentences, one idea per sentence, active voice, the same word for the same thing. The post suggests asking for about "80% of the way" when the full spec is too strict.
|
|
98
|
+
- Before writing a long explanation of structure, draw it. A diagram usually replaces several paragraphs.
|
|
99
|
+
- When the destination allows it, prefer a self-contained HTML report with interactive elements (hover values, toggles between series, expandable evidence) over a static document.
|
|
100
|
+
- When the requester asks for it, or the topic is a process best seen in motion, an explainer video (for example a 3Blue1Brown-style animation, narrated with a speech API or a local text-to-speech model) is a valid extra deliverable. Record it in `outcome.json` like any other promised format.
|
|
101
|
+
|
|
102
|
+
## 5. Quality bar
|
|
103
|
+
|
|
104
|
+
- Every figure follows the figure standard in SKILL.md: fixed container, contain-fit, aspect ratio preserved, spec fonts and palette.
|
|
105
|
+
- The caption alone tells the reader what the visual shows and what to conclude: "Median build time fell from 9.4 to 3.1 minutes after the cache change [S4]" beats "Build times".
|
|
106
|
+
- Alt text states the content, not the file: the key values or the shape of the trend for a chart, the main nodes and flow for a diagram. A purely decorative image takes `alt=""` plus `role="presentation"` and does not count as a visual; an empty alt without that marker is reported as missing.
|
|
107
|
+
- Every number in a visual comes from the data table and carries its source or lineage tag in the caption.
|
|
108
|
+
- Colors are never the only signal: label series directly or use distinct markers, so the figure reads in grayscale.
|
|
109
|
+
|
|
110
|
+
## 6. QA checklist
|
|
111
|
+
|
|
112
|
+
The static gate (`report-tools check`) enforces the machine-checkable rows; visual QA checks the rest on the rendered pages.
|
|
113
|
+
|
|
114
|
+
| Check | Enforced by |
|
|
115
|
+
| --- | --- |
|
|
116
|
+
| The report has at least one chart, diagram, or figure image | `report_without_visual` |
|
|
117
|
+
| Every visual sits in a figure with a non-empty caption | `chart_without_figure` |
|
|
118
|
+
| Every chart SVG has a title, ticks, and a text label | `chart_svg_no_text`, `chart_svg_missing_labels` |
|
|
119
|
+
| Every `<img>` has alt text | `image_missing_alt` |
|
|
120
|
+
| Every referenced asset exists and is non-empty | `broken_asset_reference` |
|
|
121
|
+
| Chart and diagram colors are spec tokens | `palette_off_token` |
|
|
122
|
+
| No image is stretched, cropped, or spilling its container | `layout_image_distorted`, `layout_overflow` |
|
|
123
|
+
| Each major quantitative finding has a chart and each structural finding has a diagram | visual QA |
|
|
124
|
+
| Diagram and chart text renders in the spec font and is legible at phone width | visual QA |
|
|
125
|
+
| Source videos and screenshots are embedded or linked with attribution where the topic has them | visual QA |
|
|
126
|
+
| Generated illustrations carry no fake data or text and are captioned as illustrations | visual QA |
|
|
@@ -25,6 +25,8 @@ export const DEFECT_CODES = deepFreeze({
|
|
|
25
25
|
chart_without_figure: { severity: "major", integrity: false, hint: "Wrap the image or chart in a figure container with a caption." },
|
|
26
26
|
chart_svg_no_text: { severity: "major", integrity: false, hint: "Give the chart a title, axis labels, units, and value labels as SVG text." },
|
|
27
27
|
chart_svg_missing_labels: { severity: "minor", integrity: false, hint: "Add the missing title, axis ticks, or unit label to the chart." },
|
|
28
|
+
report_without_visual: { severity: "major", integrity: false, hint: "Add at least one captioned visual of the findings: a chart from the data table, a rendered Mermaid diagram, or a figure image (references/report-visualization.md)." },
|
|
29
|
+
image_missing_alt: { severity: "minor", integrity: false, hint: "Give the image an alt attribute that states what it shows, not its file name; mark a purely decorative image alt=\"\" with role=\"presentation\"." },
|
|
28
30
|
korean_serif_font: { severity: "major", integrity: false, hint: "Use a gothic (sans) Korean family; serif and brush families are banned by the design spec." },
|
|
29
31
|
section_without_citation: { severity: "major", integrity: false, hint: "Cite at least one source inside this section or merge it into a cited one." },
|
|
30
32
|
missing_closing_section: { severity: "blocker", integrity: true, hint: "Add the closing section that explains how the report was made (method, sources, gates)." },
|
|
@@ -40,7 +42,7 @@ export const DEFECT_CODES = deepFreeze({
|
|
|
40
42
|
})
|
|
41
43
|
|
|
42
44
|
const LAYOUT_PREFIX = "layout_"
|
|
43
|
-
/** Codes checkStatic can raise (G1-
|
|
45
|
+
/** Codes checkStatic can raise (G1-G17). */
|
|
44
46
|
export const STATIC_CODES = Object.freeze(
|
|
45
47
|
Object.keys(DEFECT_CODES).filter((code) => !code.startsWith(LAYOUT_PREFIX) && code !== "missing_promised_deliverable"),
|
|
46
48
|
)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// gates-figures.mjs - visual gates: G2 palette, G8 chart without figure, G9 chart svg text,
|
|
2
|
-
// G10 Korean serif/brush fonts.
|
|
2
|
+
// G10 Korean serif/brush fonts, G16 report without any visual, G17 image without alt text.
|
|
3
3
|
//
|
|
4
4
|
// Each gate is { codes, skip?(ctx), run(ctx) -> Defect[] } over the context built by
|
|
5
5
|
// gates-static.mjs. Plain Node ESM, sibling imports only.
|
|
@@ -84,6 +84,19 @@ function missingChartLabels(raw) {
|
|
|
84
84
|
return missing
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
const DECORATIVE_ROLE = /^(?:presentation|none)$/i
|
|
88
|
+
|
|
89
|
+
/** An image explicitly marked decorative: empty alt plus role=presentation|none or aria-hidden=true. */
|
|
90
|
+
function isDecorative(node) {
|
|
91
|
+
if (node.tag !== "img" || node.attrs.alt === undefined || String(node.attrs.alt).trim()) return false
|
|
92
|
+
return DECORATIVE_ROLE.test(String(node.attrs.role ?? "").trim()) || String(node.attrs["aria-hidden"] ?? "").trim() === "true"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** A rendered diagram (Mermaid marks its root with aria-roledescription) has node labels, not axes and ticks. */
|
|
96
|
+
function isDiagram(node) {
|
|
97
|
+
return Boolean(node.attrs["aria-roledescription"])
|
|
98
|
+
}
|
|
99
|
+
|
|
87
100
|
function colorUses(ctx) {
|
|
88
101
|
const uses = new Map()
|
|
89
102
|
const add = (hex, node) => {
|
|
@@ -147,6 +160,10 @@ export const figureGates = [
|
|
|
147
160
|
for (const node of visuals(ctx)) {
|
|
148
161
|
if (node.tag !== "svg") continue
|
|
149
162
|
if (!((declaredSize(node) ?? 0) >= CHART_MIN || ctx.util.closest(node, isFigure(ctx)))) continue
|
|
163
|
+
if (isDiagram(node)) {
|
|
164
|
+
if (!svgTexts(node.raw ?? "").length) defects.push(ctx.defect("chart_svg_no_text", node, `${label(node)} diagram has no <text> labels (render Mermaid with htmlLabels off)`))
|
|
165
|
+
continue
|
|
166
|
+
}
|
|
150
167
|
const missing = missingChartLabels(node.raw ?? "")
|
|
151
168
|
if (missing === null) defects.push(ctx.defect("chart_svg_no_text", node, `${label(node)} chart has no <text> and no <title>`))
|
|
152
169
|
else if (missing.length) defects.push(ctx.defect("chart_svg_missing_labels", node, `${label(node)} chart is missing: ${missing.join(", ")}`))
|
|
@@ -154,6 +171,21 @@ export const figureGates = [
|
|
|
154
171
|
return defects
|
|
155
172
|
},
|
|
156
173
|
},
|
|
174
|
+
{
|
|
175
|
+
codes: ["report_without_visual"],
|
|
176
|
+
run(ctx) {
|
|
177
|
+
if (visuals(ctx).some((node) => declaredSize(node) !== 0 && !isDecorative(node))) return []
|
|
178
|
+
return [ctx.defect("report_without_visual", ctx.body, "the report has no chart, diagram, or figure image")]
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
codes: ["image_missing_alt"],
|
|
183
|
+
run(ctx) {
|
|
184
|
+
return visuals(ctx)
|
|
185
|
+
.filter((node) => node.tag === "img" && !String(node.attrs.alt ?? "").trim() && !isDecorative(node))
|
|
186
|
+
.map((node) => ctx.defect("image_missing_alt", node, `${label(node)} has no alt text`))
|
|
187
|
+
},
|
|
188
|
+
},
|
|
157
189
|
{
|
|
158
190
|
codes: ["korean_serif_font"],
|
|
159
191
|
run(ctx) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// gates-static.mjs - deterministic static gates (G1-
|
|
1
|
+
// gates-static.mjs - deterministic static gates (G1-G17) over a parsed report.
|
|
2
2
|
//
|
|
3
3
|
// Builds one document context (a document-order walk with h2 sections, citation helpers and a
|
|
4
4
|
// defect factory) and hands it to the text, figure and structure gate modules. Every severity
|
|
@@ -144,7 +144,7 @@ function buildContext(doc, options) {
|
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
/**
|
|
147
|
-
* Run G1-
|
|
147
|
+
* Run G1-G17 over a parsed report (html-lite root).
|
|
148
148
|
* @param {object} doc parseHtml(...) result
|
|
149
149
|
* @param {{ palette?: Set<string>, lineageMode?: "inline"|"section", requireSections?: (RegExp|string)[],
|
|
150
150
|
* baseDir?: string, fs?: { statSync(path: string): { size: number } }, closingPattern?: RegExp|string }} options
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// omo-codex-install:
|
|
2
|
+
// omo-codex-install:d6461760b0b2f0e272b51bfe2d55e5280cc505338f455df43303564f2465006c:3cb54cd0b22fe0bced6a100c92fc2b9f2eddc93cb6a82a57257140c4f8171750
|
|
3
3
|
var __esm = (fn, res, err) => () => {
|
|
4
4
|
if (fn)
|
|
5
5
|
try {
|
|
@@ -9984,7 +9984,7 @@ var package_default;
|
|
|
9984
9984
|
var init_package = __esm(() => {
|
|
9985
9985
|
package_default = {
|
|
9986
9986
|
name: "@oh-my-opencode/omo-codex",
|
|
9987
|
-
version: "5.1.
|
|
9987
|
+
version: "5.1.34",
|
|
9988
9988
|
type: "module",
|
|
9989
9989
|
private: true,
|
|
9990
9990
|
description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
|
|
@@ -19396,6 +19396,7 @@ var nonNegativeInteger = number2().int().nonnegative();
|
|
|
19396
19396
|
var OmoComputerSettingsLayerSchema = object({
|
|
19397
19397
|
enabled: boolean2().describe("Experimental: register the computer tool in OmO Native sessions (default: on where the host is supported; false leaves it unregistered)"),
|
|
19398
19398
|
display: string2().min(1),
|
|
19399
|
+
showCursor: boolean2().describe("Show the display-only macOS cursor overlay (default: true; false hides it)"),
|
|
19399
19400
|
max_width: positiveInteger,
|
|
19400
19401
|
max_height: positiveInteger,
|
|
19401
19402
|
screenshot_max_bytes: positiveInteger,
|