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-ui at the ^2.19.0 range;
  • clsx; and
  • tailwind-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:

  • CompDisclosure
  • CompOverlays
  • CompMenus
  • CompCommandNav
  • CompFormControls
  • CompSelection
  • CompDatesA
  • CompDatesB
  • CompFeedback
  • CompUtilities
  • BuilderCore
  • BuilderUI
  • WikiVault

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:

  1. Each component slice owned disjoint demo and route directories.
  2. The showcase registry, ComponentPage.svelte, Demo.svelte, CodeBlock.svelte, and src/app.css were shared read-only contracts for component slices.
  3. Every component slug already existed in the registry before page work began.
  4. Every component slice used the same route/demo/anatomy/notes composition contract and the same shared skin.
  5. src/lib/builder/spec.ts was read-only to both builder slices and fixed the serialisable types.
  6. BuilderCore owned src/lib/builder except spec.ts, plus the builder API route.
  7. BuilderUI owned builder/relay routes and builder UI components, and consumed the fixed BuilderCore public surface.
  8. WikiVault alone owned q5vault and quartz.config.bits.yaml.
  9. 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() and categoryAnchor helpers were deleted.
  • The builder expanded to 55 addable block types: 46 showcase mappings plus nine builder-only definitions. showcaseSlug is additive metadata, and the inspector contract gained the date, time, datetime-local, records, and node-ref field kinds.
  • Shared implementation boundaries now include block-def.ts, props.ts, date-values.ts, emit/context.ts, six blocks/defs group modules, and six emit group 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:

  1. Preserve all 22 original block keys so persisted version-1 documents remain valid.
  2. Map divider → separator and tooltip-button → tooltip through showcaseSlug metadata rather than renaming either block key.
  3. Persist date and time values only as ISO strings.
  4. Keep drawer visibility, the active left view, and layer disclosures ephemeral and outside BuilderSpec, history, persistence, and relay state.
  5. 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:

  1. src/lib/builder/emit/dates.ts emitted class on <TimeField.Root>, which svelte-check rejects because class is not in TimeFieldRootProps<Time>, although svelte/compiler accepted it. The emitter now omits class and wraps the label plus segmented input in an inner <div class="grid gap-2">.
  2. Compact builder drawers used fixed inset-x-0, so each sheet covered the whole z-20 backdrop and made backdrop dismissal impossible. The side sheets now use left-0 or right-0 with w-[min(20rem,82vw)].
  3. addBlock did not select the new node, so a dock add never opened the inspector. It now mints the id with nodeId(meta.type) and applies add plus select as one batch; the activity log recorded 2 operations passed, Add Badge, Select Badge, and 2 operations completed.
  4. LinkButtonBlock.svelte dropped href in editable mode and rendered a <button>, making the unsafe-URL contract unobservable on the canvas. It now always renders the real anchor with the safeUrl-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.ts for the eager, registry-ordered module map and both registry integrity checks;
    • src/lib/showcase/ComponentSection.svelte for each stable section boundary; and
    • src/lib/showcase/active-section.svelte.ts for shared scroll-spy state.
  • Changed:
    • src/routes/components/+page.svelte to render all sections, own the single page title and h1, run one IntersectionObserver, and scroll to the resolved target;
    • src/routes/components/+page.ts to return only the target { slug };
    • src/routes/components/+layout.svelte to read the shared active section for the compact label;
    • src/lib/showcase/ComponentDrawer.svelte to scroll in-page and shallow-sync the URL without navigation; and
    • src/lib/showcase/ComponentPage.svelte to remove per-component document metadata and demote its heading from h1 to h2.
  • Preserved:
    • src/routes/components/+layout.ts still redirects known legacy slug paths with 307; and
    • src/hooks.server.ts still 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.


loca.zone · bits.loca.zone · Bits UI

0 items under this folder.