Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/evidence.md
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,10 @@ Host: qa.door43.org, DCS `1.27.3+dcs.13-g23ba3c3ef9`. Date: 6 October 2026. Fixt
`scripts/probe/qa-create-probe.mjs --project-type daughter --translation-type revision --audience literary` (the flags #28 added) ran `project.create.plan` with `flavor: { projectType: daughter, translationType: revision, audience: literary }` and `project.create.apply` through the Worker's own code against QA under `tc-admin-qa`: `POST /user/repos` 201 in 0.43 s, then one `POST /repos/tc-admin-qa/id_tcaf2014/contents` 201 in 1.1 s with `metadata.json` (2,142 bytes), `ingredients/license.md` (18,535), and `README.md` (239), author and committer `tc-admin-qa`. The committed file carries `type.flavorType.flavor = { name: textTranslation, projectType: daughter, translationType: revision, audience: literary, usfmVersion: "3.0" }`, and the contract test regenerates it byte for byte from those inputs. The health check answered 422 "no metadata found" at 0.1 s and 200 at 5.5 s with `overall_severity_level: info` and only `release_needed` (E28, E45), no warning, no error; the repository view read `metadata_type: sb`, `flavor: textTranslation`, subject Bible, `healthcheck_severity: info`, `ingredients: null` (no books, as E45), and the catalog entry `is_valid: true`, `is_healthy_without_warnings: true`.
Host: qa.door43.org, DCS `1.27.3+dcs.13-g23ba3c3ef9`. Date: 6 October 2026. Fixtures: `fixtures/door43/qa.door43.org/2026-10-06/project-create/tc-admin-qa-flavor/`; `worker/test/contract/project-create.test.ts` holds the committed file to the writer and Door43's reading of it. Repository `tc-admin-qa/id_tcaf2014` is kept for inspection. Status: verified for these three values; that Door43 accepts every value the schema enumerates is inferred from its reading the file by the schema, as with the defaults (E45, E47), not observed value by value. Consequence: the wizard offers every enumerated value (Q4), and the `flavor` input of `project.create.plan` is built.

### E81 — The release flow runs on a project on `main`, its branch read from the repository's `default_branch`
`scripts/probe/qa-release-probe.mjs --owner tc-admin-qa-org` ran the whole release flow through the Worker's operation code with #170's change, as E54 did on `master`. `project.create.apply` created `tc-admin-qa-org/id_tcar0228` on `main`; the probe took its seed books from `bahtraku/Perjanjian-Baru-Pendau` at the branch that repository's own read names, and committed them to `main`. That read and the file reads are not recorded; Pendau's `default_branch` is `master` (E14's recording of the repository), and the probe stops when a read names none. `release.plan` took the branch from the repository's `default_branch`, `main`, with the head the catalog's `latest` stage named for it. Both release commits say "Prepared by tC Admin 0.1.0 from main at …" (`c9acaba290`, then `a7cf701557`). `v1.0.0` was created as a pre-release and promoted, `v1.1.0` released, and a `v1.1.1` preparation discarded; afterwards `GET /branches` lists `main` alone. No phase failed.
Host: qa.door43.org, DCS `28.1.0+dcs.19-g41cde8ce33`. Date: 10 October 2026 (UTC). Method: the probe, every Door43 exchange recorded in `fixtures/door43/qa.door43.org/2026-10-10/release-flow/` with its README (the token and every email redacted). Repository `tc-admin-qa-org/id_tcar0228` is kept for inspection. Status: verified. Consequence: a project on `main` releases as one on `master` does (E54), and nothing in the release flow names a branch the repository did not answer.

### E80 — The seed script builds the standard QA projects on `main` and releases them from `main`
With #167's change and the checks it added to `scripts/seed-qa.mjs`, the three standard projects built on 9 October on `master` (E74) were deleted on QA at Rich's word, and the script rebuilt them from nothing through the Worker's operation code. Each was created on `main`, every import committed to `<owner>/<repo>@main`, and each release plan was bound to `main`'s head as Door43 had it, which the script now checks and stops on otherwise.
- `tc-admin-qa-org/id_seedtb`: Matthew and Mark imported from `bahtraku/id_tb1` at `1974`, released in full as `v1.0.0` from `main` at `5d828149`; the release commit's parent is that commit. John imported, then released as the pre-release `v1.1.0` from `main` at `19e925ad` on `v1.0.0`; its release commit's parent is `v1.0.0`'s commit, as a later release starts from the previous release tag (ADR 0010). Health `healthy` at both releases and `success` on `main` after.
Expand Down
2 changes: 1 addition & 1 deletion docs/traceability.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ Keep this file current: an issue's Traceability section and its row here say the
| [#30](https://github.com/unfoldingWord-box3/tc-admin-app/issues/30) Create repository and first commit | §6 | 0004, 0011 | A2, A3, W4, W5, X1 | E21, E26, E27, E28, E43, E45, E48, Q3, Q4, Q10, Q28, Q29 | `project.create.apply` | door43/writes, operations | S1 |
| [#31](https://github.com/unfoldingWord-box3/tc-admin-app/issues/31) Setup incomplete | §6; §11 `setup_incomplete` | — | W4, X1, X2, A2 | E19, E45, E63, Q29 | `project.create.retry` | operations, door43/writes, model/git-blob, web | — |
| [#167](https://github.com/unfoldingWord/tc-admin-app/issues/167) Create projects with the default branch main | §6 | 0008 | W1, W5 | E21, E27, E45, E79, E80 | `project.create.plan`, `project.create.apply` | model/burrito, door43/writes, operations, scripts/probe, scripts/seed-qa | S1 |
| [#170](https://github.com/unfoldingWord/tc-admin-app/issues/170) Take a repository's default branch only from its default_branch | §6, §10 | 0008 | H3, R5 | E14, E79 | `release.plan`, `release.prepare`, `release.create`, `preparation.read`, `source.search`, `project.create.apply`, `project.create.retry` | door43/catalog, door43/writes, scripts | — |
| [#170](https://github.com/unfoldingWord/tc-admin-app/issues/170) Take a repository's default branch only from its default_branch | §6, §10 | 0008 | H3, R5 | E14, E79, E81 | `release.plan`, `release.prepare`, `release.create`, `preparation.read`, `source.search`, `project.create.apply`, `project.create.retry` | door43/catalog, door43/writes, scripts | — |

### EPIC: Selective release ([#41](https://github.com/unfoldingWord-box3/tc-admin-app/issues/41))

Expand Down
17 changes: 17 additions & 0 deletions fixtures/door43/qa.door43.org/2026-10-10/release-flow/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Door43 fixtures, qa.door43.org, 10 October 2026: the release flow on a project on main

`tc-admin-qa-org/` was recorded by `node --env-file=.env scripts/probe/qa-release-probe.mjs --owner tc-admin-qa-org`, which runs the Worker's own operation code (bundled with esbuild) against QA with `TEST_TOKEN` standing in for the session's token, as on 7 October 2026 (E54). The code is #170's: a repository's default branch is the `default_branch` Door43 answers for it, and the catalog's `latest` stage gives its head only when it names that branch. DCS `28.1.0+dcs.19-g41cde8ce33`. Every Door43 request in the run is one numbered file in the usual request and response wrapper, the token and every email redacted. These reductions are made, and no others:

- Request bodies: the bodies of the three content writes the operations made (`10`, `49`, `71`) are replaced by their length.
- Response contents: a file the contents endpoint answered as more than 4,000 characters of base64 is replaced by its length: the license in `10`, and MAT and MRK in `49`. The smaller files stay inline: `metadata.json` and `README.md` in `10`, `metadata.json` in `49`.
- Archives: the Scripture Burrito zips in `19`, `44`, `45`, `66`, and `67` are recorded as `archive_bytes: null`, and the one in `57` as its size alone.
- Seven exchanges carry no request headers: `11`, `12`, `33`, `34`, `35`, `57`, and `75`. The two writes onto `main`, `11` and `34`, keep only the URL, a note where the body was, the status, and the commit sha, so the branch each request named is not recorded. Their landing on `main` is witnessed by `12` and `35`, where the catalog's `latest` names `main` at those shas (`c9acaba290`, then `a7cf701557`).

| Phase | Files | What happened |
| --- | --- | --- |
| seed | `01`–`11`, `seed-receipt.json` | `project.create.plan` and `project.create.apply` created `tc-admin-qa-org/id_tcar0228` on `main` (#167); one `POST /contents` on `main` (`11`) added MAT and JHN from `bahtraku/Perjanjian-Baru-Pendau`, taken at the branch that repository's own read names (`master`, E14); that read and the file reads are not recorded |
| first release | to `33`, `release-plan-1.json` to `release-promote-1.json` | both books `new` and included, `v1.0.0`; prepared "from main at c9acaba290"; created as a pre-release, then promoted |
| second release | `34`–`57`, `release-plan-2.json` to `release-create-2.json` | one `POST /contents` on `main` revising MAT and adding MRK (`34`); released as `v1.1.0`, prepared "from main at a7cf701557" |
| discard | `58`–`75`, `release-plan-3.json`, `release-prepare-3.json`, `preparation-discard-3.json` | `v1.1.1` prepared, then discarded: one `DELETE` of its branch (`74`, 204); `GET /branches` lists `main` only (`75`) |

`summary.json` holds the per-phase results. The facts derived are E81 in `docs/evidence.md`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"request": {
"method": "GET",
"url": "https://qa.door43.org/api/v1/user",
"headers": {
"accept": "application/json",
"authorization": "token [redacted]"
}
},
"response": {
"status": 200,
"ms": 143,
"json": {
"id": 53535,
"login": "tc-admin-qa",
"type": "User",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "[redacted]",
"avatar_url": "https://qa.door43.org/avatar/24c57f97f6d61763c6943b3163fd56963d562817f0b1eacbe77c613c44c8c1de",
"html_url": "https://qa.door43.org/tc-admin-qa",
"language": "en-US",
"is_admin": false,
"last_login": "2026-10-10T02:20:31Z",
"created": "2026-09-22T15:34:43Z",
"restricted": false,
"active": true,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"repo_languages": [
"id"
],
"repo_subjects": [
"Bible"
],
"repo_metadata_types": [
"sb"
],
"username": "tc-admin-qa"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
{
"request": {
"method": "GET",
"url": "https://qa.door43.org/api/v1/user/teams?page=1&limit=50",
"headers": {
"accept": "application/json",
"authorization": "token [redacted]"
}
},
"response": {
"status": 200,
"ms": 119,
"json": [
{
"id": 451,
"name": "Owners",
"description": "",
"organization": {
"id": 53536,
"name": "tc-admin-qa-org",
"full_name": "",
"email": "",
"avatar_url": "https://qa.door43.org/avatars/88aa03889f005577f41f98bd8e2e04ed",
"description": "",
"website": "",
"location": "",
"visibility": "public",
"repo_admin_change_team_access": true,
"username": "tc-admin-qa-org",
"repo_languages": [
"en",
"fr",
"id",
"ums",
"xdy-x-dayaklau"
],
"repo_subjects": [
"Bible",
"Open Bible Stories"
],
"repo_metadata_types": [
"sb"
]
},
"includes_all_repositories": true,
"permission": "owner",
"units": [
"repo.pulls",
"repo.releases",
"repo.wiki",
"repo.ext_wiki",
"repo.actions",
"repo.ext_issues",
"repo.projects",
"repo.packages",
"repo.code",
"repo.issues"
],
"units_map": {
"repo.code": "owner",
"repo.pulls": "owner",
"repo.projects": "owner",
"repo.actions": "owner",
"repo.issues": "owner",
"repo.releases": "owner",
"repo.wiki": "owner",
"repo.ext_wiki": "read",
"repo.ext_issues": "read",
"repo.packages": "owner"
},
"can_create_org_repo": true,
"visibility": "limited"
},
{
"id": 387,
"name": "Owners",
"description": "",
"organization": {
"id": 53071,
"name": "BurritoTruck",
"full_name": "",
"email": "",
"avatar_url": "https://qa.door43.org/avatars/baa3f3dd155d0143c14944166924e5b4ebb673581ebe54a9e3140a42b2a9dec8",
"description": "",
"website": "",
"location": "",
"visibility": "public",
"repo_admin_change_team_access": true,
"username": "BurritoTruck",
"repo_languages": [
"ar",
"en",
"es",
"fr",
"grc",
"hi",
"id",
"my",
"pt",
"ru"
],
"repo_subjects": [
"Aligned Bible",
"Bible",
"Juxtalinear",
"TSV Translation Notes",
"TSV Translation Questions",
"Unknown"
],
"repo_metadata_types": [
"sb"
]
},
"includes_all_repositories": true,
"permission": "owner",
"units": [
"repo.packages",
"repo.code",
"repo.issues",
"repo.pulls",
"repo.wiki",
"repo.ext_wiki",
"repo.actions",
"repo.releases",
"repo.ext_issues",
"repo.projects"
],
"units_map": {
"repo.code": "owner",
"repo.pulls": "owner",
"repo.releases": "owner",
"repo.wiki": "owner",
"repo.ext_wiki": "read",
"repo.issues": "owner",
"repo.ext_issues": "read",
"repo.projects": "owner",
"repo.packages": "owner",
"repo.actions": "owner"
},
"can_create_org_repo": true,
"visibility": "limited"
},
{
"id": 340,
"name": "Translators",
"description": "",
"organization": {
"id": 52799,
"name": "bahtraku",
"full_name": "Yayasan BahtraKu",
"email": "",
"avatar_url": "https://qa.door43.org/avatars/521e3eefbce89f0f66e62793e1badcc0",
"description": "",
"website": "https://bahtraku.org/",
"location": "",
"visibility": "public",
"repo_admin_change_team_access": true,
"username": "bahtraku",
"repo_languages": [
"adn",
"aqm",
"bjn",
"bkr-x-kalahien",
"bkr-x-pajuepat",
"btm",
"dun",
"iba-x-salako",
"id",
"kdy",
"knx-x-bajare",
"kod",
"kps-x-kaigar",
"kvb",
"lbx",
"lio",
"lmy",
"lra",
"lur",
"mhy-x-benualima",
"mvd",
"ors-x-oranglau",
"orz-x-rarankwa",
"pku",
"ret",
"saw",
"set-x-csentani",
"skv",
"sob",
"swr",
"tdt",
"tnm",
"tnm-x-yokari",
"tpf",
"ums",
"wew-x-loli",
"wnk",
"xdy-x-tamuan",
"xem-x-hibun",
"zlm-x-akit"
],
"repo_subjects": [
"Aligned Bible",
"Bible",
"Open Bible Stories",
"TSV OBS Study Notes",
"TSV OBS Study Questions",
"TSV OBS Translation Notes",
"TSV OBS Translation Questions",
"TSV OBS Translation Words Links",
"TSV Study Notes",
"TSV Study Questions",
"TSV Translation Notes",
"TSV Translation Questions",
"TSV Translation Words Links",
"Translation Academy",
"Translation Words"
],
"repo_metadata_types": [
"rc",
"sb"
]
},
"includes_all_repositories": true,
"permission": "admin",
"units": [
"repo.ext_wiki",
"repo.actions",
"repo.code",
"repo.issues",
"repo.wiki",
"repo.ext_issues",
"repo.projects",
"repo.packages",
"repo.pulls",
"repo.releases"
],
"units_map": {
"repo.actions": "none",
"repo.pulls": "admin",
"repo.wiki": "admin",
"repo.packages": "none",
"repo.code": "admin",
"repo.issues": "admin",
"repo.releases": "admin",
"repo.ext_wiki": "read",
"repo.ext_issues": "read",
"repo.projects": "admin"
},
"can_create_org_repo": false,
"visibility": "private"
}
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"request": {
"method": "GET",
"url": "https://qa.door43.org/api/v1/user/teams?page=2&limit=50",
"headers": {
"accept": "application/json",
"authorization": "token [redacted]"
}
},
"response": {
"status": 200,
"ms": 109,
"json": []
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"request": {
"method": "GET",
"url": "https://qa.door43.org/api/v1/repos/tc-admin-qa-org/id_tcar0228",
"headers": {
"accept": "application/json",
"authorization": "token [redacted]"
}
},
"response": {
"status": 404,
"ms": 112,
"json": {
"message": "not found",
"url": "https://qa.door43.org/api/swagger"
}
}
}
Loading
Loading