Skip to content

chore(seo): broaden quickstart messaging to spend / risky actions / audit#591

Merged
amavashev merged 3 commits into
mainfrom
chore/seo-broader-quickstart-messaging
May 8, 2026
Merged

chore(seo): broaden quickstart messaging to spend / risky actions / audit#591
amavashev merged 3 commits into
mainfrom
chore/seo-broader-quickstart-messaging

Conversation

@amavashev
Copy link
Copy Markdown
Contributor

Summary

A read-only audit of quickstart/ found 8 pages framing Cycles as a spend/budget tool, missing the other two pillars — risky tool actions and audit gaps. Same correction we applied earlier today across the Rust crate (cycles-client-rust#31, #32, #33) and the Rust blog post (#585), now applied to the public quickstart surface.

Light-touch pattern: frontmatter description rewritten to name spend + action + audit, plus one short ::: tip ::: callout block near the top of each page listing the three pillars with concrete primitives (caps for risky actions, signed events for audit). No title changes, no restructuring, no code-example edits.

Pages updated (8)

File Pattern
quickstart/getting-started-with-the-python-client.md SDK light pattern
quickstart/getting-started-with-the-typescript-client.md SDK light pattern
quickstart/getting-started-with-the-cycles-spring-boot-starter.md SDK light pattern
quickstart/getting-started-with-the-rust-client.md SDK light pattern
quickstart/getting-started-with-the-mcp-server.md Same callout, MCP tool names in audit bullet (cycles_decide, cycles_create_event)
quickstart/what-is-cycles.md Callout + one-line opener broadened to mention audit trail
quickstart/how-to-add-hard-budget-limits-to-spring-ai-with-cycles.md Callout inserted after existing observability-vs-enforcement opener
quickstart/how-to-choose-a-first-cycles-rollout-...md Callout adds context sentence on which pillar each rollout option primarily addresses

Pages intentionally NOT changed (audited as appropriate for their audience)

  • index.md — already cross-links to /protocol/, /how-to/
  • end-to-end-tutorial.md — runbook format
  • architecture-overview-* — technical reference
  • deploying-* and self-hosting-* — operations focus
  • mcp-claude-* / mcp-cursor.md / mcp-windsurf.md — setup guides; existing warning correctly clarifies that MCP availability ≠ enforcement

Why titles and URLs are preserved

Each page keeps its existing H1 and URL slug to maintain inbound search-link equity. The two spend-only strategy pages (Spring AI how-to, rollout-choice) keep their slugs since those are the canonical search targets for "spring ai budget limit" and "cycles rollout" queries respectively.

Diff shape

8 files, +59 insertions / -9 deletions. Each file: 1 description line replaced, 5-7 lines added (callout block + blank line). Reviewer can scan the pattern once and verify across all 8.

Test plan

  • npx vitest run — 83/83 pass
  • npm run build — succeeds (98s)
  • Rendered HTML check: <meta name="description"> reflects new copy on Python client page
  • Rendered HTML check: callout block (Cycles enforces three runtime-authority pillars) appears exactly once per page in .vitepress/dist/quickstart/<page>.html
  • Post-deploy: spot-check any updated page in browser to confirm callout renders above-the-fold on a typical desktop viewport

amavashev added 3 commits May 8, 2026 10:00
…udit

A read-only audit of quickstart/ found 8 pages framing Cycles as a
spend/budget tool, missing the other two pillars (risky tool actions
and audit gaps). Earlier today we made the same correction in the
cycles-client-rust crate metadata, README, and the related blog post
(runcycles/cycles-client-rust#31, #32, #33; #585).

This commit applies the same pattern to the public quickstart surface
using a light-touch approach:

  - Frontmatter `description` rewritten on each page to name spend +
    action + audit (replaces "budget enforcement" framing)
  - One short ::: tip ::: callout inserted near the top of each page,
    listing the three pillars with concrete primitives — caps for
    risky actions, signed events for audit
  - No title changes, no restructuring, no code-example edits

Pages updated (8):

  Light SDK pattern (4): same callout, identical except for SDK name
  - quickstart/getting-started-with-the-python-client.md
  - quickstart/getting-started-with-the-typescript-client.md
  - quickstart/getting-started-with-the-cycles-spring-boot-starter.md
  - quickstart/getting-started-with-the-rust-client.md

  MCP server (1): callout uses MCP tool names (cycles_decide,
  cycles_create_event) instead of generic primitives
  - quickstart/getting-started-with-the-mcp-server.md

  Explainer / strategy (3): same callout + small body tweaks
  - quickstart/what-is-cycles.md (one-line opener also broadened)
  - quickstart/how-to-add-hard-budget-limits-to-spring-ai-with-cycles.md
  - quickstart/how-to-choose-a-first-cycles-rollout-...md (callout adds
    a sentence noting which pillar each rollout option primarily
    addresses, since the page is about choosing scope)

Pages intentionally NOT changed (audited and judged appropriate as-is):
  - quickstart/index.md (already cross-links to /protocol/, /how-to/)
  - quickstart/end-to-end-tutorial.md (runbook format)
  - quickstart/architecture-overview-* (technical reference)
  - quickstart/deploying-* and self-hosting-* (operations focus)
  - quickstart/mcp-claude-* + cursor + windsurf (setup guides;
    existing warning correctly clarifies MCP availability ≠ enforcement)

Title and URL slug on each page intentionally preserved to keep
inbound search-link equity. The two spend-only strategy pages
(spring-ai how-to, rollout-choice) keep their existing slugs since
those are the canonical search targets for "spring ai budget limit"
and "cycles rollout" queries respectively.

Diff shape: each file gets a description swap (1 line replaced) and a
callout insertion (5-7 lines added). +59 insertions / -9 deletions
total across 8 files.

Verified:
  - 83/83 tests pass
  - npm run build succeeds (98s)
  - rendered HTML <meta name="description"> reflects new copy
  - rendered HTML contains the callout block exactly once per page
…iption trim

Five categorical fixes across the 8 quickstart pages from the previous
commit:

  1. Frontmatter descriptions trimmed to 130-144 chars (target ~140).
     Tighter snippets in search results.

  2. Decision values use the protocol's actual UPPER casing in all
     callouts: ALLOW / ALLOW_WITH_CAPS / DENY (was Allow / AllowWithCaps
     / Deny). Aligns with cycles-protocol-v0.yaml and the wire format.

  3. Audit bullet de-overpromised: "every reservation, commit, release,
     and decision is a signed event" → "reservations, commits, releases,
     and decisions produce structured records for compliance and
     incident review". Signing is configurable per deployment;
     "structured records" is what the protocol actually guarantees.
     Same fix applied to the body lead in what-is-cycles.md.

  4. Rollout page (how-to-choose-a-first-cycles-rollout-...md): model-
     call guardrails reframed as "per-call LLM spend enforcement"
     rather than per-call action authority. That's what guardrails
     primarily address; action authority is the run-budget / caps
     surface. Description updated to match.

  5. Rust SDK code examples in the body preserved with PascalCase enum
     names (Decision::Allow, etc.) — those are the language-idiomatic
     identifiers; only the protocol-side decision values in the callout
     change to UPPER.

Plus minor accuracy improvements:
  - Added "tool allowlists/" alongside denylists in the caps bullet
    (protocol supports both)
  - MCP audit bullet adds "for export" to point at events service /
    webhook delivery as the canonical export path
  - what-is-cycles.md body lead rewritten: "produces a signed audit
    trail" → "records the evidence operators need to audit decisions
    later"

Verified: 83/83 tests pass; production build succeeds (95s).
Tighten quickstart SEO descriptions and align runtime authority framing
with protocol terminology. Clarify that Cycles applies to instrumented
paths, includes RISK_POINTS action authority, and creates structured
audit records without overclaiming signed audit semantics.
@amavashev amavashev enabled auto-merge May 8, 2026 14:33
@amavashev amavashev merged commit 1a5ee59 into main May 8, 2026
5 checks passed
@amavashev amavashev deleted the chore/seo-broader-quickstart-messaging branch May 8, 2026 14:34
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