From 40c88c48d1710704b075451c283e237863815c8b Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 06:51:55 -0400 Subject: [PATCH 1/9] Start prompts page sections closed with native toggles (#666) --- site/main.js | 19 +++++ site/prompts/index.html | 166 +++++++++++++++++++++------------------- site/styles.css | 10 ++- src/prompts_page.rs | 35 +++++---- 4 files changed, 134 insertions(+), 96 deletions(-) diff --git a/site/main.js b/site/main.js index a1ab2e8c..06b720f8 100644 --- a/site/main.js +++ b/site/main.js @@ -1,3 +1,22 @@ +// Reveal a linked prompt, skill or supporting file inside closed disclosures. +function revealFragment() { + let id; + try { id = decodeURIComponent(location.hash.slice(1)); } + catch { return; } + const target = document.getElementById(id); + if (!target) return; + let disclosure = target.closest("details"); + if (!disclosure) return; + while (disclosure) { + disclosure.open = true; + disclosure = disclosure.parentElement.closest("details"); + } + target.scrollIntoView({ block: "start" }); +} + +revealFragment(); +window.addEventListener("hashchange", revealFragment); + // Copy buttons: put the command next to the button on the clipboard. for (const button of document.querySelectorAll(".install button.copy")) { const code = button.closest(".install").querySelector("code"); diff --git a/site/prompts/index.html b/site/prompts/index.html index c317b8db..91eeac4b 100644 --- a/site/prompts/index.html +++ b/site/prompts/index.html @@ -33,21 +33,24 @@

Prompts and skills

-

The command line

How each session starts

+
+

The command lineHow each session starts

Every session runs claude headless in the Run's worktree, in auto permission mode. The Factory skills are linked into the worktree's .claude/skills/, where Claude Code finds them, and kept out of git. The prompt is one of the templates below.

claude -p --permission-mode auto --output-format stream-json --verbose <prompt>

A Resume continues the session that ended:

claude -p --permission-mode auto --output-format stream-json --verbose --resume <session id> <prompt>

With harness codex, each session runs codex exec --json --dangerously-bypass-approvals-and-sandbox -m <model> -c model_reasoning_effort="<effort>" -c project_doc_fallback_filenames=["CLAUDE.md"] <prompt> instead, without -m <model> or the Effort's -c where they are not set, and with resume <session id> before the prompt for a Resume. The Factory skills are linked into .agents/skills/, and a prompt's first line loads its skill as $thirdshift-<skill>.

+
-

Prompts

What a Run tells the agent

+
+

PromptsWhat a Run tells the agent

Every prompt a Run can send, with its placeholders highlighted: they change for each Run.

-
-

Fresh

+
+

Fresh

Starts the implement session, which goes on to review and open the pull request, when the Run starts a new Issue branch.

Sent by 2 · M · Implement

/thirdshift-implement <Issue URL>
@@ -59,9 +62,9 @@ 

Fresh

Include "Closes #<n>" in the PR body. You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
-
-
-

Continuation, with no pull request

+
+
+

Continuation, with no pull request

Starts the implement session when the Run is a Continuation of an Issue branch that has no pull request.

Sent by 2 · M · Implement

/thirdshift-implement <Issue URL>
@@ -83,9 +86,9 @@ 

Continuation, with no pull request

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Continuation, with an open pull request

+
+
+

Continuation, with an open pull request

Starts the implement session when the Run is a Continuation of an Issue branch whose pull request is open.

Sent by 2 · M · Implement

/thirdshift-implement <Issue URL>
@@ -107,9 +110,9 @@ 

Continuation, with an open pull request

- -
-

Spec review

+
+
+

Spec review

In a Spec run, starts the Spec review once every Ticket has landed on the Spec branch, before the Spec PR, a draft until then, is marked ready.

Sent by 3 · Y · Review

/thirdshift-code-review <base>, with the Spec <Spec URL> as the spec
@@ -131,9 +134,9 @@ 

Spec review

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Architecture review

+
+
+

Architecture review

Starts the Architecture review, the session an Architect run opens with, in a worktree at the head of the Base branch. The line naming the focus is left out when the command gives none.

Sent by an Architect run, before any unit

/thirdshift-improve-codebase-architecture
@@ -157,9 +160,9 @@ 

Architecture review

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security review

+
+
+

Security review

When enabled, runs one guidance review after a Run's opening session or a Spec run's Spec review, before Delivery pushes and enters the Repair loop. Ticket Runs get none; Base fixes get one too. Introduced findings, refusals or incomplete reviews hold Self-merge.

Sent by 3 · Y · Review

Use the `thirdshift-security-audit` skill in guidance mode.
@@ -181,9 +184,9 @@ 

Security review

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security audit

+
+
+

Security audit

Starts the report-only Security audit in a throwaway worktree at origin's Base branch head. The threat-model line is included when a conventional document exists; artifacts stay under the repository's audit root.

Sent by a Security run, before any unit

/thirdshift-security-audit
@@ -200,9 +203,9 @@ 

Security audit

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security reproduction

+
+
+

Security reproduction

After a Security audit, tries to reproduce one recorded finding in a fresh throwaway worktree at its audited commit. The test is copied into the private record only after a complete outcome.

Sent by a Security run, before any unit

Reproduce this recorded Security finding at audited commit `<audited commit>`.
@@ -219,9 +222,9 @@ 

Security reproduction

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Conflict Repair

+
+
+

Conflict Repair

Starts a Repair session when merging the Base branch into the Issue branch leaves conflicts.

Sent by 4 · K · Finish

/thirdshift-resolving-merge-conflicts
@@ -233,9 +236,9 @@ 

Conflict Repair

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security fix publishing

+
+
+

Security fix publishing

With fixing allowed, publishes a terse Ticket or Spec with Tickets for the most severe reproduced finding, reusing a private finding's issue. thirdshift checks and marks it ready before dispatching its Run or Spec run.

Sent by a Security run, before any unit

Publish the fix for this reproduced Security finding on Base branch `<base>`.
@@ -270,9 +273,9 @@ 

Security fix publishing

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Conflict Repair, on Foreign commits

+
+
+

Conflict Repair, on Foreign commits

In a Merge run, starts a Repair session when merging Foreign commits from the Issue branch on origin into the local one leaves conflicts.

Sent by 4 · K · Finish

/thirdshift-resolving-merge-conflicts
@@ -284,9 +287,9 @@ 

Conflict Repair, on Foreign commit You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.

- -
-

Review Repair

+
+
+

Review Repair

In a Merge run, starts a Repair session once Foreign commits are merged into the Issue branch, to review them from the head the Run last knew as its own before they can be merged.

Sent by 4 · K · Finish

/thirdshift-code-review <own head>
@@ -304,9 +307,9 @@ 

Review Repair

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

CI-fix Repair

+
+
+

CI-fix Repair

Starts a Repair session when CI fails on the pull request's head commit, listing each failed check.

Sent by 4 · K · Finish

CI failed on pull request <pull request URL> (branch <branch>, implementing <Issue URL>).
@@ -321,9 +324,9 @@ 

CI-fix Repair

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

CI-fix Repair, with Inherited failures

+
+
+

CI-fix Repair, with Inherited failures

Starts a Repair session when CI fails on the pull request's head commit and some of the failed checks, but not all, are Inherited failures: they also failed on the Base branch commit the head last merged in, so they are listed apart as not to fix.

Sent by 4 · K · Finish

CI failed on pull request <pull request URL> (branch <branch>, implementing <Issue URL>).
@@ -341,9 +344,9 @@ 

CI-fix Repair, with Inherited fail You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.

- -
-

Resume

+
+
+

Resume

Continues any session, once, that ended its turn with background work still running, which was killed with it.

Sent by 2 · M · Implement, 3 · Y · Review or 4 · K · Finish

Your background work (<background work>) was killed when your turn ended, because ending the turn ends the session.
@@ -352,17 +355,19 @@ 

Resume

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- +
+
-

Factory skills

The skills, as the agent reads them

+
+

Factory skillsThe skills, as the agent reads them

Every Factory skill and supporting file, raw, exactly as thirdshift writes it out.

-
-

thirdshift-code-review

+
+

thirdshift-code-review

Used by 3 · Y · Review

thirdshift-code-review/SKILL.md

---
@@ -474,9 +479,9 @@ 

thirdshift-code-re display_name: "Code Review" short_description: "Review a diff on standards and spec"

-
-
-

thirdshift-codebase-design

+
+
+

thirdshift-codebase-design

Used by the Architecture review, in an Architect run

thirdshift-codebase-design/SKILL.md

---
@@ -684,9 +689,9 @@ 

thirdshift-cod display_name: "Codebase Design" short_description: "Vocabulary for deep-module design"

- -
-

thirdshift-implement

+
+
+

thirdshift-implement

Used by 2 · M · Implement

thirdshift-implement/SKILL.md

---
@@ -712,9 +717,9 @@ 

thirdshift-implement policy: allow_implicit_invocation: true

- -
-

thirdshift-improve-codebase-architecture

+
+
+

thirdshift-improve-codebase-architecture

Used by the Architecture review, in an Architect run

thirdshift-improve-codebase-architecture/SKILL.md

---
@@ -969,9 +974,9 @@ 

policy: allow_implicit_invocation: true

- -
-

thirdshift-pr

+
+
+

thirdshift-pr

Used by 3 · Y · Review

thirdshift-pr/SKILL.md

---
@@ -1153,9 +1158,9 @@ 

thirdshift-pr/agents/openai display_name: "PR" short_description: "Write a PR body that's fast to review"

- -
-

thirdshift-resolving-merge-conflicts

+
+
+

thirdshift-resolving-merge-conflicts

Used by 4 · K · Finish, in a Repair

thirdshift-resolving-merge-conflicts/SKILL.md

---
@@ -1177,9 +1182,9 @@ 

thir display_name: "Resolving Merge Conflicts" short_description: "Resolve merge and rebase conflicts"

- -
-

thirdshift-security-audit

+
+
+

thirdshift-security-audit

Used by the Security audit, in a Security run, or a Security review

thirdshift-security-audit/SKILL.md

---
@@ -6529,9 +6534,9 @@ 

thirdsh } });

- -
-

thirdshift-tdd

+
+
+

thirdshift-tdd

Used by 2 · M · Implement

thirdshift-tdd/SKILL.md

---
@@ -6718,9 +6723,9 @@ 

thirdshift-tdd/tests.md

}); ```
- -
-

thirdshift-to-spec

+
+
+

thirdshift-to-spec

Used by the Architecture review, in an Architect run, or Security fix publishing, in a Security run

thirdshift-to-spec/SKILL.md

---
@@ -6810,9 +6815,9 @@ 

thirdshift-to-spec/age policy: allow_implicit_invocation: true

- -
-

thirdshift-to-tickets

+
+
+

thirdshift-to-tickets

Used by the Architecture review, in an Architect run, or Security fix publishing, in a Security run

thirdshift-to-tickets/SKILL.md

---
@@ -6925,13 +6930,15 @@ 

thirdshift-to-ticke policy: allow_implicit_invocation: true

- +
+
-

Licence and credits

Whose skills these are

+
+

Licence and creditsWhose skills these are

Most Factory skills are adapted from Matt Pocock's skills, under the licence below. The thirdshift-pr skill credits Dex Horthy's show-me skill in its CREDITS.md. The thirdshift-security-audit skill is copied from Cloudflare's security-audit-skill, under its own MIT licence, with its upstream repository and commit recorded in CREDITS.md.

LICENSE

MIT License
@@ -6956,6 +6963,7 @@ 

LICENSE

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/site/styles.css b/site/styles.css index 7e192c1c..8195c8a3 100644 --- a/site/styles.css +++ b/site/styles.css @@ -310,11 +310,17 @@ body::after { /* scanlines */ /* ---------- Prompts and skills: job sheets ---------- */ .page-head .home { display: block; color: inherit; } .paper-sheet .as-of { margin: 0; font-size: 14px; color: #444; max-width: 90ch; } +.section-disclosure > summary, .job-sheet > summary { cursor: pointer; } +.section-disclosure > summary { display: list-item; } +.section-disclosure > summary h2, .job-sheet > summary h3 { display: inline; } +.section-disclosure .eyebrow { display: block; margin-bottom: 12px; } +.section-disclosure:not([open]) > summary { margin-bottom: 0; } .job-sheets { display: grid; gap: 28px; } -.job-sheet { display: grid; gap: 10px; align-content: start; border-top: 4px solid var(--c); padding-top: 12px; min-width: 0; } +.job-sheet { border-top: 4px solid var(--c); padding-top: 12px; min-width: 0; } +.job-sheet > :not(summary) { margin-top: 10px; } .job-sheet h3 { font-size: 30px; } .job-sheet h4 { margin: 10px 0 0; font: 700 13px/1.3 var(--f-mono); color: var(--dim); } -.job-sheet p { margin: 0; max-width: 90ch; } +.job-sheet p { margin-bottom: 0; max-width: 90ch; } .sent-by { font-size: 13px; color: var(--dim); } .job-text { margin: 0; padding: 14px 16px; background: #000; border: 1px solid var(--rule); font-size: 13px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; } diff --git a/src/prompts_page.rs b/src/prompts_page.rs index 37b29adf..94064799 100644 --- a/src/prompts_page.rs +++ b/src/prompts_page.rs @@ -439,12 +439,14 @@ fn command_line(html: &mut String) { html, r##"
-

The command line

How each session starts

+
+

The command lineHow each session starts

Every session runs claude headless in the Run's worktree, in auto permission mode. The Factory skills are linked into the worktree's .claude/skills/, where Claude Code finds them, and kept out of git. The prompt is one of the templates below.

{new}

A Resume continues the session that ended:

{resume}

{codex}

+
"##, @@ -458,7 +460,8 @@ fn prompt_section(html: &mut String) { html.push_str( r##"
-

Prompts

What a Run tells the agent

+
+

PromptsWhat a Run tells the agent

Every prompt a Run can send, with its placeholders highlighted: they change for each Run.

"##, @@ -466,12 +469,12 @@ fn prompt_section(html: &mut String) { for prompt in prompts() { let _ = write!( html, - r##"
-

{title}

+ r##"
+

{title}

{when}

Sent by {sender}

{text}
-
+
"##, id = prompt.id, title = prompt.title, @@ -480,14 +483,15 @@ fn prompt_section(html: &mut String) { text = highlighted(&prompt.text), ); } - html.push_str("
\n \n
\n"); + html.push_str(" \n \n \n\n"); } fn skills_section(html: &mut String) { html.push_str( r##"
-

Factory skills

The skills, as the agent reads them

+
+

Factory skillsThe skills, as the agent reads them

Every Factory skill and supporting file, raw, exactly as thirdshift writes it out.

"##, @@ -498,8 +502,8 @@ fn skills_section(html: &mut String) { let name = skill.path().to_string_lossy(); let _ = write!( html, - r##"
-

{name}

+ r##"
+

{name}

Used by {used_by}

"##, used_by = skill_used_by(&name), @@ -516,16 +520,17 @@ fn skills_section(html: &mut String) { for file in files { file_block(html, file, " "); } - html.push_str("
\n"); + html.push_str("
\n"); } - html.push_str("
\n \n
\n"); + html.push_str(" \n \n \n\n"); } fn licence_section(html: &mut String) { html.push_str( r##"
-

Licence and credits

Whose skills these are

+
+

Licence and creditsWhose skills these are

Most Factory skills are adapted from Matt Pocock's skills, under the licence below. The thirdshift-pr skill credits Dex Horthy's show-me skill in its CREDITS.md. The thirdshift-security-audit skill is copied from Cloudflare's security-audit-skill, under its own MIT licence, with its upstream repository and commit recorded in CREDITS.md.

"##, ); @@ -539,7 +544,7 @@ fn licence_section(html: &mut String) { ); file_block(html, file, " "); } - html.push_str("
\n
\n"); + html.push_str(" \n \n\n"); } /// Every file under `dir`, at any depth. @@ -673,7 +678,7 @@ mod tests { let (_, card) = html .split_once(&format!("id=\"skill-{name}\"")) .expect("the page lists the publishing skill"); - let (card, _) = card.split_once("").unwrap(); + let (card, _) = card.split_once("").unwrap(); let (_, usage) = card .split_once("Used by ") .expect("the card names its users"); @@ -689,7 +694,7 @@ mod tests { let (_, skill) = html .split_once("id=\"skill-thirdshift-security-audit\"") .expect("the page lists thirdshift-security-audit"); - let (skill, _) = skill.split_once("").unwrap(); + let (skill, _) = skill.split_once("").unwrap(); assert!(skill.contains("Security run") && skill.contains("Security review")); assert!(skill.contains("MIT License")); assert!(skill.contains("Copyright (c) 2025-2026 Cloudflare, Inc.")); From 5f427764b99e6d62e4bf950b936dcbc205ab91cc Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 10:52:25 +0000 Subject: [PATCH 2/9] Collapse prompts page sections and job sheets by default (#666) --- site/main.js | 27 +++++ site/prompts/index.html | 216 +++++++++++++++++++++++++--------------- site/styles.css | 9 +- site/tests/prompts.cjs | 75 ++++++++++++++ src/prompts_page.rs | 75 +++++++++++--- 5 files changed, 307 insertions(+), 95 deletions(-) create mode 100644 site/tests/prompts.cjs diff --git a/site/main.js b/site/main.js index a1ab2e8c..761c11fe 100644 --- a/site/main.js +++ b/site/main.js @@ -14,6 +14,33 @@ for (const button of document.querySelectorAll(".install button.copy")) { }); } +// Fragment links reveal the destination inside the Prompts page's closed +// disclosures, including links to a skill's supporting file. +if (document.querySelector(".section-disclosure")) { + function revealFragment(hash) { + let id; + try { id = decodeURIComponent(hash.slice(1)); } + catch { return; } + const target = document.getElementById(id); + if (!target) return; + let disclosure = target.closest("details"); + if (!disclosure) return; + while (disclosure) { + disclosure.open = true; + disclosure = disclosure.parentElement.closest("details"); + } + target.scrollIntoView({ block: "start" }); + } + + revealFragment(location.hash); + addEventListener("hashchange", () => revealFragment(location.hash)); + // Following the current fragment again emits no hashchange. + document.addEventListener("click", (event) => { + const link = event.target.closest('a[href^="#"]'); + if (link && link.hash === location.hash) revealFragment(link.hash); + }); +} + // The Prompts and skills page's commit label: the commit of main the deploy // published, from the commit.txt it writes. Without one (e.g. served locally), // the label keeps its generic text. diff --git a/site/prompts/index.html b/site/prompts/index.html index c317b8db..74380e5a 100644 --- a/site/prompts/index.html +++ b/site/prompts/index.html @@ -33,21 +33,25 @@

Prompts and skills

-

The command line

How each session starts

+
+ The command line

How each session starts

Every session runs claude headless in the Run's worktree, in auto permission mode. The Factory skills are linked into the worktree's .claude/skills/, where Claude Code finds them, and kept out of git. The prompt is one of the templates below.

claude -p --permission-mode auto --output-format stream-json --verbose <prompt>

A Resume continues the session that ended:

claude -p --permission-mode auto --output-format stream-json --verbose --resume <session id> <prompt>

With harness codex, each session runs codex exec --json --dangerously-bypass-approvals-and-sandbox -m <model> -c model_reasoning_effort="<effort>" -c project_doc_fallback_filenames=["CLAUDE.md"] <prompt> instead, without -m <model> or the Effort's -c where they are not set, and with resume <session id> before the prompt for a Resume. The Factory skills are linked into .agents/skills/, and a prompt's first line loads its skill as $thirdshift-<skill>.

+
-

Prompts

What a Run tells the agent

+
+ Prompts

What a Run tells the agent

Every prompt a Run can send, with its placeholders highlighted: they change for each Run.

-
-

Fresh

+
+

Fresh

+

Starts the implement session, which goes on to review and open the pull request, when the Run starts a new Issue branch.

Sent by 2 · M · Implement

/thirdshift-implement <Issue URL>
@@ -59,9 +63,11 @@ 

Fresh

Include "Closes #<n>" in the PR body. You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
-
-
-

Continuation, with no pull request

+
+
+
+

Continuation, with no pull request

+

Starts the implement session when the Run is a Continuation of an Issue branch that has no pull request.

Sent by 2 · M · Implement

/thirdshift-implement <Issue URL>
@@ -83,9 +89,11 @@ 

Continuation, with no pull request

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Continuation, with an open pull request

+
+
+
+

Continuation, with an open pull request

+

Starts the implement session when the Run is a Continuation of an Issue branch whose pull request is open.

Sent by 2 · M · Implement

/thirdshift-implement <Issue URL>
@@ -107,9 +115,11 @@ 

Continuation, with an open pull request

- -
-

Spec review

+
+
+
+

Spec review

+

In a Spec run, starts the Spec review once every Ticket has landed on the Spec branch, before the Spec PR, a draft until then, is marked ready.

Sent by 3 · Y · Review

/thirdshift-code-review <base>, with the Spec <Spec URL> as the spec
@@ -131,9 +141,11 @@ 

Spec review

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Architecture review

+
+
+
+

Architecture review

+

Starts the Architecture review, the session an Architect run opens with, in a worktree at the head of the Base branch. The line naming the focus is left out when the command gives none.

Sent by an Architect run, before any unit

/thirdshift-improve-codebase-architecture
@@ -157,9 +169,11 @@ 

Architecture review

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security review

+
+
+
+

Security review

+

When enabled, runs one guidance review after a Run's opening session or a Spec run's Spec review, before Delivery pushes and enters the Repair loop. Ticket Runs get none; Base fixes get one too. Introduced findings, refusals or incomplete reviews hold Self-merge.

Sent by 3 · Y · Review

Use the `thirdshift-security-audit` skill in guidance mode.
@@ -181,9 +195,11 @@ 

Security review

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security audit

+
+
+
+

Security audit

+

Starts the report-only Security audit in a throwaway worktree at origin's Base branch head. The threat-model line is included when a conventional document exists; artifacts stay under the repository's audit root.

Sent by a Security run, before any unit

/thirdshift-security-audit
@@ -200,9 +216,11 @@ 

Security audit

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security reproduction

+
+
+
+

Security reproduction

+

After a Security audit, tries to reproduce one recorded finding in a fresh throwaway worktree at its audited commit. The test is copied into the private record only after a complete outcome.

Sent by a Security run, before any unit

Reproduce this recorded Security finding at audited commit `<audited commit>`.
@@ -219,9 +237,11 @@ 

Security reproduction

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Conflict Repair

+
+
+
+

Conflict Repair

+

Starts a Repair session when merging the Base branch into the Issue branch leaves conflicts.

Sent by 4 · K · Finish

/thirdshift-resolving-merge-conflicts
@@ -233,9 +253,11 @@ 

Conflict Repair

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Security fix publishing

+
+
+
+

Security fix publishing

+

With fixing allowed, publishes a terse Ticket or Spec with Tickets for the most severe reproduced finding, reusing a private finding's issue. thirdshift checks and marks it ready before dispatching its Run or Spec run.

Sent by a Security run, before any unit

Publish the fix for this reproduced Security finding on Base branch `<base>`.
@@ -270,9 +292,11 @@ 

Security fix publishing

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

Conflict Repair, on Foreign commits

+
+
+
+

Conflict Repair, on Foreign commits

+

In a Merge run, starts a Repair session when merging Foreign commits from the Issue branch on origin into the local one leaves conflicts.

Sent by 4 · K · Finish

/thirdshift-resolving-merge-conflicts
@@ -284,9 +308,11 @@ 

Conflict Repair, on Foreign commit You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.

- -
-

Review Repair

+
+
+
+

Review Repair

+

In a Merge run, starts a Repair session once Foreign commits are merged into the Issue branch, to review them from the head the Run last knew as its own before they can be merged.

Sent by 4 · K · Finish

/thirdshift-code-review <own head>
@@ -304,9 +330,11 @@ 

Review Repair

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

CI-fix Repair

+
+
+
+

CI-fix Repair

+

Starts a Repair session when CI fails on the pull request's head commit, listing each failed check.

Sent by 4 · K · Finish

CI failed on pull request <pull request URL> (branch <branch>, implementing <Issue URL>).
@@ -321,9 +349,11 @@ 

CI-fix Repair

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- -
-

CI-fix Repair, with Inherited failures

+
+
+
+

CI-fix Repair, with Inherited failures

+

Starts a Repair session when CI fails on the pull request's head commit and some of the failed checks, but not all, are Inherited failures: they also failed on the Base branch commit the head last merged in, so they are listed apart as not to fix.

Sent by 4 · K · Finish

CI failed on pull request <pull request URL> (branch <branch>, implementing <Issue URL>).
@@ -341,9 +371,11 @@ 

CI-fix Repair, with Inherited fail You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.

- -
-

Resume

+
+
+
+

Resume

+

Continues any session, once, that ended its turn with background work still running, which was killed with it.

Sent by 2 · M · Implement, 3 · Y · Review or 4 · K · Finish

Your background work (<background work>) was killed when your turn ended, because ending the turn ends the session.
@@ -352,17 +384,21 @@ 

Resume

You run headless: nobody is watching, and ending your turn ends the session. Run tests and other long commands in the foreground, raising the command's timeout if needed. If a command is moved to the background, wait for that task by its own task id or output file, never by process names or patterns (`pgrep`, `ps | grep`, and the like): other sessions on this machine run the same commands. Never end your turn while a background task you depend on is still running: ending the turn kills it. Before ending your turn, stop every background task you no longer need, by its task id (with the `TaskStop` tool, if you have it): a task still running when your turn ends is taken as work you were waiting on.
- +
+
+
-

Factory skills

The skills, as the agent reads them

+
+ Factory skills

The skills, as the agent reads them

Every Factory skill and supporting file, raw, exactly as thirdshift writes it out.

-
-

thirdshift-code-review

+
+

thirdshift-code-review

+

Used by 3 · Y · Review

thirdshift-code-review/SKILL.md

---
@@ -474,9 +510,11 @@ 

thirdshift-code-re display_name: "Code Review" short_description: "Review a diff on standards and spec"

-
-
-

thirdshift-codebase-design

+
+
+
+

thirdshift-codebase-design

+

Used by the Architecture review, in an Architect run

thirdshift-codebase-design/SKILL.md

---
@@ -684,9 +722,11 @@ 

thirdshift-cod display_name: "Codebase Design" short_description: "Vocabulary for deep-module design"

- -
-

thirdshift-implement

+
+
+
+

thirdshift-implement

+

Used by 2 · M · Implement

thirdshift-implement/SKILL.md

---
@@ -712,9 +752,11 @@ 

thirdshift-implement policy: allow_implicit_invocation: true

- -
-

thirdshift-improve-codebase-architecture

+
+
+
+

thirdshift-improve-codebase-architecture

+

Used by the Architecture review, in an Architect run

thirdshift-improve-codebase-architecture/SKILL.md

---
@@ -969,9 +1011,11 @@ 

policy: allow_implicit_invocation: true

- -
-

thirdshift-pr

+
+
+
+

thirdshift-pr

+

Used by 3 · Y · Review

thirdshift-pr/SKILL.md

---
@@ -1153,9 +1197,11 @@ 

thirdshift-pr/agents/openai display_name: "PR" short_description: "Write a PR body that's fast to review"

- -
-

thirdshift-resolving-merge-conflicts

+
+
+
+

thirdshift-resolving-merge-conflicts

+

Used by 4 · K · Finish, in a Repair

thirdshift-resolving-merge-conflicts/SKILL.md

---
@@ -1177,9 +1223,11 @@ 

thir display_name: "Resolving Merge Conflicts" short_description: "Resolve merge and rebase conflicts"

- -
-

thirdshift-security-audit

+
+
+
+

thirdshift-security-audit

+

Used by the Security audit, in a Security run, or a Security review

thirdshift-security-audit/SKILL.md

---
@@ -6529,9 +6577,11 @@ 

thirdsh } });

- -
-

thirdshift-tdd

+
+
+
+

thirdshift-tdd

+

Used by 2 · M · Implement

thirdshift-tdd/SKILL.md

---
@@ -6718,9 +6768,11 @@ 

thirdshift-tdd/tests.md

}); ```
- -
-

thirdshift-to-spec

+
+
+
+

thirdshift-to-spec

+

Used by the Architecture review, in an Architect run, or Security fix publishing, in a Security run

thirdshift-to-spec/SKILL.md

---
@@ -6810,9 +6862,11 @@ 

thirdshift-to-spec/age policy: allow_implicit_invocation: true

- -
-

thirdshift-to-tickets

+
+
+
+

thirdshift-to-tickets

+

Used by the Architecture review, in an Architect run, or Security fix publishing, in a Security run

thirdshift-to-tickets/SKILL.md

---
@@ -6925,13 +6979,16 @@ 

thirdshift-to-ticke policy: allow_implicit_invocation: true

- +
+
+
-

Licence and credits

Whose skills these are

+
+ Licence and credits

Whose skills these are

Most Factory skills are adapted from Matt Pocock's skills, under the licence below. The thirdshift-pr skill credits Dex Horthy's show-me skill in its CREDITS.md. The thirdshift-security-audit skill is copied from Cloudflare's security-audit-skill, under its own MIT licence, with its upstream repository and commit recorded in CREDITS.md.

LICENSE

MIT License
@@ -6956,6 +7013,7 @@ 

LICENSE

OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/site/styles.css b/site/styles.css index 7e192c1c..72534fec 100644 --- a/site/styles.css +++ b/site/styles.css @@ -311,7 +311,14 @@ body::after { /* scanlines */ .page-head .home { display: block; color: inherit; } .paper-sheet .as-of { margin: 0; font-size: 14px; color: #444; max-width: 90ch; } .job-sheets { display: grid; gap: 28px; } -.job-sheet { display: grid; gap: 10px; align-content: start; border-top: 4px solid var(--c); padding-top: 12px; min-width: 0; } +.job-sheet { border-top: 4px solid var(--c); padding-top: 12px; min-width: 0; } +.job-sheet-body { display: grid; gap: 10px; padding-top: 10px; } +.section-disclosure > summary, .job-sheet > summary { position: relative; padding-right: 36px; cursor: pointer; list-style: none; } +.section-disclosure > summary::-webkit-details-marker, .job-sheet > summary::-webkit-details-marker { display: none; } +.section-disclosure > summary::after, .job-sheet > summary::after { content: "+"; position: absolute; right: 0; top: 0; color: var(--c); font: 700 28px/1 var(--f-mono); } +.section-disclosure[open] > summary::after, .job-sheet[open] > summary::after { content: "−"; } +.section-disclosure > .sec-head { margin-bottom: 0; } +.section-disclosure[open] > .sec-head { margin-bottom: 28px; } .job-sheet h3 { font-size: 30px; } .job-sheet h4 { margin: 10px 0 0; font: 700 13px/1.3 var(--f-mono); color: var(--dim); } .job-sheet p { margin: 0; max-width: 90ch; } diff --git a/site/tests/prompts.cjs b/site/tests/prompts.cjs new file mode 100644 index 00000000..edb54a14 --- /dev/null +++ b/site/tests/prompts.cjs @@ -0,0 +1,75 @@ +// Optional browser regression: install puppeteer-core outside the repo, then run +// NODE_PATH=/node_modules CHROME_BIN= node site/tests/prompts.cjs +const assert = require('node:assert/strict'); +const fs = require('node:fs/promises'); +const http = require('node:http'); +const path = require('node:path'); +const puppeteer = require('puppeteer-core'); +const root = path.resolve(__dirname, '..'); +const server = http.createServer(async (req, res) => { + try { + const pathname = new URL(req.url, 'http://localhost').pathname; + const file = path.join(root, pathname.endsWith('/') ? pathname + 'index.html' : pathname); + const content = await fs.readFile(file); + res.setHeader('Content-Type', file.endsWith('.js') ? 'text/javascript' : file.endsWith('.css') ? 'text/css' : 'text/html'); + res.end(content); + } catch { res.writeHead(404); res.end(); } +}); +(async () => { + let browser; + try { + await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + const url = `http://127.0.0.1:${server.address().port}/prompts/`; + browser = await puppeteer.launch({executablePath:process.env.CHROME_BIN, headless:true, args:['--no-sandbox']}); + for (const width of [1440, 390]) { + const page = await browser.newPage(); + const errors = []; + page.on('pageerror', error => errors.push(error.message)); + await page.setViewport({width, height:900}); + await page.goto(url); + assert.equal(await page.$$eval('.section-disclosure', nodes => nodes.length), 4, 'four main sections have disclosures'); + assert.equal(await page.$$eval('details[open]', nodes => nodes.length), 0, 'all sections and sheets start closed'); + for (const title of ['command-title', 'prompts-title', 'skills-title', 'licence-title']) { + const selector = `section[aria-labelledby="${title}"] > .wrap > details > summary`; + await page.click(selector); + assert.equal(await page.$eval(selector, node => node.parentElement.open), true, `${title} opens`); + await page.click(selector); + assert.equal(await page.$eval(selector, node => node.parentElement.open), false, `${title} closes`); + } + await page.click('section[aria-labelledby="prompts-title"] summary'); + await page.focus('#prompt-fresh > summary'); + await page.keyboard.press('Enter'); + assert.equal(await page.$eval('#prompt-fresh', node => node.open), true, 'Enter opens a prompt'); + assert.equal(await page.$eval('#prompt-resume', node => node.open), false, 'other prompt stays closed'); + await page.keyboard.press('Space'); + assert.equal(await page.$eval('#prompt-fresh', node => node.open), false, 'Space closes a prompt'); + await page.goto(url + '#file-thirdshift-tdd-skill-md'); + assert.equal(await page.$eval('#skill-thirdshift-tdd', node => node.open), true, 'file fragment opens skill'); + assert.equal(await page.$eval('section[aria-labelledby="skills-title"] details', node => node.open), true, 'file fragment opens section'); + assert.ok(await page.$eval('#file-thirdshift-tdd-skill-md', node => node.getBoundingClientRect().height > 0), 'linked file is visible'); + await page.goto(url); + await page.click('section[aria-labelledby="command-title"] summary'); + await page.click('a[href="#prompt-resume"]'); + await page.waitForFunction(() => document.querySelector('#prompt-resume').open, {timeout:3000}); + assert.equal(await page.$eval('#prompt-resume', node => node.open), true, 'in-page link opens prompt'); + await page.click('#prompt-resume > summary'); + await page.click('a[href="#prompt-resume"]'); + await page.waitForFunction(() => document.querySelector('#prompt-resume').open, {timeout:3000}); + assert.equal(await page.$eval('#prompt-resume', node => node.open), true, 'same fragment link reopens closed prompt'); + assert.ok(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth), 'no horizontal overflow'); + assert.deepEqual(errors, [], 'no script exceptions'); + console.log(`PASS ${width}px: default closed; pointer/keyboard toggles; independent sheets; direct/in-page/repeated fragments; layout`); + await page.close(); + } + const noJs = await browser.newPage(); + await noJs.setJavaScriptEnabled(false); + await noJs.goto(url); + await noJs.click('section[aria-labelledby="prompts-title"] summary'); + await noJs.click('#prompt-fresh > summary'); + assert.equal(await noJs.$eval('#prompt-fresh', node => node.open), true, 'disclosures work without JavaScript'); + console.log('PASS no JavaScript: native toggles'); + } finally { + if (browser) await browser.close(); + await new Promise(resolve => server.close(resolve)); + } +})().catch(error => {console.error(error); process.exitCode = 1;}); diff --git a/src/prompts_page.rs b/src/prompts_page.rs index 37b29adf..5b8dcf3f 100644 --- a/src/prompts_page.rs +++ b/src/prompts_page.rs @@ -439,12 +439,14 @@ fn command_line(html: &mut String) { html, r##"
-

The command line

How each session starts

+
+ The command line

How each session starts

Every session runs claude headless in the Run's worktree, in auto permission mode. The Factory skills are linked into the worktree's .claude/skills/, where Claude Code finds them, and kept out of git. The prompt is one of the templates below.

{new}

A Resume continues the session that ended:

{resume}

{codex}

+
"##, @@ -458,7 +460,8 @@ fn prompt_section(html: &mut String) { html.push_str( r##"
-

Prompts

What a Run tells the agent

+
+ Prompts

What a Run tells the agent

Every prompt a Run can send, with its placeholders highlighted: they change for each Run.

"##, @@ -466,12 +469,14 @@ fn prompt_section(html: &mut String) { for prompt in prompts() { let _ = write!( html, - r##"
-

{title}

+ r##"
+

{title}

+

{when}

Sent by {sender}

{text}
-
+
+
"##, id = prompt.id, title = prompt.title, @@ -480,14 +485,15 @@ fn prompt_section(html: &mut String) { text = highlighted(&prompt.text), ); } - html.push_str("
\n \n
\n"); + html.push_str(" \n \n \n\n"); } fn skills_section(html: &mut String) { html.push_str( r##"
-

Factory skills

The skills, as the agent reads them

+
+ Factory skills

The skills, as the agent reads them

Every Factory skill and supporting file, raw, exactly as thirdshift writes it out.

"##, @@ -498,8 +504,9 @@ fn skills_section(html: &mut String) { let name = skill.path().to_string_lossy(); let _ = write!( html, - r##"
-

{name}

+ r##"
+

{name}

+

Used by {used_by}

"##, used_by = skill_used_by(&name), @@ -516,16 +523,17 @@ fn skills_section(html: &mut String) { for file in files { file_block(html, file, " "); } - html.push_str("
\n"); + html.push_str("
\n
\n"); } - html.push_str("
\n \n
\n"); + html.push_str(" \n \n \n\n"); } fn licence_section(html: &mut String) { html.push_str( r##"
-

Licence and credits

Whose skills these are

+
+ Licence and credits

Whose skills these are

Most Factory skills are adapted from Matt Pocock's skills, under the licence below. The thirdshift-pr skill credits Dex Horthy's show-me skill in its CREDITS.md. The thirdshift-security-audit skill is copied from Cloudflare's security-audit-skill, under its own MIT licence, with its upstream repository and commit recorded in CREDITS.md.

"##, ); @@ -539,7 +547,7 @@ fn licence_section(html: &mut String) { ); file_block(html, file, " "); } - html.push_str("
\n
\n"); + html.push_str(" \n \n\n"); } /// Every file under `dir`, at any depth. @@ -630,6 +638,43 @@ mod tests { std::env::var_os("UPDATE_PROMPTS").is_some() } + #[test] + fn prompts_page_sections_and_job_sheets_start_closed() { + let html = render(); + assert_eq!( + html.matches("
") + .count(), + 4 + ); + for title in [ + "command-title", + "prompts-title", + "skills-title", + "licence-title", + ] { + assert!( + html.contains(&format!("

")), + "the section keeps its heading: {title}" + ); + } + for id in [ + "prompt-fresh", + "prompt-resume", + "skill-thirdshift-implement", + "skill-thirdshift-tdd", + ] { + assert!( + html.contains(&format!("

"))); + } + for disclosure in html.split("').unwrap(); + assert!(!attributes.contains("open"), "starts closed: {attributes}"); + } + } + /// The golden-file test: the page carries the fragment as rendered now. /// The crates.io package leaves `site/` out, so it skips there. #[test] @@ -673,7 +718,7 @@ mod tests { let (_, card) = html .split_once(&format!("id=\"skill-{name}\"")) .expect("the page lists the publishing skill"); - let (card, _) = card.split_once("").unwrap(); + let (card, _) = card.split_once("

").unwrap(); let (_, usage) = card .split_once("Used by ") .expect("the card names its users"); @@ -689,7 +734,7 @@ mod tests { let (_, skill) = html .split_once("id=\"skill-thirdshift-security-audit\"") .expect("the page lists thirdshift-security-audit"); - let (skill, _) = skill.split_once("").unwrap(); + let (skill, _) = skill.split_once("

").unwrap(); assert!(skill.contains("Security run") && skill.contains("Security review")); assert!(skill.contains("MIT License")); assert!(skill.contains("Copyright (c) 2025-2026 Cloudflare, Inc.")); From 1303a81a685fde875139d83db92386c326158f13 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 12:16:17 +0000 Subject: [PATCH 3/9] Review incoming release 0.11.2 merge for issue 666 Independent Standards and Spec reviews of 764adf4...8f5ac1e found no findings; both reviewers read Cargo.toml and Cargo.lock. Reports saved in .thirdshift-review-XjpQMM and PR #675 updated. Validation: 11 prompts-page tests, CLI version test, locked metadata, formatting and all-target Clippy passed. From 0b8cbc3c8174e16a75f46759687f53abb51f55b1 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 08:39:18 -0400 Subject: [PATCH 4/9] Record empty review range for issue 666 The requested 8f5ac1e...1303a81 comparison contains no changed files and both endpoints have tree ca00e49cd9dd344d80806f1a591a1521753604bf. The review skill stopped at its non-empty-diff preflight; no reviewers ran and no findings were produced. Preflight records saved in .thirdshift-review-wCLA3z/standards.md and spec.md; PR #675 records the outcome under each axis while retaining the existing body. No code tests apply to the empty diff. From 08e26e01d9199ebd0fb4e3ac1bed6afea5aaacce Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 12:49:21 +0000 Subject: [PATCH 5/9] Record requested empty review range for issue 666 The requested 1303a81...0b8cbc3 comparison contains no changed files; both endpoints have tree ca00e49cd9dd344d80806f1a591a1521753604bf. The thirdshift-code-review skill stopped at its non-empty-diff preflight: no reviewers ran and no findings were produced. Standards and Spec preflight records are saved in .thirdshift-review-uHdLgF/standards.md and spec.md. PR #675 records this outcome under both axes while preserving the existing body. No code tests apply to the empty range. From 37c78b4645367ba38d02eeb26eed4c0c059123fc Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 09:03:57 -0400 Subject: [PATCH 6/9] Record empty review preflight since 0b8cbc3 for issue 666 The requested 0b8cbc3...08e26e0 comparison contains no changed files; both endpoints have tree ca00e49cd9dd344d80806f1a591a1521753604bf. The thirdshift-code-review skill stopped at its non-empty-diff preflight, so neither reviewer ran and no findings were produced or skipped. Standards and Spec records are saved in .thirdshift-review-1P2kb8/standards.md and spec.md. PR #675 records the empty range under both axes while preserving its existing body. No code tests apply to this empty range. From a5be601f252780466fdef34d089658d3d01bd08c Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 13:16:48 +0000 Subject: [PATCH 7/9] Record empty review preflight since 08e26e0 for issue 666 The requested 08e26e0...37c78b4 comparison contains no changed files; both endpoints have tree ca00e49cd9dd344d80806f1a591a1521753604bf. The thirdshift-code-review skill stopped at its non-empty-diff preflight, so neither reviewer ran and no findings were produced or skipped. Standards and Spec records are saved in .thirdshift-review-w3blOF/standards.md and spec.md. PR #675 records the empty range under both axes while preserving its existing body. No code tests apply to this empty range. From 7203a4250dd75b2dad4a52005b76ad10bee3b406 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 09:30:47 -0400 Subject: [PATCH 8/9] Record empty review preflight since 37c78b4 for issue 666 The requested 37c78b4645367ba38d02eeb26eed4c0c059123fc...a5be601f252780466fdef34d089658d3d01bd08c comparison contains no changed files; both endpoints have tree ca00e49cd9dd344d80806f1a591a1521753604bf. The thirdshift-code-review skill stopped at its non-empty-diff preflight, so neither reviewer ran and no findings were produced or skipped. Standards and Spec records are saved in .thirdshift-review-L4x2eI/standards.md and spec.md. PR #675 records the empty range under both axes while preserving its existing body. No code tests apply to this empty range. From d0c69c13f4b6f07cd3f201bb7a4df6ee625ec054 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 12 Oct 2026 09:56:18 -0400 Subject: [PATCH 9/9] thirdshift: failed run (PR https://github.com/JacobStephens2/thirdshift/pull/675 is a draft) 2026-10-12T13:56:18Z, host thirdshift. Uncommitted work at the time of failure is included in this commit.