Skip to content

site: genswarms.com as the operating system for AI workforces, in six languages - #102

Merged
jmlago merged 32 commits into
mainfrom
website/agentic-os
Sep 26, 2026
Merged

jmlago merged 32 commits into
mainfrom
website/agentic-os

Conversation

@acastellana

Copy link
Copy Markdown
Contributor

Problem and outcome

genswarms.com described GenSwarms as a runtime with a feature list. This redesign positions it as the operating system for AI workforces and argues that from the parts GenSwarms really has. The page ships in English, Spanish, Korean, Simplified Chinese, Russian and Turkish.

Non-goals: no Elixir changes. The docs site (MkDocs) is unchanged.

What changes on the site

  • The story. A scroll story in 8 steps, with drawings that change at each step (pinned on desktop, stacked with static drawings on phones and portrait tablets):

    • An agent is a process.
    • Messages only follow declared paths; off-graph messages are dropped (invalid_route).
    • Objects are deterministic code on the same graph.
    • Capabilities come as signed packages from the swarmidx index.
    • A swarm is a document: a seed plus a change log. The live gate refuses bad changes, e.g. going over the 100-agent cap. A stopped swarm comes back from its database.
    • One control layer runs it all.
  • Proof sections.

    • How it works: 10 rows mapping OS concepts to mechanisms.
    • A sourced comparison with LangGraph, CrewAI and AutoGen (design/comparison-sources.md).
    • What it guarantees, and what it doesn't do yet.
  • Honesty rules. Wording comes from design/2026-09-25-copy-deck-v2.md. The design is in design/2026-09-25-landing-page-design.md §4. There is no human-escalation, approval, per-user-role, memory or exactly-once claim. The simulated drawings are labelled "illustration".

  • Build. The page is built from website/src by a dependency-free Node build: node website/build.mjs, with --check for staleness.

  • Six languages (/, /es/, /ko/, /zh/, /ru/, /tr/):

    • Each version has its own URL. There is no redirect; a dismissible suggestion bar offers the matching language instead.
    • Every version carries reciprocal hreflang, a self canonical, per-language share images and a sitemap with alternates.
    • The pages use per-script system fonts.
    • The 404 page is translated.
  • Translation process. One translator per language, then a native editor pass. Term decisions and every edit are logged in website/i18n/<lang>.ledger.md.

  • Build guard. The build refuses stale or partial translations:

    • missing ids;
    • tag or placeholder mismatches;
    • dropped protected names;
    • over-long descriptions;
    • leftover or near-English text.

    A lock file fingerprints each good build.

  • Deploy. pages.yml runs the tests and --check before the landing page is placed. If they fail, the last good version stays live. After deploy it runs --verify on every language version. site-i18n.yml runs the same checks on PRs.

Validation

  • node --test website/tests/*.mjs: 48/48 pass.
  • node website/build.mjs --check: pages, lock and share images match their sources.
  • design/check-deploy-copy.sh: ok.
  • Browser audits (Playwright + Chrome):
    • i18n-audit.cjs: 6 languages × 18 sizes, checking overflow, overlaps, text size, tap targets, split brand names, wrapped buttons, stranded words and short-screen clipping. It also covers the suggestion bar, the no-JS picker and the 404 page.
    • audit.cjs: 14 sizes × 2 font sizes.
    • story.cjs: ok.
  • A visual responsive pass across 20 sizes, from 320px to 2560px, plus landscape phones, 200% zoom and large text.
  • Reviews: per task, and a final back-translation review of all five languages, which found no strengthened claims.

Before merging

  • The owner reviews the flagship terms: Spanish «fuerza laboral de IA» and «hace funcionar la organización».
  • The Korean «AI 인력», Chinese closing line, Russian «ИИ-персонал» and Turkish kicker are worth a native read. Each ledger records its rationale.
  • Merging deploys genswarms.com.

Rollback

Revert the merge commit. The deploy workflow republishes the previous landing page.

🤖 Generated with Claude Code

acastellana and others added 30 commits September 25, 2026 12:58
Positions GenSwarms as the operating system for AI workforces, built on
the chosen cinematic-story prototype; folds in the 2026-09-25 site review
fixes and makes the page translation-ready.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… figure model

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…matic prototype)

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

Adds prune:true to system() for still figures so each still SVG contains
only the groups for its own stage (agents, boundary rects, labels, token
and log blocks not in that stage's stage-list are omitted); the pinned
live figure keeps prune:false since it morphs across all stages. Moves
the last JS-assembled copy (CAPS/ARIA caption/aria arrays, and the copy-
button's Copy/Copied/Select-and-copy strings) into the markup: story.js
now reads the active still's figcaption/svg[aria-label] and the copy
button's data-idle/data-copied/data-fallback attributes.

Brings website/index.html from ~401 KB to ~151 KB, under the 150 KB
budget. Verified stills and the live figure render identically before
and after via Playwright screenshots at 1440x900 and 390x844.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- "what tools, data and systems each agent can access" (owner edit)
- How it works rows and Security lists set to spec §4.2/§4.3
- Footer: description, skill.md and llms.txt links, © 2026 GenLayer Labs · MIT License
- Comparison cells for LangGraph, CrewAI and AutoGen checked against their
  official docs (sources in design/comparison-sources.md); Draft stamp removed
- Tests for banned claims, owner edits, v0.2.0 facts and the Draft stamp

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sync the pinned stage to the step nearest the 46% viewport line on
load, resize, and mode changes, so deep links and breakpoint crossings
never leave a stale figure. Add a real skip-to-content link (#os) with
scroll-padding-top so keyboard focus never lands under the fixed
header. Add a browser test (Playwright) covering deep-link sync,
resize continuity, focus visibility, and the no-JS/reduced-motion
baseline where every step's still figure is visible without a pinned
column.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… without IO

The browser test only exercised deep-link/resize sync in a context
where IntersectionObserver was still present and masked timing gaps
(its own callback, not our load/resize handlers, was what actually
kept the stage current). Add a scenario that deletes
IntersectionObserver via addInitScript before any page script runs,
then checks a deep link, a no-hash reload with restored scroll, and a
resize cycle. Verified this scenario fails on the pre-fix commit
(92766aa) in a throwaway worktree, isolating exactly the mechanism
Task 4 added.

Running that scenario against the real fix surfaced a genuine gap: a
deep link's native fragment-scroll is smooth-animated (html has
scroll-behavior:smooth) and can take longer than the load event to
settle, and a load-only sync never re-checks afterward. Add a
rAF-throttled 'scroll' listener calling the same sync() so the stage
keeps converging on the correct step through the whole animation (and
as a general fallback for engines without IntersectionObserver),
mirroring what IO already did for browsers that have it.

Also narrow the focus-check's nav exemption from any 'nav' to
'header nav' specifically, so the footer's nav isn't accidentally
exempted.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Figure 1 shows the workforce ahead: the seven teams of figure 8 drawn
  faint (ring + three members) around the single agent, whose spokes now
  pass between them.
- Ink hierarchy and colour discipline: declared paths solid 1.8, hand
  wiring dotted and light, boundaries dashed and light; clay only for the
  moving request, the lit escalation and failure (the resting escalation
  route and the cluster human are ink).
- Larger, legible drawings: label sizes raised (L 20/16/26/16, P 16/14.5/
  20/14.5); the figure column takes min(58vw, 880px) (60vw below 1280px,
  where labels step up and long team names wrap); phone stills bleed to
  the screen edge. All figure text is >= 13px at 1440, 1280, 1024, 390
  and 360px wide.
- Smooth morphs: a camera group recentres each stage, agents glide with an
  ease-out and stagger, departures fade at once, arrivals wait for them.
- Stronger display scale sized to the text column; every step at least a
  screen tall with 18vh of air (56px on phones); no bordered chip buttons
  (secondary actions and the nav GitHub link are underlined links; nav
  targets 44px).
- Build-time minification of inlined CSS/JS and markup indentation, and
  grouped agent-position rules: 148,345 bytes (was 152,291).
- Tests: hero workforce, no chips/eyebrows, minification; browser checks
  for figure text size, clay discipline, step collisions and text running
  under the pinned figure.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…n the gutter

- Pinned mode now needs a window at least 600px tall; shorter windows get
  the in-flow stills (width-driven, >= 13px).
- Under 800px tall (as under 1280px wide) the pinned drawing's small
  labels step up to 18.5 units and long team names wrap; the stage caption
  and padding tighten so the drawing keeps its height.
- Phone stills sit inside the 16px gutter: the portrait crops are
  narrowed to the drawing's content (x 12..388), labels raised (ts 15.5,
  log 15), the supervisor moved in, and event rows wrap against the crop.
- Browser test: label sizes at 1366x657 and 1280x600 (pinned) and
  1280x560 / 1024x560 (in flow); every painted part of a phone figure
  inside the 16px gutter; a still never runs into its own caption.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds website/tests/browser/audit.cjs sweeping 14 widths (320-1440px,
including landscape phones and short laptop heights) at both default and
24px root font size, scrolled through every screenful, checking for
horizontal overflow, oversized pinned figures, story text running under
the pinned figure, sub-12px text, console/network errors, and (on phones)
tap targets under 44px.

First run (RED) found real issues, all fixed in website/src:
- footer brand link and footer nav links (Docs, GitHub, License,
  skill.md, llms.txt) were 23-24px tall on phones; give .brand and
  .foot nav a the same 44px min tap target the header nav already uses.
- Chrome's automatic favicon.ico request 404'd (console error); add an
  inert `<link rel="icon" href="data:,">`.

The audit's own `.cine .stage-col` selector was also a bug: that element
is the CSS grid track backing the pinned figure's sticky positioning, so
it always spans the full scroll height of the story column by design
(confirmed empirically) — comparing its height to the viewport failed at
every width in pinned mode, not just short ones. Fixed to check `.stage`,
the actual sticky-pinned box, which is always exactly 100vh.

audit ok: 14 sizes × 2 font sizes. story.cjs and the 15 node --test
cases stay green; website/index.html rebuilt (148650 bytes, --check
passes).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Review fix round 1. The previous fix measured `.cine .stage`, but that
element's height is fixed at 100vh by CSS (position:sticky;height:100vh),
so it can never fail the ">viewport" comparison — a permanent no-op that
would silently pass a real regression.

Now measures what the reader actually sees: the rendered `.cine .sys.live`
figure (plus its caption, part of the same pinned block), and only while
`.stage` is actually in its pinned (stuck) state — `.stage`'s own top is
~0. Without that guard, the check false-positived at the very top/bottom
of the story column, where `.stage` is legitimately in normal (unstuck)
flow and scrolls off-screen with the rest of the page.

Proved with an injected regression (.cine .sys.live{height:150vh
!important;max-height:none!important;flex-shrink:0!important} — the
flex-shrink override was needed because the figure's flex layout
auto-shrinks an overlong child, so a naive height override alone doesn't
actually overflow): the audit fails with "pinned figure taller than
viewport" while injected, and passes (`audit ok: 14 sizes × 2 font
sizes`) once removed.

Also narrows the phone tap-target exemption from a blanket `.closest
('p,li')` (which incidentally also exempted the .rail buttons for
sitting in an <li>) to `a` elements only, inside running text/prose
lists. .rail's buttons are still correctly excluded whenever measured on
a phone-shaped viewport, but only because they're actually hidden there
(offsetParent), not via a structural carve-out — so they'd be checked
normally if ever shown at that size.

story.cjs and node --test stay green; website/index.html is unchanged
(no website/src edits this round).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Head: canonical link, content-language, OG/Twitter tags, real
  favicon links (replacing the Task 6 data: stopgap), and a
  SoftwareApplication JSON-LD block for v0.2.0.
- llms.txt rewritten to the operating-system positioning with the
  spec's 4.2 mechanism table as bullets.
- 404.html: "This page ran off the swarm." message, 44px tap target
  on the home link.
- sitemap.xml: lastmod set to the merge date.
- New website/tools/og.cjs renders og-image.png via Playwright;
  regenerated it against the rebuilt page (headline + Figure 1 fully
  visible).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Review finding: 404.html defined its own --ink-2/--ink-3/--line-2
tokens with values that don't match index.html's :root, so the page
wasn't actually on the site palette despite the report's claim.

- :root now mirrors index.html's real tokens by name and value:
  --sand #E9E0D2, --ink #33301f, --ink-2 #5f5946, --clay #A84E36.
  Dropped --paper/--ink-3/--line-2/--accent, which 404 doesn't need
  and which don't exist on the main page.
- The mark's decorative line strokes now use var(--ink) at reduced
  opacity, matching the page's own convention for faint ink strokes
  (.org-ghost, .ring, etc. in page.css) instead of an invented gray.
- The "Error 404" label moved from --clay to --ink-2: clay on sand is
  4.22:1 contrast (fails the 4.5:1 requirement for normal-size text)
  and the design spec reserves clay for moving/active/failure states,
  not static labels.
- .btn-ghost dropped its bordered-chip look (an unlisted --line-2
  border) for an underlined link, which is what the main page's own
  .btn-ghost actually does (page.css: border:0;text-decoration:
  underline) — page.css's own test forbids bordered chip buttons.
- Kept the 44px min-height tap target and all text >= 12px; verified
  both by rendering 404.html in Chrome (Playwright) and reading a
  screenshot, and by measuring computed sizes in-page (13-72px text,
  44px button height for both buttons).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…the landing build

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Fixes I1-I3 and M1/M2/M4 from .superpowers/sdd/2026-09-25-landing-page-plan/final-review.md:
- read the pinned figure number from markup (.fig-n) instead of building
  "Figure N" in story.js; guard it in the no-copy-in-script test
- label Fig. 5's animated request and Fig. 8's team shapes as illustrative,
  per spec §4.4, with a dedicated coverage test
- darken agent_blocked's clay text (--clay-d) to meet 4.5:1 contrast on sand
- tone "isolated, supervised processes" down to "separate" in metadata and
  llms.txt, and soften the SubZeroClaw "each worker runs" overclaim
- copy button now falls back to selecting the prompt text when the
  Clipboard API is unavailable, instead of doing nothing
- bump the Pages workflow to Node 22 (Node 20 is EOL)

node --test website/tests/*.mjs: 18/18 pass. node website/build.mjs --check:
up to date, 150,491 bytes. Playwright story.cjs and audit.cjs both pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
v1 invented a charged-twice ticket and a human escalation step resting on
agent_blocked, which only reports an interactive tmux coding client waiting
at a prompt. v2 tells the OS story from processes, declared paths, objects,
signed packages (gsp/swarmidx), the IR and the control surface.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Story steps, How it works (10 rows), guarantees / not yet and the close
follow design/2026-09-25-copy-deck-v2.md. Drops v1's turn block, the
determines list and the charged-twice example; figure alt text and crops
for the new stages; llms.txt gains the services, packages and state rows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Stage 2 band reads 'operating system'; stage 3 adds one agent crashing and
restarting in the grid; stages 4-7 follow one support swarm (telegram,
triage, research, answer) through declared paths with a dropped
off-graph message, objects vs agents, swarmidx packages verified, and the
swarm as a seed plus change log with a refused change; stage 8 shows
unnamed swarms. Removes the classifier-to-verifier team, the human glyph,
agent_blocked and the team names. OG image regenerated (hero line gone).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Headlines, rows and the close line from deck v2; illustration notes on
stages 4-7; real event, op and package names in the figures; no v1 story
strings in index.html or llms.txt; failure text contrast >= 4.5:1 and no
clay outside moving work in the browser story test. Word caps raised to
the approved deck's length (540 prose / 720 page).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Stage 7: the refused change is shown after the log without a seq, as a
  scale_agent_group past the 100-agent cap (OpPolicy agent_cap_exceeded runs
  before a seq is assigned; refused ops are never logged). Alt text updated.
- Budget: dotted, arrowless lines from answer and research, labelled
  'model calls' (landscape); budget sits inside the graph on phones.
- Stage 4 log adds answer -> telegram; stage-8 stubs touch each shape;
  'Swarms' label moved clear of the shapes; legend agent gets its boundary.
- --crash-d darkened to #a2412b (4.83:1 on sand); dead CSS removed.
- Word caps pinned at the applied counts (530 prose / 711 page).

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

English in website/src stays the single source. Every string the page
shows or reads out (text, title and snippets, JSON-LD, aria-labels, figure
alt text and captions, every SVG label, the copy button, the skip link,
the 404 and the suggestion bar) goes through one lookup, t(), at build
time. `build.mjs --extract` records those calls into website/i18n/en.json:
145 entries with id (hash of the English), kind, where it appears,
placeholders and, for figure labels, the width budget.

- Units are whole elements with their inline markup; mixed figure lines
  are templates ("refused: over the {cap}-agent cap", "restore: seed +
  {n} changes"); identifiers drawn in the figures stay English.
- A translation (website/i18n/<lang>.json) builds website/<lang>/ with its
  own head (lang, canonical, reciprocal hreflang + x-default, og:locale,
  og:url, og-<lang>.png, content-language, JSON-LD inLanguage/url), a
  no-JS header picker, footer language links and a suggestion bar that
  never redirects. The sitemap, the 404 and llms.txt follow.
- Russian, Korean and Chinese use system faces (the brand fonts have no
  Cyrillic, Hangul or Han) and load only JetBrains Mono plus the wordmark;
  per-script title rules; translated figure labels slide, wrap or step
  down to fit, and stills grow to show them.
- The build refuses, writing nothing, on a stale catalogue, missing ids,
  changed markup or placeholders, a dropped protected name, a snippet over
  150 (80 CJK) characters, a page over 150 KB or English left on a
  translated page. It writes i18n/build.lock.json; --check verifies the
  outputs, the lock and the share images (tools/og.cjs, og.lock.json);
  --verify checks a served site.

With no translation files yet, every output is byte-identical to before.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- tools/pseudo.mjs writes a pseudo-translation for each language in its
  own writing system (accented Latin with 20% longer Spanish prose,
  Turkish letters, Cyrillic, Hangul, Han), keeping tags, placeholders,
  URLs and protected names; never committed, built into temp dirs.
- tests/i18n.test.mjs (21 tests): extraction is deterministic and matches
  en.json; ids follow the English; the guard refuses each failure class
  (missing id, markup, placeholders, protected name, 150/80-character
  snippets, English left behind, page budget); a full pseudo build has
  the right head, hreflang, canonical, fonts, sitemap, 404 and llms.txt;
  the English page is unchanged apart from the language additions;
  labels wrap and stills grow; --check catches edited pages, translations,
  locks and share images; --verify catches a missing slash redirect and
  a wrong canonical.
- tests/browser/i18n-audit.cjs: every version x 14 sizes (overflow,
  header fit, picker, pinned figure, text size, tap targets, figure
  labels overlapping, leaving the drawing or cut by the crop at all nine
  stages, console errors, failed requests), the suggestion bar (es, ko,
  zh-CN, zh-TW, zh-HK, en, de, dismissed, explicit choice, headless and
  crawler agents), the picker with JavaScript off, and the 404's language.
  Without a URL it serves a pseudo-locale build itself.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…er deploy

- pages.yml: the deploy copy leaves out website/i18n; the build job's
  --check now also refuses stale translations and share images, so the
  last good version stays live; after deploying, `build.mjs --verify`
  checks every language version on genswarms.com (retried).
- site-i18n.yml: pull requests touching website/ run the tests, --check
  and the deploy-copy check.
- check-deploy-copy.sh: same excludes as pages.yml; every built language
  folder and its og-<lang>.png ship, and i18n/ does not.

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

- The guard now catches near-English: in Russian, Korean and Chinese any
  three English words in a row that match the source; in Spanish and
  Turkish a translation made 80% or more of the English words. Protected
  and keep-list names and identifiers are cut out first, so product names
  and the comparison cells don't trip it (tests guard against that).
- _same_as_english is limited to figure labels, accessible names and
  strings of up to three words (names don't count); a listed figure
  annotation no longer trips the page check with its hand-set lines.
- Tags must nest as in the English; html text refuses a bare < or >, and
  a bare & is escaped; titles and 404 strings are escaped.
- Sitemap lastmod is per page, kept in build.lock.json and moved only
  when that page's output changes, so --check stays deterministic.
- og.cjs honours OUT_DIR; the suggestion bar never offers Simplified
  Chinese when zh-TW/HK/MO/Hant is anywhere in the list; dead code gone;
  the header widths in page.mjs point at the CSS they mirror.
- The audit fails figure text under 11px at 320px (12px from 360px); CI
  runs the deploy-copy check before the Pages copy and on PRs touching it.
- The committed-site check test reads only committed i18n files.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Five translations built from the English catalogue (145 strings), one
translator per language grounded in the GenSwarms sources and the approved
GenLayer Labs / SubZeroClaw vocabulary, then a native editor pass per
language. Every term decision and every editor change (before, after,
reason) is in website/i18n/<lang>.ledger.md.

Flagship terms: operating system (sistema operativo, 운영체제, 操作系统,
операционная система, işletim sistemi); AI workforce (fuerza laboral de
IA, AI 인력, AI 员工, ИИ-персонал, yapay zekâ iş gücü); supervisor kept as
software, not a person (supervisor, 슈퍼바이저, 监督者, супервизор,
denetleyici).

Layout fixes from the audit:
- the comparison table hyphenates only at 1000-1279px, where five columns
  share ~580px; elsewhere words stay whole (it split "agen-te" and
  "Lang-Smith")
- Russian figure 3 band label is «ОС»: the long form rendered at
  9.7-11.6px in the phone drawing at 320-375px

Tests updated for a translated site: the committed English page is checked
by stripping the language additions, and --check runs on the real i18n dir.

Validation: 48/48 unit tests; build --check ok; deploy-copy ok;
i18n-audit ok (6 languages x 14 sizes, suggestion bar, no-JS picker, 404);
story ok; audit ok (14 sizes x 2 font sizes).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- ru: desktop h1 about 20% smaller at >=1000px so «Операционная» stays one
  word (it hyphenated twice at 1440x900)
- zh: text-wrap:pretty on the lead, close paragraph and guarantee lists, so
  they don't end on one stranded character
- es: suggestion-bar link names the language («Leer en español»)
- tr: figure 8's label for bringing a swarm back is a noun («geri yükleme»),
  like the English
- ru ledger: «ОС» is used only in figure 3's band label

Validation: 48/48 unit tests; build --check ok; i18n-audit ok (6 languages
x 14 sizes, bar, no-JS picker, 404); audit ok; story ok.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Found by screenshotting every language at 20 screen sizes and reading them:

- the skip link peeked over the top of the page when a translation wrapped
  it to two lines (Russian at 320px): it now hides at bottom:100%
- the copyable prompt split its URL mid-word on phones ("genswarms.co / m"):
  under 480px the Copy button goes under the prompt
- the comparison table at 1000-1279px squeezed five columns into ~580px and
  broke brand names ("Gen-Swarms", "Lang-Graph", "Deploymen/t"): its heading
  now sits above a full-width table there, and cells no longer hyphenate
- portrait tablets (1024x1366) got the pinned story with a small drawing in
  a sea of space: the pinned mode now also needs a landscape screen, so they
  get the full-width stills
- phones on their side and 200%-zoomed laptops (844x390, 720x450) had the
  hero's buttons below the fold: a smaller hero on short landscape screens
- 2560px: the pinned drawing sat at the far edge, capped at 720px: the story
  keeps its 1920 proportions, centred, and the drawing grows
- short screens (1440x640): step 9's text in Spanish was taller than the
  screen: pinned headlines and the triad also scale with the height (no
  change from 900px tall)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
acastellana and others added 2 commits September 26, 2026 07:57
- running text (story paragraphs, spec, table cells, lists, the close, the
  footer) uses text-wrap:pretty: no paragraph ends on a lone word or a single
  CJK character ("Версия / 0.2.0.", "恢复办 / 法。")
- Chinese: the two-line lead is balanced instead of ending on "能体。"
- Turkish: the desktop hero tops out at 96px; at 104px (1920px and up)
  "işletim sistemi." was wider than its column and the full stop wrapped onto
  a line of its own
- Russian and Turkish: the comparison's heading, heads and row questions no
  longer hyphenate ("Lang-Graph" at 200% zoom, "Где работа-ют агенты"); from
  1280px the row questions' column is a little wider instead
- 404: balanced headline and pretty text ("роя." and "集群。" stood alone)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ader sees

The responsive pass found problems the audit could not see. It now fails on:
- a brand or product name split across two lines (GenSwarms, LangGraph,
  CrewAI, AutoGen, Telegram, GitHub, swarmidx, ...), hyphenated or broken
- a button whose label wraps
- a headline or lead whose last line is a stranded scrap: one word of up to
  three letters, or one or two CJK characters (a lone full stop included)
- pinned mode: a step's text taller than the screen, the rail below the
  screen, the caption over the rail

and it runs at 18 sizes: 1024x1366 (portrait tablet), 1280x720, 1920x1080
and 2560x1440 are new. Each check was confirmed to fire on the defect it
guards against (the Turkish full stop at 104px, "LangGraph" hyphenated at
200% zoom, a squeezed button).

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

coderabbitai Bot commented Sep 26, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 08369620-7700-49df-b8ac-237e1a71cdc9


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-26T08:26:38.467282Z c182a7c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c182a7cd2b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread website/src/content.mjs
</div>`,
t => step(2, t, 'Your agents need more than models and prompts.', [['', 'One agent is easy. Many agents working together need somewhere to run, rules for who talks to whom, and a way back when one fails.']]),
t => step(3, t, 'Think of it as an operating system.', [['', 'An operating system runs programs it didn’t write. GenSwarms does that for agents: it starts them, isolates them, routes their messages and restarts them when they fail.']]),
t => step(4, t, 'Every agent is a process.', [['', 'Each one runs in its own sandbox, under its own supervisor. If one crashes, it restarts and the others keep working. You set its role, its model and where it runs separately.']]),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Qualify the per-agent sandbox promise

When an agent uses the advertised :local backend—or a tmux client with runner: :host—it does not run in its own sandbox. docs/backends.md explicitly describes local agents as plain subprocesses with full access as the host user, so this security-sensitive claim should be limited to container- or bwrap-backed agents.

AGENTS.md reference: AGENTS.md:L13-L14

Useful? React with 👍 / 👎.

Comment thread website/src/content.mjs
t => step(5, t, 'Agents talk only along declared paths.', [['', 'You draw the graph. Every message is checked against it, and anything off the graph is dropped.'], ['ex', 'From here the drawings follow one swarm: a support team that answers customers on Telegram.']]),
t => step(6, t, 'Not everything needs a model.', [['', 'Objects are plain code on the same graph: a Telegram gateway, a scheduler, a budget for model spend. They do the same thing every time.']]),
t => step(7, t, 'Install what your agents need.', [['', 'Telegram, WhatsApp and email connectors, a browser, a scheduler: signed packages from the swarmidx index, verified before they load.']]),
t => step(8, t, 'A swarm is a document.', [['', 'Its definition is data, and every change is logged. A bad change is refused before it runs; a stopped swarm comes back from its database.']]),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Do not promise that every mutation is logged

For programmatic users calling SwarmManager mutation functions without persist: true, the documented default is false, so the change exists only in memory and disappears on restart. Saying every change is logged immediately before promising database restoration therefore misstates supported behavior; qualify this as persisted/API/CLI changes or change the persistence default.

AGENTS.md reference: AGENTS.md:L13-L14

Useful? React with 👍 / 👎.

Comment thread website/src/content.mjs

export const SEC = {
yes: ['a crash restarts one agent, not the swarm', 'messages follow declared paths only', 'bad configurations and changes are refused before they run', 'packages are verified against a signed log'],
not: ['one operator token, no per-user roles', 'at-least-once delivery, not exactly once', 'spend budgets come as a package, not in the core', 'updating a package restarts the agent; no live swap yet', '100 agents per swarm by default (configurable)'],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Scope the 100-agent limit to dynamic mutations

When an operator starts a swarm from an authored config containing more than 100 agents, that config is allowed: docs/intermediate-representation.md states that the default cap applies only to dynamic mutations, not operator-authored configs. Presenting this as a general per-swarm limit understates supported capacity and should instead identify it as the default dynamic-add/scale cap.

AGENTS.md reference: AGENTS.md:L13-L14

Useful? React with 👍 / 👎.

@jmlago
jmlago merged commit 6b74e10 into main Sep 26, 2026
3 checks passed
@acastellana
acastellana deleted the website/agentic-os branch September 26, 2026 20:02
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.

2 participants