Skip to content

Commit 5cd49eb

Browse files
Preserve conditions and exceptions across the docs rewrite
1 parent c5dcff2 commit 5cd49eb

44 files changed

Lines changed: 178 additions & 93 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎AGENTS.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ Assume every commit and every line of history will be public.
1212
- Be concise; lead with importance. See [STYLE_GUIDE.md](STYLE_GUIDE.md) for
1313
the full rationale, worked examples, and the complete list of banned words,
1414
wordiness swaps, and vocabulary rules Vale enforces.
15+
- Preserve prerequisites, scope, and exceptions when rewriting. Check leads
16+
against the procedure and public reference, then reconcile sibling guides,
17+
glossary entries, and built-output tests. Shorter wording is not evidence
18+
of factual accuracy.
1519
- Do not add navigation to a section until that section has a real page or
1620
generated source.
1721
- Authored navigation comes from `content/**` and its `meta.ts` files.

‎DOCS_TEST_SUITE.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ CI runs `test:docs` after the production build. It uses Node's test runner and e
1616
- Authored pages open with a subject or action instead of the repeated “After this page…” promise.
1717
- The homepage and Quickstart offer dashboard Drop before CLI installation, and the linked Publishing page describes the Drop flow.
1818
- The homepage links to a glossary that defines its recurring product terms.
19-
- Database explains how to enable Zero before it teaches queries.
19+
- Database links the full Zero runtime declaration and names its required server file before teaching queries.
2020
- Troubleshooting gives readers a first diagnostic step before listing error codes.
2121
- The opening paragraphs on Versions, Crons, Environment variables, Access, Caching, and Traffic stats answer specific reader questions. Each test names the question and the evidence expected near the top of the built page.
2222

23-
These are regression contracts for the changed entry paths and first-screen explanations. They make a future edit fail if it hides those answers again. They do not grade tone, prove that shorter text is clearer, or measure whether a person can complete a real task. Those claims need editorial review and reader testing.
23+
These are regression contracts for the changed entry paths and first-screen explanations. They make a future edit fail if it hides those answers again. They do not prove product behavior, grade tone, prove that shorter text is clearer, or measure whether a person can complete a real task. Check each expected answer against the public contract and the page's exceptions before encoding it in a test.
24+
25+
The October 6 review corrected assertions that reinforced overbroad access and traffic claims. The checks now distinguish views from requests and unique visitors, retained ready versions from other versions, and removal of one public grant from removal of all access. Cache refresh is a request, not an unconditional freshness guarantee.
2426

2527
## Other gates
2628

‎DOCS_WRITING_QA.md‎

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Authored-docs writing audit
22

3-
The reviewer click-path and command comparisons in [DOCS_QA_COMPARISON.md](DOCS_QA_COMPARISON.md) measure answer findability and factual accuracy. Neither measures whether the authored prose is better for readers. This point-in-time audit checks the writing changes against `main` as of October 5, 2026. Repeatable checks for the current docs are in [DOCS_TEST_SUITE.md](DOCS_TEST_SUITE.md).
3+
The October 5 audit below measured structure and wording, but missed factual overstatements. Its candidate examples are historical, not verified guidance. The [October 6 semantic review](#semantic-review-october-6-2026) records the corrections and their evidence. Repeatable checks for the current docs are in [DOCS_TEST_SUITE.md](DOCS_TEST_SUITE.md).
44

55
## Method
66

@@ -29,7 +29,7 @@ The edited leads now put several useful answers before the reader has to scan th
2929
| Caching | How do I force a fresh response? | Promises to explain cache behavior | Says republishing forces one |
3030
| Traffic stats | Are crawlers included? | Promises to explain counts | Says crawler traffic is excluded |
3131

32-
These rows are illustrative checks of what the opening now tells a reader, not an independent six-question success rate. The underlying facts and the full procedures remain on the pages.
32+
These rows record what the candidate openings claimed at the time, not an independent six-question success rate. Review later found that several claims dropped necessary qualifications, including the caching and traffic examples.
3333

3434
For example, Versions opened with “After this page you know what a version holds, how it reaches `ready`, how the `live` pointer moves, and how to roll back to any earlier version in seconds.” It now opens with “A rollback doesn't rebuild anything — it just repoints `live` at a version that already exists, which is why it takes seconds, not minutes.” The new sentence answers the likely rollback question; the page still explains version states below it.
3535

@@ -38,3 +38,46 @@ For example, Versions opened with “After this page you know what a version hol
3838
The manual review caught five candidate leads that were shorter but spent the first sentence on a less useful detail: slug validation on Spaces, polling mechanics on Logs, archive flags on Frameworks and builds, CLI naming on Publish from Git, and remote WP-CLI output on WordPress. Each now leads with the page's main task or mental model. The removed detail was checked elsewhere on the same page and retained or moved into the body.
3939

4040
This audit establishes changes in structure and in which facts appear first. It does not show that real readers complete tasks faster or understand the docs better. Shorter openings could also lose useful context for some readers. That requires reader testing. Vale now passes after two existing technical plurals (`GETs` and `TTYs`) were written as plain explanations; its rules do not detect repeated sentence structures or judge whether a page leads with the right fact.
41+
42+
## Semantic review, October 6, 2026
43+
44+
Reviewed every changed MDX hunk in the PR: 78 existing pages plus the new glossary. Compared each rewrite with its original wording, then checked broader claims against the relevant procedures, exceptions, sibling guides, and producer-owned public reference snapshot. This was a documentation consistency audit, not a live product test or a reread of every unchanged paragraph.
45+
46+
The first review fixed eight findings covering stats, caching, routing, anonymous key recovery, Zero pricing, hosted MCP authentication, team plan limits, and Zero setup. The follow-up applied the same reasoning across the full rewrite and corrected related claims at other entry points.
47+
48+
| Claim family | Correction | Evidence checked |
49+
| --- | --- | --- |
50+
| Retry safety | Name the key, matching request scope, 24-hour replay window, and unstored outcomes that execute again | `content/api/idempotency.mdx`, Send a key / What is not stored |
51+
| Pagination | Limit the common cursor model to endpoints that use it; retain endpoint defaults, ordering, offset paging, and unpaginated lists | `generated/openapi/api.json`: `searchDocs`, `listSpaceStorageObjects`, `listSpaceDomains` |
52+
| Publish and rollback | Preserve no-op publishes, ready/retained targets, manual promotion, and preview behavior | Public reference: `createSpaceVersion`, `promoteSpaceVersion`; `content/(concepts)/versions.mdx`; `content/(publish)/ci.mdx` |
53+
| URL lifetime | Separate a stable version URL from retained files; distinguish domain attachment from slug rename | `content/(concepts)/spaces.mdx`, Renaming; `content/cli/versions.mdx`, sf versions rm |
54+
| Access | Revoking one matching grant does not revoke other grants or the team's permissions | `content/(serve)/access.mdx`, scoped grants; `content/(concepts)/teams.mdx`, role and default-access tables |
55+
| Runtime setup | Scope auto-detection to Functions layouts; preserve the Zero declaration and the Functions database alternative | `content/(dynamic)/functions.mdx`, Where the code lives / Declare it; `content/cli/db.mdx` |
56+
| Variables and logs | A queued re-finalize can apply variables; logs have retention, ingestion delay, and static-runtime limits | `content/(dynamic)/environment-variables.mdx`; `content/(dynamic)/logs.mdx`; `listSpaceRuntimeLogs` |
57+
| Archives and Git | Preserve prebuilt archives, branch auto-deploy controls, and the GitHub App prerequisite | `generated/cli/index.md`, sf publish `--prebuilt`; `content/(publish)/git.mdx`; `content/cli/git.mdx` |
58+
| CLI helpers | Linking selects a Space rather than removing all publish options; apply and continuation helpers mutate state; continuation needs claim approval | `content/cli/project.mdx`; `content/cli/agent-commands.mdx`; `content/(publish)/anonymous-and-claim.mdx` |
59+
| WP-CLI and storage | Remote WP-CLI returns no printed output, even for read commands; object IDs do not replace read keys | `content/(dynamic)/wordpress.mdx`, Local versus remote; `content/(dynamic)/storage.mdx`, returned URL |
60+
| Agent reach | Keep supported-client detection, skill installation, permission ceilings, human-only actions, and team-automation revocation exceptions | `content/cli/agents.mdx`; `content/agents/skills.mdx`; `content/agents/permissions.mdx` |
61+
| Ownership and billing | Distinguish self-serve teams from partner customer ownership; billing reads differ from plan changes; key rotation depends on switching consumers first | `createSpace` public reference; `content/platforms/partner-api/customers.mdx`; `content/(account)/billing.mdx`; `content/(account)/api-keys.mdx` |
62+
| Cache and schedule application | Repeat public-cache exceptions in troubleshooting; crons follow the live version | `content/(serve)/caching.mdx`; `listSpaceCrons` public reference |
63+
| Sentence splitting | Limit missing generated CSS to the dynamic class instead of declaring the whole app unstyled | `content/(dynamic)/zero-runtime.mdx`, Styling |
64+
65+
Coverage by original PR section:
66+
67+
| Section | Pages compared |
68+
| --- | --- |
69+
| Account | 3: api-keys, authentication, billing |
70+
| Concepts | 3: spaces, teams, versions |
71+
| Dynamic | 8: crons, database, environment-variables, functions, logs, storage, wordpress, zero-runtime |
72+
| Publishing | 8: anonymous-and-claim, ci, frameworks, git, publish, recipes/html, recipes/next, wordpress-data-sources |
73+
| Reference | 3: config-file, glossary, limits |
74+
| Serving | 8: access, caching, customization, domains, routing, site-pages, stats, urls |
75+
| Agents | 9: claude-code, claude-desktop, codex, cursor, mcp-server, other-clients, permissions, sf-setup, skills |
76+
| API | 9: authentication, errors, idempotency, index, operations, pagination, rate-limits, sdk, webhooks |
77+
| CLI | 20: agent-commands, agents, api-keys, api, builds, db, domains, env, git, index, login, project, publish, share, source, spaces, storage, teams, versions, zero |
78+
| Entry pages | 3: index, quickstart, troubleshooting |
79+
| Platforms | 5: partner-api/configuration, customers, go-live, index, tokens |
80+
81+
The style guide and contributor instructions now require this meaning check. Existing built-output assertions were updated where they reinforced a misleading claim. No new regex suite is presented as independent proof of product behavior. Generated references remain producer-owned and unchanged. The previously recorded support-contact and API-key preset gaps remain outside these corrections.
82+
83+
Verification with Bun 1.3.11 and Node 24 passed: frozen dependency install, generated-reference and command-example checks, type check, strict link validation, production build, all 26 docs tests, composed-site audit, public-safety check, Vale, route verification, and `git diff --check`.

‎STYLE_GUIDE.md‎

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,38 @@ In practice:
4949
definition of "wordy." A 22-word sentence that chains four clauses is
5050
still a problem this rule won't catch; use judgment, not just the word
5151
count.
52-
- **Cut filler and hedging.** If a sentence works with a phrase removed,
53-
remove it.
52+
- **Cut filler, preserve conditions.** Remove a phrase only if the shorter
53+
sentence remains true for the same readers and situations. A plan limit,
54+
required flag, credential type, runtime, or exception is not filler.
55+
56+
## Preserve meaning when shortening
57+
58+
Read a rewritten lead beside the full procedure and its exceptions. Check
59+
the original wording and the public reference before treating the shorter
60+
sentence as equivalent. A fact moved out of a subsection must keep that
61+
subsection's scope: a hosted MCP guarantee does not describe local stdio.
62+
63+
- Keep prerequisites next to the action: a ready version for rollback,
64+
an idempotency key for replay, or the plan required to add members.
65+
- Keep distinct states distinct: available versus free, ready versus live,
66+
a permanent URL versus retained files, and configuration saved versus applied.
67+
- Check words such as "every," "always," "never," "only," and "any" against
68+
counterexamples. Name the supported case instead of broadening a claim.
69+
- After splitting a sentence, make sure its condition still governs every
70+
sentence that depends on it. Repeat the condition when necessary.
71+
- Check sibling guides, CLI pages, descriptions, glossary entries, and tests
72+
for the same claim. A correction is incomplete if another entry point
73+
teaches the old rule.
74+
75+
For example, "Every list uses cursors" drops offset-based and unpaginated
76+
endpoints. "Cursor-paginated endpoints return `pagination.nextCursor`; check
77+
the endpoint's limits and ordering" preserves the useful rule and its scope.
78+
79+
Tests of built docs can check that a prerequisite or exception stays visible.
80+
They do not prove product behavior. A regex matching confident wording is
81+
not evidence that the wording is true, and shorter copy is not a pass criterion.
82+
83+
## Concision examples
5484

5585
Worked example, from the page-opener cleanup:
5686

@@ -70,9 +100,12 @@ Another:
70100
> recognize every other credential Spacefast hands you by its prefix." (33
71101
> words, 4 clauses)
72102
>
73-
> After: "You can mint a scoped API key with exactly the permissions it
74-
> needs, then rotate it without downtime." (18 words — the credential-prefix
75-
> table further down the page already covers the dropped clause.)
103+
> After: "Team owners and admins can mint scoped API keys. To rotate without
104+
> interrupting an integration, create a replacement, switch the integration
105+
> to it, verify a request, and only then revoke the old key."
106+
107+
This version keeps the role prerequisite and the order that makes rotation
108+
safe. The credential-prefix table can stay below; the rotation condition cannot.
76109

77110
(These two "after" versions also show the fix from the next section — no
78111
"after this page" framing. The intermediate step, where the sentence was
@@ -96,8 +129,8 @@ Open with the fact itself, not a sentence announcing that a fact is coming:
96129
> Templated: "After this page you can mint a scoped API key and rotate it
97130
> without downtime."
98131
>
99-
> Direct: "You can mint a scoped API key with exactly the permissions it
100-
> needs, then rotate it without downtime."
132+
> Direct: "To rotate a key without interrupting an integration, switch to
133+
> its replacement and verify a request before revoking the old key."
101134
102135
> Templated: "After this page you know whether to publish your own build
103136
> output or let Spacefast build it."

‎content/(account)/api-keys.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ sidebar:
55
order: 2
66
---
77

8-
You can mint a scoped API key with exactly the permissions it needs, then rotate it without taking anything down.
8+
Team owners and admins can mint scoped API keys. To rotate without interrupting an integration, create a replacement, switch the integration to it, verify a request, and only then revoke the old key.
99

1010
## Create an API key
1111

‎content/(account)/billing.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,6 @@ Reading is never blocked in either state. Settle the payment from the billing po
8686

8787
## Billing is dashboard-only
8888

89-
Plans, checkout, and cancellation live in the dashboard. There is no `sf` command and no API endpoint for changing a plan. API keys and agent credentials cannot reach billing at all.
89+
Plans, checkout, and cancellation live in the dashboard. There is no `sf` command and no API endpoint for changing a plan. API keys and agent credentials cannot make those changes.
9090

9191
Reading is a different story. An agent can pull the resolved plan and limits from `GET /v1/teams/{teamId}/entitlements`, current counters from `GET /v1/teams/{teamId}/usage`, and the limits as they are enforced at publish time from `GET /v1/teams/{teamId}/plan-policy`. See [Usage](/usage) for what those numbers mean.

‎content/(concepts)/spaces.mdx‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ A Space is one site with a stable hostname. Publishing creates versions inside i
99

1010
## What a Space is
1111

12-
A Space is one site. It owns a slug, a hostname, an owner, and one pointer that says which version visitors get. Everything you publish lands in a Space as a new immutable version, and the Space decides which of them is live.
12+
A Space is one site. It owns a slug, a hostname, an owner, and one pointer that says which version visitors get. A publish can create a new immutable version or report no changes, and the Space decides which version is live.
1313

1414
Ids are `spc_` plus 32 hex characters:
1515

@@ -54,14 +54,15 @@ Check before you commit with [`getSlugAvailability`](/api/reference/spaces/getsl
5454

5555
## The default hostname
5656

57-
Every Space answers at `https://<slug>.view.fast/` from the moment it exists, and keeps that hostname for life. Adding a custom domain never retires it. Version and branch hostnames, the live URL rule, and what a rename does to each are on [URLs and hostnames](/urls).
57+
A Space gets a default `view.fast` hostname. Adding a custom domain leaves it in place; renaming the slug moves the default hostname and redirects the old one. Version and branch hostnames, the live URL rule, and what a rename does to each are on [URLs and hostnames](/urls).
5858

5959
## Who owns a Space
6060

61-
Exactly one owner, one of two kinds:
61+
The owner depends on how the Space was created:
6262

6363
- **A team.** The normal case. Team members reach the Space by their role. Slugs are unique per team rather than globally, so two teams can both own `docs`.
6464
- **A space key.** A Space published without an account is owned by its `sfc_` key until someone claims it. See [Publish without an account](/anonymous-and-claim).
65+
- **An external principal.** A customer in a [Partner API integration](/platforms/partner-api/customers) can own Spaces without a self-serve team.
6566

6667
To move a Space to another team, run `sf spaces transfer <team> --space docs`, or open **Space settings → General → Transfer this space → Transfer space…**. If you are an owner or admin of both teams, the move is instant. The Space keeps serving at its current address. Otherwise the target team has 7 days to accept, and nothing changes until they do. Roles and membership are on [Teams](/teams).
6768

‎content/(concepts)/teams.mdx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ sidebar:
55
order: 3
66
---
77

8-
A team owns everything — Spaces, domains, API keys, billing, members — and the role you hold there caps what you can do with any of it.
8+
A team owns its Spaces, domains, API keys, and billing. Your role in that team caps what you can do with them.
99

1010
## Why work in a team
1111

@@ -17,7 +17,7 @@ Free and Go allow only the owner. Adding another member needs [Plus](/billing#se
1717

1818
## What a team is
1919

20-
A team is the thing that owns work. Spaces, custom domains, API keys, billing, and members all hang off it. Every claimed Space belongs to exactly one team, even when you are its only member. There is no separate personal container to reason about.
20+
A team is the thing that owns work in a self-serve account. Spaces, custom domains, API keys, billing, and members all hang off it. A Space you claim belongs to the team you select, even when you are its only member. [Partner API customers](/platforms/partner-api/customers) use external principals instead.
2121

2222
A team has a name and a slug. The slug is the first segment of its dashboard URLs. You can change it in **Team settings → General**, where a live check tells you whether the new one is free.
2323

0 commit comments

Comments
 (0)