Skip to content

docs: the CI workflow name is an interface, so standardise it - #11

Merged
MarketDataApp merged 2 commits into
mainfrom
docs/standard-ci-workflow-name
Sep 16, 2026
Merged

MarketDataApp merged 2 commits into
mainfrom
docs/standard-ci-workflow-name

Conversation

@MarketDataApp

Copy link
Copy Markdown
Contributor

The trigger matches a workflow by its name: — so the name is an interface, not a label.

The five SDK repos called theirs four different things (Tests, CI, Pull Request), so every caller needed a different value, and naming the wrong one fails silently: no review runs and nothing says why. sdk-java is the trap — its Main workflow looks like the obvious candidate and only runs on pushes to main.

All five now use Tests, so the template needs no edit for an SDK repo.

Renaming was safe and measured: every required status check in these repos is a job name — test (3.10), Verify (JDK 17), check (20.x) — so branch protection never referenced a workflow name.

setup.md gains §3a: find the right workflow empirically from the checks on a real PR, not from filenames.

Paired with MarketDataApp/sdk-js#86 and MarketDataApp/sdk-java#71.

The trigger matches a workflow by its `name:`, which makes the name an
interface rather than a label. The five SDK repositories called theirs four
different things -- Tests in sdk-go, sdk-php and sdk-py, CI in sdk-js, Pull
Request in sdk-java -- so every caller needed a different value, and naming the
wrong one fails SILENTLY: no review runs and nothing says why. sdk-java is the
trap, because its `Main` workflow looks like the obvious candidate and only runs
on pushes to the default branch.

All five now use `Tests`, so the caller template needs no edit at all for an SDK
repository. Renaming was safe and measured: every required status check in every
one of these repositories is a JOB name -- test (3.10), Verify (JDK 17),
check (20.x) -- so branch protection never referenced a workflow name.

setup.md gains section 3a, which says to find the right workflow EMPIRICALLY
from the checks on a real pull request rather than from filenames, because that
is the mistake this standard exists to prevent.
runs-on still carries a CHANGE ME, for a repository that is private or outside
the organisation, and that is correct. The claim being pinned is narrower: an
SDK repository needs no edit to the TRIGGER.
@MarketDataApp
MarketDataApp merged commit 572043f into main Sep 16, 2026
1 of 2 checks passed
@MarketDataApp
MarketDataApp deleted the docs/standard-ci-workflow-name branch September 16, 2026 22:59
MarketDataApp added a commit that referenced this pull request Sep 16, 2026
The squashed merge of #11 landed a line ruff wants reformatted, so `ruff format
--check .` fails on main and on every branch taken from it. One line, no
behaviour.
MarketDataApp added a commit that referenced this pull request Sep 17, 2026
…12)

* feat(sdk): the version bump becomes a calculation, not an opinion

Six SDK repositories had no standing review instructions except sdk-py, so five
of them got the language-agnostic default. The rule the team actually agreed in
#engineering on 2026-08-28 was nowhere the bot could read it: a non-breaking
change takes the next minor, a breaking change takes the next major, and each
SDK decides on its own because the same API change can break Java's signature
and leave Python's alone.

Lucas's point is the one that makes it enforceable. The reviewer must not opine
on whether a change is breaking; it must compare the public surface before and
after and report a table. A symbol that disappeared or a type that changed IS
breaking, so the bump is a calculation. That is what stops a major shipping by
accident.

The rules are assembled rather than copied. shared.md is the part every SDK
follows; surface/<lang>.md is the part that cannot be shared, because what
counts as public surface differs sharply -- Go decides its major in the import
path and cannot defer it to release time, C# compiles default parameter values
into callers, Java breaks source and binary compatibility by different rules.
Six hand-maintained copies would drift within a month.

The generated files are not committed here: they belong in the SDK
repositories, and docs/sdk/build.sh emits them.

* style: ruff format the assertion #11 left unformatted

The squashed merge of #11 landed a line ruff wants reformatted, so `ruff format
--check .` fails on main and on every branch taken from it. One line, no
behaviour.

* docs(sdk): number the surface section so section 1 can point at it

Section 1 tells the reviewer to compare public symbols without saying what
counts as one in this language. That definition is the per-language file, so it
gets a number and a cross-reference. Also de-duplicates the two `## Tests`
headings sdk-py ended up with.

* fix(sdk): two breaking-change rules were wrong on their own terms

Java: a widened return type was listed as NOT breaking. The return type is part
of the method descriptor, so every compiled caller stops linking. And an
abstract class cannot carry a `default` method, so the interface escape hatch
does not apply to it.

C#: adding a parameter with a default value was hedged as breaking only for
named arguments. It changes the signature, so existing compiled callers fail
with MissingMethodException regardless.
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