Skip to content

Research: the alias layer as it actually is, plus a post published today arguing spotlight-spec#20 - #9

Merged
kinlane merged 2 commits into
mainfrom
blog/alias-layer
Aug 17, 2026
Merged

kinlane merged 2 commits into
mainfrom
blog/alias-layer

Conversation

@kinlane

@kinlane kinlane commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Adds a research page on how aliases actually work today, and a post for 2026-09-11 arguing the case in api-commons/spotlight-spec#20.

Both were read from @stoplight/spectral-core 1.23.1 as vendored at v6.16.2, plus the published ruleset schema — not from memory. The research page cites files for every claim so it can be checked and shown wrong.

What is here

  • research/aliases.md → /research/aliases/ — the evidence. Both alias forms, the six that ship built-in, the extends boundary, three behaviours worth knowing, and an explicit list of four things the read could not settle.
  • research/index.md — a fourth card, and a "Format behaviour" note in the Method section.
  • _posts/2026-09-11-… — the argument, at a slightly higher altitude, linking out to the research page.

The finding that matters

Aliases do not cross extends, and it is deliberate. A rule resolves against the ruleset it was written in, not the one it runs in. The test is named should refuse to resolve externally defined aliases.

So an alias is private to the file that declares it — which is why the JSONPath criticism survives a feature built to answer it. Everyone extending the OpenAPI ruleset redeclares PathItem themselves or goes back to raw JSONPath.

The refusal also buys something real: two extended rulesets can define the same alias name differently and never collide, with a fixture asserting exactly that. Both documents say so. #20 inherits that problem rather than dodging it.

None of this is documented outside a test name.

Also worth noting: six aliases ship, all in oas. AsyncAPI and Arazzo define none, against a standing promise in docs/guides/4c-aliases.md that the core rulesets would ship a common set for both.

Notes

  • The post is future-dated, so it will not appear until 2026-09-11. Merging is safe before then.
  • Jekyll builds clean locally with --future; the page and post render, and the index card links correctly.
  • Three claims in the research page are flagged inline as code-reads with no test either way, rather than stated as fact.

kinlane and others added 2 commits August 17, 2026 15:46
Aliases are the format's answer to the JSONPath criticism, and they are
barely usable — not because the idea is wrong, but because of where they
are scoped.

Adds two things, both read from @stoplight/spectral-core 1.23.1 as
vendored at v6.16.2 rather than from memory:

- research/aliases.md — the evidence, citing files for every claim, and
  an explicit list of four things the read could not settle.
- A post for 2026-09-11 — the argument, pointing at spotlight-spec#20.

The finding that matters: aliases do not cross `extends`, deliberately.
The test is named `should refuse to resolve externally defined aliases`.
An alias is therefore private to the file declaring it, which is why the
JSONPath criticism survives a feature built to answer it — and the
refusal also buys real collision-freedom, so #20 inherits that problem
rather than dodging it. None of this is documented outside a test name.

Also: six aliases ship, all in `oas`; AsyncAPI and Arazzo define none,
against a standing docs promise otherwise.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Re-dates the post from 2026-09-11 to 2026-08-17 so it goes live on merge
instead of waiting three weeks. The three later posts stay queued.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@kinlane kinlane changed the title Research: the alias layer as it actually is, plus a post arguing spotlight-spec#20 Research: the alias layer as it actually is, plus a post published today arguing spotlight-spec#20 Aug 17, 2026
@kinlane

kinlane commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Re-dated the post from 2026-09-11 to 2026-08-17 — it now publishes on merge rather than waiting three weeks. The three later posts (08-21, 08-28, 09-04) stay queued and are still skipped by the build.

Verified with a plain jekyll build (no --future): the post renders at /2026/08/17/…, and the other three are correctly skipped as future-dated.

One consequence worth naming — this lands ahead of the 08-21 and 08-28 posts that were written before it, so the blog order is now alias post, then those. Nothing in them depends on reading order.

@kinlane
kinlane merged commit 0a16267 into main Aug 17, 2026
2 checks passed
@kinlane
kinlane deleted the blog/alias-layer branch August 17, 2026 19:50
kinlane added a commit that referenced this pull request Aug 17, 2026
… as rulesets

A fourth relationship alongside engine / embeds / adjacent, for projects that
are not implementations of the format but publications in it — the AEP OpenAPI
Linter and the Italian government's national API guidelines rules. Both ship a
written guideline as an installable, extendable ruleset, which is the format
being used as a distribution medium rather than as one tool's config file.

Surfaced on both pages: a "Published as rulesets" section on implementations,
and "Rulesets published as standards" on tools.

This is the shortest list on either page, and it is the one that matters most to
the ruleset conformance class in #9 — these are the documents such a class would
have to hold.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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