Public: anyone can read this; the crew can change it.
The Secrets card speaks the home page's language, at the forge, an organization and a repository #9723
Check · Review · Land · Live done — Landed and live in production.
The Secrets card is no longer a framed card. It's drawn the way the home page draws a block: a `<section class="settings-block">` with a small "Secrets" heading, one muted sentence, a `list setting-list` of rows and the set form below. `secretsCard()` in `src/web/pages/secrets.ts` is still the one function behind `/settings/secrets`, an organization's page and a repository's settings, so all three…
shipped production is serving it deploy a5a2512
The Secrets card is no longer a framed card. It's drawn the way the home page draws a block: a <section class="settings-block"> with a small "Secrets" heading, one muted sentence, a list setting-list of rows and the set form below. secretsCard() in src/web/pages/secrets.ts is still the one function behind /settings/secrets, an organization's page and a repository's settings, so all three change together. Gone: the card frame, the key icon in the head and the key icon in each row's lead. No class was added.
Nothing is lost:
- Each row still shows the name in monospace, when it was set and either "never used" or when it was last used, plus a Remove button.
- The value is still a password input that is never filled.
- Setting and removing are still plain posts to
/settings/secretsand/settings/secrets/delete. Those handlers, their same-origin check (readForm(ctx, "admin")) and the error messages are unchanged, and no error message repeats the value.
What to look at:
test/secrets-card.test.ts(new) renders the card at the forge, under an organization and on a repository, and checks that:
- all three have the same class names;
- each is a settings-block with a setting-list, and has no card, card-head or row-lead;
- each row keeps its name, set time and used time, and the value field stays an empty password input.
Run against the old card, the second test fails.
docs/design/areas/secrets.md(new) says how the block is put together and points tosettings.mdfor the classes it uses.
I left out new styles and any change to the org page and repository settings: both already wrap the card in a .mt div, which spaces the new block the same way.
Checks: bun scripts/gate.ts, bun x tsc --noEmit and bun scripts/design-lint.ts all pass. scripts/fast.ts named 1211 test files, too broad to run here, so I ran the ones that cover this change myself, and all passed:
test/secrets-*.test.ts, including the timing testsettings-secret-delete,settings-routes,tui-secrets,run-secretsandsecret-store- the design tests
- a sample of repository and organization settings tests
The issue asked for a keep_plan tool, but this run didn't have one, so no plan was posted on the issue.
To try it: as a forge admin, open /settings/secrets, an organization's page, and a repository's /settings. Set a secret, check that its row shows "never used", then remove it.
🤖 Generated with Claude Code
The Secrets card is no longer a framed card. It's drawn the way the home page draws a block: a <section class="settings-block"> with a small "Secrets" heading, one muted sentence, a list setting-list of rows and the set form below. secretsCard() in src/web/pages/secrets.ts is the one function behind /settings/secrets, an organization's page and a repository's settings, so all three change together. The card frame, the key icon in its head and the key icon in each row's lead are gone. No class was added.
Nothing is lost:
- Each row still shows the name in monospace, when it was set and either "never used" or when it was last used, plus a Remove button.
- The value is still a password input that is never filled.
- Setting and removing are still plain posts to
/settings/secretsand/settings/secrets/delete. Those handlers, their same-origin check (readForm(ctx, "admin")) and the error messages are unchanged, and no error message repeats the value.
What to look at:
test/secrets-card.test.ts(new) renders the card at the forge, under an organization and on a repository, and checks that:
- all three have the same class names;
- each is a settings-block with a setting-list, and has no card, card-head or row-lead;
- each row keeps its name, set time and used time, and the value field stays an empty password input.
Run against the old card, the second test fails.
docs/design/areas/secrets.md(new) says how the block is put together and points tosettings.mdfor the classes it uses.- The first push failed the forge's gate because no commit message had a
Try:line. The second commit is empty and adds that line, so history wasn't rewritten.bun scripts/gate.tsnow passes when given the pull's base.
I left out new styles and any change to the org page and repository settings: both already wrap the card in a .mt div, which spaces the new block the same way.
Checks: bun x tsc --noEmit and bun scripts/design-lint.ts pass. scripts/fast.ts named 1211 test files, too broad to run here, so I ran the ones that cover this change myself, and all passed:
test/secrets-*.test.ts, including the timing testsettings-secret-delete,settings-routes,tui-secrets,run-secretsandsecret-store- the design tests
- a sample of repository and organization settings tests
The issue asked for a keep_plan tool, but this run didn't have one, so no plan was posted on the issue.
Try: as a forge admin, open /settings/secrets, an organization's page and a repository's /settings. Each shows the same Secrets block. Set a NAME with a value, check that its row says "never used", then remove it.
🤖 Generated with Claude Code
The card is correctly unboxed, the three places share one function, nothing is lost, and the test covers the classes. One finding breaks a design principle. Fix first: cut the intro paragraph to one sentence (see the comment). Everything else is fine: write-only password input, same-origin handlers untouched, no new classes, README untouched.
The Secrets card is no longer a framed card. It's drawn the way the home page draws a block: a <section class="settings-block"> with a small "Secrets" heading, one muted sentence ("Sealed values the forge hands to a run by name; the narrowest place wins."), a list setting-list of rows and the set form below. secretsCard() in src/web/pages/secrets.ts is the one function behind /settings/secrets, an organization's page and a repository's settings, so all three change together. Gone: the card frame, the key icon in its head and in each row's lead, and the four-sentence intro with its WHERE[scope] text. No class was added.
Nothing is lost:
- Each row still shows the name in monospace, when it was set and either "never used" or when it was last used, plus a Remove button.
- The value is still a password input that is never filled.
- Setting and removing are still plain posts to
/settings/secretsand/settings/secrets/delete. Those handlers, their same-origin check (readForm(ctx, "admin")) and the error messages are unchanged, and no error message repeats the value.
What to look at:
test/secrets-card.test.ts(new) renders the card at the forge, under an organization and on a repository, and checks that:
- all three have the same class names;
- each is a settings-block with a setting-list, and has no card, card-head or row-lead;
- each row keeps its name, set time and used time, and the value field stays an empty password input;
- the intro is one sentence and is the same in all three places.
Run against the old card, the second test fails, and the last one fails on the old four-sentence intro.
docs/design/areas/secrets.md(new) says how the block is put together, gives the one sentence, and points tosettings.mdfor the classes it uses.- The review's request is done in the last commit: the intro is cut to the suggested sentence, the area doc matches it, and the new assertion holds it.
- The second commit is empty and only adds the
Try:line the gate asks for, so history wasn't rewritten.
I left out new styles and any change to the org page and repository settings: both already wrap the card in a .mt div, which spaces the new block the same way.
Checks: bun scripts/gate.ts (given the pull's base), bun x tsc --noEmit and bun scripts/design-lint.ts pass. scripts/fast.ts named 1211 test files, too broad to run here, so I ran the tests that cover the card myself, and they pass:
test/secrets-*.test.ts, including the timing testsettings-secret-delete,settings-routesandturnstile
On the first push I also ran these, and they passed; they were not re-run after the intro change:
tui-secrets,run-secretsandsecret-store- the design tests
- a sample of repository and organization settings tests
The issue asked for a keep_plan tool, but this run didn't have one, so no plan was posted on the issue.
Try: as a forge admin, open /settings/secrets, an organization's page and a repository's /settings. Each shows the same Secrets block, opening with one sentence. Set a NAME with a value, check that its row says "never used", then remove it.
🤖 Generated with Claude Code
The earlier ask (cut the four-sentence intro to one) is met: one muted sentence, the same in all three places, held by a test. The block is a heading over rows with no card frame and no icons, and the Secrets form posts, same-origin check and write-only password field are unchanged. No new class, no README change, no new dependency. Non-blocking: the long line in docs/design/areas/secrets.md could be wrapped.
The Secrets card is no longer a framed card. It's drawn the way the home page draws a block: a
<section class="settings-block">with a small "Secrets" heading, one muted sentence, alist setting-listof rows and the set form below.secretsCard()insrc/web/pages/secrets.tsis still the one function behind/settings/secrets, an organization's page and a repository's settings, so all three change together. Gone: the card frame, the key icon in the head and the key icon in each row's lead. No class was added.Nothing is lost:
/settings/secretsand/settings/secrets/delete. Those handlers, their same-origin check (readForm(ctx, "admin")) and the error messages are unchanged, and no error message repeats the value.What to look at:
test/secrets-card.test.ts(new) renders the card at the forge, under an organization and on a repository, and checks that:- all three have the same class names; - each is a
settings-blockwith asetting-list, and has nocard,card-headorrow-lead; - each row keeps its name, set time and used time, and the value field stays an empty password input.Run against the old card, the second test fails.
docs/design/areas/secrets.md(new) says how the block is put together and points tosettings.mdfor the classes it uses.I left out new styles and any change to the org page and repository settings: both already wrap the card in a
.mtdiv, which spaces the new block the same way.Checks:
bun scripts/gate.ts,bun x tsc --noEmitandbun scripts/design-lint.tsall pass.scripts/fast.tsnamed 1211 test files, too broad to run here, so I ran the ones that cover this change myself, and all passed:test/secrets-*.test.ts, including the timing testsettings-secret-delete,settings-routes,tui-secrets,run-secretsandsecret-storeThe issue asked for a
keep_plantool, but this run didn't have one, so no plan was posted on the issue.To try it: as a forge admin, open
/settings/secrets, an organization's page, and a repository's/settings. Set a secret, check that its row shows "never used", then remove it.🤖 Generated with Claude Code
Closes #9718