Releases: OpenDIKW/dikw-web
Release list
dikw-web v0.8.10
Changed
- dikw-core verification pin single-sourced in
scripts/live-core/harness.mjs.
live-integration.ymlno longer sets aDIKW_CORE_VERSIONenv — CI/nightly falls
back to the harness'sDEFAULT_CORE_VERSION, the same value local runs use — and
bump-dikw-core.ymlnow edits (and reads the current pin from) only the harness
file. This unjams the auto-bump loop discovered while bumping to core 0.6.5 (#150):
a bump commit that edited a workflow file was doubly blocked — GitHub rejects such
a push from a PAT without the Workflows permission, and thegate-integrity
required check flags any.github/workflows/**edit without a maintainer's
gate-changelabel. With the pin out of the workflow file, future auto-bump PRs
need neither. TheDIKW_CORE_VERSIONenv override still works everywhere;
docs/integration-verification.mdno longer hardcodes the pin value (one less
thing to drift per bump).
dikw-web v0.8.9
Added
- Automated watch-CI + fix (
dikw-web-watch-ciskill) + loop observability
(scripts/loop-log.mjs). Turns delivery-loop step 8 from prose into a bounded,
self-logging loop: watchgh pr checks --watch, route a real failure to the
fresh-contextfixer, rerun the one known flake (graph.spec.tsPixi) at most
once, always pull the review prose before merge, and merge explicitly (never
--auto, which outraces the review) — gated by MAX_ROUNDS = 3 and a same-failure
circuit breaker. Each transition is appended as a structured JSON line to a gitignored
.loop-log.jsonl(node scripts/loop-log.mjs <event> [detail]) so an
autonomous/background run is diagnosable after the fact (runaway / stuck / flake /
silent death). Wires intodikw-web-delivery-workflowstep 9 andCLAUDE.md. See
docs/adr/0005-delivery-loop-hardening.md.
dikw-web v0.8.8
Changed
dikw-web-verify-frontendgains a measured perf + a11y pass (Step 2.5). The
frontend-verify skill previously eyeballed thedocs/ui-checklist.mda11y / contrast
/ perf items. It now uses the already-installedchrome-devtools-mcp:lighthouse_audit
for accessibility + best-practices (the tool excludes performance), plus a
performance_start_trace/stop_tracefor Web Vitals, scored to a rubric — a11y
≥ 0.9 with no new violation, CLS ≤ 0.1 (cross-checking theperf.spec.tsgate),
LCP recorded as a soft budget — turning the qualitative items into numbers.
Locally-measured, not a new CI gate (Lighthouse + trace timing is runner-dependent).
The#graphPixi route audits a11y normally but skips the background-tab perf trace.
Seedocs/adr/0005-delivery-loop-hardening.md.
dikw-web v0.8.7
Added
- Reward-hacking gate (
gate-integrityCI job /npm run check:gate). A
deterministic check the in-loop agent cannot fool, hardening the delivery loop
against an agent weakening the verification to make a check go green.
scripts/check-gate-integrity.mjsdiffs the branch against its merge base and
fails the PR if a coverage threshold was lowered, the coverageexcludelist
grew, a bundle budget was raised, e2eretrieswere raised, a test was
deleted/disabled or stripped of assertions, or the gate/CI machinery itself
(the script,.github/workflows/**,fixer.md's forbidden list) was edited.
The good direction (raising a threshold, adding tests) is always allowed; a
deliberate weakening is allowed only when a maintainer adds the visible
gate-changePR label. Until now "don't weaken the tests" was prose only in
CLAUDE.md/docs/review-rubric.md/fixer.md— the weakest defense. The job
is PR-scoped and a required status check. See
docs/adr/0005-delivery-loop-hardening.md.
dikw-web v0.8.6
Fixed
- Flaky graph e2e (
graph.spec.ts > renders a nonblank Pixi graph canvas) —
root-caused, not retried away. In React StrictMode's dev double-invoke, the
graph mounts twocreatePixiGraphEngine()inits concurrently. The canvas was
attached viamount.replaceChildren(app.canvas)inside the async factory,
outside the effect'sactiveguard, so a slower-resolving stale init could
clobber the live engine's canvas and then empty the mount when itsdestroy()
fired — leavingdata-ready="true"over a canvas-less stage.GraphCanvasnow
attaches the canvas only inside the active guard (the engine exposes a
canvasgetter), so the discarded init never touches the DOM. Production
rendering is unchanged (no StrictMode double-invoke there → single attach). The
spec also gates ondata-render-count >= 1before reading the canvas contract. - Flaky Mermaid disclosure clicks (
wiki.spec.ts,theme.spec.ts). A bare
getByText("flowchart")also matched the<style>Mermaid injects (its CSS
mentionsflowchart), so once any diagram had rendered the locator resolved to
two nodes and.click()threw a Playwright strict-mode violation. Both specs
now scope to the<summary>element (locator("summary", { hasText: … })).
dikw-web v0.8.5
Fixed
- Chat agent tool calls fail (
fetch failed) in a proxied dev/live setup.
dikw-core has no CORS, so the browser keepsserverUrlat the default and
routes its/v1reads through the same-origin Vite proxy (VITE_DIKW_PROXY_TARGET
→ the real, dynamically-ported core). But the sidecar's/agentcore calls run
server-side and bypassed that proxy — they dialed the default port the
browser sent (http://127.0.0.1:8765), where nothing listens, so every agent
tool (retrieve_knowledge,dikw_health, …) returnedfetch failedand the
chat could not read the knowledge base. The sidecar now mirrors the Vite
/v1proxy:agentSidecarPlugininjects the Vite-resolved
VITE_DIKW_PROXY_TARGET(honoring.env.local, not just a shell export, and
warning on a malformed value) andapplyDevProxyTarget(server/agent/http.ts)
routes the default core URL to it. Dev-only by construction — the standalone
production sidecar injects no target, so it always dials the configured
Server URLverbatim; a custom, directly-reachableserverUrlis also left
untouched. Unit guards:server/agent/http.test.ts"applyDevProxyTarget…" +
the injected-target handler test;server/agent/vitePlugin.test.ts
"resolveDevProxyTarget…".
Changed
live:verifyagent↔core check now reproduces the real browser path.
scripts/live-core/verify-agent.mjspreviously POSTed/agentwith the live
core's real dynamic URL, bypassing the proxy the browser depends on — so it
passed even while the actual chat was broken. It now sends the default core
URL (like the browser) and asserts a core tool reachedstatus:"succeeded"
(not merely that one was invoked — afetch failedcall still emits a
tool_event). This catches the bug above: it fails against a sidecar that can't
reach core and passes once the proxy is mirrored.
dikw-web v0.8.4
Fixed
-
Hero metric value is the documented 27px, not a drifted 30px. A
token-migration override silently pinned.metric-card__valueto 30px over the
27px base rule, contradicting DESIGN.md §3 (which documents the hero-number as
27px twice). Dropped the override so the documented size ships. -
Three sans-uppercase "eyebrows" now use the mono label voice
(Mono-Only-Uppercase)..wiki-info-grid dt(every sibling field label was
already mono),.wiki-preview__header, and MB-Web's.mb-labbilingual column
header (the twin of the workbench's mono.bi-colhead span) were sans uppercase
— the exact AI "eyebrow" tell the type system forbids. Routed onto the mono
label role at the shared 0.04em tracking. -
Three mono labels declared a
font-weight: 600no-op. IBM Plex Mono ships
only 400/500, so600silently rendered as 500 and diverged from the canonical
label weight:.bi-colhead span,.import-step__marker,.trace-invocation__dur
now declare 500 (no visual change — they already rendered at 500). -
User Markdown table headers render verbatim.
.markdown-table-wrap thno
longer force-uppercases the author's header row (a content-fidelity breach — a
header likepH/mRNAwas mangled — and a sans-eyebrow tell). The row stays
distinct by weight + surface, not case. The label role's "table heads" remain
the workbench's own data-table column labels (mono uppercase); DESIGN.md §3 now
spells out the distinction. -
.wisdom-dialog__header h2rides the title role. It was an untokenized
font-size: 17pxthat inherited the UA bold 700; now sans 600 with the title
tracking, byte-for-byte parity with its sibling.wisdom-card h2. -
.markdown-chart__captionis on the role ladder (body-sm13px), not an
off-scale0.85em.e2e guards:
typography.spec.ts"type-system rules hold on sweep-unreachable
surfaces (workbench)" + "MB-Web column labels use the mono uppercase voice" —
these inject the auth/hover/MB/state-gated surfaces the passive invariant sweeps
can't render, so the rules are now guarded there too.
dikw-web v0.8.3
Fixed
- AI-translate dual columns fill the reader pane. The bilingual view's root
inherits.markdown-body's single-columnmax-width: 72ch, so the source /
translation columns crushed into one measure on the left and left the pane's
right half empty..bilingual-colsnow overrides that cap — it fills the reader
width (each column gets its own measure) and, past two measures on an ultra-wide
pane, caps and centers. Below 1100px, where the pairs collapse to one stacked
column, the cap reverts to the single-column 72ch so a stacked paragraph never
runs past a comfortable line length. e2e guards:bilingual.spec.ts
"dual-column view fills the reader pane…" + "…restores the single-column measure
when columns stack…". - DESIGN.md typography frontmatter matched to the implementation. The
machine-readabletypography:block still named the pre-v0.8.0 families (Source
Serif 4 / Inter Tight / JetBrains Mono) and carried swapped weights (display 500,
label 600) — contradicting the shipped IBM Plex superfamily and the §3 prose
table (display 600, label 500). Frontmatter families, weights, and the stray
§3 "JetBrains Mono" mention now read IBM Plex.
Changed
- MB-Web radii and colors consolidated onto the shared tokens.
src/mb/mb.css
kept a parallel light + dark palette whose values already duplicated the
workbench tokens. Differently-named locals (--ac/--acb/--border/ …)
now alias theirstyles.cssequivalent and same-named ones (--bg/--surface
/--text/ …) inherit the global values, so the parallel dark block is gone;
the off-scale radii snapped to the4 / 6 / 7 / 8 / 999scale (cards 8px; the
badge / chip / filter / toast / sync pills fully round); the note highlighter
yellows became named--mb-mark/--mb-mark-stagedtokens. Only the few
genuinely MB-specific literals with no shared equivalent (answer-blue, on-accent
foreground, AA-darkened faint, hover wash) stay local. Zero-visual-change for
colors; verified in the browser across library, reader, and notes in light + dark.
dikw-web v0.8.2
Fixed
- Settings appearance copy no longer mixes languages. The zh-CN 外观 subtitle
read "System 会跟随操作系统偏好" — the English enum labelSysteminside Chinese
chrome, breaking the single-language-chrome rule. Now "「跟随系统」会随操作系统的明暗
偏好自动切换。". - Editorial / responsive heading sizes snapped onto the role ladder. The tail the
0.8.1 small-text pass left —.wiki-preview-card h2(19 → title 17),
.import-done-banner__headline(20 → title 17),.wisdom-popover__title h2
(15.5 → body 15), and the responsive.metric-card__valuedownscales (24 / 26 → 22,
the reader-h2 editorial step) — is now on the ladder.
Changed
- MB-Web type migrated onto the role tokens.
src/mb/mb.cssdropped its
self-contained half-step scale (11.5 / 12.5 / 13.5 / 14.5 …); 59 of its 60
font-sizedeclarations now resolve to--type-*(label / body-sm / body / title)
by nearest role, made available by the app-widestyles.cssimport. The one kept
literal is.mb-r-title(22px), the paper-reader title. MB-Web radii/colors remain a tracked
follow-up (DESIGN.md §3). Verified in the browser across the library, reader, and
notes views.
dikw-web v0.8.1
Fixed
- Small-text ladder closed (post-v0.8.0 scale consolidation). A residual 12px
tier crammed betweenlabel(11) andbody-sm(13), plus stray 14 / 16 sizes
besidebody(15) /title(17), survived the v0.8.0 pass. All 4612pxsites
now snap tobody-sm(dense metadata — IDs, paths, durations, pills, table cells,
hints, segmented controls) orlabel(the uppercase label voice). The off-scale
outliers resolve too:.page-header__description(14 → body-sm),
.settings-panel__header h2(16 → title, matching every other panel title), the
import section-head titles +.section-title(14 → body),.answer-text
(16 → body), and the reader markdown table header/cell inversion (th 12 / td 14 →
both body-sm). The small-text band (11–17) on every workbench route now lands
on the{11, 13, 15, 17}run — no 12px tier, no stray 14 / 16. A few editorial /
responsive heading sizes outside that band (preview-card 19, done-banner 20,
wisdom-popover 15.5, responsive metric 24 / 26) are a pre-existing tail and a
tracked follow-up (DESIGN.md §3). - Inline / block code (
0.92em) and KaTeX math are documented as deliberate
em-relative off-ladder exemptions; a newno UI text renders off the role scalee2e invariant guards the ladder across
overview / base / import / chat / settings / tasks / wisdom.
Notes
- MB-Web (
src/mb/mb.css) keeps its own half-step subsystem scale for now;
migrating it onto the--type-*role tokens is a tracked follow-up (DESIGN.md §3).