registry: a package's capability summary #51

Closed
opened 2026-10-05 21:07:14 +00:00 by orion · 6 comments
Collaborator

Context

Which std package is which capability (RELEASE.md section 7.8), summed up per published package and shown by the registry.

Source

Acceptance criteria

  • The capability table in the docs
  • torb publish records the summary
  • The registry shows it

Dependencies

None known.

Moved from the planning lists of the docs; the design record stays the specification.

## Context Which `std` package is which capability (RELEASE.md section 7.8), summed up per published package and shown by the registry. ## Source - [NETWORK.md slice 11](https://git.torb.dev/torbscript/language/src/commit/393ef2608e4a60b8ff76d8b6b408951b822d887d/docs/design/NETWORK.md#L750) - [RELEASE.md readiness](https://git.torb.dev/torbscript/language/src/commit/393ef2608e4a60b8ff76d8b6b408951b822d887d/docs/design/RELEASE.md#L107) ## Acceptance criteria - [ ] The capability table in the docs - [ ] `torb publish` records the summary - [ ] The registry shows it ## Dependencies None known. _Moved from the planning lists of the docs; the design record stays the specification._
Author
Collaborator

[loop:torbscript] intake: in scope (author orion, label loop), sources NETWORK.md slice 11 and RELEASE.md 7.8, not a duplicate, no collision with a design record. Touches torb publish, the registry index and the registry page (tools/registry, depends on the registry slices of #16); no seed impact expected. next: refine, waiting (ready buffer full: #4, #163, #164, #223 are ready) until 2026-10-10T04:00:00Z

[loop:torbscript] intake: in scope (author orion, label loop), sources NETWORK.md slice 11 and RELEASE.md 7.8, not a duplicate, no collision with a design record. Touches `torb publish`, the registry index and the registry page (`tools/registry`, depends on the registry slices of #16); no seed impact expected. next: refine, waiting (ready buffer full: #4, #163, #164, #223 are ready) until 2026-10-10T04:00:00Z
Author
Collaborator

[loop:torbscript] claim refine by session:loop-torbscript-20261023 until 2026-10-23T03:19:32Z

[loop:torbscript] claim refine by session:loop-torbscript-20261023 until 2026-10-23T03:19:32Z
Author
Collaborator

[loop:torbscript] decided by the loop: scope of this issue is the remaining gap, not the whole slice. Checked on main (2bdab4d6): torb publish already derives and prints the capabilities (capabilitiesOf, compiler/src/package/archive.trb, docs/tooling/torb-publish.md), the registry re-derives them on receipt (tools/registry/src/upload.trb), the index line capabilities "..." carries them, and the package page shows them as chips for the latest version only (currentLines, tools/registry/src/packages.trb). Open: (1) no capability table in the docs as a table, (2) the releases table keeps no capabilities, so the versions table cannot show them per version and cannot flag a gain, (3) RELEASE.md 7.8's "gained since" line. Why this cut: it follows RELEASE.md 7.8 and NETWORK.md slice 11 and fits one PR.

[loop:torbscript] decided by the loop: left out of this issue, each its own later step (just in time, none filed now): moving the table from the toolchain into std ("lives in std", RELEASE.md 7.8, plus the test that every machine-reaching std package is listed), and the transitive view over the dependency graph. Why: the table move touches the compiler's lookup and is a separate commit set; the transitive view needs the resolved graph. Neither blocks the per-version summary. Capabilities of releases published before the column exists are "not recorded" (nullable column, migration like the earlier ALTER TABLE ones in database.trb), shown as such, and no gain is flagged against an unrecorded predecessor: guessing "none" would be a false claim on a security display.

[loop:torbscript] decided by the loop: **scope of this issue is the remaining gap, not the whole slice.** Checked on `main` (2bdab4d6): `torb publish` already derives and prints the capabilities (`capabilitiesOf`, `compiler/src/package/archive.trb`, docs/tooling/torb-publish.md), the registry re-derives them on receipt (`tools/registry/src/upload.trb`), the index line `capabilities "..."` carries them, and the package page shows them as chips for the latest version only (`currentLines`, `tools/registry/src/packages.trb`). Open: (1) no capability table in the docs as a table, (2) the `releases` table keeps no capabilities, so the versions table cannot show them per version and cannot flag a gain, (3) RELEASE.md 7.8's "gained since" line. Why this cut: it follows RELEASE.md 7.8 and NETWORK.md slice 11 and fits one PR. [loop:torbscript] decided by the loop: **left out of this issue, each its own later step (just in time, none filed now):** moving the table from the toolchain into `std` ("lives in std", RELEASE.md 7.8, plus the test that every machine-reaching `std` package is listed), and the transitive view over the dependency graph. Why: the table move touches the compiler's lookup and is a separate commit set; the transitive view needs the resolved graph. Neither blocks the per-version summary. Capabilities of releases published before the column exists are "not recorded" (nullable column, migration like the earlier `ALTER TABLE` ones in `database.trb`), shown as such, and no gain is flagged against an unrecorded predecessor: guessing "none" would be a false claim on a security display.
Author
Collaborator

[loop:torbscript] refine: ready. Goal: every version on a package page shows what its own imports reach, and a version that gains a capability over its predecessor is flagged (RELEASE.md 7.8; NETWORK.md slice 11).

Design record point: RELEASE.md 7.8 ("The capability summary") and the 7.x registry site section, which says "The capability summary (#51) is not built"; update that sentence and NETWORK.md slice 11 state in the same PR. Seed: no (no syntax, native, driver flag or string-looked-up std name; registry and docs only).

Acceptance criteria (testable):

  • Docs: a table page (docs/tooling, linked from torb-publish.md) lists each capability name with its std modules/names, taken from capabilityOf/capabilityOfImport, including the "pure values" rule; a registry test or docs check keeps the table and capabilityOf in step.
  • releases gets a nullable capabilities column (migration for existing databases, same pattern as deprecated), written at publish from upload.release.capabilities; a test publishes two versions and reads both back.
  • The package page's versions table has a Capabilities column per version (none for an empty recorded set, not recorded for NULL), escaped like other stored text.
  • A version whose recorded set has a capability its recorded predecessor lacks shows "gained: "; tests: gain, no gain, loss, unrecorded predecessor (no flag), first version (no flag).
  • GET /api/1/packages/... (if it lists releases) or the existing release listing carries capabilities per version; otherwise the page only.
  • RELEASE.md 7.8/site section and NETWORK.md slice 11 updated: per-version and gain done; std table and transitive view listed as the open remainder.
  • Gates: tools/registry tests and sh tools/gates.sh a in forge CI.

Size: one PR, two commits: docs(tooling): the capability table and feat(registry): capabilities per version and the gain flag. Dependencies: none (registry slices of #16 are in). The two left-out steps stay on the epic's checklist (#51 remains open until they are filed or decided dropped; the implementer closes only this step's boxes and notes the remainder).

Tokens: roughly 60k in this refine run. Releases claim claim refine by session:loop-torbscript-20261023.

[loop:torbscript] refine: ready. Goal: every version on a package page shows what its own imports reach, and a version that gains a capability over its predecessor is flagged (RELEASE.md 7.8; NETWORK.md slice 11). Design record point: RELEASE.md 7.8 ("The capability summary") and the 7.x registry site section, which says "The capability summary (#51) is not built"; update that sentence and NETWORK.md slice 11 state in the same PR. Seed: no (no syntax, native, driver flag or string-looked-up std name; registry and docs only). Acceptance criteria (testable): - [ ] Docs: a table page (docs/tooling, linked from `torb-publish.md`) lists each capability name with its `std` modules/names, taken from `capabilityOf`/`capabilityOfImport`, including the "pure values" rule; a registry test or docs check keeps the table and `capabilityOf` in step. - [ ] `releases` gets a nullable `capabilities` column (migration for existing databases, same pattern as `deprecated`), written at publish from `upload.release.capabilities`; a test publishes two versions and reads both back. - [ ] The package page's versions table has a Capabilities column per version (`none` for an empty recorded set, `not recorded` for NULL), escaped like other stored text. - [ ] A version whose recorded set has a capability its recorded predecessor lacks shows "gained: <names>"; tests: gain, no gain, loss, unrecorded predecessor (no flag), first version (no flag). - [ ] `GET /api/1/packages/...` (if it lists releases) or the existing release listing carries `capabilities` per version; otherwise the page only. - [ ] RELEASE.md 7.8/site section and NETWORK.md slice 11 updated: per-version and gain done; `std` table and transitive view listed as the open remainder. - Gates: `tools/registry` tests and `sh tools/gates.sh a` in forge CI. Size: one PR, two commits: `docs(tooling): the capability table` and `feat(registry): capabilities per version and the gain flag`. Dependencies: none (registry slices of #16 are in). The two left-out steps stay on the epic's checklist (#51 remains open until they are filed or decided dropped; the implementer closes only this step's boxes and notes the remainder). Tokens: roughly 60k in this refine run. Releases claim `claim refine by session:loop-torbscript-20261023`.
Author
Collaborator

[loop:torbscript] claim implement by session:loop-torbscript-20261023 until 2026-10-23T07:29:18Z

[loop:torbscript] claim implement by session:loop-torbscript-20261023 until 2026-10-23T07:29:18Z
Author
Collaborator

[loop:torbscript] implement: PR #406 is open and CI is green (gates, tier A and B, tools/registry, pdisc). Two commits: docs(tooling): the capability table and feat(registry): capabilities per version and the gain flag. What it does:

  • docs/tooling/package-capabilities.md, linked from torb-publish.md, and tools/registry/tests/capability-table.test.trb, which reads its tables and compares them with capabilityOf / capabilityOfImport.
  • Nullable releases.capabilities with a migration (NULL is not recorded, never none), written at publish; tests publish several versions and read the stored sets and pages back, and migrate an old database.
  • A Capabilities column per version on the package page (none, not recorded, escaped) and gained: <names> against the nearest earlier unyanked version. Tests: gain, no gain, loss, unrecorded predecessor, first version, yanked predecessor, escaping.
  • RELEASE.md 7.8 and NETWORK.md slice 11 updated. No API listing carries capabilities, so the page only. No seed refresh.

Open remainder, so #51 should stay open (the PR says Closes #51 as the contract asks; reopen on merge or split): the capability table in std itself and the transitive view over the dependency graph.

next: review

Token usage: not available to the subagent (spans two context windows).

[loop:torbscript] implement: PR https://git.torb.dev/torbscript/language/pulls/406 is open and CI is green (gates, tier A and B, tools/registry, pdisc). Two commits: `docs(tooling): the capability table` and `feat(registry): capabilities per version and the gain flag`. What it does: - `docs/tooling/package-capabilities.md`, linked from `torb-publish.md`, and `tools/registry/tests/capability-table.test.trb`, which reads its tables and compares them with `capabilityOf` / `capabilityOfImport`. - Nullable `releases.capabilities` with a migration (NULL is *not recorded*, never *none*), written at publish; tests publish several versions and read the stored sets and pages back, and migrate an old database. - A Capabilities column per version on the package page (`none`, `not recorded`, escaped) and `gained: <names>` against the nearest earlier unyanked version. Tests: gain, no gain, loss, unrecorded predecessor, first version, yanked predecessor, escaping. - RELEASE.md 7.8 and NETWORK.md slice 11 updated. No API listing carries capabilities, so the page only. No seed refresh. Open remainder, so #51 should stay open (the PR says `Closes #51` as the contract asks; reopen on merge or split): the capability table in `std` itself and the transitive view over the dependency graph. next: review Token usage: not available to the subagent (spans two context windows).
argus closed this issue 2026-10-23 02:29:05 +00:00
Sign in to join this conversation.
No labels
loop
ready
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
torbscript/language#51
No description provided.