Skip to content

SPEC and waiver hygiene: per-line skip roster, current facts, doc-example and lint fixes - #535

Merged
jeremy merged 4 commits into
mainfrom
docs/spec-waiver-hygiene
Jul 31, 2026
Merged

SPEC and waiver hygiene: per-line skip roster, current facts, doc-example and lint fixes#535
jeremy merged 4 commits into
mainfrom
docs/spec-waiver-hygiene

Conversation

@jeremy

@jeremy jeremy commented Jul 31, 2026

Copy link
Copy Markdown
Member

Governance docs had drifted from the code across three fronts. This PR trues them up so later work (conformance-closure PRs in flight) can delete exactly its own roster lines instead of rebasing a prose paragraph.

SPEC §19 + Appendix D

  • The zero-skip roster is restructured from a summary paragraph into a per-line enumeration of all 38 skips a default mock-mode run reports across the five runners, verbatim, each tagged waiver-backed (rubric ID), architectural, or unwaivered. Re-derived from the runners at head (includes the Up Next priority writes + provenance repin to the exact-target contract (#12380, #12483) #528-era Ruby priority-mutation skips and Kotlin's tag-based link-header skip that lives outside KOTLIN_SKIPS — found by adversarial review running the Kotlin runner: 9 live skips, not the 8 in its skip map).
  • §19 category table + Appendix D gain the 7 fixture files they omitted: downloads, network-retry, uploads_download, todos_write, cards_write, schedule_entries_write, live-my-surface (the last documented as opt-in via BASECAMP_LIVE, owned by CONTRIBUTING.md's live-canary machinery).
  • The conformance gate line adds the python runner, which make conformance has run all along.
  • §7: the idempotent-POST enumeration catches up to the current seven (verified by joining behavior-model.json idempotent: true with openapi.json methods): CompleteTodo, CreateBookmark, EnableCardColumnOnHold, PauseQuestion, PrioritizeAssignment, Subscribe, SubscribeToCardColumn. The on_retry pseudocode note now says all six SDKs ship the (failed, upcoming) pair (true since Swift retry lifecycle: SPEC-correct onRetry numbering, re-auth on every retry path, no events from catch #517).

rubric-audit.json

AGENTS.md

The "NEVER edit */generated/" rule now names its four real exceptions (_base.py, _async_base.py, base_service.rb, and Python's empty package-root __init__.py) — the exact confusion behind #518's refuted review finding. Verified against both generators: none of the four is emitted; generated/services/__init__.py is.

Source fixes riding along

  • Seven invalid doc examples fixed (same defect class as TypeScript in-source docstring pagination examples fail the repo's strict typecheck #511), each verified against the real generated signatures: six used the stale two-ID list(projectId, todolistId) convention; BaseService.kt's KDoc sketched a nonexistent listAsFlow and a requestPaginated call that could not compile. Valid examples untouched.
  • The three standing lint warnings on every CI run are gone: two doc-only imports dropped (types remain publicly exported), and the deliberate control-character guard in discovery.ts gets an explicit no-control-regex disable with rationale (WHATWG URL silently strips/rewrites those characters).

Verification: TS lint (0 warnings), typecheck, build, tests green; Kotlin compileKotlinJvm green; edited KDoc examples manually re-verified against declarations (KDoc isn't compiled). Adversarial review (4 lenses) ran over the diff; its 5 findings (2 P1) are incorporated above.


Summary by cubic

Aligns SPEC, rubric, and governance docs with current SDK behavior and runner output. Makes future conformance-closure PRs remove exact skip lines instead of editing prose.

  • Refactors

    • Restructured the zero-skip roster to a per-line list of 38 skips across Go, Kotlin, Python, Ruby, and TypeScript, each tagged waiver-backed, architectural, or unwaivered.
    • Added 7 missing conformance fixtures to §19 and Appendix D; updated idempotent POSTs to seven; Swift section reflects the full set; retry pseudocode notes all six SDKs pass attempt numbers consistently.
    • Added the Python runner to the conformance gate.
    • rubric-audit.json: flipped Go 3C.6 to a plain pass; corrected notes for 2D.5, 3A.5, 1B.5 (Ruby nullable *time.Time timestamps currently pass through as strings; tracked in Ruby generator: datetime coercion keys on the exact x-go-type time.Time spelling, missing nullable *time.Time timestamps #537); updated the audit date.
    • AGENTS.md: documented the four non-generated exceptions under generated/.
  • Bug Fixes

    • Fixed seven invalid examples (single-ID todos surface; reframed BaseService.kt KDoc examples as illustrative generator output and corrected pagination examples).
    • Removed three lint warnings by dropping doc-only imports and adding an explicit no-control-regex disable with rationale in typescript/src/oauth/discovery.ts.

Written for commit 8f9fc21. Summary will update on new commits.

Review in cubic

jeremy added 3 commits July 31, 2026 13:17
…nt-POST set, stale waiver flips

The §19 zero-skip roster becomes a per-line enumeration of all 38 live skips
across the five runners (each tagged waiver-backed, architectural, or
unwaivered), so a PR that closes a gap deletes exactly its own lines. The §19
category table and Appendix D gain the 7 fixture files they omitted. The
idempotent-POST enumeration catches up to the current seven (CreateBookmark
and PrioritizeAssignment joined). rubric-audit.json: the Go 3C.6 waiver flips
to a plain pass (Go auto-paginates with same-origin enforcement), 2D.5/3A.5/
1B.5 notes are corrected to six-SDK reality, and the audit date is current.
AGENTS.md names the four non-generated files under generated/ as explicit
exceptions to the never-edit rule.
Six examples still used the stale two-ID calling convention
(list(projectId, todolistId)) that predates the single-ID todo surface, and
BaseService.kt's KDoc sketched a listAsFlow method that exists nowhere and a
requestPaginated call that would not compile (trailing lambda binding to the
wrong parameter, stale OperationInfo shape). Same defect class as #511. Every
example verified against the real generated signatures; valid examples left
untouched.
Two imports referenced only from prose doc comments are dropped
(RequestInfo in client.ts, FallbackReason in discovery.ts — both types stay
publicly exported via their home modules), and the deliberate control-character
guard in discovery.ts gets an explicit no-control-regex disable with its
rationale: the WHATWG URL parser silently strips or rewrites those characters,
so without the guard a malformed origin spelling would be accepted.
Copilot AI review requested due to automatic review settings July 31, 2026 20:18
@jeremy jeremy added the documentation Improvements or additions to documentation label Jul 31, 2026
@github-actions github-actions Bot added typescript Pull requests that update TypeScript code kotlin labels Jul 31, 2026

Copilot AI 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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@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: fd30d23a76

ℹ️ 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 rubric-audit.json Outdated
…ice examples as generator output

Codex caught a real generator inconsistency behind the 1B.5 overclaim: Ruby's
datetime coercion keys on the exact x-go-type time.Time spelling, so MyNote's
nullable *time.Time timestamps decode as raw strings (filed as #537; the note
now says so). The two BaseService KDoc examples are reframed as illustrative
generator output so they cannot be read as a recipe for hand-written wire
methods, which AGENTS.md forbids.
Copilot AI review requested due to automatic review settings July 31, 2026 20:29
@jeremy

jeremy commented Jul 31, 2026

Copy link
Copy Markdown
Member Author

Bot-review status: Codex reviewed both rounds — its two P2 findings (real generator inconsistency → #537; example framing) are fixed in 8f9fc21, threads resolved with evidence. Copilot errored on the initial review and was re-requested once per the standing flaky-Copilot convention; merging on Codex + green CI.

@jeremy
jeremy enabled auto-merge (squash) July 31, 2026 20:30

Copilot AI 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.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@jeremy
jeremy merged commit e6d7581 into main Jul 31, 2026
42 of 43 checks passed
@jeremy
jeremy deleted the docs/spec-waiver-hygiene branch July 31, 2026 20:32

@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: 8f9fc21585

ℹ️ 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".

* }
* OperationInfo("Todos", "ListTodos", "todo", false, resourceId = todolistId),
* null,
* { httpGet("/todolists/$todolistId/todos.json") },

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 Thread the operation ID through the generated example

Because this block is now presented as the shape the generator emits, its httpGet call must pass operationName = info.operation, as the actual generated todos.kt does. Without it, BasecampHttpClient receives the default null, skips the Metadata.operations lookup, and therefore does not apply ListTodos's per-operation retry status set or attempt ceiling to the initial page; the future streaming example repeats the same omission.

AGENTS.md reference: AGENTS.md:L3-L6

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation kotlin typescript Pull requests that update TypeScript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants