Commit Graph
206 Commits
Author SHA1 Message Date
Chinesezjc 7b49f4a4ee docs(ci): runbook — glob migrated identity files; scope the promise to enterprise-pool outages
- The clone exclusion is now '.runner*' (catches .runner_migrated /
  .credentials_migrated, which GitHub writes on migrated runners and
  which equally trip the already-configured refusal — hit live during
  the 2026-07-27 org-group migration).
- The problem statement now states the verdict runs on ubuntu-latest,
  scopes the switch to enterprise Linux-pool outages, and names the
  residual dependency: node-compat/python-sdk/windows stay standard-
  hosted, so a broader hosted-capacity failure still blocks the
  verdict, with Windows the only leg lacking any in-house substitute.
Static gate green locally: 32 passed, 0 failed.
2026-07-27 16:56:02 +08:00
Chinesezjc 2bacd4814e Merge master; re-record serial-reference pairing over the merged pair 2026-07-27 16:48:01 +08:00
Chinesezjc 3cf2853b3f docs(ci): bootstrap procedure starts the listener service
config.sh only registers; the runner stays offline until svc.sh
install/start. Both language sides updated so emergency capacity
actually comes online.
2026-07-27 16:22:30 +08:00
Chinesezjc ce3b13bb08 ci: standby fetches full history; runbook — writer wording throughout, master-ref pinning incompatibility
- serial-linux-selfhosted checks out fetch-depth 0: depth 2 misses
  github.event.before on multi-commit or force pushes, failing the
  archive verifier on a valid tree. Full fetch is cheap against the
  VM's local mirror.
- Runbook (both languages): every remaining admin phrasing (problem
  statement, switch heading, alternatives, consequences) now says
  writer; and the 'composes with this mechanism' claim about a
  master-ref-pinned runner group is replaced with the truth observed
  live on 2026-07-27 — master-ref pinning blocks PR failover, and the
  shipped posture is repository-scoped all-workflow group access.
Static gate green locally: 32 passed, 0 failed.
2026-07-27 16:13:45 +08:00
Chinesezjc 24d7211f09 docs(ci): stop claiming no PR-editable path reaches the standby pool
The standby lane itself is push-only, but under failover pull_request
jobs do reach these runners with the PR merge ref's workflow. The
workflow comment and the larger-runner note (both languages) now state
that plainly and name the actual boundary — repository membership
(private, forking disabled, Dependabot excluded) — matching the
runbook. Static gate green locally: 32 passed, 0 failed.
2026-07-27 16:02:56 +08:00
Chinesezjc e2eca69e9c docs(ci): writer-level trust boundary stated everywhere; serial note counts four references
- Sweep every remaining 'admin-only' claim (workflow comments, runbook
  lines 13/40, topology note, all zh pairs): the variable is
  writer-manageable, and the boundary against untrusted code is
  repository membership (private, forking disabled, Dependabot
  excluded) — stated identically at every site instead of only in the
  'who can flip' paragraph.
- Serial cross-platform reference note (both languages): master now
  runs four references — the three hosted OS legs plus the self-hosted
  standby drill, linked to the failover runbook.
Static gate green locally: 32 passed, 0 failed.
2026-07-27 15:54:59 +08:00
Chinesezjc d606ab6877 ci: standby archive base ref; runbook — dependabot exception, clean bootstrap, variable trust model
- serial-linux-selfhosted now fetches depth 2 and passes
  DSH_ARCHIVE_BASE_REF=github.event.before, running the same
  frozen-archive comparison as serial-linux instead of diffing the
  new manifest against itself.
- Runbook (both languages): documents the deliberate dependabot
  exception (queued-on-hosted during failover is expected, not a
  failed switch); corrects the emergency-capacity bootstrap to
  exclude .runner/.credentials when cloning a runner directory; and
  replaces the 'admin-only' variable claim with the accurate
  trust-model statement — repository variables are writer-manageable,
  which in this private fork-disabled repo with an all-workflows
  runner group is routing among members, not an escalation.
Static gate green locally: 32 passed, 0 failed.
2026-07-27 15:47:19 +08:00
Chinesezjc caabf8f671 ci: dependabot stays hosted under failover; runbook matches shipped bounds
- All four failover selectors (three workers + the verdict job) and the
  paired env/cache expressions now exclude dependabot[bot]: under
  failover, dependency-supplied code keeps queueing for the hosted pool
  instead of executing on the persistent VM. A delayed Dependabot PR
  during an outage is an acceptable cost; dependency code on the
  privileged host is not.
- Runbook (both languages): records the shipped failover bounds
  (coverage 8, snapshots 12, sized for six instances) and documents
  that the verdict job follows the selector too — operators previously
  had no explanation for a verdict queued after all workers passed.
- Local static gate green: 32 passed, 0 failed (translation pairing
  519 pairs consistent).
2026-07-27 15:36:11 +08:00
Chinesezjc aedf7fbf34 docs(i18n): keep the runbook link target identical across the pair
The pairing gate requires link target #9 to be byte-identical between
the language sides; my earlier 'fix' pointed the zh side at the zh
runbook and broke the contract. Reverted to the shared target and
re-recorded the pairing hash.
2026-07-27 15:27:40 +08:00
Tianyi Cui cff614d37d ci: run the pull-request Windows blocking gates under Wine on hosted Linux
The required windows job moves from windows-2025 to ubuntu-latest, running
checksum-verified Windows Node under Wine at Linux-job wall clock (2m46s
warm vs 7-9min); master's serial-windows native-kernel reference is
untouched, and a new master-only wine-apt-cache job seeds the apt cache
every pull request restores. The experiment workflow folds into ci.yml,
the Agent Note moves to implemented with measured results, and the two CI
topology notes update to the shipped facts.
2026-07-27 13:17:12 +08:00
Chinesezjc 5fa74343aa docs(ci): six always-on instances, no pre-registered spares
The spare tier is retired. Steady-state pool load is one serial standby
job per master push, so six always-on instances already are the
failover capacity; pre-registered offline runners are a silently
expiring guarantee (GitHub garbage-collects them after 30 days
offline). Incident-time extra capacity is a one-minute org-token
registration, now documented in the runbook.
2026-07-27 12:54:35 +08:00
Chinesezjc fbd50aeb74 Merge remote-tracking branch 'origin/master' into ci/offload-coverage-to-vm-backup 2026-07-27 10:43:18 +08:00
Tianyi Cui e423bfbee6 Merge remote-tracking branch 'origin/master' into worktree-i18n-update-workflow
# Conflicts:
#	.agents/notes/implemented/process/2026-07-02-bilingual-docs-and-pairing-gate.i18n.yaml
#	.agents/skills/dsh-translate-docs/SKILL.md
#	docs/i18n/README.i18n.yaml
2026-07-27 09:39:54 +08:00
Tianyi Cui 736c8bf6de Merge remote-tracking branch 'origin/master' into worktree-nih-dependency-audit 2026-07-27 04:59:50 +08:00
Tianyi Cui 3fe60837c1 docs(i18n): record the v1-vs-v2 briefing A/B in the Agent Note
Head-to-head replay of the same ten historical examples, both arms in
one time window with identical prompts and pairwise blind judging:
prose quality and cost at parity (stylistic margins only); the shipped
briefing wins two objective outcomes — code-fence-only examples land
byte-identical to the human-reviewed updates with zero model tokens,
and the flagged first-occurrence move reproduces the human-reviewed
gloss relocation the section-only form leaves as a contract violation.
Chinese counterpart brought along via the briefed path and the pair
re-recorded.
2026-07-27 03:35:50 +08:00
Tianyi Cui 3b328b375e ci: restore standard Windows allocation 2026-07-27 02:31:46 +08:00
Tianyi Cui 53283003e9 feat(i18n): unit-mapped briefings with mechanical --apply, adopting the #684 planner mechanics
The briefing now maps each update at the narrowest safely aligned
granularity, widening deterministically on mapping failure: a change
confined to the pair's byte-identical code fences is computed outright
(--apply splices it into the counterpart and validates the result
against the pairing gate's structural signature before writing);
otherwise changed Markdown units — headings, paragraphs, table rows,
list items, fences, block quotes, HTML blocks, thematic breaks, link
definitions, matched by container-scoped kind sequences — each carry
their last-confirmed source, current source, and current counterpart
text; units that do not align fall back to depth-matched heading
sections (depth only, so translated heading text still maps); and when
sections do not align either, or both sides drifted, the briefing says
so and withholds the mapping. Terminology rows now match the changed
spans only, English terms on word boundaries with plural inflections,
and Chinese-target briefings track each relevant term's document-wide
first occurrence — a moved occurrence pulls the vacated and receiving
spans into the briefing with an explanatory note.

The unit mapping, mechanical code splice, and first-occurrence tracking
adopt the planner design from the incremental prompt-pipeline PR (#684),
whose provider-backed bake-off independently validated the same scope
ladder; this PR carries those mechanics into the agent-facing briefing
path so both consumers of the consistency records behave alike. The
prior line-hunk section mapping and its heading-text alignment (which
could not map cross-language sections) are replaced wholesale.

Docs: SKILL.md update path, i18n README pair, development.md pair, and
the briefed-updates Agent Note pair brought along; the development.md
fence edit was applied with --apply itself, and the prose updates were
made through the new unit/section briefings.
2026-07-27 02:31:07 +08:00
Tianyi Cui 8b684fa5d0 ci: fetch archive baseline history 2026-07-27 02:01:46 +08:00
Tianyi Cui 3b8600e2e8 ci: keep required aggregate on enterprise runner 2026-07-27 01:25:01 +08:00
Tianyi Cui 51bf3ca96e Merge remote-tracking branch 'origin/master' into worktree/archive-agent-notes-20260726
# Conflicts:
#	.agents/notes/archived/process/2026-07-23-browser-demo-gif-recording.i18n.yaml
2026-07-27 00:53:07 +08:00
Tianyi Cui 394b3f804c Merge remote-tracking branch 'origin/master' into worktree-nih-dependency-audit 2026-07-27 00:46:06 +08:00
Tianyi Cui 3841c4ee58 docs(i18n): briefed update path in the workflow, contract, and Agent Note
The dsh-translate-docs skill now triages updates onto a briefing-driven
path — gen-translation-brief output as the translator's whole working
set, orchestrator-applied mechanical fence edits, scoped record/check —
while the whole-document path for new pairs is unchanged. The i18n
README documents the scoped gate forms and the briefing tool;
development.md lists the new command; the new bilingual Agent Note
records the decision and the ten-example benchmark behind it (briefed
path ~1/3 the tokens and wall clock of the corpus-loading path at equal
judged quality; whole-document re-translation rejected on preservation
collapse). Counterpart updates in this commit were produced with the
new briefed path; the new note's Chinese side is a whole-document
translation.
2026-07-27 00:44:22 +08:00
Tianyi Cui d14f3371ae Merge remote-tracking branch 'origin/master' into worktree-nih-dependency-audit 2026-07-27 00:40:02 +08:00
Tianyi Cui 420e0b5fb7 Merge remote-tracking branch 'origin/master' into worktree/fix-pty-sigint-flake 2026-07-27 00:35:06 +08:00
Tianyi Cui 25a7c6e207 Merge branch 'master' into code-mode-ui/dispatch-spill 2026-07-27 00:05:29 +08:00
Tianyi Cui d2b15e71df Merge pull request #662 from deepseek-harness/code-mode-ui/shiki
feat(web): shiki syntax highlighting for code surfaces
2026-07-27 00:00:23 +08:00
Tianyi Cui e0e187a6a7 test(pty): avoid echoed readiness marker race 2026-07-26 23:52:12 +08:00
Tianyi Cui 8ceb638bb5 docs(skills): record-browser-gif — assets-branch publishing + mandatory GUI-PR gifs
Every PR that changes product-user-visible GUI behavior now includes a
demonstration GIF with real provenance (that branch's built tree, real
key, real model rounds). Recording stays side-effect-free; the skill
gains a bounded final publication step: GIFs go on an append-only
orphan assets branch (one per PR series) and embed via the blob URL
with ?raw=true, never on the PR branch itself.

Folds in the operational lessons from the Code Mode UI series:
.playwright-mcp/ screenshot roots (now gitignored), per-PR staging and
precise server teardown, one-call DOM polling for transient states,
exact-text completion predicates, prompt engineering for UI states,
and the export-before-invoke GIF_SKILL_DIR encoder pitfall.

Agent Note: implemented/process/2026-07-26-gui-pr-gif-evidence-and-assets-branch (+ zh pair); the 2026-07-23 recording note now defers publication policy to it.
2026-07-26 23:21:44 +08:00
Tianyi Cui 37140bf823 docs(notes): archive low-value decision records 2026-07-26 23:06:00 +08:00
Tianyi Cui 047e48bd8d docs: preserve incremental PR retarget checkpoints 2026-07-26 21:59:03 +08:00
Tianyi Cui 426da32217 Merge branch 'code-mode-ui/dispatch-spill' into code-mode-ui/shiki 2026-07-26 21:44:17 +08:00
Tianyi Cui 4bcb52ea12 Merge remote-tracking branch 'origin/master' into worktree/fix-clean-symlink-boundary
# Conflicts:
#	packages/support/llm-mock-server/tests/server.spec.ts
2026-07-26 21:33:44 +08:00
Tianyi Cui bbdb852407 Merge remote-tracking branch 'origin/master' into worktree-nih-dependency-audit 2026-07-26 18:54:03 +08:00
Tianyi Cui 79e72eb736 fix(ui-primitives): prototype-safe alias lookup; pre-warm shiki off the render path
Responding to ds-review-bot round 2 on #662:

- LANG_ALIASES is a Map: an assistant-authored fence label like
  constructor or __proto__ now misses (plain render) instead of resolving
  an inherited object property and crashing shiki mid-conversation. Test
  sweeps the inherited-key labels.
- The singleton is pre-warmed in a deferred task at plugin boot (the
  ~120-175ms engine+grammar construction long task moves off the first
  finalized fence's render); the lazy path remains the correctness
  fallback, and unref keeps non-browser imports from pinning the loop.

Agent Note updated (both languages).
2026-07-26 18:33:51 +08:00
Tianyi Cui 3a88912a22 docs: adopt dependencies-over-hand-rolling policy from NIH audit
A repo-wide Not Invented Here audit (ten parallel domain surveys covering
every package group, scripts/, native/, vendor/ edges, python/, test
infrastructure, and CI) asked of each hand-rolled surface whether a
maintained external package or Node builtin deletes it with a net win.

Policy: new implemented process note records that a dependency which
genuinely deletes owned code is a preferred simplification (bar: net
deletion, health, boundary fit, settled seams stay); root AGENTS.md
carries the one-line rule and dsh-find-simplifications now surveys for
hand-rolled-where-a-dependency-exists candidates.

Findings, all bilingual from birth:
- proposed/simplification: eventsource-parser for llm-deepseek SSE,
  node:timers/promises for three hand-rolled sleeps, turndown (or
  minimal 'entities') for tool-web HTML->markdown, gate-script
  consolidation onto mdast/parseArgs/globSync
- proposed/testing: execa + parseArgs + loadEnvFile + vi.waitFor for
  hand-rolled test subprocess plumbing
- proposed/process: pnpm/action-setup for symmetric CI caching
- proposed/feature: evaluate landstrip before building a Windows
  sandbox launcher
- rejected/simplification: ~30 swap verdicts recorded (vscode-jsonrpc,
  p-retry, Ajv, write-file-atomic, msw, hono, better-sqlite3, wireit,
  landstrip-for-linux, YAML consolidation, ...) so the survey is not
  re-litigated from scratch

Also drops the stale prompt/ entry from the AGENTS.md layout map
(workspace instructions live in packages/context/workspace-context).
2026-07-26 15:54:36 +08:00
Tianyi Cui b4d032c1a2 docs: make bilingual pairing universal 2026-07-26 15:06:51 +08:00
Tianyi Cui a976a3e64a Merge remote-tracking branch 'origin/master' into worktree/i18n-complete-non-readme 2026-07-26 12:08:40 +08:00
Tianyi Cui 63cd1b5834 docs(notes): refine the shiki note's Chinese pair 2026-07-26 10:19:43 +08:00
Tianyi Cui c57af8fa36 docs(notes): add Chinese pair for the shiki highlighting note 2026-07-26 10:06:36 +08:00
Tianyi Cui bb3dc50a4b feat(web): shiki syntax highlighting for code surfaces
One highlighter for the client: a synchronous fine-grained shiki core
(JS regex engine, no WASM) in ui-primitives with an explicit grammar
allowlist (typescript, shellscript, json — aliases resolve, unknown
languages take a geometry-identical plain arm). The shared CodeBlock
component owns both arms; markdown fences, the run_code expanded
program body (typescript), and the details panel Input (json) all
route through it. Token colors live in a new ui-theme shiki.css sheet
as --shiki-* custom properties (light/dark blocks), wired through the
shell's base.css chain — tokens-only styling holds; shiki's generated
span tree is the sanctioned innerHTML path (static output, no user
HTML). jsdom specs pin token spans, aliases, both fallbacks, and the
fence route; the built-bundle snapshot asserts the highlighted program
under the code row.
2026-07-26 09:52:37 +08:00
Chinesezjc 498df1d8de ci: gate static lane's cache restore under failover; fix runbook recovery steps
Review round on the pivoted design:

- node-24 (static) kept an unconditional hosted pnpm cache restore while the
  coverage and consumers lanes skip it under failover. On the self-hosted VM
  that restore downloads ~180 MB into /home/runner, a path pnpm never reads
  there, adding latency and contention during an outage. Gate it with the same
  `vars.DSH_CI_FAILOVER != 'selfhosted'` condition so all three lanes match.

- Runbook switch step 2 said "Re-run failed jobs", but the documented
  indefinite-queue outage leaves jobs queued (not failed), which cannot be
  re-run in place and do not retarget on variable change. Correct both language
  sides to cancel the run and re-run all jobs, or push a new commit.

- The standby-lane comment still described the switch as a one-line runs-on
  change; it is now setting the admin-only DSH_CI_FAILOVER variable.
2026-07-26 05:44:35 +08:00
Chinesezjc 68e280ce4f docs(ci): make the failover runbook a conforming dated Agent Note
The failover runbook landed as .agents/notes/implemented/process/ci-failover-runbook.md,
which fails three doc-sync gates: the classification/format gates require a
yyyy-mm-dd-topic.md filename and the implemented Agent Note skeleton
(Problem/Decision/Alternatives/Consequences), and the bilingual pairing gate
requires cross-note link targets to match between the two language sides.

Rename to 2026-07-26-ci-failover-runbook.md/.zh.md, reshape both sides into the
implemented skeleton (the runbook steps live in bespoke sections under Decision),
point the sibling topology note and the ci.yml comment at the dated filename, and
make both sides link the canonical .md per the bilingual convention. Re-recorded
the i18n pairing records.
2026-07-26 05:22:28 +08:00
Tianyi Cui 586ccb677e docs: refine semantic PR label taxonomy 2026-07-26 04:18:03 +08:00
Chinesezjc 1a60140729 Merge remote-tracking branch 'origin/master' into ci/offload-coverage-to-vm-backup
# Conflicts:
#	.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml
2026-07-26 03:53:19 +08:00
Tianyi Cui 37bfac749b docs: enforce bilingual README coverage 2026-07-26 03:39:30 +08:00
Tianyi Cui 78e57ab53e docs: record PR label taxonomy 2026-07-26 03:28:39 +08:00
Tianyi Cui 0fb392e42f Merge remote-tracking branch 'origin/master' into worktree/i18n-complete-non-readme 2026-07-26 02:53:54 +08:00
Tianyi Cui f2cf29bd04 docs: deduplicate paired code-block checks 2026-07-26 02:52:48 +08:00
Tianyi Cui 6dd1ce1c9b fix(build): contain clean targets within repository 2026-07-26 02:51:58 +08:00
Tianyi Cui a439ed4e43 Merge branch 'master' into fix-update-builderror 2026-07-26 02:39:35 +08:00