Files
sencho/docs/git-transport-attestations.yaml
T
Anso 0928765232 docs(git): publish a versioned Git transport support matrix (#1883)
* fix(git): make gitSourceStatus exhaustive over GitSourceErrorCode

GIT_ERROR was the only code falling through the implicit default
branch. Give it an explicit case and add the same never-guard
webhookPullStatus already uses, so a future code with no mapping is a
compile error instead of a silent 400.

* fix(git): fail loudly under CI when git or sshd is missing

Every real-git and real-sshd integration suite carried its own local
gitAvailable()/sshdAvailable() probe and skipped silently when the
dependency was absent, in CI as well as locally. A cell in the
upcoming support matrix could then advertise automated proof while
the test that proves it never ran.

Consolidate into shared requireGitBinary()/requireSshd() helpers
(one for backend vitest, one for Playwright, since backend's rootDir
pin blocks a cross-directory import) that take an injectable probe.
Locally a missing dependency still skips; under CI it throws with an
actionable message naming what's missing.

* feat(docs): publish a versioned Git transport support matrix

Adds docs/git-transport-support.yaml as the canonical claim set for
every transport/ref/auth/host/CA combination Git Sources supports,
each claim naming its own reproducible evidence rather than
generalizing from a related test. A claim is supported only when a
real end-to-end test (or a dated live attestation) proves that exact
combination; everything else is marked unverified, never assumed.

The published page (docs/features/git-transport-support.mdx) is
generated from the YAML by backend/scripts/git-support-matrix, so it
cannot silently drift from what the tests actually prove. A new
backend test (git-support-matrix.test.ts) enforces this: schema
validity, evidence semantics (supported needs success evidence,
unsupported needs a reproducible rejection, unverified forbids
evidence entirely), byte-identical page generation, and that every
referenced test title resolves via the TypeScript AST rather than a
string search that a skipped or commented-out test would pass.

The error-model section is cross-checked against the real
GitSourceErrorCode and TransportFacingCode unions and against
gitSourceStatus's actual HTTP mapping, so the matrix and the runtime
behavior cannot diverge either.

Named Git hosts (GitHub, GitLab, Gitea, Forgejo, Bitbucket) and the
direct-proxy/Pilot execution paths are seeded as unverified pending a
live attestation pass; only the generic local-fixture combinations
already proven by the real-git integration suites are marked
supported today.

* docs(git): scope GitHub claims to what this pass can actually attest

Splits the GitHub row into a public no-auth claim (attestable with a
real public repository) and separate PAT/SSH deploy-key claims marked
unverified with an explicit reason: this pass holds no real GitHub
credential to exercise them with, and none is assumed or fabricated.

* feat(docs): attest the Git transport matrix live against real hosts

Runs the QA fleet's live Sencho instance through the transport
combinations that automated fixtures cannot exercise, then records
each result in docs/git-transport-attestations.yaml so it can be
re-run and compared later.

GitHub, GitLab, and Bitbucket are attested over public HTTPS against
real, stable, publicly-owned demo repositories (branch and pinned
SHA; GitLab additionally has a tagged fixture). Gitea and Forgejo get
full coverage (branch, tag, and SHA, over both HTTPS with a
per-source CA and SSH with a deploy key) against disposable
self-hosted instances stood up for this pass, including a private
repository so the authentication and host-key failure classifiers
were exercised against a real wrong credential and a real wrong host
key, not just the mocked corpus. The direct-proxy and Pilot execution
paths are each confirmed once against a real public host, proving
the distributed dispatch itself rather than assuming it from the
local-path evidence.

Left honestly unverified: GitHub PAT and SSH deploy-key auth (this
pass holds no real GitHub credential), a GitHub tag combination (no
small stable tagged fixture found), and a Bitbucket tag combination
(the fixture repository carries none). Every claim's evidence records
its exact transport, ref, auth, host, CA, and node path so nothing
here is extrapolated from a neighboring result.

All infrastructure created for this pass (two throwaway Git server
containers, one probe stack) was torn down afterward and the fleet's
container list was confirmed to match its state before the pass.

* style(git): replace em dashes and fix a stale .mjs reference

Directive 18 applies to code comments and build markers too, not just
prose. Also corrects the claim set's header comment, which still
named render.mjs after the renderer was moved to render.js to match
the house convention for backend scripts.
2026-09-01 21:56:02 -04:00

366 lines
13 KiB
YAML

# Retained live-evidence results for docs/git-transport-support.yaml claims
# with `evidence.kind: live`.
#
# This is the reproducibility artifact for every non-automated claim: a
# future engineer (or SEN-362's GA verification) can re-run the exact
# procedure in scripts/git-attestation/README.md and compare against what is
# recorded here. Never record raw credential-bearing output, tokens, deploy
# keys, hostnames or URLs beyond generic fixture identities, or fleet
# credentials: only structured pass/fail metadata and scrubbed commands.
#
# Schema (schema: attestation-v1):
# id: referenced by a claim's evidence.attestation.
# date: when the attestation ran (YYYY-MM-DD).
# source_commit: the Sencho commit the claim set's implementation_baseline
# names; a claim binds to this, not to the runtime image digest below.
# sencho_image_digest: the exact runtime image executed. Recorded because
# a runtime attestation executes an image while claims are committed
# from a revision; retained so the executed runtime is identifiable even
# though it is not what claims bind to.
# host: the closed enum value matching the claim (github, gitlab, gitea,
# forgejo, bitbucket, generic); never a descriptive string.
# host_version: optional, self-hosted only: the exact image reference run.
# Omitted for hosted SaaS, where inventing a server version would be false.
# node_path: local | direct-proxy | pilot: the execution path exercised.
# transport / ref / auth / ca: duplicated from the referencing claim so the
# validator can assert exact-dimension equality, not extrapolation.
# repository / ref_name: the exact fixture repository and literal ref
# exercised (a branch, tag, or commit, not the ref *kind*).
# command: a scrubbed, non-credential-bearing description of what ran.
# result: success | rejected, matching the claim's evidence.outcome.
version: '1'
schema: 'attestation-v1'
attestations:
# ===== Named hosts, public read-only (HTTPS, no auth) =====
- id: att-2026-09-01-github-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: github
node_path: local
transport: https
ref: branch
auth: none
ca: system
repository: octocat/Hello-World (GitHub's own public demo repository)
ref_name: master
command: POST /api/git-sources/browse against the real Sencho instance; branch tip resolved and fetched
result: success
- id: att-2026-09-01-github-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: github
node_path: local
transport: https
ref: sha
auth: none
ca: system
repository: octocat/Hello-World
ref_name: 7fd1a60b01f91b314f59955a4e4d4e80d8edf11d (master tip)
command: POST /api/git-sources/browse pinning the branch tip's own commit SHA
result: success
- id: att-2026-09-01-gitlab-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitlab
node_path: local
transport: https
ref: branch
auth: none
ca: system
repository: gitlab-org/gitlab-test (GitLab's own canonical test fixture repository)
ref_name: master
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-gitlab-tag
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitlab
node_path: local
transport: https
ref: tag
auth: none
ca: system
repository: gitlab-org/gitlab-test
ref_name: v1.0.0 (annotated)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-gitlab-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitlab
node_path: local
transport: https
ref: sha
auth: none
ca: system
repository: gitlab-org/gitlab-test
ref_name: 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 (v1.0.0's peeled commit)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-bitbucket-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: bitbucket
node_path: local
transport: https
ref: branch
auth: none
ca: system
repository: atlassian_tutorial/helloworld (Atlassian's own public tutorial repository)
ref_name: master
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-bitbucket-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: bitbucket
node_path: local
transport: https
ref: sha
auth: none
ca: system
repository: atlassian_tutorial/helloworld
ref_name: 65d938f39f364da3f90767e008022ffe45c562af (master tip)
command: POST /api/git-sources/browse
result: success
# ===== Self-hosted Gitea, own throwaway instance on the QA fleet =====
- id: att-2026-09-01-gitea-https-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitea
host_version: gitea/gitea:1.22
node_path: local
transport: https
ref: branch
auth: pat
ca: per-source
repository: throwaway fixture repository on a disposable Gitea instance, torn down after this pass
ref_name: main
command: POST /api/git-sources/browse with a per-source CA bundle and a Personal Access Token
result: success
- id: att-2026-09-01-gitea-https-tag
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitea
host_version: gitea/gitea:1.22
node_path: local
transport: https
ref: tag
auth: pat
ca: per-source
repository: throwaway fixture repository on a disposable Gitea instance
ref_name: v1.0 (annotated)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-gitea-https-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitea
host_version: gitea/gitea:1.22
node_path: local
transport: https
ref: sha
auth: pat
ca: per-source
repository: throwaway fixture repository on a disposable Gitea instance
ref_name: pinned commit SHA (branch tip)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-gitea-ssh-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitea
host_version: gitea/gitea:1.22
node_path: local
transport: ssh
ref: branch
auth: deploy-key
ca: not-applicable
repository: throwaway fixture repository on a disposable Gitea instance
ref_name: main
command: POST /api/git-sources/browse with a read-only deploy key and the host key fetched via Sencho's own probe endpoint
result: success
- id: att-2026-09-01-gitea-ssh-tag
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitea
host_version: gitea/gitea:1.22
node_path: local
transport: ssh
ref: tag
auth: deploy-key
ca: not-applicable
repository: throwaway fixture repository on a disposable Gitea instance
ref_name: v1.0-light (lightweight)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-gitea-ssh-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: gitea
host_version: gitea/gitea:1.22
node_path: local
transport: ssh
ref: sha
auth: deploy-key
ca: not-applicable
repository: throwaway fixture repository on a disposable Gitea instance
ref_name: pinned commit SHA (branch tip)
command: POST /api/git-sources/browse
result: success
# ===== Self-hosted Forgejo, own throwaway instance on the QA fleet =====
- id: att-2026-09-01-forgejo-https-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: forgejo
host_version: codeberg.org/forgejo/forgejo:7
node_path: local
transport: https
ref: branch
auth: pat
ca: per-source
repository: throwaway fixture repository on a disposable Forgejo instance, torn down after this pass
ref_name: main
command: POST /api/git-sources/browse with a per-source CA bundle and a Personal Access Token
result: success
- id: att-2026-09-01-forgejo-https-tag
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: forgejo
host_version: codeberg.org/forgejo/forgejo:7
node_path: local
transport: https
ref: tag
auth: pat
ca: per-source
repository: throwaway fixture repository on a disposable Forgejo instance
ref_name: v1.0 (annotated)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-forgejo-https-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: forgejo
host_version: codeberg.org/forgejo/forgejo:7
node_path: local
transport: https
ref: sha
auth: pat
ca: per-source
repository: throwaway fixture repository on a disposable Forgejo instance
ref_name: pinned commit SHA (branch tip)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-forgejo-ssh-branch
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: forgejo
host_version: codeberg.org/forgejo/forgejo:7
node_path: local
transport: ssh
ref: branch
auth: deploy-key
ca: not-applicable
repository: throwaway fixture repository on a disposable Forgejo instance
ref_name: main
command: POST /api/git-sources/browse with a read-only deploy key and the host key fetched via Sencho's own probe endpoint
result: success
- id: att-2026-09-01-forgejo-ssh-tag
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: forgejo
host_version: codeberg.org/forgejo/forgejo:7
node_path: local
transport: ssh
ref: tag
auth: deploy-key
ca: not-applicable
repository: throwaway fixture repository on a disposable Forgejo instance
ref_name: v1.0-light (lightweight)
command: POST /api/git-sources/browse
result: success
- id: att-2026-09-01-forgejo-ssh-sha
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: forgejo
host_version: codeberg.org/forgejo/forgejo:7
node_path: local
transport: ssh
ref: sha
auth: deploy-key
ca: not-applicable
repository: throwaway fixture repository on a disposable Forgejo instance
ref_name: pinned commit SHA (branch tip)
command: POST /api/git-sources/browse
result: success
# ===== Distribution: direct-proxy and Pilot node paths =====
- id: att-2026-09-01-github-direct-proxy
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: github
node_path: direct-proxy
transport: https
ref: branch
auth: none
ca: system
repository: octocat/Hello-World
ref_name: master
command: POST /api/git-sources/browse with x-node-id targeting a remote proxy-mode fleet node
result: success
- id: att-2026-09-01-github-pilot
date: '2026-09-01'
source_commit: 79b86ddcd4aefdd6941f098e35990ab397b13c72
sencho_image_digest: sha256:980531f85861e092b7eee8a5b6a840d3964ccc6db25c42517c0ac43fefe67e16
host: github
node_path: pilot
transport: https
ref: branch
auth: none
ca: system
repository: octocat/Hello-World
ref_name: master
command: POST /api/git-sources/browse with x-node-id targeting a Pilot-agent fleet node
result: success