Tracker credentials are ship-declared service identities - #228
Merged
Conversation
czpython
force-pushed
the
tracker-services
branch
from
August 10, 2026 08:47
f5c416e to
c5d173e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear and Jira credentials move off ship's extension settings onto the service-identity seam (#224): they are the appliance's standing identity at the tracker — one per deployment, all-or-nothing, paired with a webhook secret — the same shape as the GitHub App. This is the first extension-declared use of the seam.
What moves
contrib/ship/services.pydeclares the two services:verifyproves the key with aviewer/organizationquery and stores the actor and workspace as identity facts.verifycalls/rest/api/3/myselfand stores the reported display name; base URL and email are non-secret facts shown on the card.Both are
required = False: trackerless installs stay healthy. The generic connect cards, verify-before-store, and doctor coverage all come from the seam — no frontend or wire changes in this PR.What stays on ship settings
The
trackerselector and the trigger/resting statuses — workflow policy, not identity. Connection and selection are independent: both trackers can be connected while the selector picks one. One new ship doctor check reports the cross-concern state: a selected-but-unconnected tracker is pending operator setup; trackerless by choice is healthy.Consumers
Ship.get_tracker()builds clients from the service rows; a missing identity means trackerless, and the half-configured-Jira failure class is gone (connect is all-or-nothing)._issue_urlreads the Jira base URL from the row.clean()pairing rules are deleted — the connect form subsumes them.Tracker credentials now live in the encrypted
service_identitiescolumn; the docs' encryption-envelope caveat no longer lists them.Deploy
One-time re-paste per live box, same as the GitHub App pattern: connect Linear/Jira from Settings → Harnesses after rollout. The old settings-override rows are orphaned and harmless.
🤖 Generated with Claude Code