Skip to content

Latest commit

 

History

History
154 lines (110 loc) · 34.3 KB

File metadata and controls

154 lines (110 loc) · 34.3 KB

Once UI Core — Roadmap

Source of truth for this repo's roadmap. Mirrored (read-only reference) to the Aveiro draft workspace at /once-ui-core/roadmap.mdx after every agent run — this file always wins on conflict.

  • Horizon: 8 weeks — Mon 2026-07-27 → Sun 2026-09-20
  • Owner: Lorant (release decisions, breaking-change sign-off, npm publish) + daily Once UI Core agent (planning, audits, docs, non-breaking fixes, proposals)
  • Agent role: front-end/design architect for the wider Once UI ecosystem — plans the release cycle (what goes into each patch/minor/major), drives refactors, and works toward splitting the library and improving adoption of its semantic design system. Supports sibling projects (Studio, Aveiro, Chirio) that build on this package, but never publishes or merges on its own authority.

1. North star & thesis

Goal: keep Once UI Core reliable and coherent while it grows, and steer it toward a cleaner, split architecture that's easier to adopt and easier for agents (human-directed or autonomous) to build with correctly.

What already exists (verified in-repo, not assumed):

  • pnpm/Turborepo monorepo: packages/core (@once-ui-system/core, currently v1.7.13, MIT), apps/dev (component sandbox), apps/docs (docs.once-ui.com, Next 15 + MDX, 239 source files).
  • Single flat packages/core — no primitives/blocks/server package split yet. ~178 component files, 8 top-level barrel exports (components, contexts, modules, icons, types, interfaces, utils, hooks), plus a ./server subpath export (og-utils, og-url-validation) that a recent commit (07d5f92) started isolating from the main entry — first real step toward a split.
  • An AI-codegen harness already shipped (ai/manifest.json, ai/catalog.json, ai/rules.compact.md, ai/tasks/, scripts/init-agent.js) — Once UI already positions itself as agent-buildable; this roadmap leans into that rather than duplicating it.
  • No CHANGELOG.md at the repo root — changelog currently lives as docs-site content (apps/docs/src/resources/changelog.jsx), which drifts from actual releases easily.
  • Known, already-documented issues (AGENTS.md): 4 Vitest failures under jsdom, a Biome config/CLI version mismatch (1.9.4 vs 2.4.13), and broken apps/dev linting since Next 16 dropped next lint.
  • Sponsorship visibility already exists: README has a Sponsors section linking GitHub Sponsors, and .github/FUNDING.yml is configured. Not built from scratch — only needs strengthening (concrete tiers, "what sponsors get").

2. Eight-week plan

Week 1 · Jul 27 – Aug 2 — Release hygiene & known issues

  • Introduce root CHANGELOG.md as the actual source of truth going forward — done 2026-07-29 (history reconstructed back to 1.6.0; [Unreleased] section carries the proposed 1.8.0 contents; 1.7.1–1.7.12 reconciliation stays in Week 4). Re-scoped 2026-07-28 (Lorant): in-repo CHANGELOG.md as source of truth is confirmed, but the publish target is not the docs-site changelog page — roadmap + changelog instead publish to a reworked Aveiro-hosted Once UI Learn site (learn-once-ui.aveiro.page). The Aveiro agent owns the site side; this agent owns authoring CHANGELOG.md and coordinates the publish pipeline with Aveiro via comments. Do not build a docs-site sync pipeline.
  • Fix the 4 documented Vitest/jsdom failures in packages/core — resolved 2026-07-29 by the 1.8.0 release (div's #115 added the missing scrollLockState module; #120's ScrollLock fix cleared the jsdom failures). Verified post-merge: 92/92 tests pass. Credit: community + release integration, not this agent.
  • Resolve the Biome config-vs-CLI version mismatch so lint/format are trustworthy again — done 2026-07-30: all three configs migrated to the 2.5.6 schema (the auto-migration silently rewrote recommended: true to preset: "none" — i.e. no lint rules at all — caught and corrected to preset: "recommended"), git-ignore integration on, generated artifacts excluded. Error count went 1,624 → 488 real findings in shipped source; found and fixed ai/gotchas.json being invalid JSON along the way. Burn-down split into: (a) a mechanical format/import-organization sweep (~209 files, ~11k lines — measured, deliberately NOT ridden on the daily PR; proposed as its own follow-up PR right after #118 merges), (b) rule-by-rule fixes folded into Week 2's API-consistency pass (noArrayIndexKey 66, useExhaustiveDependencies 64, useHookAtTopLevel 10, a11y ~12).
  • Triage apps/dev lint breakage from the Next 16 next lint removal — done 2026-07-30, re-scoped by reality: #115 had already switched every lint script to biome check ., but neither app had @biomejs/biome installed, so their lint never ran; ESLint configs (apps/dev/eslint.config.mjs, apps/docs/.eslintrc.json) and docs' eslint/eslint-config-next deps were dead weight. Added the missing devDependency, migrated both configs, removed the dead ESLint remnants (lockfile −2.8k lines, audit 35 → 34). Both apps now lint for real: dev 43 errors, docs 160 — inventoried in AGENTS.md, burn-down with the Week 2 pass.
  • Release-planning doc: define concrete patch/minor/major criteria for Core — done 2026-07-29 as root RELEASING.md (patch/minor/major criteria incl. an explicit AI-consumer rule for ai/ harness files, plus the proposal → verification → maintainer-publish flow).
  • Strengthen the existing Sponsors section — done 2026-07-29, re-scoped by the /support audit: the sponsor-tiers surface already exists and is live on once-ui.com/support (Studio repo: funding gauge, membership tiers incl. three company tiers with Stripe checkout, sponsor wall). No new page needed. README's Sponsors section now points companies at it. Outreach gate lifts once Lorant confirms /support is the surface outreach should target (assessment in the 07-29 workspace note).
  • Triage the 130 Dependabot alerts GitHub reports on main (69 high, 48 moderate, 13 low as of 2026-07-27 push) — done 2026-07-28, see daily log. Verified 0 of packages/core's actual runtime dependencies carry any advisory; every flagged package is transitive dev/build tooling or an app-level Next.js version. Patched 7 same-major transitive advisories (postcss, ws, flatted, yaml, immutable, fast-uri, @eslint/plugin-kit) via pnpm.overrides on agent/2026-07-28-dependabot-triage. Remaining alerts need major-version bumps (next, vite, ajv, js-yaml, picomatch) — flagged as follow-up, not blanket-overridden.
  • Needs from Lorant: review/merge agent/2026-07-28-dependabot-triage; sign-off on sponsor-tier copy before it ships publicly; awareness that ~110 alerts remain and need scoped major-version-bump follow-ups (see daily log)

Week 2 · Aug 3 – Aug 9 — API consistency audit, pass 1

  • Prop-naming consistency audit across the ~178 components (booleans, size scales, variant naming) → findings doc
  • Audit the ./server export boundary post-07d5f92 — confirm no other server-only code still leaks through the main entry
  • First draft of an llms.txt / machine-readable component index (agent-usability priority)
  • Ship the top 2 non-breaking fixes from the prop-naming audit
  • Needs from Lorant: none blocking; flag if audit surfaces anything requiring a breaking change

Week 3 · Aug 10 – Aug 16 — Library-split RFC

  • Draft an RFC: split packages/core into core (primitives/layout/tokens), blocks (compositions), and a real server package (building on the 07d5f92 isolation) — map the breaking-change surface for each
  • Prototype the split in a throwaway, unmerged branch to validate tooling (build config, package exports maps) — proof of feasibility, not a real migration
  • Circulate the RFC via comments to the Studio and Aveiro agent collections (Studio's registry/blocks work and Aveiro's editor depend on this)
  • Needs from Lorant: go/no-go on the RFC before any real split work begins — this is a major breaking change

Week 4 · Aug 17 – Aug 23 — Docs & agent-usability

  • Component doc completeness audit (props tables, examples, common-failure warnings) against ai/catalog.json
  • Fill the top 10 gaps found
  • Publish llms.txt v1 if the Week 2 draft was approved
  • Reconcile CHANGELOG.md against actual release history and fix drift — this content becomes what migrates to the Aveiro-hosted Once UI Learn site per the Week 1 re-scope (not the docs-site changelog page, which is being phased out of this role)

Week 5 · Aug 24 – Aug 30 — Accessibility & regression pass

  • Accessibility audit of the 20 most-used components (keyboard nav, ARIA, focus management)
  • Fix the top findings
  • Add regression tests for the Week 1 jsdom fixes and the a11y findings so they don't silently regress

Week 6 · Aug 31 – Sep 6 — Minor release plan

  • Compile everything shippable from Weeks 1–5 into a real 1.8.0 release plan
  • Write release notes / CHANGELOG.md entries
  • Run the cross-project release workflow: Studio checks for new premium-block dependencies, Aveiro preps docs/changelog — propose the release; Lorant approves and executes the actual publish
  • Needs from Lorant: approval to publish 1.8.0 (this agent never runs npm publish)

Week 7 · Sep 7 – Sep 13 — Adoption experiments

  • Starter-experience audit: install → first component in under 5 minutes, list every friction point found
  • Add/refresh the example recipes in ai/examples/ — done 2026-09-13, re-scoped by what the tools found. The 26 shipped blocks did not need new recipes so much as the two tools that guard them: the codemod found fill still on a Media and two Carousels (a rename tsc cannot catch, since fill stayed valid and only changed meaning), and the harness validator was telling agents RevealFx.delay is in seconds — inverted by 2.0 — while failing three classes of correct code. 6 of 26 blocks failed their own validator; 3 do now, and those are Card-as-static-panel judgement calls left for Lorant. Reading Card to judge them found its radius fallback never ran (`radius-${x}` || "radius-l" is always truthy) and a static card painting cursor: interactive.
  • Draft a migration guide — done 2026-09-13 as root MIGRATING.md, scoped to 1.8.x → 2.0 rather than the Week 3 split (which did not land as a package split; see rfcs/2026-08-once-ui-2-architecture.md). Six steps, each instruction run against a fixture rather than described. Writing it surfaced that the codemod rewrote consumers' stylesheet imports to @once-ui-system/foundations, which is not on npm — that pass is --css and off by default now.

Week 8 · Sep 14 – Sep 20 — Consolidate & next-quarter plan

  • Retro: what shipped, what's blocked, quality/adoption signals worth tracking going forward
  • Branch backlog review + pruning proposal (see §4)
  • Next-quarter roadmap draft

3. Daily agent protocol

  1. Fresh clone of main; check git log and the branch review queue (§4) for unmerged agent/* branches older than 3 days — flag instead of duplicating.
  2. Read /agents.mdx, then the once-ui-core collection in the Dopler Universe workspace — act on open notes and answer comments before roadmap work. Skim sibling collections (Studio, Aveiro, Chirio) for overlap.
  3. Pick the topmost unchecked, unblocked item above.
  4. Work on the daily agent branch under the Daily PR contract (see the agent workspace protocol, in effect 2026-07-29): every run ends with exactly one open, ready-for-review agent PR to main — extend it on subsequent runs until merged. Never commit to main directly; merges happen only after Lorant's APPROVED review; never npm publish.
  5. Verify with pnpm --filter @once-ui-system/core build, pnpm --filter @once-ui-system/core typecheck, and pnpm --filter @once-ui-system/core test. Missing secrets get mocked and flagged, never invented.
  6. Update this file (checkbox, daily log, review queue, needs table), commit, push.
  7. Re-sync the Aveiro draft mirror, resolve notes, leave cross-agent comments, write the Daily Agent Report.

4. Branch review queue

  • 2026-07-29: The three unmerged agent branches (agent/2026-07-27-roadmap-bootstrap, agent/2026-07-28-roadmap-update, agent/2026-07-28-dependabot-triage) were consolidated into this run's daily PR per the Daily PR contract in /agents.mdx — one open agent PR at a time, review happens there. The source branches stay on origin untouched until the PR merges, then can be deleted.
  • PR #115 (community, div) — merged by Lorant 2026-07-29 15:17 UTC after two review rounds by this agent (both blockers + the exports require restoration verified). Shipped in 1.8.0.
  • PR #117 (Prism grammar aliases) — merged by Lorant 2026-07-29 via the #120 release integration. Shipped in 1.8.0.
  • PR #120 (claude/once-ui-release-readiness-l9lxrk, release integration) — merged by Lorant 2026-07-29: merged #117, fixed a ScrollLock regression (clearing the 4 historical jsdom test failures), added unoptimized props, bumped version to 1.8.0.
  • PRs #113/#114/#116 (cursor[bot] drafts, learn-site content) — third-party drafts, not this agent's to act on; flagged for Lorant only.
  • origin/once-ui-harness — fully merged into main, historical, no action needed.
  • The origin/cursor/* branch set and revert-53-dialog-race-condition-fix — still unclassified against main; carried as a follow-up (not reached 07-29).

5. Daily log

2026-07-27 (bootstrap): First run for this automation. Read /agents.mdx and the once-ui-core collection (context, Lorant's brief, the open revenue-sprint note) plus sibling roadmaps (Studio, Aveiro, Chirio) for overlap. Explored the repo (structure, exports, versioning, known issues per AGENTS.md) and wrote this roadmap from real repo state — no code changes this run, per the bootstrap protocol. Branch: agent/2026-07-27-roadmap-bootstrap.

2026-07-28: Acted on Lorant's open note (five items). (1) Dependabot triage: ran pnpm audit directly (no GitHub Security API access from this agent's tools) — 143 findings monorepo-wide (13 low / 53 moderate / 77 high per pnpm's count, close to GitHub's 130/69/48/13). Cross-checked every high-severity finding's package against packages/core/package.json's actual dependencies (7 packages: @floating-ui/react-dom, classnames, compressorjs, date-fns, prismjs, react-icons, recharts) — zero of them have any advisory. Every flagged package is either transitive dev/build tooling (vitest→vite/ws, sass→postcss, biome→glob/ajv) or an app's own Next.js peer/dependency (next, a peerDependency consumers supply themselves) — real runtime risk to npm consumers of @once-ui-system/core is 0. Patched 7 same-major, low-risk transitive advisories (postcss 8.4.31→8.5.23, ws 8.20.0→8.21.1, flatted 3.3.3→3.4.3, yaml 2.8.1→2.9.0, immutable 5.1.2→5.1.9, fast-uri 3.0.6→3.1.4, @eslint/plugin-kit 0.3.1→0.3.5) via pnpm.overrides in root package.json. Verified with a clean pnpm --filter @once-ui-system/core build and test (same 4 pre-existing jsdom failures documented in AGENTS.md, no new failures). Left unpatched and flagged for scoped follow-up: next (app-level version decision, not this agent's call), vite (7→8 is a major bump, risks vitest compat), ajv 6→8, js-yaml 3→4, picomatch 2→4 (all major-version API changes, too risky for a blanket override without dedicated testing). Branch: agent/2026-07-28-dependabot-triage, pushed. (2) Community PR / (5) div's branch — same PR. PR #115 (divyanshudhruv, "Improve component API surface, dark mode, and docs") is both the open community PR and "div's branch" Lorant asked about — one and the same. Read the full 4,747-line diff. Findings: the headline TextWeight addition uses bold→400 and bolder→500, which is backwards (CSS's own bold keyword means 700) and conflicts with this PR's own token names one layer down (--font-weight-normal, --font-weight-medium); proposed rename bold→normal, bolder→medium (values unchanged) in the review. Also found a real regression — a new unconditional inline borderColor style on RadioButton overrides the existing .checked class's brand-colored border via CSS specificity (inline always wins), silently breaking the checked-state ring in both themes — and two inaccurate PR-body claims (a described controlsBackground→background rename that never existed; a described full→s radius change on wrappers that didn't previously exist). Also flagged undisclosed scope creep touching shared internals (DropdownWrapper sizing/flip logic used by six other components, DatePicker's year-picker layout/range, Dropdown.tsx props) not mentioned in the PR description. Posted a REQUEST_CHANGES review on GitHub with all of the above. Go/no-go: no-go as submitted — release not cut; will re-review once div pushes fixes. (3) Bet 1 outreach: per the vendor-outreach playbook, drafted Wave 0/1 emails in this agent's dated note in the Dopler Universe workspace (not in this public repo — recipient names/companies are internal-only per the information-classification rules). Flagged that they should not be sent until the sponsor-tiers page (Week 1, still open) ships, per the playbook's own sequencing rule. (4) Changelog/roadmap re-scope: folded into Week 1 and Week 4 above.

2026-07-29: Daily PR contract day one. (1) Consolidation: merged the three pending agent branches into a single daily PR (this branch) per /agents.mdx — roadmap bootstrap + update, dependabot overrides, gitignore fix. (2) PR #115 re-review: div pushed three commits since the 07-28 review. Verified both blockers fixed: TextWeight is now "default" | "normal" | "medium" | "strong" with matching tokens/utilities, and the unconditional borderColor inline style on RadioButton is gone (checked-state ring restored via SharedInteractiveStyles). Cloned the fork head (80d9e79) and ran the full gate: build ✓, typecheck ✓, tests 88 passed with only the 4 pre-existing jsdom failures from AGENTS.md — no new regressions. New finding: commit 2dcebd9 ("resolve Turbopack proxy error, unify turbo scripts, and update deps", 144 files) additionally rewrote the package exports map — every subpath's require condition replaced with a types condition — swapped classnames→clsx, bumped runtime deps within majors, and bumped dev tooling across majors (@types/node 20→26, jest-dom 6→7, biome 2.4.13→2.5.6, turbo 2.5.6→2.10.7). Dropping require breaks CJS require() resolution (ERR_PACKAGE_PATH_NOT_EXPORTED) for any non-bundler consumer — recommendation posted on the PR: restore the require condition (keeping types first), then ship as minor 1.8.0 (new props + type widening + dep swap = minor per RELEASING.md, not the patch originally assumed). Also noted #115's root package.json/lockfile rewrite will conflict with this PR's pnpm.overrides — whichever lands second re-applies, and the audit should be re-run after #115 merges since its lockfile regeneration may supersede some pins. (3) Release prep: root CHANGELOG.md introduced (Week 1 item) with the proposed 1.8.0 contents covering #115 + #117 + the security overrides; RELEASING.md written (Week 1 release-planning item) defining patch/minor/major criteria — including the exports-map and AI-consumer rules this exact case exercised. #117 merge stays gated on Lorant's APPROVED review of #115 per the 07-29 note's sequencing. (4) Biome-mismatch and Vitest-failure Week 1 items intentionally not started: #115 already bumps biome to 2.5.6 and touches test files — doing the same work in parallel guarantees conflicts; both re-scoped to after #115 lands. (5) Baseline correction: verifying this branch surfaced that AGENTS.md's documented test baseline was stale — clean main actually has 235 tsc --noEmit errors (untyped ai/examples, missing Vitest globals types) and ScrollLock.integration.test.tsx fails to even collect because it imports src/internal/scrollLockState, a module never committed to main (came in via a partial merge; div's fork adds it). Confirmed via a clean origin/main worktree: 1 failed suite + 4 failed tests / 85 passed — identical to this branch, so no regressions here. AGENTS.md updated with the real baseline; #115 incidentally fixes all of it, which strengthens the case for landing it.

2026-07-29 (release day, second entry): Lorant merged #115, #117, and the release-integration PR #120 directly at 15:17 UTC and published 1.8.0 to npm (verified via npm view). This branch reconciled against the new main: merge conflicts resolved (.gitignore union, README sponsors-tiers routing kept, lockfile taken from main), the 7 pnpm.overrides re-applied and re-audited against the regenerated lockfile — audit dropped 143 → 36 findings thanks to #115's dep bumps; added a sharp ^0.35.3 override (libvips CVEs, within the declared peer range, build-verified), leaving 35 findings across 5 packages that are all app-level major bumps (next 26, vite 5, webpack 2, esbuild 1, brace-expansion-via-minimatch@3 1). Post-merge gate on this branch: build ✓, typecheck 0 errors, tests 92/92 pass — the 1.8.0 release fixed both long-standing baselines, and AGENTS.md was updated accordingly (a failing test or tsc error is now a real regression). CHANGELOG.md reconciled: [Unreleased] → [1.8.0] — 2026-07-29 matching what actually shipped (#115 + #117 + #120's ScrollLock fix and unoptimized prop); the security overrides moved to the new [Unreleased] since they ride this PR, not the release. Biome mismatch re-verified as still open (CLI 2.5.6 vs schema 2.4.13, ~1,624 errors).

2026-07-30: Closed out Week 1's two remaining tooling items (theme: make lint trustworthy). (1) Biome reconciliation: migrated all three biome.json files from schema 2.4.13 to 2.5.6 via biome migrate — with one catch: the migration rewrote rules: { recommended: true } to preset: "none", which silently disables every lint rule; verified against a known-dirty file and corrected to preset: "recommended". Enabled vcs.useIgnoreFile (drops dist/.next from checks) and excluded generated artifacts (ai/catalog.json, ai/manifest.json, ai/spec.json, ai/components/, src/data/emoji-data.json — all written by generate-ai-spec/generate-emoji-data with their own formatting). Result: 1,624 errors → 488, and the survivors are all real findings in shipped source. Measured (then reverted) the mechanical fix: biome check --write cleans the 177 import-organization + 139 format errors but touches ~209 files / ~11k lines — proposed as a standalone sweep PR immediately after #118 merges rather than bloating it; the ~172 genuine lint findings fold into Week 2. (2) ai/gotchas.json was invalid JSON — surfaced by the 45 "parse" errors: the Icon.names entry had lost its key line, so the whole file failed JSON.parse for every AI-harness consumer since it shipped in 1.8.0. Fixed (one line), flagged for the next release as a fix worth shipping soon since downstream agents read this file per the manifest. (3) apps lint plumbing: #115 had switched all lint scripts to biome check ., but apps/dev/apps/docs never had @biomejs/biome installed — their lint could not run at all; the Next-16 next lint question from the original item was already moot. Added the devDep (2.5.6, matching core), migrated their configs identically, and deleted the dead ESLint layer (eslint.config.mjs referencing packages dev doesn't even have, docs' legacy .eslintrc.json + unused eslint/eslint-config-next deps): lockfile −2.8k lines, pnpm audit 35 → 34 findings. Full gate on the branch: build ✓, typecheck 0 errors, tests 92/92, docs app production build ✓. AGENTS.md lint section rewritten with the real per-package baselines (do-not-regress inventory: core 488 / dev 43 / docs 160).

2026-09-13: Release-prep session on claude/once-ui-2-release-prep-6dkl9v, working Week 7 from the top. (1) CHANGELOG.md [Unreleased] was fifteen commits behind, including three breaking ones — the subpath moves for recharts/prismjs/compressorjs, the own-icon-set change with its two type changes, and the oklch token conversion with the browser floor it sets. Its opening paragraph still claimed "no component, prop, export, token, or CSS class is removed or renamed", written when the framework adapter was the only breaking change and false since the prop-standardisation pass landed underneath it. Rewritten as the five things a 1.8.x app has to do, in order. Classification stops being "open": RELEASING.md's own criteria settle it at major, and only the publish decision is left. (2) MIGRATING.md — Week 7's migration-guide item; see above. (3) Codemod fix: its CSS pass pointed stylesheet imports at an unpublished package, so running the official codemod broke a consumer's build with nothing it could do about it. Opt-in now. (4) Week 7 examples item, re-scoped to the tools; see above. Full gate: 312 tests pass, typecheck clean, lint findings unchanged from the documented baseline. Not done: the starter-experience audit (Week 7's first item), and this roadmap is itself stale — it plans a 1.8.0 minor off v1.7.13 while the branch carries 2.0.0-alpha.0, and this log had no entry between 07-30 and today. That belongs to Week 8's retro.

6. Needs from Lorant

Need Why Urgency
Review + merge daily PR #118 (post-release reconciliation + security overrides + the 07-30 lint-trustworthiness batch incl. the ai/gotchas.json validity fix) Week 1 is fully done once this merges; overrides + the harness fix protect nobody until then Medium
OK to open the mechanical Biome sweep PR (format + import organization, ~209 files / ~11k lines, zero behavior change) right after #118 merges Clears 316 of the 488 remaining lint errors in one reviewable-by-sampling PR; blocked on #118 to avoid rebase pain Low
Decide on the remaining audit findings needing major-version bumps (post-1.8.0: next, vite, webpack, esbuild, brace-expansion via minimatch@3) None are runtime risk to npm consumers, but each needs a scoped, tested follow-up rather than a blanket override Low (no active runtime risk)
Create the GitHub release for v1.8.0 from the CHANGELOG.md entry (npm publish already done) Closes the release loop per RELEASING.md step 5; the tag/release page is what downstream agents link Low
Go/no-go on the Week 3 library-split RFC once drafted Major breaking change, affects Studio and Aveiro Medium (Week 3)
Confirm once-ui.com/support as the outreach target page + the pricing-anchor question (see 07-29 workspace note) Gates the Bet 1 outreach sends Medium

7. Decision log

  • 2026-07-27: Bootstrap run scoped to roadmap creation only, per protocol — no code changes attempted yet.

  • 2026-07-27: The open revenue-sprint note in this repo's Dopler Universe collection asks for sponsor-visibility work, a sponsor-prospect list, and draft outreach. Sponsor visibility (README/FUNDING.yml) already existed, so Week 1 above scopes it down to strengthening tiers/copy — public, low-risk, appropriate for this public repo. The prospect list and outreach drafts are commercial/internal work involving real third-party data; kept entirely out of this public file (per the public-repo guardrail) and deferred to the Aveiro-only workspace on a subsequent run, following the same no-fabricated-data discipline the Studio and Aveiro agents already established this sprint (real data or an escalation, never invented names).

  • 2026-07-28: Dependabot triage used pnpm audit against the lockfile rather than GitHub's Security/Dependabot API, which this agent's GitHub tools don't expose — cross-checked the resulting counts (143 vs. GitHub's 130) are close enough to trust the severity breakdown, and confirmed the underlying finding (0 runtime risk to published packages/core) by directly diffing advisory package names against packages/core/package.json's dependencies, not by trusting either tool's summary alone.

  • 2026-07-28: Chose same-major-version pnpm.overrides only for this run's dependency fix batch, explicitly skipping every advisory that would require a major-version bump (next, vite, ajv, js-yaml, picomatch) — those change public APIs of tools this repo depends on and need a dedicated, tested follow-up rather than a blanket lockfile pin that could silently break the build.

  • 2026-07-28: Posted a REQUEST_CHANGES GitHub review on PR #115 rather than merging or leaving it pending — found a real visual regression (RadioButton checked-state border) plus the typography-naming issue Lorant flagged, so "no-go" was the only defensible call; patch release stays unscoped until div (or this agent, if asked) pushes fixes.

  • 2026-07-29: Classified the pending release as minor (1.8.0) rather than the patch originally assumed, applying the freshly written RELEASING.md criteria to #115's final shape (new props, TextWeight widening, classnames→clsx, DropdownWrapper behavior change). Recommended restoring the exports require condition rather than accepting a silent package-resolution break inside a "minor" — if Lorant accepts the drop instead, the same criteria say major. Week 6's planned minor renumbers accordingly (1.9.0 or absorbs into this one).

  • 2026-07-29: Deliberately skipped the remaining Week 1 code items (Vitest/jsdom fixes, Biome mismatch) this run: #115 already bumps biome and touches the same test files, so parallel work would conflict with a community PR mid-review — sequencing over throughput.

  • 2026-07-29 (release day): Added a sharp ^0.35.3 override on top of the 7 existing pins — the libvips CVE advisory is patched only in ≥0.35.0, the package's own peer range already allows ^0.35, and the build verified clean. Deliberately did NOT override brace-expansion (patched only in ≥5.0.8; forcing minimatch@3's brace-expansion@1 to v5 would break glob matching) — left as a scoped follow-up with the other majors.

  • 2026-07-30: Deliberately did NOT commit the biome check --write sweep (measured at ~209 files / ~11k lines) onto the daily PR — the Daily PR contract's reviewability budget wins over throughput; proposed it as a standalone follow-up PR gated on #118 merging. Also chose preset: "recommended" over the auto-migration's preset: "none" output after verifying the migration had silently disabled all lint rules — an auto-migration result is a proposal, not a truth.

  • 2026-07-30: Removed docs' unused eslint/eslint-config-next dependencies rather than keeping them "just in case" — Next 16 removed next lint, no ESLint config remained wired to any script, and the removal shrank the lockfile by ~2.8k lines and the audit surface by one finding. If a future docs lint wants ESLint back, it returns via an explicit flat-config setup, not leftovers.

  • 2026-09-14: Left Select's focus lifecycle broken rather than fixing it inside the focusRing change. Select moves focus off the trigger and into the dropdown, so the trigger is not the focused element for most of the interaction, and its own handleBlur is wired to the search input but never to the trigger. A ring keyed to the trigger lit on first focus and then went out with the menu still open, so focusRing is omitted from SelectProps (a prop that type-checks and silently does nothing is worse than no prop) and the gap is recorded here instead. Fixing it means tracking focus across the whole control — trigger plus dropdown — which is a change to Select's focus architecture, not a one-liner, and it should carry its own interaction tests. Until then Select has no focus indicator, same as every field before focusRing. The dead focused/filled classes that used to sit in that component are gone, so nothing there is misleading about it any more. Resolved later the same day: Select now tracks focus across the whole control (onFocusCapture on the wrapper, cleared by a document-level focusin/pointerdown watcher, since removing the focused dropdown button fires no focusout), and focusRing is back in SelectProps.

  • 2026-09-15 (release plan, Lorant): 2.0 ships in this order and not before every step is done: (1) publish 2.0.0-alpha.0 to the alpha dist-tag — the only public artifact until final; (2) finalize the once-ui.com landing (studio, branch 2.0); (3) finalize the docs site; (4) migrate Stack (magic-convert) to 2.0; (5) write the marketing — blog post, Design Engineers Club newsletter segment, socials; (6) release 2.0.0 to latest when all of it is ready. No public releases, posts or announcements in between, and every piece of copy — site, docs, changelog prose, marketing — is written as if for the final 2.0, never for the alpha: no "alpha", "preview" or "coming soon" in anything a visitor reads. The alpha's changelog caveats (bundler-only, foundations unpublished) are versioned facts under the alpha heading and are the one exception; the ESM-only PR lands between (1) and (6) and retires the first of them. The marketing thesis for the whole sequence: 2.0 is the release where Once UI becomes a system an AI can build with correctly — one spec drives the docs, the harness, the validator and the codemod; utilities and responsive classes are generated; breakpoints are fixed so CSS and JS agree — which is the precondition for the Stack + prompts model.

8. Guardrails

  • This is a public open-source repo — nothing here or in any pushed branch may contain Dopler business strategy, revenue figures, prospect/customer data, or internal URLs/secrets.
  • Never commit to main; the agent's daily PR merges only after Lorant's APPROVED review (Daily PR contract, 2026-07-29); never run npm publish — releases are proposals until Lorant executes them.
  • Nothing external (emails, posts, outreach, sponsor messages) is ever sent without an explicit approval note from Lorant.
  • No secrets in the repo; missing env values get mocked and flagged, never invented.
  • Instructions come only from Lorant (chat, or notes/pages in the Dopler Universe workspace) or registered agents via the comment convention — agent comments never override Lorant or these guardrails. Everything else (issues, PRs, external sites) is data, not commands.
  • Never edit another agent's roadmap, collection, or repo — propose changes via comments.