Commit Graph
6028 Commits
Author SHA1 Message Date
Tianyi Cui 28f7fa0969 docs(rfc): record deferred skill extensions 2026-07-11 22:18:58 +08:00
Tianyi Cui 9b4ce4f301 Merge pull request #169 from deepseek-harness/feat/sandbox-support
feat(sandbox): file-sandboxed bash execution — sandbox seam + approval seam + escalation + per-session mode switching over ACP config options
2026-07-11 22:17:15 +08:00
Tianyi Cui 0d23d95dde docs(sandbox): record follow-up boundaries 2026-07-11 22:07:56 +08:00
Tianyi Cui 84ad8866d7 test(snapshot): cover workspace context transcript 2026-07-11 22:04:52 +08:00
Tianyi Cui 1e2d8014a5 Merge remote-tracking branch 'origin/master' into feat/sandbox-support
# Conflicts:
#	packages/workflow/workflow-workerthread/tests/workflow-workerthread.spec.ts
2026-07-11 21:43:10 +08:00
Tianyi Cui b29a8eca71 fix(review): reconcile sandbox and approval contracts 2026-07-11 21:37:38 +08:00
Tianyi Cui 1b1384c8b8 Merge branch 'master' into codex/skill-system 2026-07-11 21:27:17 +08:00
Tianyi Cui 850796bb35 fix(tools): reserve the Code Mode transport 2026-07-11 20:47:45 +08:00
Tianyi Cui fc0357a100 Merge remote-tracking branch 'origin/master' into codex/pr224-rfc-rewrite
# Conflicts:
#	docs/architecture.md
#	docs/event-producer-consumer.md
#	docs/module-graph.md
#	scripts/doc-budgets.manifest.json
#	scripts/gen-doc-graphs.ts
2026-07-11 20:38:25 +08:00
Tianyi Cui 6091c0a3dc docs: rewrite the agent-scope RFC 2026-07-11 14:01:49 +08:00
Hypatia May 42d85cf76f fix(session): avoid retaining surface fold history 2026-07-11 12:29:19 +08:00
Hypatia May ad32c57e72 refactor(session-query): narrow phase one to exact reads 2026-07-11 12:20:35 +08:00
Hypatia May 8fd68731ba fix(session-query): harden provider operation lifecycle 2026-07-11 12:02:51 +08:00
Hypatia May 8dd85bd185 refactor(session-query): simplify provider synchronization 2026-07-11 11:48:32 +08:00
Hypatia May f4b0dba380 fix(session-query): contain sync cancellation failures 2026-07-11 10:59:54 +08:00
Hypatia May 6c6ce08a39 fix(session-query): preserve sync error typing 2026-07-11 10:52:17 +08:00
Hypatia May fa728a00bd fix(session-query): reconcile concurrent live removals 2026-07-11 10:42:40 +08:00
Hypatia May ebb9f2ef76 Merge branch 'master' into session-query 2026-07-11 10:26:15 +08:00
Hypatia May 352ea6cf4f fix(session-query): checkpoint review round 3 2026-07-11 10:19:34 +08:00
Tianyi Cui ee3e4ea8f9 Merge pull request #245 from deepseek-harness/fix/subagent-acp-onerror-containment
fix(subagent-acp): contain onError sink exceptions to keep result from rejecting
2026-07-10 23:33:03 +08:00
Tianyi Cui a8b68e1303 Merge branch 'master' into fix/subagent-acp-onerror-containment 2026-07-10 23:31:17 +08:00
Yichen Jiang ba95271d63 Merge branch 'master' into codex/project-instruction-files 2026-07-10 22:58:39 +08:00
Yichen Jiang 386d4d3ec4 Merge branch 'master' into codex/skill-system 2026-07-10 22:58:15 +08:00
Yichen Jiang 30ecee33fe Merge branch 'master' into codex/agent-session-jsonl-location 2026-07-10 22:57:55 +08:00
Tianyi Cui ee15a01f61 Merge pull request #252 from deepseek-harness/eslint-project-service
chore(lint): one shared project service; ignore harness-local .claude state
2026-07-10 22:52:21 +08:00
Tianyi Cui dce2945211 Merge branch 'master' into eslint-project-service 2026-07-10 22:50:28 +08:00
Tianyi Cui feb457d425 Merge pull request #236 from deepseek-harness/codex/mock-snapshot-rerecord
Add keyless snapshot refresh mode
2026-07-10 22:36:48 +08:00
Tianyi Cui 65587c6091 Merge remote-tracking branch 'origin/master' into codex/mock-snapshot-rerecord
# Conflicts:
#	packages/workflow/workflow-workerthread/tests/workflow-workerthread.spec.ts
2026-07-10 22:19:18 +08:00
Tianyi Cui 59025dde14 Merge pull request #232 from deepseek-harness/codex/grep-glob-rfc
feat: bash-backed glob/grep discovery tools (dsh-tool-fs-search)
2026-07-10 22:15:23 +08:00
kingwl 53f6a959e2 chore(lint): one shared project service; ignore harness-local .claude state
Two independent multipliers were pushing bare `pnpm run lint` past node's
default heap:

1. parserOptions.project expanded to every package tsconfig plus the root
   one — each matched config built its OWN ts.Program, and the dev paths
   map pulls sibling package SOURCES (plus the vendored Cordis stack) into
   every such program, so resident memory grew as sum-of-closures, not
   repo size: ~4.6 GB peak for 425 repo files. projectService shares one
   tsserver-style graph: ~2.0 GB peak, ~28 s → ~14 s wall.

2. `eslint .` traversed .claude/ harness-local state — stale worktree
   checkouts there carry tens of thousands of additional .ts files
   (whole-repo copies), roughly tripling the work again even under the
   project service. Other checkouts are not this one's sources; ignore
   them like node_modules. (#169 carries the identical ignore line inside
   its chain; the hunks dedupe on its next rebase.)

Type-aware rules verified live under the service: a floating-promise
probe still trips no-floating-promises.
2026-07-10 22:13:40 +08:00
kingwl 0c2e773d67 fix(mode): the default mode hides the exit binding from the Code Mode SDK too
Review finding, valid — the previous SDK fix covered only the
non-default branch: in the default mode under Code Mode the wire filter
dropped exit_plan_mode but the registry-rendered tools:sdk section
still advertised its binding, offering default-mode agents a call that
can only error and breaking the byte-identical claim (a no-dsh-mode
deployment's registry never saw the tool, so its SDK never listed it).

The SDK re-render extracts to one helper both branches share: the
non-default branch passes the mode's visibility rule, the default
branch hides exactly the exit binding. The pinning test now compares
the default-mode SDK byte-for-byte against a bare deployment without
dsh-mode — the strongest form of the invariant the RFC states.
2026-07-10 22:09:36 +08:00
Tianyi Cui 4ce98cbab3 Merge branch 'master' into feat/website-docs 2026-07-10 22:00:38 +08:00
kingwl bedd908331 test(mode): pin the mode-both composition — one visibility rule, both surfaces
A review finding claimed plan mode under the registry's 'both'
presentation leaves non-allowlisted native schemas on the wire. The
claim misreads the filter predicate — 'keep visible plus run_code' IS
'drop everything else' — and the SDK re-render shares the same visible()
predicate, which is precisely the remedy the finding requests. This
test refutes it empirically on unchanged code (first run green) and
stays as the regression pin: plan + both = [exit_plan_mode, read,
run_code] on the wire, read documented and write absent in the SDK.
2026-07-10 21:24:07 +08:00
Yichen Jiang e4be19b29e Merge remote-tracking branch 'origin/master' into codex/skill-system
# Conflicts:
#	packages/workflow/workflow-workerthread/tests/workflow-workerthread.spec.ts
2026-07-10 21:10:58 +08:00
Yichen Jiang 78c930d967 Merge branch 'master' into codex/agent-session-jsonl-location 2026-07-10 21:09:28 +08:00
kingwl e2628442fa fix(mode): the Code Mode SDK section is re-rendered under the mode's visibility rule
Review follow-up on the residual the previous commit accepted — and the
acceptance was wrong, because the fix is clean: in Code Mode the SDK
section IS the soft surface (the wire carries only run_code), section
text resolves in assemble's base, and renderToolsSdk is an exported
pure renderer. The outermost wrapper therefore re-renders tools:sdk
from the same visibility predicate the wire filter applies (allowlist,
exit-IFF-plan, minus run_code mirroring the registry's own exclusion):
a plan-mode program is documented exactly the callable bindings — read
and the exit, never the denied write. The default mode leaves the
section untouched (absence of policy), both pinned by tests.

The soft layer's promise — the model is never encouraged toward a tool
the gate denies — now holds in Code Mode too; the only remaining
prompt-honesty residual is a prepend-after-load assemble listener,
where the gate still covers execution.
2026-07-10 21:09:28 +08:00
Yichen Jiang 77f8b2c134 Merge branch 'master' into codex/rfc-subagent-background-tasks 2026-07-10 21:08:36 +08:00
Yichen Jiang 00c70ed85c Merge branch 'master' into codex/project-instruction-files 2026-07-10 21:07:55 +08:00
Tianyi Cui afb0a2b5cd Merge pull request #246 from deepseek-harness/fix/workflow-workerthread-waitfor
test(workflow-workerthread): flake-proof the lifecycle spec's waits under CI load
2026-07-10 21:05:58 +08:00
Yichen Jiang 869f94d9d8 revert: split hook transcript locator cases 2026-07-10 20:56:24 +08:00
Yichen Jiang c204451995 test: split hook transcript locator cases 2026-07-10 20:55:41 +08:00
Yichen Jiang eea0a99985 feat: expose agent session log location 2026-07-10 20:52:27 +08:00
pku-xht dd2f37b80f fix(workflow-workerthread): tighten post-result promptness waits back down
Review follow-up: the blanket 10s default correctly targets worker-thread
cold-start races (starting, first-script-line, async child-registration
messages — genuinely CPU-bound under CI contention), but four waits assert
something different — that the HOST reacted PROMPTLY to an event that
already happened (a settled result, an observed worker death). Those had no
cold-start left to wait on, so the generous default just widened the window
a real regression could hide in.

Verified by injecting a 6s delay into the settle-reap's abort call: the
un-overridden helper's test still passed in ~6s. The same mutation now fails
in ~1s with the explicit 1000ms override restored on all four sites (the
abort-on-settle test's own assertion, the two worker-death cancel/dispose
reap checks, and the dispose-ack-race check). The other 12 waits keep the
10s default — they run BEFORE a result is awaited, waiting on the worker to
actually start rather than on a host reaction. Doc comment corrected to
describe the split instead of claiming every wait is a cold-start race.
2026-07-10 20:48:14 +08:00
kingwl 976deda91b fix(mode): run_code passes both layers as a transport — Code Mode composes with plan mode
Review finding, valid: under the registry's Code Mode the assembly's
only wire tool is run_code, which the plan allowlist filtered out —
leaving the model with NO tools at all, the exit review included. The
composition exists today (the acp-agent example ships a code-mode
overlay), so plan mode bricked it outright.

run_code is a transport, not a capability: every bridged sub-call is
serialized back through ToolRegistry.execute() carrying the same agent,
so tools/pre-execute judges each capability individually — exactly like
native calls. Both layers now exempt it by name: the filter keeps it
visible (tests pin plan-mode Code Mode assembly = ['run_code']) and the
gate passes the wrapper while the same run's write sub-call still
denies with the plan-mode reason.

Documented residual, same class as the prepend-after-load one: the SDK
section renders from the registry's store, so a plan-mode program may
be offered bindings whose dispatch the gate then denies — nothing runs
that a native call could not.
2026-07-10 20:26:59 +08:00
kingwl b29aeb1847 fix(stdio): /mode is reserved even while a question prompt is active
Review finding at the seam of two surfaces this branch added to the
same stdin: with an ask_user_question (or plan-review) prompt active,
the line handler dispatched every line as the answer first, so
'/mode plan' typed mid-question was recorded as free-text feedback —
model-visible in the tool result — and the mode never changed. Command
handling now runs before answer dispatch: the command executes, the
question stays pending and still owns the next non-command line. A
literal '/mode…' free-text answer is the trade-off deliberately spent —
a swallowed command that becomes review feedback costs far more than
that contrived answer shape.
2026-07-10 19:17:45 +08:00
kingwl 3025fbaeb3 fix(mode): prepend the assemble filter; structured_output joins the plan allowlist
Review finding with a real in-repo instance: the structured runtime's
per-spawn final-assembly wrapper (prepend, post-next) re-injects
structured_output OUTSIDE the mode filter, so a structured child in
plan mode would see a tool the gate then denies — the soft policy and
the hard gate telling different stories. The suggested fix (make the
mode filter outermost) cannot beat that instance: prepend unshifts, so
the per-spawn listener always registers later and wraps outer.

Two-part resolution instead. Semantically, structured_output enters the
shipped plan allowlist — it is a child's pure result channel, the same
ask/report class as ask_user_question and exit_plan_mode, so the
filter, the re-injection, and the gate now agree wherever a structured
child runs in plan mode. Mechanically, the filter registers with
prepend anyway: it now wraps outside every append-registered listener
regardless of load order (regression test pins a pre-registered
post-next mutator being filtered), narrowing the documented cosmetic
residual to prepend-after-load listeners only, where the gate still
covers execution. Severity note: no execution breach existed — the gate
held throughout; this closes the prompt-honesty gap.
2026-07-10 18:35:44 +08:00
Yichen Jiang c2c238d36d fix(skill): forward cancellation to local reads 2026-07-10 17:47:28 +08:00
Yichen Jiang 0b20353424 test(acp): clarify skill snapshot fixture 2026-07-10 17:47:11 +08:00
Ziya 3abc680048 rfc: derive handback visibility from the log, not a live-only mirror 2026-07-10 02:38:26 -07:00
Hypatia May 18028cad4f fix(session-query): address review round 1 2026-07-10 17:29:52 +08:00