Commit Graph
928 Commits
Author SHA1 Message Date
Tianyi Cui 2d80d868be ci: isolate lint and tune coverage lane 2026-07-06 02:39:26 +08:00
Tianyi Cui 7cd4868056 ci: split primary gates into broad lanes 2026-07-06 02:22:22 +08:00
Tianyi Cui c64eca451c ci: ignore doc-typecheck temp dirs during lint 2026-07-06 02:04:32 +08:00
Tianyi Cui d9c401d27a Merge remote-tracking branch 'origin/master' into codex/parallelize-ci 2026-07-06 01:59:49 +08:00
Tianyi Cui 44664551cf test: wait for ACP stdout frame under e2e parallelism 2026-07-06 01:54:09 +08:00
Tianyi Cui 0452261b5b Merge parallel pre-push gates into CI scheduler 2026-07-06 01:47:13 +08:00
Tianyi Cui 9c0cd392b9 Merge pull request #176 from deepseek-harness/worktree-add-merging-stacked-prs-skill
docs: add the dsh-merging-stacked-prs skill
2026-07-06 01:28:43 +08:00
Tianyi Cui 282215f3fa Merge remote-tracking branch 'origin/worktree-add-merging-stacked-prs-skill' into worktree-add-merging-stacked-prs-skill 2026-07-06 01:21:48 +08:00
Tianyi Cui 89e7005cfd docs: state the dependent check's contract as zero-versus-non-zero
Verified against gh: --base filters server-side and exactly, so any
open dependent guarantees a non-zero print, but --jq length counts the
fetched page and gh's default --limit is 30 (--limit 5 prints 5 when
the true count is 20). The printed number is min(actual, limit), so the
skill no longer claims it as the auto-close count; only 0 clears a
delete.
2026-07-06 01:19:46 +08:00
Tianyi Cui 42bdf4f8fa Merge branch 'master' into worktree-add-merging-stacked-prs-skill 2026-07-06 01:18:36 +08:00
Tianyi Cui 3b145bff5c docs: check dependents per-branch with --base, not a capped sweep
Review comment on the verify step: dumping every open PR under
--limit 1000 wastes agent context and re-truncates past 1000. Ask the
exact question server-side instead: gh pr list --state open
--base <branch> --json number --jq length, whose output is a single
count that is exact at any number of open PRs. Skill, checklist, and
the cookbook dependent-check line all use the per-branch form.
2026-07-06 01:15:32 +08:00
Tianyi Cui 6ea7d7af53 ci: parallelize real-api e2e files 2026-07-06 01:10:27 +08:00
Tianyi Cui c0af59f804 docs(rfc): record parallel pre-push gates 2026-07-06 01:04:06 +08:00
Tianyi Cui 08e09217bf docs(rfc): record parallel GitHub CI gates 2026-07-06 01:04:06 +08:00
Tianyi Cui 60f7a592b3 Merge remote-tracking branch 'origin/master' into worktree-add-merging-stacked-prs-skill 2026-07-06 01:01:35 +08:00
Tianyi Cui f9cd84286f Merge pull request #177 from deepseek-harness/codex/move-acp-snapshot-replay-doc
Move ACP snapshot replay doc into package
2026-07-06 01:01:27 +08:00
Tianyi Cui aa866e377b Merge remote-tracking branch 'origin/codex/parallelize-ci' into codex/parallelize-ci 2026-07-06 00:58:04 +08:00
Tianyi Cui dc8bf36400 Merge remote-tracking branch 'origin/master' into codex/parallelize-pre-push 2026-07-06 00:56:43 +08:00
Tianyi Cui d64fe7b8b3 Merge remote-tracking branch 'origin/master' into codex/parallelize-ci 2026-07-06 00:56:35 +08:00
Tianyi Cui 7cdf8676dd Merge branch 'master' into codex/move-acp-snapshot-replay-doc 2026-07-06 00:56:13 +08:00
Tianyi Cui 89303ae656 Merge pull request #165 from deepseek-harness/worktree-system-prompt-variables
System prompt: prompt variables, persona-as-section, tool-guidance ownership
2026-07-06 00:55:56 +08:00
Tianyi Cui 1c05c41f47 docs: wait for MERGED before advancing the stack
Second review round: 'gh pr merge' can return after merely enabling
auto-merge when required checks are pending or a merge queue is active,
so retargeting the next PR could run against a master that does not yet
contain the parent. The procedure and checklist now require
'gh pr view <n> --json state' to report MERGED after every merge.
2026-07-06 00:55:09 +08:00
Tianyi Cui 5caceee380 Move ACP snapshot replay doc into package 2026-07-06 00:52:06 +08:00
Tianyi Cui 72c83c771a chore: parallelize pre-push gates 2026-07-06 00:52:00 +08:00
Tianyi Cui dd44402871 docs: fix review findings in the stacked-PR merge skill
Codex review caught three procedure defects: the dependent check used
bare 'gh pr list', whose default pagination can hide an open dependent
and make branch deletion look safe (now --state open --limit 1000); the
refresh step merged local master, which 'gh pr merge' leaves stale (now
fetch and merge origin/master); and the quick checklist omitted pushing
the dependent after the local merge.
2026-07-06 00:46:22 +08:00
Tianyi Cui 8e649792b7 Merge branch 'master' into codex/parallelize-ci 2026-07-06 00:41:41 +08:00
Tianyi Cui bb4cc0ff60 docs: add the dsh-merging-stacked-prs skill
Commit the stacked-PR landing procedure as a repo skill so every
collaborator's agent discovers it: merge bottom-up, retarget and refresh
each dependent, and delete no branch until the whole stack has landed
(deleting a base branch auto-closes the open PR that bases on it).
The responding-to-pr-review-on-a-stack cookbook guide's dependent-check
step links the skill as the full landing procedure.
2026-07-06 00:35:54 +08:00
Tianyi Cui 3633cf90c8 fix(review): contain provider-removed listener failures; pin the model-via-request path
ds-review-bot round 2, both warnings:

- subagent/provider-removed now routes through emitLifecycle (per-listener
  containment, the subagent/start|end precedent) instead of raw ctx.emit,
  whose dispatch halts on the first throw: a throwing subscriber can no
  longer starve a later mirror into keeping a stale tool, nor disrupt the
  backend fiber's teardown mid-disposer. provider-added deliberately keeps
  propagation (register-time rollback semantics, like the system-prompt
  registries); the asymmetry is documented on emitLifecycle, the event
  JSDoc, and the provider-lifecycle RFC.

- The documented model-via-agent/request fallback composes with a
  {{model}} persona via the ownership rule itself: the plugin supplying
  the model late states it early on the system-prompt/assemble waterfall.
  Declined re-ordering render after agent/request — it would break the
  agent/pre-step contract (compaction must measure the prompt the model
  sees). New loop test pins the supply path end-to-end; the RFC's
  {{model}} consequence bullet now covers supply as well as switch.
2026-07-06 00:34:47 +08:00
Tianyi Cui 80358aed9f ci: parallelize github workflows 2026-07-06 00:15:19 +08:00
Tianyi Cui bffdee88e4 Merge origin/master: adopt the uniform RFC format
This branch's two RFCs (prompt-variables, provider-lifecycle events)
conform to the new contract in the same merge: 'Status: implemented'
dateless header, 'Rejected alternatives' -> 'Alternatives considered',
'What we give up' folded into '## Consequences' (per the uniform-format
RFC's own rejection of a costs-only closer), and the index regenerated
into the new INDEX.md. docs/rfc/README.md resolved to master's rewrite.
2026-07-06 00:13:09 +08:00
Tianyi Cui d10d94a640 Merge pull request #174 from deepseek-harness/worktree-rfc-uniform-format
docs(rfc): uniform RFC format — contract, gate, and full-corpus adoption
2026-07-06 00:06:14 +08:00
Tianyi Cui b38d751e42 docs(rfc): align the no-Status-line alternative's file count with the measured one 2026-07-05 23:56:11 +08:00
Tianyi Cui 0e29de459e docs(rfc): address Codex review — fence-aware format gate, exact corpus counts
Two findings from the pre-ready review, both verified:

- verify-rfc-format scanned raw lines, so an RFC quoting a Status line,
  a banned heading, or the grandfather comment inside a fenced example
  would false-positive. The content scans (duplicate Status, H2 headings,
  banned headings, grandfather, legacy marker) now ignore fenced blocks;
  the positional header-block checks stay raw. Verified: a fenced
  'Status: implemented' + '## Plan' + grandfather quote inside a walked
  RFC no longer trips the gate.

- The companion RFC's pre-format corpus counts were imprecise: 27
  distinct Status spellings (reasons collapsed), not 'some fifteen';
  nineteen implemented files carrying thirty proposal-era heading
  occurrences, not 'over twenty files'; three English files (plus one zh
  counterpart) with no status, not four.
2026-07-05 23:45:34 +08:00
Tianyi Cui 6bca9cbeb3 docs(rfc): record the subagent provider-lifecycle events as their own RFC
The subagent/provider-added and subagent/provider-removed events carry a
decision of their own — reactive consumer registration instead of a
load-order requirement the cordis Loader never guaranteed — buried in a
section of the prompt-variables RFC. Extract it: the mechanism, the
Loader-concurrency evidence, the rejected alternatives (apply-time
lookup, polling, assemble-time wording, name-keyed wording), and what we
give up (the absent-tool window, the dup-toolName blast radius) move to
2026-07-05-subagent-provider-lifecycle-events.md; the prompt-variables
RFC keeps the context contract and points there; index regenerated.
2026-07-05 23:28:13 +08:00
Tianyi Cui 3f83a4ee96 review: the persona becomes the system-prompt plugin's deployment config
Review round 2 (tianyicui inline comments):

- dsh-system-prompt itself registers the harness:identity (-100) and
  deployment:persona (0) sections — they must survive a swapped loop
  plugin, so they leave dsh-agent-loop; the persona text is the plugin's
  own validated 'persona' config. The model/cwd variables STAY on the
  loop: runtime facts of the agents it drives.
- AgentOptions.systemPrompt is deleted with all its forwarding plumbing:
  the app configs' systemPrompt keys become 'persona' routed through
  dsh-agent-core (schema = z.intersect of the owners'), the ACP bridge
  and tool-subagent stop carrying persona configuration, and subagent
  children now render the deployment persona like every other agent.
- Example personas drop transport/interface trivia (ACP, CLI) — facts
  irrelevant to the model.
- Root CONTEXT.md removed (not idiomatic); its persona definition was
  wrong under the new ownership anyway.
- Docs, READMEs, the prompt-variables RFC, and generated catalogs
  updated; new loop test pins the assemble-waterfall escape valve
  (an emptied assembly sends NO system field).
2026-07-05 23:23:46 +08:00
Tianyi Cui e6fad266a6 docs(rfc): define and enforce a uniform RFC format; adopt it across the corpus
Define the in-file RFC contract in docs/rfc/README.md § The file format:
the header block (`# RFC: <title>` plus a dateless Status enum
cross-checked against the lifecycle folder), the per-lifecycle body
skeleton (a Problem opener everywhere; Proposal/Alternatives considered/
Acceptance criteria/Risks in proposed/; present-tense Decision/
Consequences with proposal-era headings banned in implemented/; the
frozen proposal shape in rejected/), and a mandatory Alternatives
considered section with a date-fenced grandfather comment for pre-format
RFCs whose alternatives are not reconstructible from the record.

Enforce it with a new doc-sync gate, scripts/verify-rfc-format.ts, and
normalize all 112 RFCs to it: ~15 Status-line spellings collapse to the
enum, 29 Context openers become Problem, the 39 legacy-format XXX debt
markers are resolved and banned from reappearing, proposal-era sections
in implemented RFCs are rewritten to shipped reality (including the
web/fs/subagent seam RFCs' migration plans and test checklists, closing
the doc-tiers deferred-work item on the web seam), every RFC gains an
Alternatives considered section or the grandfather comment, and the
bilingual pair is re-mirrored and re-recorded.

Move the generated index tables out of README.md into a fully generated
docs/rfc/INDEX.md — gen-rfc-index now writes the whole file, and
verify-rfc-classification checks its freshness and rejects index-shaped
rows in the curated README — which makes room for the format contract to
live in the README front door instead of a separate FORMAT.md.

The decision record, and the first RFC written in the new format, is
docs/rfc/implemented/process/2026-07-05-uniform-rfc-format.md.
2026-07-05 22:58:25 +08:00
Tianyi Cui 2304f7a245 Merge origin/master: adopt the DeepSeek Harness SDK product name
Reconciliations beyond textual conflicts:
- product rename (DeepSeek Code -> DeepSeek Harness SDK) applied to the
  PR-added assertion in system-prompt.spec.ts that master's rename
  commit could not reach
- architecture.md: master's rewrite kept; this PR's prompt-assembly
  semantics re-added in the new doc's voice (Turn Flow footnote +
  service-spine row), within the 1630-word ceiling
- cordis catalog regenerated into master's split events.md/services.md
  (events-and-services.md deleted); module graph and doc graphs
  regenerated to pick up this PR's new events and dependency edges
2026-07-05 20:54:48 +08:00
Tianyi Cui d5cb3297ad Merge pull request #167 from deepseek-harness/codex/architecture-intro-rewrite
docs: rewrite architecture intro
2026-07-05 20:07:13 +08:00
Tianyi Cui e154396612 docs: refine architecture extension map 2026-07-05 19:52:07 +08:00
Tianyi Cui d899333cde docs: split cordis primer from architecture map 2026-07-05 19:07:34 +08:00
Tianyi Cui fdd65269f9 docs: synthesize architecture rewrite 2026-07-05 18:51:52 +08:00
Tianyi Cui dca7a436e4 docs: update product name 2026-07-05 15:31:50 +08:00
Tianyi Cui 00cf8b693a feat(agent-loop): open every prompt with the harness identity section
A static harness:identity section at order -100 — the first occupant of
the documented negative band — states that the agent is powered by the
DeepSeek Harness SDK before the deployment's persona renders. Harness
attribution is a harness fact: it lives on the loop plugin, not in each
deployment's persona, so every agent (subagents included) carries it and
no YAML can forget it. A deployment that must drop it can remove the
section in the system-prompt/assemble waterfall.

Order-band docs updated in all five homes (PromptSection JSDoc, the
system-prompt and agent-loop READMEs, architecture.md, the RFC).
2026-07-05 11:37:32 +08:00
Tianyi Cui 2f191cc72b docs(agent): state the persona's template contract in its JSDoc
The AgentOptions.systemPrompt doc said the persona 'may reference'
variables without saying that every complete {{...}} group IS interpreted,
strictly, and that literal {{...}} prose has no escape syntax yet (the
RFC's recorded deferral). A persona author reads this line first; it now
carries the contract. (ds-review-bot inline finding: the escape mechanism
itself stays deferred per the RFC — pre-release, no external consumers,
and the failure is loud with the fix in the message.)
2026-07-05 10:48:40 +08:00
Tianyi Cui e890a3373e test(review): pin the tool-subagent plugin fiber's lifecycle ownership; doc nits
Codex round-2 findings:

- A committed test now proves the REAL plugin fiber (not a direct apply)
  owns the provider-lifecycle listeners: disposing a mounted tool's fiber
  unmounts the tool and leaves the provider intact, and a fiber disposed
  while WAITING never zombie-mounts when its provider arrives later.
- TODO(subagent-dup-toolname) records the invalid-config blast radius of
  two waiting fibers sharing a toolName (the duplicate throw propagates
  through subagent/provider-added and rolls back the provider).
- CONTEXT.md drops its creation-history sentence; the RFC's acceptance
  checklist becomes present-tense shipped invariants (docs/AGENTS.md
  writing rules).
2026-07-05 03:40:22 +08:00
Tianyi Cui 96055d1763 docs: rewrite architecture intro 2026-07-05 03:32:11 +08:00
Tianyi Cui 57fd914f95 Merge pull request #130 from deepseek-harness/codex/docs-graph-brainstorm
docs: add graph atlas and Mermaid verification
2026-07-05 03:20:07 +08:00
Tianyi Cui a06e5f1c87 Merge remote-tracking branch 'origin/master' into codex/docs-graph-brainstorm
# Conflicts:
#	docs/architecture.md
2026-07-05 03:09:32 +08:00
Tianyi Cui 99540e6a94 Merge pull request #164 from deepseek-harness/worktree-arch-doc-drop-layering
docs: make the service map the front door of architecture.md
2026-07-05 02:59:50 +08:00
Tianyi Cui 54a3c8b2a4 docs: address graph review placement 2026-07-05 02:54:01 +08:00