Skip to content

fix(docs): the competitive table said a competitor's repo was gone; it is archived - #58

Merged
webdevsamran merged 1 commit into
mainfrom
fix/competitor-data-and-optic
Sep 9, 2026
Merged

fix(docs): the competitive table said a competitor's repo was gone; it is archived#58
webdevsamran merged 1 commit into
mainfrom
fix/competitor-data-and-optic

Conversation

@webdevsamran

Copy link
Copy Markdown
Owner

docs/competitive-analysis.md carried this row:

| Optic | — | — | — | — | repo gone (404) |

and the prose "Dredd/Optic — archived/gone".

Optic's repository is not gone. opticdev/optic is archived and public, with 1,534 stars, last pushed 2026-01-08.

The 404 was ours

scripts/fetch_competitor_meta.py asked for useoptic/optic, which does not exist. gh_json caught the resulting CalledProcessError and returned None; the caller wrote {"error": "repo-not-found-or-error"} into data/competitor-meta.json; and the document transcribed that tool failure as a fact about a competitor.

A typo in a constant became a published claim that a project had disappeared.

Why this one matters beyond accuracy

An archived incumbent with 1,534 stars in exactly this project's domain is the most useful fact in the file — it describes an opening. Recording it as "gone" both stated something false and discarded the signal.

Fixed at the source, not in the table

gh_json now raises FetchError instead of returning None, so a failed lookup stops the run and a human decides whether a project moved or genuinely went away. allow_404 is threaded through only for the releases endpoint, where absence is a real answer.

The landscape table is regenerated from a fetch run today, so every cell is traceable to committed data rather than typed by hand:

was (2026-08-23) now (2026-09-09)
oasdiff 1,327 1,356
Schemathesis 3,554 3,590
Optic "repo gone (404)" MIT, 1,534, archived

What keeps it fixed

tests/unit/test_competitive_table_matches_data.py binds the prose to the data:

  • every table row matches competitor-meta.json (license, stars, last push)
  • no entry may be a recorded failed lookup
  • the heading date must be the data's fetch date
  • Optic specifically must read as archived rather than absent

Verified by drifting a star count and watching it fail.

Verification

Gate Result
ruff check / ruff format --check clean
mypy clean, 90 source files
pytest 432 passed

…t is archived

docs/competitive-analysis.md carried the row

    | Optic | — | — | — | — | repo gone (404) |

and the prose "Dredd/Optic — archived/gone". Optic's repository is not gone.
`opticdev/optic` is archived and public with 1,534 stars, last pushed
2026-01-08.

The 404 was ours. scripts/fetch_competitor_meta.py asked for
`useoptic/optic`, which does not exist. `gh_json` caught the resulting
CalledProcessError and returned None; the caller wrote
`{"error": "repo-not-found-or-error"}` into data/competitor-meta.json; and the
document transcribed that tool failure as a fact about a competitor. A typo in
a constant became a published claim that a project had disappeared.

It is worth being precise about why this one matters beyond accuracy. An
archived incumbent with 1,534 stars in exactly this project's domain is the
single most useful fact in the file -- it describes an opening. Recording it as
"gone" both stated something false and discarded the signal.

Fixed at the source rather than in the table: gh_json now raises FetchError
instead of returning None, so a failed lookup stops the run and a human decides
whether a project moved or genuinely went away. `allow_404` is threaded through
only for the releases endpoint, where absence is a real answer.

The landscape table is regenerated from a fetch run today (2026-09-09), so
every cell is traceable to data in this repository rather than typed by hand:
oasdiff 1,327 -> 1,356, Schemathesis 3,554 -> 3,590, k6 31,424, and Optic
correctly archived.

tests/unit/test_competitive_table_matches_data.py binds the prose to the data:
every table row must match competitor-meta.json, no entry may be a recorded
failed lookup, the heading date must be the data's fetch date, and Optic
specifically must read as archived rather than absent. Verified by drifting a
star count and watching it fail.

Verified: ruff, ruff format, mypy (90 files), 432 tests pass.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

github-actions Bot commented Sep 9, 2026

Copy link
Copy Markdown

API Verity — contract review

One comment per PR — updated on each push.

@webdevsamran
webdevsamran merged commit c33b320 into main Sep 9, 2026
13 checks passed
@webdevsamran
webdevsamran deleted the fix/competitor-data-and-optic branch September 9, 2026 10:17
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