Skip to content

chore: post-consolidation follow-ups (ADR-072) - #4

Merged
aibeshkov merged 6 commits into
mainfrom
chore/post-consolidation-followups
Aug 4, 2026
Merged

aibeshkov merged 6 commits into
mainfrom
chore/post-consolidation-followups

Conversation

@aibeshkov

Copy link
Copy Markdown
Contributor

Summary

  • Java artifactId: keyorix-java -> keyorix-sdk, matching @keyorixhq/sdk/PyPI keyorix symmetry. groupId com.keyorix unchanged. Updated every adjacent reference (pom.xml's <name>/<url>/sonar.projectKey, README's title + dependency snippet). Verified: mvn -q -DskipTests package produces keyorix-sdk-0.2.1.jar.
  • Package-identity scrub: repo-wide search for keyorix-java/-go/-node/-python/-py as package/module identity (distinct from repo names in archive-pointer prose, which are left alone). Fixed python/README.md's stale title and both Node/Python petstore examples' descriptions of "the keyorix-node/-python SDK."
  • BACKLOG.md (new): records two Phase 7 supply-chain findings from ADR-072, not implemented — URL scheme restriction needed on the caller-supplied server URL (all four SDKs, bandit B310 in Python specifically), and all four SDKs embedding raw server response bodies into thrown errors (candidate for a future redaction test, genericReadError in the Go MCP server as precedent).
  • CI job-name collision fix: go.yml/java.yml both had a job named build-test; node.yml/python.yml both had one named test. Since these are separate path-filtered workflow files, GitHub's required-status-check matching by literal name means a passing check from one language could silently satisfy what was meant to gate a different one. Renamed to build-test-go/build-test-java/test-node/test-python — all 11 job IDs across the repo now unique, verified via a full scan.

Test plan

  • mvn -q -DskipTests package (java/) — produces keyorix-sdk-0.2.1.jar
  • actionlint on all modified workflow files — clean
  • Full repo grep confirming zero remaining package-identity references to old names

groupId com.keyorix already carries the product name; the -java suffix is
redundant in a Java-only ecosystem and breaks symmetry with npm's
@keyorixhq/sdk and PyPI's keyorix. Nothing is published under com.keyorix
yet, so this is free now and permanent (a groupId+artifactId is immutable
once published to Maven Central) once it isn't.

Searched the whole repo for other keyorix-java references before
committing: only .gitignore's provenance comment ("# java/ (from
keyorix-java/.gitignore)") remains, correctly untouched -- that's the old
repo's name in prose, not a package identity. Everything else that WAS
package identity is updated in this commit, not left half-consistent:
pom.xml's <name> (paired display name) and <url> (was pointing at the
now-archived standalone repo, now points at java/ in keyorix-sdks), and
README.md's title and dependency snippet (also fixed the snippet's stale
0.1.0 version to match pom.xml's actual 0.2.1 while touching that block).

Judgment call, flagging explicitly rather than silently deciding: pom.xml's
sonar.projectKey also said keyorix-java (the old repo's SonarCloud
project). Changed to keyorixhq_keyorix-sdks -- a single combined project
for the whole consolidated repo, matching keyorix's own ADR-070 precedent
of folding multiple directories into one SonarCloud project rather than
maintaining one per subdirectory. This is a config-string update only, not
an actual SonarCloud registration (that remains a manual setup step, same
as the npm/PyPI defensive registrations).

Verified: `mvn -q -DskipTests package` from java/ produces
target/keyorix-sdk-0.2.1.jar (and the matching sources jar) -- the new
artifactId resolves and the build isn't broken by the rename.

Signed-off-by: Andrei Beshkov <andrey.beshkov@gmail.com>
Repo-wide search for keyorix-java/-go/-node/-python/-py as package or
module identity (java's own instance already handled in the previous
commit). Found three real hits, distinct from the .gitignore/CI-comment
provenance notes that are correctly left alone (repo names in archive-
pointer prose, not package identity, per the same distinction applied
throughout this consolidation):

- python/README.md's own title said "# keyorix-py" -- stale even by the
  old repo's own naming (the actual repo was keyorix-python, not
  keyorix-py) and never fixed when go/node/java's READMEs were retitled
  during the consolidation. Its `pip install keyorix` line was already
  correct and untouched.
- node/examples/petstore/README.md and python/examples/petstore/README.md
  both described "the keyorix-node SDK" / "the keyorix-python SDK" --
  informal prose, not an install instruction, but still names a package
  that doesn't exist under that name; a reader could reasonably go
  looking for it.

go/examples/petstore/README.md has no equivalent sentence to begin with;
nothing to fix there.

Signed-off-by: Andrei Beshkov <andrey.beshkov@gmail.com>
New BACKLOG.md (this repo didn't have one yet), recording two findings
from ADR-072's Phase 7 supply-chain audit that weren't fixed as part of
the consolidation -- both are SDK behavior changes, out of scope for that
work:

- URL scheme restriction on the caller-supplied server URL (bandit B310 in
  python/keyorix.py specifically, but the same unrestricted-scheme pattern
  exists in all four SDKs' request-URL construction).
- All four SDKs embedding the raw server response body into thrown errors
  on non-2xx responses -- the candidate for a required redaction test in
  the eventual generation ADR, with the Go MCP server's genericReadError
  as the precedent to follow.

Not implemented here -- backlog entries only.

Signed-off-by: Andrei Beshkov <andrey.beshkov@gmail.com>
go.yml and java.yml both named their primary job build-test; node.yml and
python.yml both named theirs test. These are separate, path-filtered
workflow files, so GitHub matches required-status-checks by literal
context name (confirmed from keyorix's own protection config, e.g.
"Analyze (server)" vs "Analyze (operator)" are distinguished precisely by
rendering as different names) -- an identical job name across two
path-filtered workflows means a PR touching both languages would show two
check-runs with the same name, and a required check on that name could be
satisfied by either one succeeding. A broken Go build could hide behind a
passing Java build under the same nominal gate, or vice versa.

Renamed: build-test -> build-test-go (go.yml), build-test -> build-test-java
(java.yml), test -> test-node (node.yml), test -> test-python (python.yml).
No `needs:` references anywhere in these files depended on the old names
(checked before renaming). Verified: every job ID across all five workflow
files is now unique (11 total, zero duplicates), and actionlint is clean.

Prerequisite for setting keyorix-sdks' branch protection to the keyorix
repo's equivalent -- found while drafting that config, not yet applied.

Signed-off-by: Andrei Beshkov <andrey.beshkov@gmail.com>
PR #4's CI surfaced this: pyproject.toml's build-backend was
"setuptools.backends.legacy:build", which doesn't exist on the CI
runner's setuptools -- "Dependency audit (pip-audit)" and "SBOM
(CycloneDX)" both failed at `pip install ".[dev]"` with
BackendUnavailable: Cannot import 'setuptools.backends.legacy'. Predates
this consolidation entirely (present since keyorix-python's v0.1.0,
2026-04-20, verified via git show on the original commit) -- it just
never got exercised in CI before, since no CI existed for python until
this consolidation wired it up. Correct value is the standard
setuptools.build_meta.

That alone wasn't sufficient: with the real backend actually running
package auto-discovery, it found two top-level modules in a flat layout
(keyorix.py and test_keyorix.py) and refused to guess which to package.
Added [tool.setuptools] py-modules = ["keyorix"] to make it explicit
(also verified the correct TOML key is hyphenated py-modules, not
py_modules -- the latter fails setuptools' own pyproject.toml schema
validation).

Verified end-to-end in a fresh venv, not just that it doesn't error:
`pip install ".[dev]"` succeeds and builds a real wheel
(keyorix-0.2.1-py3-none-any.whl), pip-audit exits 0 ("no known
vulnerabilities found"), cyclonedx-py's SBOM command exits 0, bandit
still reads its config correctly (exit 1, the same 4 already-documented
findings -- not a regression), and python -m unittest test_keyorix.py
still passes 6/6.

Signed-off-by: Andrei Beshkov <andrey.beshkov@gmail.com>
Caught live on PR #4: the "Run OWASP Dependency Check" step sat
in_progress for over an hour with zero output, then confirmed via the
GitHub API it genuinely wasn't moving. Without NVD_API_KEY (not
configured for this repo yet), dependency-check-maven falls back to
NVD's free/unauthenticated API for its CVE database sync, which NVD
rate-limits aggressively enough to hang rather than fail. Cancelled the
stuck run (repos/.../actions/runs/.../cancel) and added
timeout-minutes: 15 so this fails fast on future PRs instead of quietly
burning Actions minutes for hours until the secret exists.

Signed-off-by: Andrei Beshkov <andrey.beshkov@gmail.com>
@aibeshkov
aibeshkov merged commit 5ea9fc3 into main Aug 4, 2026
9 of 11 checks passed
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