Skip to content

docs: progressive-disclosure docs (generated reference, per-feature folders, slim README/CHANGELOG/CLAUDE.md) - #29

Merged
hanrw merged 14 commits into
mainfrom
docs/progressive-disclosure
Sep 23, 2026
Merged

hanrw merged 14 commits into
mainfrom
docs/progressive-disclosure

Conversation

@hanrw

@hanrw hanrw commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Why

Docs grew with every feature: the doc rules made each feature copy the same facts into the README list, the README command examples, a 9-section feature doc and a long changelog bullet. Nothing removed content and nothing checked it.

This PR restructures the docs around one goal: reduce accidental complexity so docs are easy to change. Docs now load in tiers, like Agent Skills: a small top level that links down, never copies. The full design is in docs/documentation-design/README.md.

What changed

Before After
README.md 744 lines 97
CHANGELOG.md 1,065 lines 80 (older minors in docs/changelog/, moved unchanged)
CLAUDE.md 286 lines 71
Feature READMEs (46) 17,661 lines 3,854
Broken links 7 0
  • Command reference and docs index are generated. make docs writes docs/commands.md from asc --experimental-dump-help (plugins off) and docs/README.md from each feature's frontmatter description. Neither is edited by hand.
  • One folder per feature. docs/features/<x>/README.md holds the user guide (≤200 lines): Quick start, Workflows, REST, Gotchas, See also. Deep dives sit next to it. There are no flag tables (the generated reference has them) and no architecture, domain model, file map or testing sections (the source has them).
  • Design docs kept, moved aside. Contributor design docs (command center, web server, web apps, web console, screenshot editor) move unchanged to design.md next to a short README.
  • The README is a landing page. The release workflow, Swift package guide and development notes move to docs/release.md, docs/library.md and CONTRIBUTING.md.
  • CHANGELOG keeps only the current minor. scripts/changelog-rollover.py runs from promote-changelog.sh, so each new minor release moves the previous one into docs/changelog/<minor>.md. New entries are one line each, with a doc link and a PR link, and the [Unreleased] entries are condensed to that style.
  • CLAUDE.md keeps only the rules for every task. The REST exposure checklist and doc rules move into the implement-feature skill.
  • CI:
    • A new Docs job runs scripts/check-docs.py --strict: links, size budgets, descriptions, changelog bullet length and the one-minor rule.
    • The build job fails if the generated docs are stale.

Also in this PR

  • Release script fix. When a new minor was released, the rollover left the new version as the last section of CHANGELOG.md, which broke two things:

    • extract-changelog.sh read on into "Older releases" and the reference links, so those would have landed in the GitHub Release notes.
    • The empty-release fallback never fired.

    extract-changelog.sh now stops at any heading, separator or reference link, and the fallback moved into promote-changelog.sh, before the rollover. scripts/test-changelog-release.sh runs the release sequence for patch and minor releases, with and without entries, and runs in CI. It fails 8 checks against the old scripts.

  • Source-level fact check. Every feature doc was checked against Sources/, and wrong claims were fixed:

    • curl examples used ports 5173/8080 instead of 8420
    • the iris session order was wrong
    • plugin install/uninstall REST names couldn't match anything
    • examples used non-existent commands and flags
    • affordance lists in the JSON samples were incomplete
    • library.md had Swift code that didn't compile

Code issues found (not fixed here, since they need tests first)

  • Dead affordance: getVersion on review submission items and submission plans points at asc versions get, which doesn't exist.
  • REST links with no route:
    • GET /api/v1 advertises betaAppLocalizations at /api/v1/beta-app-localizations, but no route serves it.
    • IAP createAvailability resolves to POST /api/v1/iap/{id}/availability, but the controller only registers PATCH.
  • Subscription links with no route: subscription update, delete and createIntroductoryOffer links have no REST route.
  • Unwired code: SkillUpdateChecker.checkIfNeeded is never called.
  • Released changelog is wrong: the 0.18.4 entry names POST /api/v1/subscriptions/:id/prices, but the route is /prices/set-batch.

Review notes

  • Old docs had errors, fixed during the trim:
    • The builds archive default is app-store-connect.
    • A weekly-report example date wasn't a Sunday.
    • version-check-readiness said pricing needed the web UI; asc apps prices set exists now.
  • REST sections: where an old doc had none, the section was built from the controllers, or the doc says the feature is CLI-only. performance, init, asc-users, game-center and skills have no REST routes.
  • Stale design docs: web-apps/design.md (it describes a Node.js proxy) and asc-web-management/design.md (it describes an asc web command that no longer exists) were moved as they were. Both are candidates for deletion.
  • Not in this PR: the skills/ submodule. Its asc-cli/references/commands.md should link to docs/commands.md in a follow-up.

Test plan

  • python3 scripts/check-docs.py --strict shows 0 problems
  • make docs regenerates with no diff
  • CHANGELOG split loses no lines, and re-running the rollover changes nothing
  • A simulated promote-changelog.sh 0.19.0 rolls 0.18.x into docs/changelog/0.18.md
  • extract-changelog.sh still returns the notes for released versions and for [Unreleased]
  • scripts/test-changelog-release.sh passes (patch and minor, with and without entries)
  • Every asc command, flag, REST path and anchor in the docs exists in the binary, the controllers or the target file

🤖 Generated with Claude Code

hanrw and others added 9 commits September 23, 2026 18:30
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- CHANGELOG.md keeps [Unreleased] + 0.18.x; 0.17, 0.16 and 0.1 move
  unchanged to docs/changelog/<minor>.md (no lines lost)
- scripts/changelog-rollover.py runs from promote-changelog.sh so each
  new minor release rolls the previous one off automatically
- scripts/check-docs.py reports broken links, size budgets, missing
  descriptions and changelog bullet length (report-only for now)
- rename docs/desgin.md to docs/design.md; fix 7 broken links

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
docs/commands.md is generated from `asc --experimental-dump-help` with
plugins disabled; docs/README.md is generated from feature doc
frontmatter. Neither is edited by hand.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
README keeps the pitch, quick start, CAEOAS example and a feature table
that links to each feature doc (744 -> 97 lines). The hand-written
command reference is replaced by docs/commands.md; the release
workflow, Swift package guide and development notes move to
docs/release.md, docs/library.md and CONTRIBUTING.md.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Moves every feature doc into its own folder, shaped like a Skill, so a
feature always has one path and deep dives are added next to README.md
without moving anything. Link targets rewritten mechanically; no content
changes. check-docs reports zero broken links.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Each docs/features/<x>/README.md now has a description and follows
Quick start -> Workflows -> REST -> Gotchas -> See also, within 200
lines (17,661 -> 3,854 lines total). Flag tables are replaced by links
to the generated command reference; architecture, domain model, file
map, testing and extending sections are removed, with non-obvious
reasons kept as gotchas. Contributor design docs (command center,
web server, web apps, web console, screenshot editor) move unchanged
to design.md next to their README.

Also stops the generator dropping real --version options and the
`asc version` command.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
CLAUDE.md keeps the TDD gate, commands, layer rules and pointers
(286 -> 76 lines). The REST exposure checklist and doc rules move into
the implement-feature skill, which loads only when building a feature;
the domain folder tree is dropped since the source tree shows it.

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

coderabbitai Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 124 files, which is 24 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 2b44ee1c-eb60-47f3-8691-ed25dffc1531

📥 Commits

Reviewing files that changed from the base of the PR and between e3ecc90 and 6950938.

📒 Files selected for processing (124)
  • .claude/skills/implement-feature/SKILL.md
  • .claude/skills/implement-feature/references/architecture-diagrams.md
  • .claude/skills/improvement/SKILL.md
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • Makefile
  • README.md
  • docs/README.md
  • docs/changelog/0.1.md
  • docs/changelog/0.16.md
  • docs/changelog/0.17.md
  • docs/commands.md
  • docs/design.md
  • docs/documentation-design/README.md
  • docs/documentation-design/layout.md
  • docs/features/age-rating.md
  • docs/features/age-rating/README.md
  • docs/features/app-clips.md
  • docs/features/app-clips/README.md
  • docs/features/app-icons.md
  • docs/features/app-icons/README.md
  • docs/features/app-info-localizations.md
  • docs/features/app-info-localizations/README.md
  • docs/features/app-infos.md
  • docs/features/app-infos/README.md
  • docs/features/app-previews.md
  • docs/features/app-previews/README.md
  • docs/features/app-pricing.md
  • docs/features/app-pricing/README.md
  • docs/features/app-shots-themes.md
  • docs/features/app-shots-themes/README.md
  • docs/features/app-shots-themes/authoring.md
  • docs/features/app-shots.md
  • docs/features/app-shots/README.md
  • docs/features/app-wall.md
  • docs/features/app-wall/README.md
  • docs/features/app-wall/homepage-pipeline.md
  • docs/features/asc-auth.md
  • docs/features/asc-auth/README.md
  • docs/features/asc-users.md
  • docs/features/asc-users/README.md
  • docs/features/asc-web-management/README.md
  • docs/features/asc-web-management/design.md
  • docs/features/beta-app-localizations.md
  • docs/features/beta-app-localizations/README.md
  • docs/features/beta-review.md
  • docs/features/beta-review/README.md
  • docs/features/builds-archive.md
  • docs/features/builds-archive/README.md
  • docs/features/builds-upload.md
  • docs/features/builds-upload/README.md
  • docs/features/code-signing.md
  • docs/features/code-signing/README.md
  • docs/features/command-center-react/README.md
  • docs/features/command-center-react/design.md
  • docs/features/customer-reviews.md
  • docs/features/customer-reviews/README.md
  • docs/features/game-center.md
  • docs/features/game-center/README.md
  • docs/features/iap-subscription-availability.md
  • docs/features/iap-subscription-availability/README.md
  • docs/features/iap-subscriptions.md
  • docs/features/iap-subscriptions/README.md
  • docs/features/iap-subscriptions/pricing.md
  • docs/features/iap-subscriptions/submission-iris-parity.md
  • docs/features/init.md
  • docs/features/init/README.md
  • docs/features/iris/README.md
  • docs/features/iris/iris-srp-login.md
  • docs/features/iris/iris.md
  • docs/features/market.md
  • docs/features/market/README.md
  • docs/features/performance.md
  • docs/features/performance/README.md
  • docs/features/plugins.md
  • docs/features/plugins/README.md
  • docs/features/plugins/authoring.md
  • docs/features/product-page-optimization.md
  • docs/features/product-page-optimization/README.md
  • docs/features/promoted-purchases.md
  • docs/features/promoted-purchases/README.md
  • docs/features/reports.md
  • docs/features/reports/README.md
  • docs/features/resolution-center.md
  • docs/features/resolution-center/README.md
  • docs/features/rest-api.md
  • docs/features/rest-api/README.md
  • docs/features/review-submissions.md
  • docs/features/review-submissions/README.md
  • docs/features/screenshot-editor/README.md
  • docs/features/screenshot-editor/design.md
  • docs/features/screenshots.md
  • docs/features/screenshots/README.md
  • docs/features/simulators.md
  • docs/features/simulators/README.md
  • docs/features/skills.md
  • docs/features/skills/README.md
  • docs/features/submit-with-products.md
  • docs/features/submit-with-products/README.md
  • docs/features/testflight.md
  • docs/features/testflight/README.md
  • docs/features/version-check-readiness.md
  • docs/features/version-check-readiness/README.md
  • docs/features/version-localizations.md
  • docs/features/version-localizations/README.md
  • docs/features/version-review-detail.md
  • docs/features/version-review-detail/README.md
  • docs/features/web-apps/README.md
  • docs/features/web-apps/design.md
  • docs/features/web-server-architecture/README.md
  • docs/features/web-server-architecture/design.md
  • docs/features/xcode-cloud.md
  • docs/features/xcode-cloud/README.md
  • docs/library.md
  • docs/release.md
  • scripts/changelog-rollover.py
  • scripts/check-docs.py
  • scripts/extract-changelog.sh
  • scripts/gen-docs.py
  • scripts/promote-changelog.sh
  • scripts/test-changelog-release.sh

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

hanrw and others added 5 commits September 23, 2026 18:45
- iap-subscriptions/pricing.md linked to the parent README's old
  #rest-endpoints section, now #rest
- CONTRIBUTING pointed new features at docs/features/<x>.md
- documentation design now describes the per-feature design.md files
  the migration created

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

When a new minor was released, the rollover left the new version as the
last section in CHANGELOG.md, so:
- extract-changelog.sh read on into the 'Older releases' line and the
  reference links, and those would land in the GitHub Release notes
- the empty-release fallback in release.yml waited for a '---' that
  the rollover had removed, so no entry was written

extract-changelog.sh now stops at any heading, separator or reference
link. The fallback moves from release.yml into promote-changelog.sh and
runs before the rollover. scripts/test-changelog-release.sh runs the
release sequence for patch and minor releases, with and without
entries, and runs in CI.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A source-level review of every feature doc found claims that didn't
match the code. Fixed:
- wrong web-server port in curl examples (8420, not 5173/8080); the
  server binds 0.0.0.0, so the loopback advice was impossible
- plugin install/uninstall REST examples used names that can't match
- reports --version example (1_4), missing --version on builds upload,
  a non-existent `asc versions get` in a workflow step, jq path for
  reviews output, market affordance key (browseMarket)
- incomplete affordance lists in JSON samples (review submissions,
  app infos), IAP submit conditions, promoted-purchase create default,
  primary-locale rule in check-readiness, CLI delete for app-info
  localizations, skills update/check behaviour (the background update
  checker is not wired into any command)
- library.md example didn't compile (bundleId, listBuilds signature);
  macOS minimum is 14 per Package.swift

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- iris session order: saved Apple ID login first, then ASC_IRIS_COOKIES,
  then browser cookies; --platforms takes one value per flag;
  verify-code prints JSON; status sample gains submitIAP
- iris-srp-login: --method and --trust were planned, not implemented
- remaining 8080 ports -> 8420; screenshot editor exports
  screenshots.zip; import also reads order
- app-wall: developer is optional, duplicate and fork-timeout behaviour
- performance: --build-id wins when both ids are given
- command center is hosted at cc.asccli.app, not served by web-server
- submission-iris-parity referred to a non-existent `asc iap get`

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@hanrw
hanrw merged commit 02851e4 into main Sep 23, 2026
3 checks passed
@codecov

codecov Bot commented Sep 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.04%. Comparing base (e3ecc90) to head (6950938).
⚠️ Report is 16 commits behind head on main.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main      #29      +/-   ##
==========================================
- Coverage   82.04%   82.04%   -0.01%     
==========================================
  Files         492      492              
  Lines       14362    14362              
==========================================
- Hits        11784    11783       -1     
- Misses       2578     2579       +1     

see 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

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