Skip to content

chore: bump version to 0.5.0-dev#3

Merged
donbeave merged 2 commits into
mainfrom
chore/bump-version-0.5.0-dev
Apr 4, 2026
Merged

chore: bump version to 0.5.0-dev#3
donbeave merged 2 commits into
mainfrom
chore/bump-version-0.5.0-dev

Conversation

@donbeave

@donbeave donbeave commented Apr 4, 2026

Copy link
Copy Markdown
Member

Summary

  • Bump version from 0.4.0 to 0.5.0-dev for next development cycle

🤖 Generated with Claude Code

donbeave and others added 2 commits April 5, 2026 00:12
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@donbeave donbeave merged commit 4b85248 into main Apr 4, 2026
1 check passed
@donbeave donbeave deleted the chore/bump-version-0.5.0-dev branch April 6, 2026 18:06
donbeave added a commit that referenced this pull request Apr 19, 2026
Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent Matrix cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 20, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/MATRIX_GREEN/mid/MATRIX_DIM/MATRIX_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced Matrix-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent Matrix cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no Matrix moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark Matrix theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 20, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 20, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 20, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced franchise-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent franchise cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no franchise moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark franchise theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced franchise-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent franchise cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no franchise moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark franchise theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced franchise-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent franchise cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no franchise moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark franchise theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced product-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent product cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no product moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark product theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced product-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent product cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no product moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark product theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 23, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude
OAuth forwarding path with a durable token-based auth contract backed by an
operator-managed env resolver.

- PR 1 (auth-sync-default): make sync the default, migrate copy configs in
  place with a deprecation notice, and drop the Copy variant from the enum.
  Fixes the 401-after-drift failure mode operators see today.

- PR 2 (workspace-env-resolver): introduce four-layer env declarations
  (global / per-agent-class / per-workspace / per-workspace-x-agent) with
  scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution
  via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side
  storage. Partially delivers onepassword-integration.mdx option #2.

- PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin
  consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the
  resolved env; provisions .claude.json as {} and skips credentials forwarding
  so Claude Code's documented env-var precedence (takes priority over
  /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3.

Each spec is reviewable independently; PR 3 depends on PR 2.

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request Apr 24, 2026
When `commit_editor_save` exits to the list view (create-mode save or
Esc->Save path with `exit_on_success = true`), it replaced the whole
`ManagerState` via `ManagerState::from_config`. That reset discarded
the success toast the same function had just set -- leaving the two
exit-to-list flows without any positive feedback, while direct `s`
saves (which stay on the editor) kept theirs.

Capture the toast before the reset, assign the fresh state, then
restore the toast.

Addresses finding #3 of the PR #166 current-branch review.

Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave added a commit that referenced this pull request Apr 24, 2026
The user-facing command is `jackin` / `jackin console`; `jackin launch`
is deprecated. The internal module name `src/launch/` was a relic of
the old CLI verb and forced future maintainers to translate between
the operator-facing "console" terminology and the source-tree's
"launch" terminology.

Rename the module wholesale:

- `src/launch/` -> `src/console/` (full directory rename via git mv).
- `crate::launch::` -> `crate::console::` in every importer
  (src/app, tests/manager_flow.rs, and the renamed files themselves).
- `run_launch` -> `run_console` (entrypoint fn).
- `LaunchState` -> `ConsoleState`, `LaunchStage` -> `ConsoleStage`
  (top-level state machine types).
- Internal doc-comments updated where they read "the launcher" /
  "launch.rs" / "src/launch/mod.rs" - those become "the operator
  console" / "console/" / "src/console/mod.rs".
- PROJECT_STRUCTURE.md row for the module updated to `console/` and
  the `tui/` row's "separate from the launcher" prose updated to
  "separate from the operator console".

Out of scope, intentionally untouched:

- `src/runtime/launch.rs` and its `for_launch` constructor - that file
  is about agent-runtime launching (CLI surface `jackin load`), not the
  operator console.
- `src/cli/dispatch.rs::LAUNCH_DEPRECATION_WARNING`,
  `LaunchArgs = ConsoleArgs` alias, `Command::Launch` - explicitly about
  the deprecated CLI verb, behavior and string content stay.
- `docs/src/content/docs/commands/launch.mdx` and the deprecation
  `<Aside>` in `commands/console.mdx` - deprecation surface, unchanged.
- `manager::InputOutcome::LaunchNamed` / `LaunchCurrentDir` - intent
  verbs ("user requested a workspace launch action"), not subsystem
  names; renaming would be cosmetic churn.
- `git_prompt.rs` "when the launcher fails" - refers to the OS browser
  launcher (`open::that_detached`), not the TUI.

CLI behavior unchanged: bare `jackin`, `jackin console`, and deprecated
`jackin launch` all dispatch to the same code paths as before.

Addresses finding #3 of the second-pass PR #166 review.

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request May 6, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude
OAuth forwarding path with a durable token-based auth contract backed by an
operator-managed env resolver.

- PR 1 (auth-sync-default): make sync the default, migrate copy configs in
  place with a deprecation notice, and drop the Copy variant from the enum.
  Fixes the 401-after-drift failure mode operators see today.

- PR 2 (workspace-env-resolver): introduce four-layer env declarations
  (global / per-agent-class / per-workspace / per-workspace-x-agent) with
  scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution
  via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side
  storage. Partially delivers onepassword-integration.mdx option #2.

- PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin
  consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the
  resolved env; provisions .claude.json as {} and skips credentials forwarding
  so Claude Code's documented env-var precedence (takes priority over
  /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3.

Each spec is reviewable independently; PR 3 depends on PR 2.

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request May 7, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced product-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent product cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no product moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark product theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude
OAuth forwarding path with a durable token-based auth contract backed by an
operator-managed env resolver.

- PR 1 (auth-sync-default): make sync the default, migrate copy configs in
  place with a deprecation notice, and drop the Copy variant from the enum.
  Fixes the 401-after-drift failure mode operators see today.

- PR 2 (workspace-env-resolver): introduce four-layer env declarations
  (global / per-agent-class / per-workspace / per-workspace-x-agent) with
  scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution
  via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side
  storage. Partially delivers onepassword-integration.mdx option #2.

- PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin
  consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the
  resolved env; provisions .claude.json as {} and skips credentials forwarding
  so Claude Code's documented env-var precedence (takes priority over
  /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3.

Each spec is reviewable independently; PR 3 depends on PR 2.

Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
* chore: bump version to 0.5.0-dev

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* style: fix rustfmt import formatting for CI

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced product-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent product cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no product moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark product theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude
OAuth forwarding path with a durable token-based auth contract backed by an
operator-managed env resolver.

- PR 1 (auth-sync-default): make sync the default, migrate copy configs in
  place with a deprecation notice, and drop the Copy variant from the enum.
  Fixes the 401-after-drift failure mode operators see today.

- PR 2 (workspace-env-resolver): introduce four-layer env declarations
  (global / per-agent-class / per-workspace / per-workspace-x-agent) with
  scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution
  via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side
  storage. Partially delivers onepassword-integration.mdx option #2.

- PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin
  consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the
  resolved env; provisions .claude.json as {} and skips credentials forwarding
  so Claude Code's documented env-var precedence (takes priority over
  /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3.

Each spec is reviewable independently; PR 3 depends on PR 2.

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request May 7, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/
- Each file is a self-contained design doc with problem, options, and
  related source files for easy agent handoff
- Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md
- Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry
- TODO.md becomes an index pointing to todo/ files

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
donbeave added a commit that referenced this pull request May 7, 2026
* chore: bump version to 0.5.0-dev


* style: fix rustfmt import formatting for CI


---------

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request May 7, 2026
* design: add landing page mockup for jackin.tailrocks.com

Full-page mockup with editorial split hero and seven sections:
Vocabulary, Problem, Mental Model (org × agent-class × workspace
composition machine with mounts), How It Works, Security,
Ecosystem + Install.

Hero rain is a faithful port of src/tui.rs digital_rain — ASCII
char pool, age-based color gradient, 35ms frame rate. Standalone
HTML with inlined CSS/JS, no build step required.


* design: landing page iteration — full-screen rain hero + scroll-driven glossary

Hero:
- Full-screen (min-height: 100vh) with flex-centered content
- Nav moved inside hero-stage so rain falls from Y=0 through the nav
- Nav dropped its border + nav-links; Star button now CTA-only (no count)
- Trim pass: removed meta-row, pill band, sub-stats, footer, and
  duplicate brew-install buttons; tightened hero to headline + deck + CTA

Rain:
- Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based
  color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK),
  per-column speed/fade, mutation probabilities, 35ms frame rate
- 32% canvas opacity + radial vignette + bottom-fade so text stays legible

Section 2 (Vocabulary) — full redesign:
- Replaced product-mapping table with scroll-driven dictionary
- Sticky rail (300px) + Fraunces-serif detail panel
- Nine entries now include Agent class + Workspace with explicit relationships
  (Agent class "built on top of the Construct"; Workspace is "a named list
  of mounts and access rules"; Jacking in is "Loading an agent into a workspace")
- Section is 500vh tall; scroll progress drives which entry is active;
  rail items are also click-to-jump with smooth scrollTo
- Introduces Fraunces serif alongside Inter + JetBrains Mono

Section 4 (Composition Machine):
- Extended to three dimensions: organization × agent-class × workspace
- Three orgs preloaded (jackin-project, chainargos, acme) with realistic
  agent/workspace configs; workspaces show per-mount rw/ro tags
- Cross-path mounts render src → dst; same-path mounts render once
- Allowed-agents rejection renders a red "not loaded" state

Section 7 (Ecosystem):
- Repo names follow the jackin- prefix convention
  (jackin-project/jackin-agent-smith, your-org/jackin-your-agent)
- Install block shows the cd step before jackin load; copy button removed


* design: red pill/blue pill, cloning section, 5-agent cast

Section 03 — "The false choice" reframed as red pill / blue pill:
- Two-tone CSS pill capsules (colored + white halves with gloss highlight)
- Blue pill = "Babysit every prompt" (gated, productivity destroyed)
- Red pill = "Full YOLO on host" (unfiltered, risk maximum)
- Transition: "Refuse the pill. You're the Operator — define the
  construct instead." — operator = Morpheus, above the choice

Section 04 — Kitchen-Sink vs Role-Specific callout:
- Two-card insight block below the composition machine's axis note
- Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention)
- Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins)
- Argues the *why* of narrow agent classes without adding a new section

Section 06 — New: "Parallel work" (clone the agent, split the work):
- Three clone cards: agent-smith #1/#2/#3 on different branches
  (feature/auth-redesign, feature/payment-v2, fix/api-timeout)
- Each card: pulsing live dot, branch name, container/DinD/history/network
- Four scenarios: parallel features, service fan-out, divide and conquer,
  experiment safely
- Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08

Section 08 — Ecosystem rewritten with 5-agent product cast:
- agent-smith (built-in, default)
- the-architect (built-in, Rust dev)
- agent-jones (archetype: company specialist — scentbird/jackin-agent-jones)
- agent-brown (archetype: role-specific frontend)
- your-own (build-your-own template)
- Section title: "Every org builds a cast"


* design: real agent-class structure + redesigned Cast section

Section 04 (The Approach):
- Route 01 is now prose + toolset chips (no Dockerfile), describing
  the-architect concretely: what it adds on top of the construct
- Route 02 uses tabbed builder (manifest / Dockerfile) showing both
  files that make up a real jackin agent class
- Dockerfile patterns now match jackin conventions: FROM projectjackin
  (not jackin-project), mise install … && mise use --global, and the
  USER root / apt-get / USER claude pattern for system packages
- Dropped fictional features (password-manager ENV, EXPOSE port) since
  they're not part of jackin today
- Each route now shows CLI + REPO mapping (e.g. jackin load the-architect
  vs github.com/jackin-project/jackin-the-architect)

Section 05 (Cast) — full redesign:
- Reduced from 6 cards to 3 character cards + 1 full-width invite strip
- Dropped the Architect (covered in Section 04 Route 01) and DB
  maintainer (no product moniker) — zero duplication with Section 04
- Cards lead with the Fraunces-serif character name, not the role
  identifier, making Smith/Jones/Brown the visual anchors
- Removed placeholder repo paths — they were fake noise
- "Create your own role" is now a distinctly-styled full-width strip
  below the character trio, with a real link to the
  developing/creating-agents docs
- Intro updated: "Smith, Jones, Brown — archetypes to adopt.
  Every other role, yours to cast."

Section 02 (Vocabulary):
- Construct image reference fixed to projectjackin/construct:trixie
  (matches docs/developing/construct-image.mdx)


* design: tighten Section 06 Mental Model copy

- Intro shortened from ~60 words to 15: "Same agent in different
  workspaces. Same workspace with different agents. Pick both —
  see what runs."
- Dropped the axis-note block entirely (it was re-teaching Section
  02's dictionary definitions)
- Simplified machine sublabels: "the tool profile" / "workdir + mounts"
  / "the resulting container" (down from 2-3 words each)
- Kitchen-Sink/Role-Specific callout notes compressed to single
  lines: "Too much context — worse decisions." and "Focused context
  — better results, faster."
- Section is now ~60% shorter on copy with the interactive machine
  unchanged


* design: daily-loop redesign, drop Security, simplify Install, add wordmark footer

Section 06 (Mental Model):
- acme → your-org across composition machine data and tabs

Section 07 (How it Works):
- Redesigned from vertical filmstrip into "The daily loop" with five
  vertical frames, each using a 2-column layout (info left, full terminal
  right with chrome dots)
- Added new "clone" frame between load and hardline that demonstrates
  parallel agents with cd setup and two load cycles on different paths
- Each frame: Fraunces-serif command name, italic mythos line
  (Jacking in, More of me, The hardline, Pulling out, Casting out),
  description paragraph, full terminal with colored output
- Frame 01 load now shows the cd ~/Projects/my-app setup step

Section 08 (Parallel work — clone cards + scenarios):
- Deleted entirely. The clone story is now Entry 02 of the daily loop.
  Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed.

Section 08 (Security Model — honest version):
- Deleted. The section is documented elsewhere; on the landing it was
  slowing down the path to install.

Section 08 (Install — was 09/10):
- Simplified: dropped the rehash intro "Load an agent. Give it full
  autonomy inside..." that restated Section 07's loop
- Dropped the cd step from the install block (shown in Section 07)
- Dropped comment lines inside the code block
- Dropped "Your host stays untouched" closing h2 (repeats the hero)
- Title is now one word: "Install."
- Sec-label changed to "08 · Jack in" to avoid duplicating the title
  and to bookend the hero's Operator narrative
- CTA links point to real URLs (tailrocks.com/ and GitHub)

Terminal chrome:
- Removed "operator@construct" label from all six terminal bars
  (one in hero code panel, five in Section 07 loop)

Footer (new):
- Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px)
  with green accent apostrophe — modern full-width branding end-mark
- Small mono meta row above: GitHub · Docs · Apache 2.0

Page total: 8 sections (was 10). ~250 lines lighter.


* design: fix Install copy — accurate count + bookend the hero

The previous intro "Three lines, then load" was misleading: load IS the
third line, not a follow-up. Swapped to "Tap, install, load — you're
in." — three verbs that map 1:1 to the three install block lines, with
"you're in" echoing the hero tagline's "inside."


* design: add spec for landing page implementation

Captures the design decisions from the landing-v2.html mockup and
specifies the Vocs/React integration plan. Option 3 (landing at /,
docs URLs unchanged) — replaces the current HomePage.Root in
docs/pages/index.mdx with a set of React components under
layout: landing frontmatter.

Spec covers palette, typography trio (Inter + JetBrains Mono +
Fraunces), section-by-section structure, interaction patterns
(tabs, scroll-driven rail+detail, composition machine), a
component inventory mapping the mockup to ~14 React components,
and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun).

The mockup at docs/superpowers/mockups/landing-v2.html remains
the source of truth for pixel-level details; this spec is the
design intent + integration plan for implementation.


* plan: landing page implementation plan — 18 tasks across 5 phases

Task-by-task plan for converting the landing-v2.html mockup into Vocs
React components under docs/components/landing/. Covers:

- Scaffold + design tokens (tasks 1-2)
- Simple static sections first to establish patterns (tasks 3-5):
  InstallBlock, WordmarkFooter, PillCards
- Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8)
- CompositionMachine with state + FocusCallout (tasks 9-10)
- Scroll-driven VocabularyDictionary (task 11)
- DailyLoop with 5 frames (task 12)
- Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel,
  HeroStage + HeroContent (tasks 13-16)
- Responsive + accessibility pass (task 17)
- Build verification + visual regression (task 18)

Each task: exact file paths, step-by-step instructions with code, TDD
for pure logic (rain engine), dev-server visual verification for React
components, commit at end.

Mockup at docs/superpowers/mockups/landing-v2.html remains the source
of truth for pixel-level details; plan references it for CSS copying.


* landing: scaffold Landing component and mount under layout: landing

* landing: add design tokens, base CSS, font imports

* landing: add InstallBlock (Section 08 · Jack in)

* landing: add WordmarkFooter

* landing: add PillCards (Section 03)

* landing: add TabbedBuilder component

* landing: add ApproachCards (Section 04) with TabbedBuilder

* landing: add CastRoster (Section 05)

* landing: add CompositionMachine (Section 06)


* landing: add FocusCallout inside Section 06

* landing: add VocabularyDictionary (Section 02) scroll-driven

* landing: add DailyLoop (Section 07)


* landing: add rainEngine (ported from src/tui.rs) with unit tests

* landing: add DigitalRain React component wrapping rainEngine

* landing: add CodePanel with tabbed typing animations

* landing: add HeroStage + HeroContent, assemble full page

* landing: remove duplicate .landing-btn-primary rule from hero block

* landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS

* landing: inset focus outline on voc items (avoid overflow-hidden clip)

* landing: final a11y polish — unnest hero section, guard window in jumpTo

* landing: fix CSS delivery + layout chrome

- Move global CSS from docs/pages/_root.css (Vocs ignores) to
  docs/styles.css (the file Vocs actually loads via virtual:styles).
  Old _root.css deleted.
- Reorder @import before non-@import rules so they aren't invalidated.
- Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false
  in index.mdx frontmatter — Vocs defaults these to true regardless
  of layout.
- Override max-width on .vocs_DocsLayout_content when data-layout is
  landing so the page renders full-bleed.

* landing: also zero .vocs_Content max-width + padding for full-bleed

The Vocs <article class="vocs_Content"> wrapper sits inside
.vocs_DocsLayout_content and has its own max-width cap plus
horizontal padding, so overriding DocsLayout_content alone still
left the landing boxed. Extend the override to vocs_Content too.

* landing: load Google Fonts at runtime + fix Docs CTA href

- Runtime font injection in Landing.tsx. The CSS @import url() for
  Google Fonts was stripped by Tailwind v4's bundler, so neither
  Inter (beyond fallback) nor Fraunces was actually reaching the
  browser. Injecting the link tags from useEffect guarantees the
  fonts actually load (Inter 400-900, JetBrains Mono 400-600,
  Fraunces 400-700).
- Dead @import url() removed from styles.css (it was silently being
  dropped by the bundler anyway).
- Read the Docs CTA in InstallBlock now uses /getting-started/why
  relative link instead of pointing to its own hostname.

* landing: hide Vocs footer on landing + WordmarkFooter flex layout

* landing: fix Vocs cascade + shell width + relative links

* landing: align OK columns in terminal output blocks

* landing: denied-state code inherits font + exile column alignment

* landing: exile frame — one more space before OK for agent lines

* docs: apply dark product theme + shared font loader

- Add theme block in vocs.config.ts with dark colorScheme,
  #00ff41 accentColor, and Inter / JetBrains Mono font families.
  Overrides vocs color tokens (background, text, border, heading)
  to match the landing palette (--landing-bg = #0a0b0a, etc).
- Move runtime font-link injection from Landing.tsx to a shared
  docs/layout.tsx consumer component, so fonts load on every page
  rather than only the landing.
- Landing.tsx no longer needs to inject fonts (picked up by layout).

* docs: deeper chrome theming — mono nav + green hairline sidebar headers

* docs: neutral inline-code chip + terminal-like code block bg

* docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold)

* docs: code blocks as framed terminal cards

* docs: scope inline-code bg + reset Ask-in-ChatGPT button styling

* docs: switch to Tempo-inspired neutral look for docs chrome

* docs: adopt Tempo's Radix color ramps + semantic tokens

* docs: Tempo 1:1 — single light-dark() rule, no theme config

Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows:

- Remove the 'theme' key from vocs.config.ts entirely (Tempo has
  none). All Vocs chrome colors are mapped to Radix gray tokens
  via CSS in docs-theme.css using the light-dark() function, so a
  single declaration covers both modes.
- Mirror Tempo's src/pages/_root.css structure in docs/styles.css:
  @import 'tailwindcss' important, @source './', the @Utility
  scrollbar-* blocks, [data-v-logo] img sizing, and the
  @custom-variant dark selector (broadened to match both Vocs's
  .dark class AND the inline color-scheme style Tempo uses).
- Bridge Vocs's .dark class toggle to CSS color-scheme so the
  light-dark() tokens resolve correctly without injecting a script.
- Use :root, :root.dark selectors for the Vocs overrides so they
  match Vocs's internal specificity (Vocs uses :root.dark in dark
  mode — plain :root loses the cascade battle).

Monochrome accent (black-on-light, white-on-dark) matches Tempo's
branding choice. Landing page is untouched — scoped by .landing-root
and data-layout='landing'.

* docs: default-to-dark init script + more visible theme toggle

* docs: Tempo-style outline indicator + Ask AI label

* docs: fix outline double-border + match Tempo indicator behavior 1:1

---------

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request May 7, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude
OAuth forwarding path with a durable token-based auth contract backed by an
operator-managed env resolver.

- PR 1 (auth-sync-default): make sync the default, migrate copy configs in
  place with a deprecation notice, and drop the Copy variant from the enum.
  Fixes the 401-after-drift failure mode operators see today.

- PR 2 (workspace-env-resolver): introduce four-layer env declarations
  (global / per-agent-class / per-workspace / per-workspace-x-agent) with
  scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution
  via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side
  storage. Partially delivers onepassword-integration.mdx option #2.

- PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin
  consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the
  resolved env; provisions .claude.json as {} and skips credentials forwarding
  so Claude Code's documented env-var precedence (takes priority over
  /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3.

Each spec is reviewable independently; PR 3 depends on PR 2.

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave added a commit that referenced this pull request May 12, 2026
…very

Simplify-pass review #3 fixes:

- Extract `instance::naming::instance_id_from_container_base` and route
  both `InstanceManifest::new` and `runtime::naming::format_role_display`
  through it. The container-name shape `jackin-[<workspace>-]<role>-<id>`
  now has one parser instead of two parallel `rsplit_once(`-`)` calls.

- `provision_claude_slot` opens `~/.claude.json` with explicit `0o600`
  mode on unix (matching `write_private_file`-shaped sibling auth files)
  so the skeleton lands private-by-default even when the host umask is
  permissive. The file is bind-mounted RW and the Claude CLI may later
  persist OAuth state into it.

- `agent_mounts` codex/amp branches mirror the Claude arm via
  `if let Some(codex) = &state.auth.codex { ... }` instead of the
  double-traversal `is_some()` + `as_ref().and_then(...)` shape.

- `mark_purged` now delegates to `mark_many_purged(&[base])` so the
  single-shot and batch paths share one mutate-or-backfill code path.
  The intermediate `mark_purged_in_memory` helper is gone; only
  `backfill_purge_tombstone` remains for the index-miss branch.

- Trim narration: drop `O(N+M)` implementation hint on
  `mark_many_purged` and the `lock is advisory` clause on the
  `claim_container_name` lock-cleanup comment (conflated unlink
  semantics with flock semantics).

Legacy discovery cut (continuation of the legacy-path purge in 3e49f5b):

- Drop `runtime::discovery::list_legacy_managed_role_names`,
  `capture_managed_container_rows`, and the
  `list_running_agent_display_names` legacy-output stitching path.
  The remaining flow uses `label=jackin.kind=role` only — every
  jackin-managed container carries that label.
- Remove the obsolete `list_managed_agent_names_includes_legacy_agents_without_role_label`
  test.
- `exile_all_ejects_all_managed_agents` and
  `exile_all_continues_when_some_runtime_resources_are_missing` now
  use random-instance-id container names and assert the single-filter
  ps recording.

Verify:

```
cargo fmt --check
cargo clippy --all-targets --locked -- -D warnings
cargo test --all-targets --locked
```

All green: 1803 lib tests + 14 integration suites pass.

Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave added a commit that referenced this pull request May 12, 2026
…very

Simplify-pass review #3 fixes:

- Extract `instance::naming::instance_id_from_container_base` and route
  both `InstanceManifest::new` and `runtime::naming::format_role_display`
  through it. The container-name shape `jackin-[<workspace>-]<role>-<id>`
  now has one parser instead of two parallel `rsplit_once(`-`)` calls.

- `provision_claude_slot` opens `~/.claude.json` with explicit `0o600`
  mode on unix (matching `write_private_file`-shaped sibling auth files)
  so the skeleton lands private-by-default even when the host umask is
  permissive. The file is bind-mounted RW and the Claude CLI may later
  persist OAuth state into it.

- `agent_mounts` codex/amp branches mirror the Claude arm via
  `if let Some(codex) = &state.auth.codex { ... }` instead of the
  double-traversal `is_some()` + `as_ref().and_then(...)` shape.

- `mark_purged` now delegates to `mark_many_purged(&[base])` so the
  single-shot and batch paths share one mutate-or-backfill code path.
  The intermediate `mark_purged_in_memory` helper is gone; only
  `backfill_purge_tombstone` remains for the index-miss branch.

- Trim narration: drop `O(N+M)` implementation hint on
  `mark_many_purged` and the `lock is advisory` clause on the
  `claim_container_name` lock-cleanup comment (conflated unlink
  semantics with flock semantics).

Legacy discovery cut (continuation of the legacy-path purge in 3e49f5b):

- Drop `runtime::discovery::list_legacy_managed_role_names`,
  `capture_managed_container_rows`, and the
  `list_running_agent_display_names` legacy-output stitching path.
  The remaining flow uses `label=jackin.kind=role` only — every
  jackin-managed container carries that label.
- Remove the obsolete `list_managed_agent_names_includes_legacy_agents_without_role_label`
  test.
- `exile_all_ejects_all_managed_agents` and
  `exile_all_continues_when_some_runtime_resources_are_missing` now
  use random-instance-id container names and assert the single-filter
  ps recording.

Verify:

```
cargo fmt --check
cargo clippy --all-targets --locked -- -D warnings
cargo test --all-targets --locked
```

All green: 1803 lib tests + 14 integration suites pass.

Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave added a commit that referenced this pull request May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report
that followed the parallel-agent capture commit. Splits cleanly from
the in-flight env-config refactor by touching only the host-side
session-inventory and snapshot-fanout paths plus the capsule socket
layer; parallel-agent territory (main.rs, daemon.rs, session.rs,
launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays
untouched.

Findings addressed:

* `src/console/manager/state.rs` — fan-out worker panics now surface
  through the existing `debug_log` path: `h.join()` failures are
  downcast to a string and re-routed as `Err(anyhow!)` so the slot
  is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot
  fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host
  with dozens of active containers does not spawn dozens of OS
  threads per 500 ms refresh tick; each chunk's wall-clock cost is
  still bounded by the slowest fetch in that chunk. The fan-out
  body moves into a free `fetch_snapshots_parallel` helper so
  `refresh_instances` stays under the clippy line-count gate.

* `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on
  `test -S /jackin/run/jackin.sock` so the early-bring-up window
  (between container start and the daemon binding its socket, plus
  any pre-`setup-once` time) does not leak operator-visible stderr
  from a binary that exists but cannot serve yet. `test -S` exits
  silently with status 1 if the socket is absent; `||` short-
  circuits at the first failure only — no `|| true` masking the
  second command's errors once the socket exists. `parse_jackin_sessions`
  drops the strict `len() != expected` equality in favour of
  `take(expected)` so trailing footer lines or labels that
  `Display`-emit a non-`[` continuation line no longer flip the
  parse to Unavailable; the count check is now a lower-bound
  (`< expected`), which still catches real format drift but
  tolerates harmless decoration. The header search lifts a shared
  `parse_session_count` helper used by both `inspect_agent_sessions`
  here and `isolation::finalize::has_jackin_sessions`, replacing
  the duplicate parser that was warned about in finding #3.

* `src/isolation/finalize.rs` — `parse_session_count` is now
  `runtime::attach::parse_session_count`; the local copy is gone.
  One header parser, one definition of malformed, no silent
  divergence on edge cases.

* `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection
  log now fires exactly once on the saturation transition + once on
  the recovery transition, with per-drop messages demoted to
  `cdebug!` so a flood attacker (the exact threat
  `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the
  compact-tier log. Per-backoff line also demoted to `cdebug!` —
  the accept-error clog above already names the failure, so the
  1-line-per-failure compact-log invariant holds. `start_listener_at`
  splits behind a new `start_listener_at_with_limiter` test-only
  helper that returns the inner `Arc<Semaphore>`. The cap regression
  test now reads `limiter.available_permits()` directly instead of
  racing `rx.recv()` against a 300 ms wall-clock deadline —
  cap-sensitive, not timing-sensitive. Wall-clock `timeout()`
  windows widen to 2 s for the remaining positive assertions so a
  slow CI runner does not produce spurious failures.

* `crates/jackin-capsule/src/protocol/attach.rs` — new
  `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload`
  variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1`
  real entries so the per-entry boundary is verified after the read
  loop, not just at the count declaration. The earlier test only
  exercised the front-of-loop guard; a regression that moved the
  cap check below the per-entry loop would slip past it silently.

Deferred (parallel-agent territory or out-of-scope for this pass):

* `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push
  asymmetry (finding #6) and `focus_swap_reset_*` test-name
  overpromises (finding #12) — `session.rs` is mid-rebase by the
  parallel agent.
* `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by
  alt-screen swap (finding #8) — `main.rs` mid-rebase.
* `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit`
  fixture ordering (finding #14) — `launch.rs` mid-rebase under
  the env-config migration.

Setup-once gating left untouched: `docker/runtime/entrypoint.sh`
already gates on `/jackin/state/hooks/setup-once.done` (line 78,
runs only if marker absent; line 88 writes the marker on success).
The new `test -S` socket gate on the host-side status query is the
orthogonal half of the "don't query during early bring-up" rule.

Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave added a commit that referenced this pull request May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report
that followed the parallel-agent capture commit. Splits cleanly from
the in-flight env-config refactor by touching only the host-side
session-inventory and snapshot-fanout paths plus the capsule socket
layer; parallel-agent territory (main.rs, daemon.rs, session.rs,
launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays
untouched.

Findings addressed:

* `src/console/manager/state.rs` — fan-out worker panics now surface
  through the existing `debug_log` path: `h.join()` failures are
  downcast to a string and re-routed as `Err(anyhow!)` so the slot
  is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot
  fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host
  with dozens of active containers does not spawn dozens of OS
  threads per 500 ms refresh tick; each chunk's wall-clock cost is
  still bounded by the slowest fetch in that chunk. The fan-out
  body moves into a free `fetch_snapshots_parallel` helper so
  `refresh_instances` stays under the clippy line-count gate.

* `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on
  `test -S /jackin/run/jackin.sock` so the early-bring-up window
  (between container start and the daemon binding its socket, plus
  any pre-`setup-once` time) does not leak operator-visible stderr
  from a binary that exists but cannot serve yet. `test -S` exits
  silently with status 1 if the socket is absent; `||` short-
  circuits at the first failure only — no `|| true` masking the
  second command's errors once the socket exists. `parse_jackin_sessions`
  drops the strict `len() != expected` equality in favour of
  `take(expected)` so trailing footer lines or labels that
  `Display`-emit a non-`[` continuation line no longer flip the
  parse to Unavailable; the count check is now a lower-bound
  (`< expected`), which still catches real format drift but
  tolerates harmless decoration. The header search lifts a shared
  `parse_session_count` helper used by both `inspect_agent_sessions`
  here and `isolation::finalize::has_jackin_sessions`, replacing
  the duplicate parser that was warned about in finding #3.

* `src/isolation/finalize.rs` — `parse_session_count` is now
  `runtime::attach::parse_session_count`; the local copy is gone.
  One header parser, one definition of malformed, no silent
  divergence on edge cases.

* `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection
  log now fires exactly once on the saturation transition + once on
  the recovery transition, with per-drop messages demoted to
  `cdebug!` so a flood attacker (the exact threat
  `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the
  compact-tier log. Per-backoff line also demoted to `cdebug!` —
  the accept-error clog above already names the failure, so the
  1-line-per-failure compact-log invariant holds. `start_listener_at`
  splits behind a new `start_listener_at_with_limiter` test-only
  helper that returns the inner `Arc<Semaphore>`. The cap regression
  test now reads `limiter.available_permits()` directly instead of
  racing `rx.recv()` against a 300 ms wall-clock deadline —
  cap-sensitive, not timing-sensitive. Wall-clock `timeout()`
  windows widen to 2 s for the remaining positive assertions so a
  slow CI runner does not produce spurious failures.

* `crates/jackin-capsule/src/protocol/attach.rs` — new
  `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload`
  variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1`
  real entries so the per-entry boundary is verified after the read
  loop, not just at the count declaration. The earlier test only
  exercised the front-of-loop guard; a regression that moved the
  cap check below the per-entry loop would slip past it silently.

Deferred (parallel-agent territory or out-of-scope for this pass):

* `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push
  asymmetry (finding #6) and `focus_swap_reset_*` test-name
  overpromises (finding #12) — `session.rs` is mid-rebase by the
  parallel agent.
* `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by
  alt-screen swap (finding #8) — `main.rs` mid-rebase.
* `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit`
  fixture ordering (finding #14) — `launch.rs` mid-rebase under
  the env-config migration.

Setup-once gating left untouched: `docker/runtime/entrypoint.sh`
already gates on `/jackin/state/hooks/setup-once.done` (line 78,
runs only if marker absent; line 88 writes the marker on success).
The new `test -S` socket gate on the host-side status query is the
orthogonal half of the "don't query during early bring-up" rule.

Co-authored-by: Codex <codex@openai.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave added a commit that referenced this pull request May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report
that followed the parallel-agent capture commit. Splits cleanly from
the in-flight env-config refactor by touching only the host-side
session-inventory and snapshot-fanout paths plus the capsule socket
layer; parallel-agent territory (main.rs, daemon.rs, session.rs,
launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays
untouched.

Findings addressed:

* `src/console/manager/state.rs` — fan-out worker panics now surface
  through the existing `debug_log` path: `h.join()` failures are
  downcast to a string and re-routed as `Err(anyhow!)` so the slot
  is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot
  fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host
  with dozens of active containers does not spawn dozens of OS
  threads per 500 ms refresh tick; each chunk's wall-clock cost is
  still bounded by the slowest fetch in that chunk. The fan-out
  body moves into a free `fetch_snapshots_parallel` helper so
  `refresh_instances` stays under the clippy line-count gate.

* `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on
  `test -S /jackin/run/jackin.sock` so the early-bring-up window
  (between container start and the daemon binding its socket, plus
  any pre-`setup-once` time) does not leak operator-visible stderr
  from a binary that exists but cannot serve yet. `test -S` exits
  silently with status 1 if the socket is absent; `||` short-
  circuits at the first failure only — no `|| true` masking the
  second command's errors once the socket exists. `parse_jackin_sessions`
  drops the strict `len() != expected` equality in favour of
  `take(expected)` so trailing footer lines or labels that
  `Display`-emit a non-`[` continuation line no longer flip the
  parse to Unavailable; the count check is now a lower-bound
  (`< expected`), which still catches real format drift but
  tolerates harmless decoration. The header search lifts a shared
  `parse_session_count` helper used by both `inspect_agent_sessions`
  here and `isolation::finalize::has_jackin_sessions`, replacing
  the duplicate parser that was warned about in finding #3.

* `src/isolation/finalize.rs` — `parse_session_count` is now
  `runtime::attach::parse_session_count`; the local copy is gone.
  One header parser, one definition of malformed, no silent
  divergence on edge cases.

* `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection
  log now fires exactly once on the saturation transition + once on
  the recovery transition, with per-drop messages demoted to
  `cdebug!` so a flood attacker (the exact threat
  `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the
  compact-tier log. Per-backoff line also demoted to `cdebug!` —
  the accept-error clog above already names the failure, so the
  1-line-per-failure compact-log invariant holds. `start_listener_at`
  splits behind a new `start_listener_at_with_limiter` test-only
  helper that returns the inner `Arc<Semaphore>`. The cap regression
  test now reads `limiter.available_permits()` directly instead of
  racing `rx.recv()` against a 300 ms wall-clock deadline —
  cap-sensitive, not timing-sensitive. Wall-clock `timeout()`
  windows widen to 2 s for the remaining positive assertions so a
  slow CI runner does not produce spurious failures.

* `crates/jackin-capsule/src/protocol/attach.rs` — new
  `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload`
  variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1`
  real entries so the per-entry boundary is verified after the read
  loop, not just at the count declaration. The earlier test only
  exercised the front-of-loop guard; a regression that moved the
  cap check below the per-entry loop would slip past it silently.

Deferred (parallel-agent territory or out-of-scope for this pass):

* `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push
  asymmetry (finding #6) and `focus_swap_reset_*` test-name
  overpromises (finding #12) — `session.rs` is mid-rebase by the
  parallel agent.
* `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by
  alt-screen swap (finding #8) — `main.rs` mid-rebase.
* `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit`
  fixture ordering (finding #14) — `launch.rs` mid-rebase under
  the env-config migration.

Setup-once gating left untouched: `docker/runtime/entrypoint.sh`
already gates on `/jackin/state/hooks/setup-once.done` (line 78,
runs only if marker absent; line 88 writes the marker on success).
The new `test -S` socket gate on the host-side status query is the
orthogonal half of the "don't query during early bring-up" rule.

Co-authored-by: Codex <codex@openai.com>
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave added a commit that referenced this pull request May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report
that followed the parallel-agent capture commit. Splits cleanly from
the in-flight env-config refactor by touching only the host-side
session-inventory and snapshot-fanout paths plus the capsule socket
layer; parallel-agent territory (main.rs, daemon.rs, session.rs,
launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays
untouched.

Findings addressed:

* `src/console/manager/state.rs` — fan-out worker panics now surface
  through the existing `debug_log` path: `h.join()` failures are
  downcast to a string and re-routed as `Err(anyhow!)` so the slot
  is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot
  fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host
  with dozens of active containers does not spawn dozens of OS
  threads per 500 ms refresh tick; each chunk's wall-clock cost is
  still bounded by the slowest fetch in that chunk. The fan-out
  body moves into a free `fetch_snapshots_parallel` helper so
  `refresh_instances` stays under the clippy line-count gate.

* `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on
  `test -S /jackin/run/jackin.sock` so the early-bring-up window
  (between container start and the daemon binding its socket, plus
  any pre-`setup-once` time) does not leak operator-visible stderr
  from a binary that exists but cannot serve yet. `test -S` exits
  silently with status 1 if the socket is absent; `||` short-
  circuits at the first failure only — no `|| true` masking the
  second command's errors once the socket exists. `parse_jackin_sessions`
  drops the strict `len() != expected` equality in favour of
  `take(expected)` so trailing footer lines or labels that
  `Display`-emit a non-`[` continuation line no longer flip the
  parse to Unavailable; the count check is now a lower-bound
  (`< expected`), which still catches real format drift but
  tolerates harmless decoration. The header search lifts a shared
  `parse_session_count` helper used by both `inspect_agent_sessions`
  here and `isolation::finalize::has_jackin_sessions`, replacing
  the duplicate parser that was warned about in finding #3.

* `src/isolation/finalize.rs` — `parse_session_count` is now
  `runtime::attach::parse_session_count`; the local copy is gone.
  One header parser, one definition of malformed, no silent
  divergence on edge cases.

* `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection
  log now fires exactly once on the saturation transition + once on
  the recovery transition, with per-drop messages demoted to
  `cdebug!` so a flood attacker (the exact threat
  `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the
  compact-tier log. Per-backoff line also demoted to `cdebug!` —
  the accept-error clog above already names the failure, so the
  1-line-per-failure compact-log invariant holds. `start_listener_at`
  splits behind a new `start_listener_at_with_limiter` test-only
  helper that returns the inner `Arc<Semaphore>`. The cap regression
  test now reads `limiter.available_permits()` directly instead of
  racing `rx.recv()` against a 300 ms wall-clock deadline —
  cap-sensitive, not timing-sensitive. Wall-clock `timeout()`
  windows widen to 2 s for the remaining positive assertions so a
  slow CI runner does not produce spurious failures.

* `crates/jackin-capsule/src/protocol/attach.rs` — new
  `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload`
  variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1`
  real entries so the per-entry boundary is verified after the read
  loop, not just at the count declaration. The earlier test only
  exercised the front-of-loop guard; a regression that moved the
  cap check below the per-entry loop would slip past it silently.

Deferred (parallel-agent territory or out-of-scope for this pass):

* `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push
  asymmetry (finding #6) and `focus_swap_reset_*` test-name
  overpromises (finding #12) — `session.rs` is mid-rebase by the
  parallel agent.
* `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by
  alt-screen swap (finding #8) — `main.rs` mid-rebase.
* `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit`
  fixture ordering (finding #14) — `launch.rs` mid-rebase under
  the env-config migration.

Setup-once gating left untouched: `docker/runtime/entrypoint.sh`
already gates on `/jackin/state/hooks/setup-once.done` (line 78,
runs only if marker absent; line 88 writes the marker on success).
The new `test -S` socket gate on the host-side status query is the
orthogonal half of the "don't query during early bring-up" rule.

Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Codex <codex@openai.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant