User feedback (2026-05-24): /ship-spec must end with `gh pr ready
<N>`; don't leave PRs in draft. Overrides the skill's documented
"v1 stops at draft" stance. Recorded in both the harness MEMORY.md
and the auto-memory feedback store so future sessions apply the
preference without re-correction.
Follow-up (deferred): update .claude/skills/ship-spec/SKILL.md
Stage 9 to call `gh pr ready <N>` as the final step.
Refs #350.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Memory Improvement Protocol § c (Improve), session-closing pass.
14 candidates scanned; 4 filtered as already-captured; 7 filtered
as not durable / already in rules; 3 survived to MEMORY.md
(none graduated to IDENTITY.md — no cross-session generalization
established yet from a single run).
Promoted:
- /ship-spec Stage 4 HALT-on-HIGH semantics are looser in practice
than the spec implies — in-place AC mitigation with a Synthesis
audit trail in critique.md is equivalent when fixes are
mechanical (no PROTECTED-PATH / boundary-crossing signals).
- /ship-spec Stage 7 template path drift: the referenced template
at tasks/openharness-v07-convergence/prompt.md is now at
tasks/archive/... ; skill prose hasn't caught up.
- memory/YYYY-MM-DD/log.md gitignore vs context/rules/memory.md
docstring mismatch: rule says "log.md tracked inside"; .gitignore:42
rule memory/[0-9]*/ excludes the entire directory contents in
practice. Daily logs are local-only working state.
Refs #350. /reflect log entry appended to memory/2026-05-24/log.md
(local-only per the gitignore behavior recorded in lesson 3).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Memory Improvement Protocol per context/rules/memory.md.
Promotes one durable lesson from the /delegate run that landed
the Karpathy wiki integration: when /delegate spawns parallel
sub-agents touching a shared append-style file (CHANGELOG.md,
AGENTS.md skills table), scope each sub-agent to disjoint files
and let the orchestrator integrate the shared-file edits at
commit time. Avoids concurrent-commit clobber and silent stale-
view compose (same mechanism behind the 2026-05-19 worktree
lesson). Pattern is "fan out implementation, fan in integration."
Also promotes the pre-existing 2026-05-23 .claude/plans/ gitignore
lesson which was unstaged since PR #347; this commit lands it on
this PR's merge to development.
Daily log entries for pm-agent / ship-spec / delegate runs were
appended to memory/2026-05-24/log.md but the directory is
gitignored by the existing memory/[0-9]*/ rule, so the daily log
lives only on the local filesystem (per the established
convention; only MEMORY.md is the long-term tracked store).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
All US-001..US-005 passes: true; progress.txt has Codebase Patterns
+ per-story entries + STATUS: COMPLETE sentinel. /delegate execution
of tasks/karpathy-llm-wiki/prd.json is finished.
Refs #350. PR #351 ready for human review (transition to ready via
gh pr ready 351 + /ci-status).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wave 4 (final) of /delegate execution.
Appends 3 rows to the AGENTS.md skills table — flat append, no
new category header. CLAUDE.md symlink integrity verified intact
before and after (inode 3408085 unchanged).
CHANGELOG entry: one ### Changed line for the registration action
itself (per US-005 AC); per-skill ### Added entries already shipped
in US-001/2/3/4 commits.
Refs #350. Closes#350 once merged. All 5 stories from the prd.json
are now landed; next step is gh pr ready 351 + /ci-status.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wave 2 of /delegate execution; both skills land together.
/wiki-ingest (.claude/skills/wiki-ingest/SKILL.md, 295 lines):
- Argument interface: <url|path> [--slug <override>] | --from-draft
<slug> [--allow-stale]; argument-hint set
- URL ingest WebFetches and writes wiki/raw/<yyyy-mm-dd>-<slug>.md;
path ingest mirrors a copy; both mkdir -p wiki/raw/ first
- --from-draft globs memory/*/wiki-drafts/<slug>.md, sorts by ISO
date in parent dir name (not mtime), excludes .skip files, errors
STALE if > 7d unless --allow-stale
- Slug derivation, body-merge, and frontmatter schema all defer to
context/rules/wiki.md (§§ 3, 7, 2 respectively)
- Daily log entry per Memory Improvement Protocol
- Orchestrator-only writes (sub-agents draft to memory/<today>/
wiki-drafts/<slug>.md and orchestrator promotes via --from-draft)
/wiki-query (.claude/skills/wiki-query/SKILL.md, 299 lines):
- Argument interface: <topic>; multi-word OR semantics
- Frontmatter-only grep using context/rules/wiki.md § 6 canonical
awk extraction; matches title/slug/tags only (NOT body)
- Empty result prints No wiki entries matched <topic> and exits 0
- Sub-cap: <3 reads all; >=3 reads top 3 by updated: descending;
cap hardcoded in v1
- Reads individual files directly (does not route via README index)
- Daily log entry per Memory Improvement Protocol
Refs #350. Wave 2 of /delegate execution. Wave 3 (US-004 /wiki-lint)
is the next dependency-unblocked story.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Establishes the Karpathy LLM Wiki foundation: top-level wiki/ +
wiki/raw/ directories with README anchors, .gitignore exemption
for the snapshot README, and the complete 7-section schema rule
at context/rules/wiki.md (boundary table, entry schema, slug
derivation, cross-link convention, confidence lifecycle, canonical
frontmatter extraction command, body-merge strategy for updates).
The schema rule auto-loads via context/rules/*.md and is the
canonical reference for US-002 (/wiki-ingest), US-003 (/wiki-query),
and US-004 (/wiki-lint). All three skills MUST use the locked
extraction command from § 6 to avoid silent divergence.
Refs #350. Wave 1 of /delegate execution.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Four-file contract (per SPEC v0.7 §tasks/) + critique:
- prd.md: 5 user stories (US-001 through US-005), 12 FRs,
8 non-goals; HIGH critic findings folded into ACs.
- prd.json: schemaVersion 1, branchName feat/350-karpathy-llm-wiki,
5 stories with wave-encoded priorities and dependency notes.
- prompt.md: Ralph iteration instructions adapted from the
archived convergence template; wave-ordering and symlink-
discipline notes specific to this task.
- progress.txt: empty header.
- critique.md: 2-critic adversarial review (implementer +
user lens) with 7 HIGH / 12 MED / 6 LOW findings; all
HIGH findings mitigated in prd.md ACs (recorded in the
Synthesis section). 0 protected-path violations.
Tracks #350 (implementation). Builds on plan PR #347
(.claude/plans/karpathy-llm-wiki.md on branch
feat/346-karpathy-llm-wiki). Parent tracking issue #346.
PRD generated by /prd; reviewed by 2 critics (implementer +
user lens, with the advisor-model 3-step variant — critique
findings folded back into PRD as AC tightenings); converted
by /ralph.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Add `client-` prefix to sandbox-processes.md naming table for
external-surface clients bridging an in-sandbox agent.
- Tighten the `agent-` example off interactive CLIs; document that
claude/codex/opencode are foreground tools, not tmux sessions.
- entrypoint.sh: restore client-slack on container start when
SLACK_APP_TOKEN + SLACK_BOT_TOKEN are present and `pi` is installed.
- Propagate rename through wizard code, READMEs, and docs.
- Fold in half-finished harness-pi rename from #302.
Closes#344
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Strip top-level argument-hint frontmatter (portability), repin skills.lock
to merged master (commit f95011fe, checksum 02dd6324), and add the
previously-missing LICENSE for folder parity with upstream.
Closes#339
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Strip top-level argument-hint frontmatter (forbidden by skills-ref@0.1.5
portability policy; --dry-run documented in body). Harness copy now
byte-identical to the upstream contribution. Fix skills.lock checksum to
the registry folder-algorithm value (9be176e0); note references upstream
PR mifunedev/skills#5, commit backfilled on merge.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Surface scripts/install.sh local-run detection as three equal-weight install
paths (upstream / fork-and-clone / clone-and-own) in README, installation.md,
and quickstart.md. No script changes — the installer already handled both
self-hosting flows; docs were the only gap.
Closes#331
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add interview and render-html to .mifune/skills.lock now that
mifunedev/skills PR #3 has merged; all 15 skills are upstream-tracked
- Sync render-html/SKILL.md from master (portable path, no hard-coded
/home/sandbox/harness prefix); restore argument-hint locally
- Add LICENSE files for interview and render-html (Mifune Dev copyright)
- Update all 15 skill checksums and commit SHA in skills.lock
- Update .mifune/README.md and CHANGELOG.md to reflect full coverage
config.example.json was the tracked seed for the gitignored config.json,
but the base ships zero compose overlays and every reader (Makefile,
install.sh, banner.sh) tolerates a missing config.json via jq fallbacks.
Remove the file and its now-dead seeding block in install.sh.
Closes#323
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Picks 2–4 task-specific questions via AskUserQuestion, echoes a
2–3 sentence scope brief, then proceeds. Skips trivial tasks with
an announcement. Serves as the in-tree reference pattern for
AskUserQuestion-based elicitation in future skills.
Tracks #316.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes#314.
Adds an on-request skill that takes an artifact (file or in-context
material) plus a one-line intent and produces a single self-contained
HTML file optimized for the moment a human reads it once to make a
decision. Writes to memory/<UTC-date>/<slug>.html (gitignored via the
existing memory/[0-9]*/ rule).
Encodes Thariq's HTML-over-Markdown thesis as a three-condition gate:
synthesis artifact + would-be-unreadable-as-Markdown + no downstream
pipeline consumer. Refuses to render source/pipeline input (PRDs,
briefings, rules, skills, commit messages, log.md itself). No
templates — each invocation produces bespoke HTML, picking widgets
per artifact (severity table, dependency SVG, collapsible evidence).
- .claude/skills/render-html/SKILL.md (new)
- AGENTS.md — Skills table row
- memory/README.md — recognized co-resident of log.md
- CHANGELOG.md — Unreleased entry
Two coupled changes:
1. .claude/skills/release/SKILL.md (Step 3 → 4):
Capture PREV_BRANCH before the promotion commit and push it back
to origin BEFORE cutting release/$VERSION. Without this, the
promotion commit lived only on release/* (and reached main via
the release-branch merge), but development never received it,
so the next round of work re-carried already-released entries
under [Unreleased] and the next /release double-promoted them.
2. CHANGELOG.md:
Repair the existing drift caused by (1). Three prior releases
(2026.5.14, 2026.5.15, 2026.5.16) had their promoted versioned
sections on main but not on development. Reset CHANGELOG.md to
main's versioned history, then re-seed [Unreleased] with only
genuinely post-2026.5.16 entries: #309 fork-friendly-install,
the /worktrees skill, and this fix itself.
Closes#297.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: scaffold fork-friendly-install task
Four-file contract per SPEC v0.7 §tasks/:
- prd.md: 7 user stories with post-critic-mitigation AC
- prd.json: schemaVersion 1, branchName feat/308-fork-friendly-install
- prompt.md: Ralph iteration instructions
- progress.txt: empty header
- critique.md: 2-critic review (implementer + user lens),
all 6 H-severity findings mitigated; 1 M-severity ICP.md
drift flagged as separate orchestrator hygiene
Source: 5-seat AI council unanimous Option E (Hybrid B+A) +
Critic concur-with-amendments. Parameterizes the clone source
via OH_GITHUB_REPO so a forked Open Harness installs the
forker's code, not upstream's; keeps oh.mifune.dev canonical
upstream URL unchanged.
Tracks #308. PRD generated by /prd; reviewed by 2 critics
(implementer + user lens); converted by /ralph.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: US-005 — README adds a "For forks / self-host" block
Inserts a ### 📦 For forks / self-host subsection into README.md after
the closing paragraph of ## 📦 Install and before ## 🚀 Use it. Includes
blockquote visual-hierarchy guard, matching <your-org>/<your-fork>
placeholders in both curl URL path and OH_GITHUB_REPO env var, branch
substitution note, mutable-HEAD trust caveat, and .devcontainer/ footnote
with concrete patch guidance. Upstream line 17 is byte-identical.
* feat: US-001 — OH_GITHUB_REPO env var parameterizes the clone
- Adds OH_GITHUB_REPO="${OH_GITHUB_REPO:-ryaneggz/open-harness}" immediately after REPO_DIR is set (line 180) and before the migration block (line 182)
- Validates with bash [[ =~ ]] regex (^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$); dies with clear message on mismatch
- Emits warn "Cloning from fork: $OH_GITHUB_REPO" when non-default value supplied
- Replaces both hardcoded clone URLs (with and without --branch) with https://github.com/${OH_GITHUB_REPO}.git in lockstep
- bash -n passes; shellcheck: baseline 11, post-edit 11 (no new warnings)
* task: US-001 — update progress.txt with commit SHA dbf8623
* feat: US-002 — OH_GITHUB_REF aliases OH_INSTALL_REF
Adds OH_GITHUB_REF alias resolution block after the fork-warn block,
before the population/migration classification. When both
OH_GITHUB_REF and OH_INSTALL_REF are set to differing non-empty
values, a warn fires before the alias resolution overrides
OH_INSTALL_REF. The fresh-clone branch-guard now keys on the
resolved $OH_GITHUB_REF, so either var triggers --branch clone form.
Back-compat preserved: OH_INSTALL_REF=v1.2.3 with OH_GITHUB_REF
unset still results in --branch v1.2.3 (alias resolves to v1.2.3).
No deprecation warning emitted in this release.
bash -n: PASS. shellcheck: 11 warnings (no regression vs baseline).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: US-003 — pull path validates remote against OH_GITHUB_REPO
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: US-004 — help text documents OH_GITHUB_REPO and OH_GITHUB_REF
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: US-007 — CHANGELOG records OH_GITHUB_REPO/REF additions
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lead `docs/quickstart.md` "Enter the sandbox" with the VS Code Dev Containers attach flow (Command Palette → `Dev Containers: Attach to Running Container...` → `openharness`), since it works identically on localhost and over Remote-SSH; `make shell` demoted to a terminal fallback.
Add an orchestrator-as-default framing block to `docs/intro.md` "How it works" plus a Mermaid architecture diagram showing the host/sandbox split, the orchestrator at the center of the sandbox subgraph, the tmux session row, the `docker.sock` path to an optional second sandbox, and external GitHub / LLM-provider edges.
Repurpose `docs/agents/overview.md` "Running an agent in tmux" into "Default surfaces" (Pi+Slack, T3 Code, docs app) with VS Code Simple Browser guidance. Rename documented tmux sessions to `harness-pi` / `harness-t3code` in this page only — `apps/oh/src/config/slack.ts` and `context/rules/sandbox-processes.md` still use the `agent-` prefix; full rename will follow.
Fix dark-mode inline-code pill contrast in `apps/docs/src/css/custom.css` (background 0.06 → 0.12, border 0.1 → 0.22, text → pure white).
Docs-only; tests not run.
Closes#302
Remove maintainer-specific repo examples from `.worktrees/README.md` while keeping the structural boundary: agent-owned harness work lives under `agent/`, durable standalone repos live under `project/<owner>/<repo>/`.
Docs-only; tests not run.
Closes#298
Clarify that new long-lived standalone repos belong under `.worktrees/project/<owner>/<repo>/`, while `.worktrees/agent/` is limited to harness agent branches and legacy agent-owned clones.
Document the concrete Mifune misplacement that triggered this clarification.
Docs-only; tests not run.
Closes#295
The oh config slack wizard UX entry (#290, merged via #291) was inserted
into the already-shipped [2026.5.14] section instead of [Unreleased].
[2026.5.14] was tagged on 2026-05-14T06:36Z and the [Unreleased] block
was reset to empty by that release — but #291 anchored its CHANGELOG
edit to the wrong ### Changed heading. Moved the entry to [Unreleased]
so the next release captures it.
Closes#293.
Token prompts now echo a ● per keystroke instead of swallowing all output —
visible feedback that input is being received. The flow is reframed into
four numbered steps with inline "Where:" hints and clickable URLs (OSC 8
hyperlinks, fall back to "label (url)" on legacy terminals). Each input
shows a validation checkmark on success. A final summary screen lists the
keys (tokens redacted) behind a Proceed? [Y/n] gate before the env file is
touched.
Two files touched. apps/oh/src/lib/prompt.ts gains step(), link(), and
bold() helpers, plus a TTY-aware askSecret that handles backspace, Ctrl-U,
Ctrl-C, and Enter via raw mode. Piped/non-TTY stdin keeps the legacy
readline path as askSecretPiped so `echo "" | oh config slack` keeps
working for tests. apps/oh/src/config/slack.ts trims the round-1 preamble
to a 3-line header and applies the new helpers across both prompt groups.
Closes#290.
The 1455 callback is the Pi harness's own OAuth login flow, not Codex.
Codex CLI has its own headless path (codex login --device-auth) and
doesn't need the port. Move the detail to docs/agents/pi.md with a
cross-reference note in codex.md; correct CHANGELOG and the compose
comment.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Detail in docs/agents/codex.md that codex login is a prerequisite for
the Pi harness, that the 1455 callback works out of the box via VS Code
Remote SSH, and that direct-terminal users must forward the port
manually. Link CHANGELOG entry to issue #287.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Maps container port 1455 to 127.0.0.1:1455 so an editor's auto
port-forwarding (VS Code Remote SSH) carries the OAuth redirect to the
laptop, removing the manual `ssh -L 1455:localhost:1455` step for
`codex` subscription login in the sandbox.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
X-campaign follow-ups are owned by their respective agent sandboxes now;
the orchestrator's Active items list ships empty so new users start clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the host-group-membership workaround in entrypoint.sh with a
real UID/GID sync — on boot the sandbox user's UID/GID is rewritten to
match the bind-mounted repo's owner, so anything the sandbox creates
in-container is owned by the host user on the host (no chown handoff).
Delete the 11 in-tree compose overlays (claude/codex/deepagents/opencode/
pi-host.yml, ssh.yml, ssh-generate.yml, sshd.yml, git.yml, postgres.yml,
cloudflared.yml), the /cloudflared-tunnel skill, install/cloudflared-tunnel.sh,
the SANDBOX_PASSWORD plumbing, the *_HOST_BIND_MOUNT skip-clauses in
entrypoint.sh, the git-worktree resolver block, and the host-UID
overlay-stripping block in scripts/install.sh.
config.json's composeOverrides[] stays as the extension point for
downstream packs.
Doc / skill text references to deleted things are deferred to a
follow-up PR.
Closes#283
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The agent/ subfolder holds two patterns: harness branch worktrees (legacy
in-tree agents) and standalone agent-repo clones with their own .git
(post-graduation agents). dc-designer is the example clone.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The harness root package.json declares deps (croner for scripts/cron-runtime.ts;
@slack/socket-mode, @slack/web-api, chalk, @sinclair/typebox for the in-tree
Slack Pi extension) that aren't bundled into Pi or any global CLI. The harness
is bind-mounted, so a Dockerfile-time install gets shadowed at runtime. The
entrypoint now runs pnpm install --prefer-offline at the harness root on first
boot when node_modules/ is missing, before the cron runtime starts. Set
SKIP_PNPM_INSTALL=1 to opt out.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Step 3b: when a tunnel exists in the Cloudflare account but its
<tunnel-id>.json credentials file isn't on this host (created on a
different machine, lost, etc), reconstruct the JSON from
`cloudflared tunnel token <name>` rather than failing.
Also documents the trap that token-mode runs (`--token <T> --url <u>`)
silently drop --url because the tunnel is treated as remotely-managed
— connections register but Cloudflare returns 530.
The pipe goes direct from `cloudflared tunnel token` to `jq` to a
file; assigning to a *TOKEN-named variable would trip the
deny-env-dump.sh hook.
Closes#249
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>