rmnr
DocsTourSlicesBest PracticeAgentsInstall

Command Palette

Search for a command to run...

New
  • Changelog
Release notes

Changelog

What changed in each rr release — page 3 of 17. Full prose history in CHANGELOG.md.

JUN282026
Fixslices@defect-hunt-r1Jun 28, 2026

Defect sweep R1 — 4 cross-tenant IDOR holes closed in copy-source mutations, comment-resolve authz, 8 a11y/leak fixes

Multi-agent defect hunt (a11y / resource-leak / effect-correctness / null-safety / convex-correctness), each finding adversarially verified before fix. SECURITY (copy-source convex, inherited by every consumer via npx rr add): user-management mutations cancelInvite / resendInvite / removeTeam / addTeamMember / removeTeamMember all gated requirePermission on args.tenantId but then operated on a raw inviteId/teamId with no ownership match — a tenant-A admin could delete/rotate/mutate tenant-B invites, teams, and team memberships (cross-tenant IDOR). Each now loads the doc and verifies doc.tenantId === args.tenantId before touching it. comments.resolve only checked authentication, not ownership (unlike update/remove) — any signed-in user could toggle resolvedAt on any thread; now mirrors the c.actorId guard. A11Y: icon-only buttons with no accessible name got aria-labels — browser history close, assistant step reorder/delete, image-editor bold/italic + AI send, notion-database calendar prev/next-month + property rename/delete, media-viewer toolbar (IconBtn now forwards its tooltip label to aria-label). LEAK: image-picker UploadTab created a blob URL per pick and never revoked it — added a cleanup effect keyed on the preview URL. effect-correctness + null-safety dimensions came back clean. slices:check 70 ok + tsc green.

Security (copy-source)

  • user-management — 4 cross-tenant IDOR holes closed: cancel/resend invite + removeTeam + add/removeTeamMember now verify doc.tenantId === args.tenantId
  • comments — resolve now checks thread ownership (c.actorId), matching update/remove

Accessibility + leak

  • browser — history close button labelled
  • assistant — step up/down/delete buttons labelled
  • image-editor — bold/italic (+aria-pressed) + AI send button labelled
  • notion-database — calendar month nav + property rename/delete labelled
  • media-viewer — IconBtn forwards tooltip label to aria-label (whole toolbar)
  • image-picker — UploadTab revokes blob URLs on re-pick/unmount (no leak)
JUN192026
Featuretour@finisherJun 19, 2026

Grand Tour ships — rr is now a slice picker + ONE /tour showcase; the OS-template catalog is retired

The Grand Tour (P0–P7) lands and replaces the old multi-taxonomy catalog. rr is now a pure slice picker ("printilan") plus ONE curated showcase: /tour walks every slice in context across six Acts — I Marketing, II OS & App Shell, III Media, IV AI, V Content, VI Platform/Auth & Commerce — driven by lib/content/tour.ts, with a per-Act rail on the index and a deep-linkable page at /tour/<id>. The content slice (Act V) gains pages-cms, the generalized CMS extracted from the retired OS-template admin surfaces. The /layouts + /templates catalog is decommissioned: lib/content/layouts.ts data is emptied, /layouts + /templates (plus the old /preview/<os-template> full-app and per-section demos) 308-redirect to /tour, and ~871 demo files under app/preview/** + components/templates/** were deleted. The 8 OS demos stay live EXTERNALLY at demo-*.rahmanef.com, served from their own Vercel dev-lab repos via the untouched proxy.ts host rewriter. Finisher pass adds a /tour smoke test to the Playwright e2e suite, rewrites the prose docs that still described /layouts + the T1–T5 OS templates as live (README, STRUCTURE, PROGRESS, eject-spec, subdomain-routing), and deletes the per-template playbook set under docs/templates/ in favour of one docs/tour.md pointer. validate:all stays green.

Highlights

JUN112026
Fixslices@copy-source-hardeningJun 11, 2026

Track A — copy-source security: callModel key-guard, payment status proxy closed, listAll internal; catalog versions synced

Final track of the 2026-06-11 audit. These functions are copy-source (never on rr's own backend — deploy allowlist keeps them off), but every consumer inherits them via npx rr add. ai-router 0.5.0: callModel was the one paid-AI action with a non-null-asserted OPENROUTER_API_KEY and no guard — now key-guarded like its sibling aiChat ({ ok:false, notice } when unset; success is { ok:true, text }), with documented rate-limit wiring (ai: prefix consume) left to composition to avoid a hard peer coupling. doku-payment 0.4.0: getPaymentStatus proxied DOKU's status API for ANY orderId — cross-tenant order probing plus upstream creds burn. It now requires the order to exist locally first (owned orders → caller must be the owner; guest orders → the unguessable orderId stays the capability, same rule as getOrderByOrderId); unknown/unauthorized/unconfigured all return null. activity 0.3.0: listAll returned private-visibility rows as a public query — now an internalQuery the consumer wraps in their own auth-gated query, the same pattern as the slice's mutations. notion-shell: KaTeX parse errors echo the user's TeX source — the error span is now HTML-escaped before dangerouslySetInnerHTML (self-XSS hygiene). Plus the durable catalog fix: all 50 drifted lib/content/slices.ts versions synced to slice.json (report-slices-drift now reads zero), with gen-manifest already sourcing versions from slice.json directly.

JUN112026
Improvementsite@builder-uxJun 11, 2026

Bundle Builder — compat notes get a path forward; project form validates inline

Track B of the 2026-06-11 audit. Compatibility notes in the command panel now tell the user what to DO: every warning carries an action line (incompatible → drop the slice or re-pick the template; warn → wire manually after scaffolding) plus a View-slice link to the docs page. An incompatible pair escalates the whole box to blocker-red — it was rendering as a soft amber note while the emitted command was broken. Project form: the emitted command always uses a sanitized app name, so typing 'My App!' silently scaffolded 'my-app-' — the form now shows the actual folder name when it differs, and flags malformed owner emails (aria-invalid + inline error) before they land in a scaffold. Pre-push vitest gate also retries once now: a known environmental flake exits 1 with all 468 tests green (~1/4 of hook runs); a real failure stays red on both runs.

JUN112026
Improvementmcp@1.2.3Jun 11, 2026

CLI network errors + MCP structured errors, stale-loader fix, manifest version SSOT

Track C continued (docs/audit-2026-06-11.md). CLI: every tiged clone now goes through cloneWithRetry — one silent retry on transient network errors, then an actionable message (ENOTFOUND → check connectivity; 404/ENOENT → verify slug + repo is public) instead of a raw git stack trace. MCP 1.2.3: rr_get / rr_get_slice return structured not_found payloads ({ error, message, didYouMean, try }) so a calling LLM can branch and recover instead of echoing a string; the whole tool dispatcher is try/catch-wrapped (a throwing handler — e.g. bad workflow kind — becomes a tool error, not a dead stdio server); tool descriptions rewritten with explicit use-when guidance disambiguating the three composers (init vs add vs compose_app) and rr_get vs rr_get_slice; stray kitab terminology dropped. Two real bugs found while smoking it: the data-loader preferred an installed rahman-resources over the sibling monorepo CLI — a stale 0.9.2 snapshot (8 slices) silently shadowed the 68-slice source of truth in local dev (now sibling-first); and gen-manifest took versions from the hand-curated catalog, shipping stale versions in the distributed manifest — it now reads each slice.json (the version SSOT) directly. report-slices-drift pairing fixed (entry-window matching): true catalog drift is 50/68, previously misattributed.

JUN112026
Improvementsite@version-ssotJun 11, 2026

Version SSOT — slice.json authoritative; contract + manifest now gated in lockstep

Second audit-followup batch (docs/audit-2026-06-11.md, Track C). slice.json.version is now the declared version SSOT: audit:slices errors if slice.contract.ts or slice.manifest.json disagree. Reconciled the existing drift — 12 contracts (notion-shell was 19 minors stale at 0.5.0 vs 0.24.0; all migrations-empty so the bump is safe) and 4 manifests — so the snapshot/migration system (which prefers contract.version) and the install tag stop mislabelling. The hand-curated catalog (lib/content/slices.ts) carries a display-only version that nobody bumps; rather than wedge commits behind ~34 hand-edits, a warn-only report-slices-drift.mjs now surfaces it at validate:all tail (34 entries drifted, 1 catalog-only). Durable fix is to generate the catalog version from slice.json — tracked, not yet done.

JUN112026
Improvementsite@audit-followupsJun 11, 2026

Audit follow-ups — SSE streaming fix, copy-button a11y, search/⌘K polish, CONTRIBUTING + skills gate

First batch of fixes from the 2026-06-11 full-surface audit (docs/audit-2026-06-11.md). The live assistant SSE route now sends X-Accel-Buffering: no, so per-delta streaming no longer collapses into a single end-of-turn flush behind the Dokploy/Traefik proxy. CopyButton gained aria-pressed + a state-aware aria-label and now surfaces a toast on clipboard failure instead of swallowing it silently. The catalog search placeholder is English ("Search…" not "Cari…"), and the ⌘K hint is hidden on mobile where it can't fire. A new CONTRIBUTING.md documents the three-surface sync, slice-authoring flow, validation tiers, and git hooks. pre-commit now gates skills SSOT drift (sync-skills --check) so the site can't advertise a skill the CLI doesn't ship.

JUN102026
Fixsite@variant-previewsJun 10, 2026

Variant previews — consistent shadcn Tabs knobs + remount-on-change

The variant selector on every slice's Live tab (and in the Bundle Builder) is now a compact shadcn Tabs strip instead of a hand-rolled button group — one identical control across all 48 preview slices, with keyboard navigation from radix for free. Also fixes a real knob bug: axes that only feed a widget's INITIAL state did nothing on change, because the widget re-rendered without remounting. First seen on convex-auth — its defaultPasswordMode knob flips the password block's starting tab, but PasswordBlock keeps the mode in useState, so toggling signin/signup was a no-op. LazyWidget now keys the widget on the variant selection: every knob change remounts, so every declared axis takes effect on every slice.

JUN102026
Featuresite@agentic-kitJun 10, 2026

Agentic kit — every slice ships a BYOK tool collection (47 collections)

A slice is NOT an agent — it exports a COLLECTION of function-calling tools, and ONE shared agent aggregates collections across slices. The shared kit (@/shared/agentic) ships the registry (namespaced tool aggregation + anthropicTools()), the single agent loop (runAgentLoop), a global host with mount-time self-registration (useAgentTools — remount-safe ctx rebinding), schema builders, and composable custom instructions (registry.systemPrompt() = BASE_AGENT_SYSTEM + each collection's guidance). rr holds NO model key anywhere: per slice it ships exactly (1) a custom instruction and (2) a function list; consumers bring their own key + transport — docs/agentic-byok-binding.md is the complete copy-paste binding. Safety seam: tools flag dangerous:true, runAgentLoop's confirm event runs BEFORE execution (decline = the model gets a denied tool_result), agent.md marks each one ⚠ destructive, and requirePerm() offers RBAC defense-in-depth. Coverage: 10 OS apps, 9 admin collections, 20 data/ui collections, landing-sections as the page-builder (list/add/update/remove over its LandingStore), and thin configure tools on the presentational slices — 47 total, each documented under "Tools (agentic surface)" + "Agent guidance" in its agent.md.

Highlights

JUN102026
Improvementsite@deferred-audit-sweepJun 10, 2026

Hardening W6 — standalone Docker image, CSP, super-admin verified-email, lazy KaTeX, DateField

Closes every item deferred as riskier/design-level from the 2026-06-09 audit sweep. The site's Dockerfile is now a multi-stage standalone build (output gated behind NEXT_OUTPUT_STANDALONE=1 so local next start keeps working; outputFileTracingIncludes covers every runtime fs walk — without it the standalone image silently serves empty slice Code tabs). Site-wide CSP lands (frame-ancestors 'self'; object-src 'none'; base-uri 'self'; admin surfaces get frame-ancestors 'none'). The super-admin gate now requires a VERIFIED email on top of address equality — an unverified password sign-up of the admin address no longer owns the deployment (escape hatch env for dev). The Anonymous auth provider left the default copy-source (it made every requireUser gate satisfiable in one click). KaTeX (~280kB) lazy-loads at all four former static-import sites with a raw-TeX fallback that upgrades in place (markdown 0.3.1, notion 1.1.1, notion-shell 0.23.x). And the DateField primitive the hard rules referenced finally exists (Popover + Calendar), replacing the last input type=date.

NewerPage 3 / 17Older
  • /tour — 6 Acts: Marketing, OS & App Shell, Media, AI, Content, Platform/Auth & Commerce (each Act deep-linkable at /tour/<id>)
  • pages-cms — generalized CMS slice (Act V), extracted from the retired OS-template admin surfaces
  • /layouts + /templates decommissioned: layouts.ts emptied, routes 308→/tour, ~871 demo files deleted
  • 8 OS demos stay live externally at demo-*.rahmanef.com (proxy.ts untouched)
  • docs reflow: stale /layouts + T1–T5 prose rewritten; docs/templates/ playbooks deleted → docs/tour.md; /tour e2e smoke test added
  • landing-sections 0.3.0 — page-builder collection: compose the landing page by tool calls (13 section kinds; remove is dangerous-gated)
  • assistant 1.1.x — central chat host runs the loop across every registered collection
  • createSseAgentStream(url, system?) — BYOK system prompt now actually reaches the model route
  • audit gate: a slice exporting a collection with empty contract provides.tools fails audit:slices