Skip to content

Correct the API coverage claim: 183/184, not 100% - #621

Merged
jeremy merged 3 commits into
mainfrom
docs/upload-versions-communiques
Aug 5, 2026
Merged

Correct the API coverage claim: 183/184, not 100%#621
jeremy merged 3 commits into
mainfrom
docs/upload-versions-communiques

Conversation

@jeremy

@jeremy jeremy commented Aug 4, 2026

Copy link
Copy Markdown
Member

API-COVERAGE.md asserted "100% coverage of tracked in-scope API (184/184 endpoints)". That is false. It also had no way to become accurate: the matrix has only ✅ and ⏭️, so a partly-covered section had to be recorded as fully covered.

This adds a deliberately narrow third status — ⚠️ blocked: the CLI cannot faithfully cover an endpoint for a reason outside the CLI, and the row must name the blocker. Summary now reads 183/184.

The one gap: GET /uploads/:id/versions.json

Not a missing command — the command is written and held in draft #622. The SDK is what blocks it.

A live read-only probe returns version events:

{ "id": 16850997498, "recording_id": 10165243019, "action": "active",
  "details": { "status_was": "drafted" }, "created_at": "", "creator": { } }

The OpenAPI spec models the response as []Upload, so ListVersions decodes events into Upload structs. The result runs clean and is confidently wrong: title, filename, status, download_url blank; action, details, recording_id dropped; and id is the event id, so basecamp files show <id> 404s. Shipping that means shipping wrong data.

Scope changed since this PR was opened

It originally also added two communiqué files. Those are removed (b9a71959). basecamp-cli is public and bc3 is private, and one of them quoted three verbatim Ruby blocks from bc3 controllers — merging it would have published private source. Beyond that, a public CLI's source tree is the wrong venue for a cross-team ask; those belong as issues on the repos that own the code, where the recipients actually are.

The diff is now API-COVERAGE.md only, +26/−4.

Note: the removed files remain fetchable at this branch's earlier commits (c39164e3, e4584080) until the branch is deleted. Flagged separately — the same exposure exists on main via COMMUNIQUE-card-step-partial-updates.md (#608), which predates this work.

Merging

This does not depend on the SDK fix — it describes the blocker. Holding it leaves a claim on public main that is verifiably wrong. The tradeoff is churn: 183/184 now, back to 184/184 when ListVersions is fixed and #622 lands.

bin/ci green (exit code checked, not piped through tail).

API-COVERAGE.md asserted "100% coverage of tracked in-scope API (184/184
endpoints)". That was false, and the matrix had no way to say so: with only
✅ and ⏭️ available, a partly-covered section had to be recorded as fully
covered. Add a narrow third status — ⚠️ blocked, meaning the CLI cannot
faithfully cover an endpoint for a reason outside the CLI, and the row must
name the blocker.

The one gap is GET /uploads/:id/versions.json. The command is written; the SDK
is what blocks it. UploadsService.ListVersions types the response as []Upload,
but the API returns version events (action, details, recording_id), so a caller
gets Upload structs with blank title/filename/status and an id that is the
event id and does not resolve as an upload. Held rather than shipped, because
shipping it means shipping wrong data.

COMMUNIQUE-sdk-upload-versions-response.md reports that to the SDK team, with
the live response, the bc3 controller that produces it, and a suggested
UploadVersion type.

COMMUNIQUE-upload-versions-api.md addresses #404 to BC3 Rails, and corrects the
premise it was drafted on. PUT /uploads/:id.json does not accept
attachable_sgid: UploadsController#update permits only base_name and
description, and uploadable_params is wired to create alone — so the parameter
is silently dropped, not rejected. Replacement does exist (stage an Upload,
then POST .../uploads/:id/versions swaps the recording's recordable), but it is
undocumented, redirects instead of rendering JSON, takes form-shaped array
params, and stages via multipart rather than attachable_sgid. The communique
asks for an API-reachable shape and offers two.

Neither the SDK nor the bc3 repository was modified.

Refs #404
Copilot AI balanced review requested due to automatic review settings August 4, 2026 18:28
@github-actions github-actions Bot added the docs label Aug 4, 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: c39164e3be

ℹ️ 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 COMMUNIQUE-upload-versions-api.md Outdated
Review caught the communique quoting bc3-api's "each version event represents a
file replacement" approvingly, then pasting a response example whose action is
"active" with status_was: drafted — a publication transition, not a new file.
The endpoint renders version_events_since_publication, i.e. the whole event
stream. Replacement is the blob_changed subset, emitted by Upload#recorded_as →
track_blob_change when the new recordable's blob differs.

Say so, in both places the document leans on the endpoint, and ask BC3 not to
model the listing as binary revisions.

Also tighten the "what this unblocks" bullet: files versions can only observe
web-app replacements today, and would list ones the CLI itself caused only if
this ships.
Copilot AI review requested due to automatic review settings August 4, 2026 19:25

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.

basecamp-cli is public; bc3 is private. COMMUNIQUE-upload-versions-api.md
quoted three verbatim Ruby blocks from bc3 — Uploads::StageController#create,
Uploads::VersionsController#create, and UploadsController's before_action and
param filters — so merging it would have published private source in a public
repo. Caught before merge.

Beyond the leak, a public CLI's source tree is the wrong venue for a
cross-team ask. These are messages to BC3 and to the SDK, not documentation of
this tool; they belong in issues on those repos, where the recipients are.

Drop both files. Keep the API-COVERAGE.md correction, which is a claim about
this CLI and does belong here, with its links to the removed files replaced by
plain description.
Copilot AI review requested due to automatic review settings August 4, 2026 20:36

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: b9a719599c

ℹ️ 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 API-COVERAGE.md
@jeremy jeremy changed the title Correct the coverage claim, and file two upload-versions communiqués Correct the API coverage claim: 183/184, not 100% Aug 4, 2026
@jeremy

jeremy commented Aug 5, 2026

Copy link
Copy Markdown
Member Author

Declining this one, and it's worth saying why rather than just resolving.

Full API coverage: projects, todos, cards, … is a domain enumeration that exists to make the skill trigger. Every domain in that list is covered by commands — the sentence is not an endpoint-parity claim, and there is no number in it to be wrong. The thing that did claim parity was API-COVERAGE.md's "100% coverage of tracked in-scope API (184/184)", which is exactly what this PR removes.

The priming risk is also smaller than it looks: basecamp files versions does not exist in the shipped surface — it is held on feat/files-versions. An agent consulting the skill finds no versions command to be misled about, because there is none. If it ever ships, the skill gains a real entry and the coverage matrix drops the ⚠️ in the same change.

Rewording the description to hedge would cost skill-trigger quality for no gain in truth. API-COVERAGE.md is the authority on counts, and it now says 183/184 and names the blocker.

@jeremy
jeremy merged commit 9362d2f into main Aug 5, 2026
24 of 25 checks passed
@jeremy
jeremy deleted the docs/upload-versions-communiques branch August 5, 2026 08:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants