Skip to content

docs: write for the reader and settle conflicting facts - #1069

Merged
ysyneu merged 13 commits into
mainfrom
docs/reader-first
Oct 17, 2026
Merged

ysyneu merged 13 commits into
mainfrom
docs/reader-first

Conversation

@ysyneu

@ysyneu ysyneu commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Rewrites the docs to the reader's level: what a customer sees, sets, and decides, not how Flashduty works inside. Also fixes facts that contradicted each other across pages.

Rules (new section in AGENTS.md → Writing and page design → Reader first)

  • Delete test: if a paragraph were gone, would the reader act or expect anything differently? If not, delete it.
  • Refactor test: if the internals changed but the console and API stayed the same, would this paragraph become wrong? If so, replace it with the observable behavior.
  • What to keep: limits, defaults, timings the reader observes, error messages, permissions, and fields the reader types or parses.
  • What to drop: internal services, code identifiers where the console has a label, roadmap, and internal values in samples.
  • Page types: the expected opening and order for each type (setup guide, feature page, reference, FAQ).

Sources: Diátaxis, GOV.UK content design, Nielsen Norman Group, Wikipedia lead-section guidance, Every Page is Page One, plus the Krug and Williams rules already in this file.

Changes by area

Area Files (zh+en) Main changes
Repo tooling 11 Reader-first rules. One glossary.md (three copies had diverged). .claude/skills is a symlink to .agents/skills. standards.md removed
Integrations 353 Alert sources: one severity-mapping heading and lead sentences; Zabbix has one walkthrough with tabs. Webhook payload tables live on one page. Sample payloads use example values. SSO steps are written out in text
On-call 94 Event codes replaced with console labels. Offline features and roadmap removed. Duplicated tables now live on one owner page. Template variables match the engine
AI SRE 36 Agent tool names and return codes replaced with visible behavior. Billing and scope rules on one page each
Monitors 48 One name for the alert engine. Rule types match the form. Recovery tables live in the quickstart
RUM 111 SDK facts settled from SDK source. Samples use the real loader and package names
Platform, developer, OpenAPI 26 Role and custom-menu contradictions fixed, APP Key path unified, catalog counts corrected

Facts settled from product code

  • Custom snooze: up to 30 days. Presets stay within 24 hours.
  • MTTA: measured from trigger to acknowledgment. One page had the direction reversed.
  • 跟随告警关闭 (close with alerts): hidden until enabled for the account, and on by default once shown.
  • Template variables: PersonID/PersonName/Email. LabelsMD5, TitleEnglish and IntegrationType do not exist.
  • Status page subscriptions: email and RSS/Atom.
  • AI SRE cloud sandbox: reaches public addresses but not private networks. 全部允许 (Allow all) is the only option.
  • Monitors detection modes: threshold, no data, and data exists. The 同比/环比/复合 types do not exist.
  • RUM SDK facts:
    • Intake host: browser.flashcat.cloud.
    • Web privacy option: defaultPrivacyLevel, default mask.
    • Upload cadence: Web 30 s, Android and HarmonyOS 2 s.
    • CocoaPods is supported.
    • Carrier name: Android and HarmonyOS don't collect it; iOS does.
  • Preset roles: they see every custom menu, and only custom roles are bound. APP Key is under 个人中心 (Personal center) → APP Key.
  • API catalog: 372 endpoints (370 with reference pages, plus gallery pin and unpin), 55 of them AI SRE.
  • Standard plan support: 7×8, on the pricing page and the PagerDuty comparison.

Checks

  • mint broken-links: no broken links.
  • mint validate: passed.
  • scripts/api_path_redirects.py --check: passed.
  • scripts/lint_openapi.py: passed.
  • integration-docs: build.mjs and check.mjs pass with 348 keys.
  • Console help bundle vs main: no page grew by more than 118 characters, so hidden blocks still stay out of the console.
  • No file renamed or moved, and docs.json is unchanged.

Includes #1068

#1068 (API reference update) is merged into this branch. Merging this PR lands both.

Please confirm

  • RUM compliance guide: the carrier-name wording is now platform-specific, and the privacy-policy disclosure template now names the iOS carrier name.
  • Comparison pages: competitor prices and quotas could not be checked against public sources.
  • Not checked against source: the OceanBase severity mapping, the browser minimum versions, and the WeCom 60-day license wording.

ysyneu added 13 commits October 17, 2026 02:28
- Quick start: document the Fd-App-Key header, response language
  (locale / lang / Accept-Language), that data is {} or omitted when an
  operation has no payload, and the timestamp/enum/update conventions.
  Move limits and errors to one page instead of repeating them.
- Rate limits and errors: state the default per-account limits (read
  50/s and 1,000/min, write 20/s and 300/min), the
  Flashcat-Request-Rate-Limit-Delay header on 429, and a corrected error
  code table (MethodNotAllowed is 405, ResourceNotFound means the object
  does not exist, NoLicense covers plan, quota and credits).
- Pagination: limits and defaults vary per operation; list every
  operation that accepts search_after_ctx; explain that on incident and
  alert lists has_next_page stops at 1,000 items in page-number mode and
  how to continue with the cursor.
- Point the Go SDK pages at the new error code anchor.
Review all 370 public operations against the backend implementation and
fix what a caller needs to use each endpoint from its page alone:

- Restrictions: rate limits now match the gateway (most write operations
  are 300/min and 20/s, not the read tier), permissions list every
  permission that grants the call, and audit and plan requirements are
  stated where they apply.
- Enums: declare the full value set for status, type, mode and similar
  fields and explain each value; open sets say so.
- Request and response schemas: add missing fields, remove fields the
  server no longer accepts or returns, correct required lists, mark
  fields that can be null, and state units (seconds, milliseconds,
  nanoseconds) and defaults.
- Usage notes: correct behavior that was described wrongly (whole-object
  replacement on several upserts, soft vs permanent deletes, inhibit rule
  semantics, pagination limits) and move long descriptions out of the
  page subtitle.
- Examples: every request and 200 response example validates against its
  schema; operations without a payload show no data field.
- Shared components: data is optional in the success envelope, 403 is
  documented on every operation, 429 documents the
  Flashcat-Request-Rate-Limit-Delay header, the error code table matches
  the server, and the APP Key scheme mentions the Fd-App-Key header.
- API catalog: add the five missing monitor folder operations (370 total).
- Rebuild the consolidated openapi.{en,zh}.json from the module specs.
Add five rules: integer enums must explain every value, required may only
name declared properties, every operation documents 403, request and 200
response examples must match their schema, and operation descriptions stay
within 220 characters.
AGENTS.md gains a Reader first section: a delete test and a refactor
test for every paragraph, what belongs on a page versus what to write
instead, and the opening and order for each page type. The three
diverged glossary copies are merged into glossary.md; .claude/skills
becomes a symlink to .agents/skills and the translate skill links to
the root glossary. polish-document reads AGENTS.md instead of its own
outdated standards.md.
Alert sources share one severity-mapping heading and gain lead
sentences; Zabbix keeps one walkthrough with per-version tabs. Webhook
payload tables live on the incident webhook page only, sample payloads
use example values, and change integrations describe which events merge
instead of key formulas. SSO pages state Flashduty settings in text.
Event codes become console labels, offline and roadmap content is
removed, and duplicated tables (snooze presets, similarity, label links)
now live on one page with links elsewhere. Template variables match the
template engine, default values follow the console, and marketing and
unsourced comparison claims are cut.
Tool names and return codes give way to observable behavior, the
billing notice and scope rules each live on one page, and sandbox
network access is described consistently.
Rule types match the rule form, recovery tables live in the quickstart,
and the engine page keeps the settings operators configure while
dropping internal delivery details.
Intake host, upload cadence, privacy option, SDK versions, CocoaPods
support and carrier-name collection now agree with the SDKs. Samples
use the real loader and package names, user IDs come from the app's own
account system, and roadmap notes are removed.
Preset roles and custom menus, the APP Key location, member contact
editing and API catalog counts now match the product. Permission and
custom-menu pages no longer describe storage mechanics, and the OpenAPI
introduction links to rate limits instead of copying them.
Conflicts in the OpenAPI introduction, pagination, catalog and Go SDK
pages resolve to #1068's text, which already links to rate limits and
describes pagination by behavior. The catalog total is 372: the 370
endpoints with reference pages plus gallery pin/unpin, matching the
per-module counts.
The collected-data table already says iOS reports the carrier name over
cellular; the privacy-policy template customers copy now says so too.
@ysyneu
ysyneu merged commit b0b340e into main Oct 17, 2026
1 check passed
@ysyneu
ysyneu deleted the docs/reader-first branch October 17, 2026 10:24
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