Skip to content
Open
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
30 changes: 30 additions & 0 deletions drafts/2026-05-04T043235Z.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
**Status:** draft (pending manual post)

**HN:** https://news.ycombinator.com/item?id=47948379 (Show HN: Harness — Manage parallel Claude Code agents across Git worktrees, by frenchie4111, 4 days old, 3 points, 1 visible comment)

**Story / OP:** Show HN: Harness — Manage parallel Claude Code agents across Git worktrees (https://github.com/frenchie4111/harness). OP: "I built Harness because I was dissatisfied with all the other options out there (cmux, Conductor) and wanted more flexibility. Only been working on it for a couple of weeks so I would love feedback!"

**Sub-thread tone signal:** Only one comment exists on the thread, and it is currently `[flagged]` and hidden in the default view. OP responded to that flagged comment explaining the design rationale: each worktree is a tab, the icon shows agent status, and importantly "red means waiting on a permission prompt". So the harness layer surfaces an explicit human-in-the-loop approval gate as part of its UX. Reply form is open.

**My reply** (top-level, replying to the Show HN itself, posted as unauthenticated user — user picks account at post time):

```
(disclosure: I work on FailProof AI: https://github.com/exospherehost/failproofai)

The red-status-equals-permission-prompt design makes visible what the harness layer is paying for in human attention: with N parallel worktrees, every prompt is a context switch, and the cost scales with N. A lot of those prompts are recoverable a layer below: anything you would always click "deny" on can be a PreToolUse hook that returns deny() with a reason, so the agent gets the rejection inline without ever turning a tab red. Composes with what you have - the hook short-circuits the obvious-no calls, the prompt surface handles the genuinely ambiguous ones. Curious whether you considered per-worktree hook config, so an experimental worktree could ship with a stricter policy set than a "trusted" one.
```
Comment on lines +11 to +15
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a language tag to the fenced reply block to satisfy markdownlint.

Line 11 opens a fenced code block without a language, which triggers MD040. Add a language label (for example text) to keep lint clean.

Suggested diff
-```
+```text
 (disclosure: I work on FailProof AI: https://github.com/exospherehost/failproofai)

 The red-status-equals-permission-prompt design makes visible what the harness layer is paying for in human attention: with N parallel worktrees, every prompt is a context switch, and the cost scales with N. A lot of those prompts are recoverable a layer below: anything you would always click "deny" on can be a PreToolUse hook that returns deny() with a reason, so the agent gets the rejection inline without ever turning a tab red. Composes with what you have - the hook short-circuits the obvious-no calls, the prompt surface handles the genuinely ambiguous ones. Curious whether you considered per-worktree hook config, so an experimental worktree could ship with a stricter policy set than a "trusted" one.
</details>

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.22.1)</summary>

[warning] 11-11: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @drafts/2026-05-04T043235Z.md around lines 11 - 15, The fenced code block
starting with on the reply block should include a language tag to satisfy markdownlint MD040; change the opening fence from to text (or another appropriate language) so the block is fenced as text and lint passes, e.g.,
update the block that begins with the disclosure "(disclosure: I work on
FailProof AI...)" to use ```text as its opener.


</details>

<!-- fingerprinting:phantom:triton:hawk:1b55a2c7-5e47-4a32-b5d2-ccdbc8015892 -->

<!-- d98c2f50 -->

<!-- This is an auto-generated comment by CodeRabbit -->


**Insight for the FailProof team:**

The "N parallel agents" framing is a real slice of the audience that has not been front-and-center in our positioning so far. Solo agent + hooks is the dominant story; parallel-N agent + hooks is the thing that turns hooks from "nice safety net" into "the only way to keep your eyes open." Concrete actions: (1) a blog or README section called something like "Hooks at parallel-agent scale" that walks through the math — if 5% of your tool calls would surface as approval prompts and you run 10 agents in parallel, you are now interrupting yourself ~12x more often than the solo case; the auto-deny share of PreToolUse hooks linearly reduces that. (2) Show that per-project `.failproofai/policies/` config naturally gives you per-worktree policy variation since each worktree typically tracks a different branch / scope, without anyone needing to hand-roll worktree-aware tooling. That answers the "per-worktree hook config" question I leave dangling in the reply, but in a way the reader has to click through to the README to discover, not get spoon-fed in the comment. (3) The competing-product reference set in this slice is real and small: cmux, Conductor, this Harness. Worth knowing where each of them sits on permission-prompt UX, so the next time one of them surfaces on HN we have a sharper mental model. (4) frenchie4111's [flagged] sole commenter is a signal that the thread has a contrarian visible to mods; a substantive on-topic technical reply that engages with the design rather than the flagged drama is the right shape here.

**Notes / findings:**

- Thread is 4 days old. HN's reply window is ~2 weeks, so well within it; reply form is rendered.
- Only one comment on the thread, marked `[flagged]` (hidden in default view). The OP himself replied to it with a design defense, so a substantive reply that engages with the OP's design is unlikely to crowd anyone out and likely to draw an OP response. No `[dead]` markers anywhere visible.
- Mid-thread visibility risk is low here — with 3 points and effectively zero visible comments, a top-level reply will sit at the top.
- Cross-thread guard: I have replied on harness-vs-hook-layer threads before (PR #20 Pu.sh, PR #17 harness-outside-sandbox). The Pu.sh draft was about "harness wants to stay 400 LOC, push hardening into a separate hook layer"; the harness-outside-sandbox draft was about "PreToolUse as a tool-request firewall in the no-credentials-in-sandbox split". This draft's angle is different: it is about the **UX cost of permission prompts at parallel-N scale**, and how an auto-deny hook layer reduces the linear-in-N attention tax. The framing is specific to Harness's red-status indicator design choice; it would not work as a paste on either of the prior threads.
- ASCII-punctuation audit on the reply body: no em-dash, en-dash, curly quote, unicode arrow, or fancy ellipsis. Hyphens, ASCII straight quotes, three-dot ellipsis only.
- Anti-pitch audit: one disclosure line at top; one paragraph (~125 words) of substantive on-topic content; one policy concept named (PreToolUse hook + deny()), no comma-listed policy names; no install commands; no version numbers; no `~/.failproofai/` path callouts; no Agent Monitor / dashboard plug; no `http://localhost:8020` mention; no two-link pattern (repo URL appears once, in the disclosure line); ends with a question to OP (per-worktree hook config) that genuinely asks rather than pitching.
- Reply targets the Show HN itself (top-level), not the [flagged] sub-thread.
- Per-worktree hook config really is a clean idea independent of FailProof. If frenchie4111 builds it natively, that is good for the harness layer; if they shell out to FailProof's existing project-scope config, that is good for FailProof; either outcome is fine.