Build Process Log
This is the dated, source-grounded record of the 2026-08-30 implementation and publication session and the 2026-08-31 local redesign session. Claims below distinguish source facts from observed build, service, HTTP, and browser receipts.
2026-08-30 — SvelteKit scaffold established
The repository snapshot contains:
- a SvelteKit route tree under
src/routes; - shared library code under
src/lib; - the application shell and global stylesheet;
- Vite configuration with Tailwind and SvelteKit plugins;
- adapter-node selected in
vite.config.ts; and - package scripts for development, build, preview, SvelteKit sync, and
svelte-check.
The final production gate later completed with 0 svelte-check errors and warnings, followed by a successful adapter-node build; see private page (sign-in required).
2026-08-30 — Dependency boundary fixed
package.json declares five direct runtime dependencies:
@internationalized/date;@lucide/svelte;bits-uiat the^2.19.0range;clsx; andtailwind-merge.
The development toolchain declares adapter-node, SvelteKit, the Svelte Vite plugin, Tailwind’s Vite plugin, Node types, Svelte, svelte-check, Tailwind CSS, TypeScript, and Vite. No daisyUI package, browser automation package, or server-side LLM SDK is declared.
2026-08-30 — Registry-first showcase contract established
src/lib/showcase/registry.ts declares the category vocabulary, ordered component records, slug lookup, grouped navigation, previous/next navigation, and upstream documentation URL helper. Its source comment explicitly names it the showcase single source of truth.
The current source snapshot contains 46 registry entries. This count is derived from the file and is why the component catalog contains 46 rows; no row is dropped to satisfy an inherited count.
ComponentPage.svelte consumes registry metadata and navigation. Demo.svelte owns the preview surface and optional raw-source disclosure. Route pages own component-specific anatomy, demos, and API notes.
2026-08-30 — Parallel implementation fan-out started
The exact work-slice names were:
CompDisclosureCompOverlaysCompMenusCompCommandNavCompFormControlsCompSelectionCompDatesACompDatesBCompFeedbackCompUtilitiesBuilderCoreBuilderUIWikiVault
All listed slices completed and were integrated through the shared contracts below.
2026-08-30 — Contracts made the fan-out safe
Parallelism used explicit boundaries rather than merge-time guesswork:
- Each component slice owned disjoint demo and route directories.
- The showcase registry,
ComponentPage.svelte,Demo.svelte,CodeBlock.svelte, andsrc/app.csswere shared read-only contracts for component slices. - Every component slug already existed in the registry before page work began.
- Every component slice used the same route/demo/anatomy/notes composition contract and the same shared skin.
src/lib/builder/spec.tswas read-only to both builder slices and fixed the serialisable types.BuilderCoreownedsrc/lib/builderexceptspec.ts, plus the builder API route.BuilderUIowned builder/relay routes and builder UI components, and consumed the fixed BuilderCore public surface.WikiVaultalone ownedq5vaultandquartz.config.bits.yaml.- Project-wide build and live verification were reserved for Main after all slices landed, avoiding false failures against half-written sibling files.
2026-08-30 — Wiki SSOT authored
The vault was derived from package.json, vite.config.ts, src/app.css, the showcase registry and shell sources, the reference accordion page, src/lib/builder, the builder session endpoint, the builder/relay route sources, and the deploy templates. Its deployment and live receipts are maintained in private page (sign-in required).
2026-08-30 — Integrated source verified
The final application gate ran npm run check && npm run build. svelte-check processed 4,826 files with 0 errors and 0 warnings. Vite completed its server and browser builds and adapter-node emitted the production server.
The generated builder source for both sample screens compiled with the Svelte compiler. A coverage spec containing every one of the 22 registered builder block types also compiled without warnings.
2026-08-30 — Application and wiki published
The adapter-node application was installed as the hardened system service bits.service, running as loca on loopback port 51500. Nginx publishes bits.loca.zone and serves the Quartz output at wiki.bits.loca.zone. A Let’s Encrypt certificate covering both names expires on 2026-11-28.
The Multi-Wiki Grid build passed SSOT validation, parsed 61 Markdown inputs, and emitted 178 files. Public HTTPS probes returned 200 for the application, builder, wiki root, and component catalog.
2026-08-30 — Browser contract proven
A real Chromium session rendered all 46 catalog entries and fetched every corresponding component route with 200. The reference Accordion expanded and exposed its source.
The builder relay installed as window.bitsBuilder, advertised 22 blocks, accepted a human chat request through ask(), applied a heading and switch through validated operations, returned an agent response through say(), exported matching Svelte source, and left zero pending requests. Invalid operations produced structured errors, and undo/redo visibly changed the serialized root count.
2026-08-30 — Local component guide layer published
bun run generate:component-guides derived 46 concise component and utility guides, their category index, and the reference catalog from src/lib/showcase/registry.ts. Each live showcase page now links first to https://wiki.bits.loca.zone/components/<slug>; exhaustive upstream API documentation remains a secondary reference inside the local guide.
The application gate remained green with 0 errors and 0 warnings, the adapter-node service was rebuilt and restarted, and the expanded 61-input Quartz vault emitted 178 files.
2026-08-31 — Compact showcase and canvas-first builder
The showcase registry remains the single source for all 46 components. Its redesigned consumer is a compact, single-page component picker rather than a second navigation shell: there is no duplicate sidebar, entries are icon-led, and hover and keyboard-focus tooltips open with zero delay. Filtering and component links still derive from the registry.
The builder is now canvas-first and exposes all 22 registered block types around the primary canvas. Its activity surface presents a bounded observable record of requests, validation, operations, persistence, and agent results. Activity autoscroll follows new rows only while the user remains at the bottom; once a user scrolls up to inspect earlier activity, new entries preserve that reading position.
Blueprint 1.6.1 was consulted only as advisory, primary-source composition evidence. It was not adopted as application source or a runtime dependency. daisyUI remains absent.
An adversarial screenshot review challenged the first builder pass for reserving too much chrome around the canvas. The final refinement changed the desktop palette from two block rows to one at the xl breakpoint and narrowed the inspector to 18rem without hiding any block type or primary action.
The YAGNI project-scoped OMP layer consists only of:
.omp/RULES.md;.omp/rules/bits-builder.mdc; and.omp/skills/bits-builder-agent/SKILL.md.
After the local gates and browser review completed, explicit release approval was obtained. The adapter-node service was restarted and read back active; the production route sweep passed all 46 component pages; the wiki SSOT gate passed and emitted 178 files from 61 inputs; and live browser probes confirmed the application, process log, operations receipts, component catalog, and relay protocol.
2026-08-31 — Components IDE and canvas-first builder refinement
The refinement changed:
- The showcase now has a single query-driven component viewport with a persistent drawer and canonical
?component=<slug>selection. Known legacy slug routes use 307 compatibility redirects. - Pagination and category anchors were removed. The dead
neighbours()andcategoryAnchorhelpers were deleted. - The builder expanded to 55 addable block types: 46 showcase mappings plus nine builder-only definitions.
showcaseSlugis additive metadata, and the inspector contract gained thedate,time,datetime-local,records, andnode-reffield kinds. - Shared implementation boundaries now include
block-def.ts,props.ts,date-values.ts,emit/context.ts, sixblocks/defsgroup modules, and sixemitgroup modules. - The builder now uses canvas-first adaptive drawers, an activity rail, a full-width 55-item bottom dock, a live Layers panel, and an editable JSON contract.
- Generated component-guide links now use
https://bits.loca.zone/components?component=<slug>as the canonical live form.
The ordered decisions were:
- Preserve all 22 original block keys so persisted version-1 documents remain valid.
- Map
divider→separatorandtooltip-button→tooltipthroughshowcaseSlugmetadata rather than renaming either block key. - Persist date and time values only as ISO strings.
- Keep drawer visibility, the active left view, and layer disclosures ephemeral and outside BuilderSpec, history, persistence, and relay state.
- Validate the registry at boot: showcase mappings are complete and unique, field keys are unique, and each materialized default-key set equals its field-key set. This makes “all configuration is in the inspector” executable.
Verification found and corrected four defects:
src/lib/builder/emit/dates.tsemittedclasson<TimeField.Root>, whichsvelte-checkrejects becauseclassis not inTimeFieldRootProps<Time>, althoughsvelte/compileraccepted it. The emitter now omitsclassand wraps the label plus segmented input in an inner<div class="grid gap-2">.- Compact builder drawers used
fixed inset-x-0, so each sheet covered the wholez-20backdrop and made backdrop dismissal impossible. The side sheets now useleft-0orright-0withw-[min(20rem,82vw)]. addBlockdid not select the new node, so a dock add never opened the inspector. It now mints the id withnodeId(meta.type)and appliesaddplusselectas one batch; the activity log recorded2 operations passed,Add Badge,Select Badge, and2 operations completed.LinkButtonBlock.sveltedroppedhrefin editable mode and rendered a<button>, making the unsafe-URL contract unobservable on the canvas. It now always renders the real anchor with thesafeUrl-normalised href and suppresses navigation while editing.
The compact backdrop also received one visual polish: cursor-pointer bg-black/70 backdrop-blur-[2px] plus a title makes the exposed strip read as a dismissal target.
2026-08-31 — Components endless single-page override
The user explicitly overrode the single-selection viewport: /components is now one endless page containing all 46 registry components top to bottom. Query state no longer chooses which module exists in the document.
Implementation files:
- Added:
src/routes/components/modules.tsfor the eager, registry-ordered module map and both registry integrity checks;src/lib/showcase/ComponentSection.sveltefor each stable section boundary; andsrc/lib/showcase/active-section.svelte.tsfor shared scroll-spy state.
- Changed:
src/routes/components/+page.svelteto render all sections, own the single page title andh1, run oneIntersectionObserver, and scroll to the resolved target;src/routes/components/+page.tsto return only the target{ slug };src/routes/components/+layout.svelteto read the shared active section for the compact label;src/lib/showcase/ComponentDrawer.svelteto scroll in-page and shallow-sync the URL without navigation; andsrc/lib/showcase/ComponentPage.svelteto remove per-component document metadata and demote its heading fromh1toh2.
- Preserved:
src/routes/components/+layout.tsstill redirects known legacy slug paths with 307; andsrc/hooks.server.tsstill limits preload hints to stylesheet and font assets.
Stacking 46 ComponentPage instances makes 46 competing <svelte:head> blocks and 46 h1 headings incorrect. The route now owns one <title> and one h1; each component shell contributes an h2.
?component=<slug> remains the canonical deep-link form but now names a scroll target rather than filtering content. All 46 published guide links therefore keep working while every component remains in the document.
The local production build measured the all-in-one cost:
- SSR HTML: 1,175,578 bytes;
- gzipped HTML: 111,513 bytes;
- response headers: 541 bytes.
The eager page is intentionally large, but the preload-hint restriction kept the response headers small, so the oversized-Link-header 502 has not returned in the local production build. Live-domain deployment of this override remains pending.