HomeTrang chủ › What's newCó gì mới
Release highlights · what is on main and what landed in the latest cutĐiểm nổi bật · những gì đã vào main và những gì bản release gần nhất mang

What's newCó gì mới

v7.5.1 · 2026-11-04

What's new · v7.5.1Có gì mới · v7.5.1

🩹
A patch: the install gate is green on Windows and macOS again. The Windows hs-*.cmd launchers ship CRLF and run under cmd.exe; packing on Windows stays under the command-line limit; the installers take the first Python ≥3.12 that already has the deps, honor a HARNESS_PY you set, and print which one they took; and a finished hs-rops run takes down what it left in its process group. Full notes: CHANGELOG.md → [7.5.1].Bản vá: cổng cài đặt xanh lại trên Windows và macOS. Launcher hs-*.cmd trên Windows nay xuống dòng CRLF và chạy được dưới cmd.exe; đóng gói trên Windows không vượt giới hạn dòng lệnh; trình cài chọn Python ≥3.12 đầu tiên đã có đủ thư viện, theo đúng HARNESS_PY bạn đặt, và in ra bản nó chọn; và lượt hs-rops đã xong sẽ dọn những gì còn sót trong process group. Đầy đủ: CHANGELOG.md → [7.5.1].
v7.5.0 · 2026-11-03

What's new · v7.5.0Có gì mới · v7.5.0

🛡️
The harness reaches a ninth runtime, and a gate can ask you instead of only refusing. OpenCode v2 joins the install targets through a bridge shared with pi; secret-file reads, shell reads included, wait for your yes; an agent can check a credential without seeing it; and hs-usage admit sizes a fan-out by the machine's load and the quota. Alongside: hs-rops fixes for runs that stall or lose their session. Full notes: CHANGELOG.md → [7.5.0].Harness có runtime thứ chín, và gate có thể hỏi bạn thay vì chỉ từ chối. OpenCode v2 vào danh sách đích cài qua bridge dùng chung với pi; đọc tệp bí mật, kể cả qua shell, phải chờ bạn đồng ý; agent kiểm được credential mà không nhìn thấy nó; và hs-usage admit định cỡ fan-out theo tải máy và quota. Cùng đợt: các bản sửa hs-rops cho lượt chạy bị treo hoặc rớt session. Đầy đủ: CHANGELOG.md → [7.5.0].

🧭 The harness installs onto OpenCode v2🧭 Harness cài lên OpenCode v2

--runtime opencode writes a plugin under .opencode/plugins/hs-bridge/ that calls the same Python dispatcher: a refusal throws in tool.execute.before, a gate's ask goes to OpenCode's own permission prompt for that call, and the model's shell gets the project's HARNESS_DATA_ROOT. Agents keep their tool cage as per-action permissions, skills land as hs-<name>, the harness block is spliced into AGENTS.md, and the user's opencode.json is never written. pi and OpenCode now share one generated bridge core, which also fixes pi's file gates. Checked against OpenCode 2.2.5 with a local fake model.--runtime opencode ghi một plugin dưới .opencode/plugins/hs-bridge/ gọi đúng bộ dispatcher Python: lời từ chối được ném ra trong tool.execute.before, câu hỏi của gate đi vào hộp xin quyền của chính OpenCode cho lượt gọi đó, và shell của model nhận HARNESS_DATA_ROOT của dự án. Agent giữ cũi tool dưới dạng quyền theo từng hành động, skill vào dưới tên hs-<name>, khối harness được ghép vào AGENTS.md, và opencode.json của người dùng không bao giờ bị ghi. pi và OpenCode nay dùng chung một lõi bridge sinh ra, nhờ đó sửa luôn các gate tệp của pi. Đã kiểm với OpenCode 2.2.5 bằng một model giả chạy cục bộ.

9 runtimes besides Claude Codeshared bridge corepermission prompt

🙋 A gate can put a call to you🙋 Gate có thể hỏi bạn

A compliance core may now answer ask: the dispatcher writes permissionDecision: "ask" once the whole group has run, so a later deny still wins. The privacy guard uses it for Read and, new, for the shell: cat, grep, cp, bash -c, --file= or a symlink alias naming a likely-secret file waits for your yes. A runtime with no prompt to show gets a deny.Một lõi compliance nay có thể trả ask: dispatcher ghi permissionDecision: "ask" sau khi cả nhóm đã chạy, nên một lệnh chặn đến sau vẫn thắng. Privacy guard dùng nó cho Read và, mới, cho shell: cat, grep, cp, bash -c, --file= hay một symlink trỏ tới tệp có vẻ chứa bí mật đều chờ bạn đồng ý. Runtime không có hộp hỏi để hiện thì nhận lệnh chặn.

permissionDecision: askshell reads includeddeny still wins

🔐 Check a credential without seeing it🔐 Kiểm credential mà không nhìn thấy nó

hs-secrets compare REF answers match or differs for a candidate read from stdin or a file, prints neither value, refuses one on argv, and locks the ref after five wrong in a row within an hour. hs-secrets hint REF shows a declared public prefix plus the last four characters. A secret value that would change the shell command it lands in is refused.hs-secrets compare REF trả match hoặc differs cho một giá trị đọc từ stdin hoặc tệp, không in giá trị nào, từ chối giá trị truyền qua argv, và khoá ref đó sau năm lần sai liên tiếp trong một giờ. hs-secrets hint REF chỉ hiện tiền tố công khai đã khai cộng bốn ký tự cuối. Giá trị bí mật nào làm đổi lệnh shell mà nó được chèn vào thì bị từ chối.

compare · hintno value printed5 wrong → locked

🚦 Admit a fan-out by load and quota🚦 Cho phép fan-out theo tải máy và quota

hs-usage admit --want N answers how many agents may run at once: the smallest of what was asked, what the machine carries (0.7 × CPUs minus the 1-minute load, never below one) and what the quota allows. Without --live the quota is unknown, so it admits one and exits 10 with ask_user. The orchestration rule requires it before any fan-out of more than one agent. The usage nudge now ships off.hs-usage admit --want N trả lời được chạy cùng lúc mấy agent: số nhỏ nhất giữa số được xin, mức máy gánh được (0,7 × số CPU trừ tải 1 phút, không dưới một) và mức quota cho phép. Không có --live thì chưa biết quota, nên nó chỉ cho một và thoát 10 kèm ask_user. Luật điều phối bắt buộc gọi nó trước mọi lượt fan-out hơn một agent. Usage nudge nay mặc định tắt.

admit --want Nexit 10 · ask_userusage nudge off

hs-ropshs-rops

  • lock status shows each holder's held time, its process group's size and CPU seconds, and the owner's state and wchan, in the text and the JSON.lock status hiện thời gian giữ ghế của từng người giữ, kích thước và số giây CPU của nhóm tiến trình, cùng trạng thái và wchan của tiến trình chủ, ở cả dạng chữ lẫn JSON.
  • A run's far group under 5% of one core for ROPS_IDLE_WARN seconds (default 300) gets one stderr note naming what it waits on; advisory, never stops the run.Nhóm tiến trình ở máy xa dùng dưới 5% một lõi trong ROPS_IDLE_WARN giây (mặc định 300) nhận một dòng ghi chú trên stderr nêu nó đang chờ gì; chỉ tư vấn, không bao giờ dừng lượt chạy.
  • An rsync that moves nothing for 120 s ends rc 30 and frees its seats; a dir hold whose client stops beating for 90 s is freed.rsync không chuyển được gì trong 120 s thì kết thúc rc 30 và trả ghế; ghế thư mục mà client ngừng gửi nhịp 90 s thì được giải phóng.
  • A dropped ssh session watches the log for the run's own rc instead of reporting a green suite as rc 2; 124 names fetch --wait when the host stays out of reach.Session ssh bị rớt sẽ theo dõi log để lấy rc của chính lượt chạy thay vì báo một suite xanh thành rc 2; 124 chỉ tới fetch --wait khi máy xa vẫn không với tới được.
  • A far temp dir past 90% full (inodes or bytes) is named before a run, past 98% the run is refused with rc 75.Thư mục tạm ở máy xa đầy quá 90% (inode hoặc byte) được nêu tên trước lượt chạy, quá 98% thì lượt chạy bị từ chối với rc 75.
  • run --tmux starts its command in a session it creates: the new pane runs a bare sh, so a login shell that asks a question at start (oh-my-zsh's update prompt) no longer eats the typed command and reports rc 125.run --tmux khởi động được lệnh trong session do nó tạo: pane mới chạy sh trần, nên login shell hỏi gì đó lúc khởi động (câu hỏi update của oh-my-zsh) không còn nuốt lệnh đã gõ rồi báo rc 125.
  • A lane gets the host's plan text (md/json/jsonl/yaml/txt) and leaves e2e screenshots and logs behind: one repo's 1.6 GB plans/ held a first run about 20 minutes. ROPS_CARRY_PLANS=off copies none.Lane chỉ nhận phần chữ của plans/ trên máy chủ (md/json/jsonl/yaml/txt), bỏ lại ảnh và log e2e: plans/ 1,6 GB của một repo từng bắt lượt chạy đầu chờ khoảng 20 phút. ROPS_CARRY_PLANS=off thì không chép gì.
  • CPU seats follow what a command can use: a vitest/jest takes its --maxWorkers, else one seat per test file it names; make -jN takes N; a script or build still takes the whole pool; any other program one seat. A one-file vitest no longer queues behind a suite.Số chỗ CPU theo đúng mức lệnh dùng được: vitest/jest lấy theo --maxWorkers, không khai thì mỗi tệp test nêu tên một chỗ; make -jN lấy N; script hay lệnh build vẫn lấy cả máy; chương trình khác một chỗ. vitest chạy một tệp không còn phải xếp hàng sau cả bộ test.
  • sync onto a dir with no .venv builds one; a failed ROPS_ENV_CHECK over a lane dir with no checkout names the ways out that work.sync lên thư mục chưa có .venv sẽ dựng nó; ROPS_ENV_CHECK thất bại trên thư mục lane không có checkout nêu đúng những lối ra dùng được.

Also changed & fixedCòn đổi & sửa

  • install.py --prune deletes only the list it printed: alone or with --yes it lists the orphans with a risk token and exits 3; deleting takes --accept-risks <token>, after a byte-checked snapshot under prune-snapshots/.install.py --prune chỉ xoá đúng danh sách nó đã in: chạy riêng hoặc kèm --yes thì liệt kê tệp mồ côi kèm risk token và thoát 3; muốn xoá phải có --accept-risks <token>, sau một snapshot đã đối chiếu từng byte dưới prune-snapshots/.
  • hs:test judges coverage only against a floor the repo declares and names where it read it; with none the number is reported, not judged. A test that failed and passed on rerun stays listed as flaky.hs:test chỉ chấm coverage theo ngưỡng repo tự khai và nêu nơi đọc ra; không có ngưỡng thì con số chỉ được báo, không chấm. Test đỏ rồi xanh khi chạy lại vẫn bị ghi là flaky.
  • hs:plan traces one credible next case before it builds a seam; hs:brainstorm and hs:advise apply the same test to options that add structure.hs:plan lần theo một ca tiếp theo có bằng chứng trước khi dựng seam; hs:brainstorm và hs:advise áp cùng phép thử cho các phương án thêm cấu trúc.
  • The user's home, or anything above it, is never taken for a project root or data home.Thư mục home của người dùng, hay bất cứ thư mục nào phía trên nó, không bao giờ bị lấy làm gốc project hay data home.
  • Skill content from ak 3.0 is ported by principle only, in our own words.Nội dung skill từ ak 3.0 chỉ được port theo nguyên lý, viết lại bằng lời của mình.
v7.4.0 · 2026-10-28
🧩
v7.4.0 — TypeScript gets the verbs that change code, not only the ones that read it. The refactor family runs on a TypeScript tree through the compiler, more hs-code verbs read TypeScript, and which language a verb serves is now data, with permanent, reasoned refusals for the rows that never will. Alongside: hs-rops fixes, a cook stop that asks about a paused phase before the plan-level review, and register writes that leave their view for later. Full notes: CHANGELOG.md → [7.4.0].v7.4.0 — TypeScript có cả các verb sửa code, không chỉ verb đọc. Họ refactor chạy trên cây TypeScript qua compiler, thêm nhiều verb hs-code đọc TypeScript, và verb phục vụ ngôn ngữ nào nay là dữ liệu, kèm lời từ chối vĩnh viễn có lý do cho những dòng không bao giờ phục vụ. Cùng đợt: các bản sửa hs-rops, một điểm dừng của cook hỏi về phase tạm dừng trước review cấp plan, và lệnh ghi sổ đăng ký để phần view lại cho sau. Đầy đủ: CHANGELOG.md → [7.4.0].
v7.3.0 · 2026-10-21
🗺️
v7.3.0 — TypeScript and React repos join the code map, and the harness runs their checks itself. hs-code now reads TypeScript and JavaScript through language packs (tree-sitter in-process, or the project's own tsc), resolving relative imports, workspace package names, subpath exports and tsconfig paths across pnpm, npm and yarn workspaces. The harness runs a TypeScript repo's vitest or jest, tsc -b, eslint and coverage itself, and the gate owes every declared check by name; install.sh --global installs one bundle for the whole machine; and the release preflight runs its CI on a remote host through hs-rops. Full notes: CHANGELOG.md → [7.3.0].v7.3.0 — repo TypeScript và React vào bản đồ code, và harness tự chạy các phép kiểm của chúng. hs-code nay đọc TypeScript và JavaScript qua language pack (tree-sitter chạy trong tiến trình, hoặc chính tsc của dự án), phân giải import tương đối, tên package workspace, subpath export và đường dẫn tsconfig trên workspace pnpm, npm và yarn. Harness tự chạy vitest hoặc jest, tsc -b, eslint và độ phủ của repo TypeScript, và cổng đòi từng phép kiểm đã khai theo tên; install.sh --global cài một bundle cho cả máy; bước kiểm trước release chạy CI trên máy từ xa qua hs-rops. Đầy đủ: CHANGELOG.md → [7.3.0].
v7.1.0 · 2026-10-01

Asking is the feature, not a nag. Writing codemap.yaml changes the user's repo, so it is the user's call — the offer rides exit 10 with an ask_user block, keeps the step's own answer whole in deferred, never masks a broken (2) or refused (3) step, and stays silent in an unattended session. Declining lasts the session; a later session asks again.Hỏi là tính năng, không phải làm phiền. Ghi codemap.yaml là đổi repo của user, nên quyền quyết thuộc user — lời mời đi cùng exit 10 và khối ask_user, giữ nguyên câu trả lời thật của bước trong deferred, không bao giờ che bước hỏng (2) hay bị từ chối (3), và im lặng khi không có người ở terminal. Từ chối có hiệu lực trong phiên; phiên sau hỏi lại.

🚪 hs-code init — one way in, extensible by data🚪 hs-code init — một cửa vào, mở rộng bằng dữ liệu

init status|run|decline reads the initializers: block each hs-code-registry.d fragment declares for itself, packs included. A row with run is set up; a row with a route (port → /hs:port) is only reported and never holds the status red. run is dry by default; --apply writes codemap.yaml and the first snapshot in one step. A new domain that needs setup adds a row — init does not change.init status|run|decline đọc khối initializers: mà mỗi mảnh hs-code-registry.d tự khai, kể cả của pack. Dòng có run thì được dựng; dòng có route (port → /hs:port) chỉ được báo và không làm status đỏ. run mặc định chạy khô; --apply ghi codemap.yaml và snapshot đầu trong một bước. Domain mới cần khởi tạo thì thêm một dòng — init không đổi.

status · run · declinedry by defaultroute rows report only

❓ codemap_offer — ask once, keep the real step❓ codemap_offer — hỏi một lần, giữ bước thật

Five adoption states decide the answer: adopted, offer, declined, unattended, unsupported. Only offer asks; the decision is an append-only consent ledger keyed by session (8h without a session id). The same ask_user block is declared in cook, fix, plan and review, and the dispatcher still refuses ask_user on any rung but 10.Năm trạng thái adoption quyết câu trả lời: adopted, offer, declined, unattended, unsupported. Chỉ offer mới hỏi; quyết định nằm trong sổ đồng ý append-only theo phiên (8h khi không có session id). Cùng một khối ask_user khai ở cook, fix, plan và review, và dispatcher vẫn từ chối ask_user trên mọi nấc trừ 10.

5 adoption statesper-session consentnever masks 2/3

🧭 /hs:codemap joins the floor🧭 /hs:codemap lên sàn luôn-bật

The skill that reads init status and routes each state — set up only with the user's yes, decline, snapshot after the tree moves, check drift and orphan tests. hs-run names it from every facts domain, so it is always there when the offer is: the floor is now 16. The floor members that are not the SDLC spine became data (floor_extra), so the 13-skill spine is derived, not hand-kept.Skill đọc init status và định tuyến từng trạng thái — chỉ lập khi user đồng ý, từ chối, snapshot lại khi cây đổi, kiểm drift và test mồ côi. hs-run gọi tên nó từ mọi domain đọc facts, nên nó phải có mặt mỗi khi lời mời có mặt: sàn nay là 16. Các thành viên sàn không thuộc spine SDLC thành dữ liệu (floor_extra), spine 13 skill được suy ra chứ không chép tay.

16-skill floorfloor_extra68 skills

🔁 An endless facts_stale loop, found by running it🔁 Vòng facts_stale vô tận, tìm ra bằng cách chạy thật

The snapshot store counts codemap.yaml with the roots when it decides a tree is dirty; the facts engine checked the roots alone. With the map uncommitted on a src/ layout — exactly the tree a fresh init run --apply leaves — every call answered facts_stale at exit 11, and the refresh it handed over rewrote the same measurement. Both doors now read one scope; a flat root had hidden it.Kho snapshot tính cả codemap.yaml cùng các root khi xét cây có bẩn không; engine facts chỉ xét root. Khi bản đồ chưa commit trên layout src/ — đúng cây mà init run --apply vừa để lại — mọi lần gọi trả facts_stale ở exit 11, và lệnh làm mới nó đưa ra ghi lại đúng phép đo đó. Nay hai cửa đọc cùng một phạm vi; root phẳng đã che lỗi này.

dogfood-foundtwo doors, one scopered→green e2e

Counted from source, reconciled everywhereĐếm từ nguồn, đồng bộ mọi nơi

Every number here is measured off the tree v7.1.0 shipped (f5bc01f80) — the harness profile of run_local_tests.py plus the separate hs-code profile.Mọi con số ở đây đo trên cây mà v7.1.0 ship (f5bc01f80) — profile harness của run_local_tests.py cộng profile hs-code riêng.

18505
tests passing · harness profiletest xanh · profile harness
592
tests passing · hs-code profiletest xanh · profile hs-code
68
skills · 16 floor + 26 opt-in + 26 onskill · 16 lõi + 26 tùy chọn + 26 bật sẵn
64
hooks · 15 rules · 26 agentshook · 15 rule · 26 agent

Also changed & fixedCòn đổi & sửa

ChangedĐã đổi

  • The gemini and partner lane couriers merged into one lane-relayer agent with an allowlist of the two companion scripts.Hai agent chuyển phát làn gemini và partner gộp thành một lane-relayer với danh sách cho phép hai script companion.
  • A repo-wide prompt audit trimmed dated patterns across skills, agents, rules and hook strings; the binding rule sentences stayed.Một lượt audit prompt toàn repo cắt các mẫu chỉ dẫn lỗi thời trong skill, agent, rule và chuỗi hook; các câu luật ràng buộc được giữ.
  • hs-code init gets its own coverage group at the measured 85%, and the cheatsheet lists /hs:codemap and the code-map offer.hs-code init có nhóm độ phủ riêng ở mức đo 85%, và cheatsheet ghi /hs:codemap cùng lời mời lập bản đồ.

FixedĐã sửa

  • graph init writes import_roots measured from the chosen layout, so a src/ package's tests are owned instead of orphaned, and refuses (exit 3) a repo with no language the map reads instead of writing an empty Python descriptor.graph init ghi import_roots đo từ layout đã chọn, nên test của package src/ được sở hữu thay vì mồ côi, và từ chối (exit 3) repo không có ngôn ngữ bản đồ đọc được thay vì ghi một descriptor Python rỗng.
  • Every "no code map" refusal in graph, change, scaffold and test now names how to create one.Mọi lời từ chối "chưa có bản đồ" ở graph, change, scaffold và test nay chỉ cách tạo.
  • The code-style register silently dropped a skill's Boundaries section when its heading was renamed.Register code-style lặng lẽ bỏ mục Boundaries của một skill khi tiêu đề bị đổi tên.
  • A count gate missed the cheatsheet's "All 66" (the tree holds 68) because the noun was only implied; the sentence is now pinned in both languages.Một cổng đếm bỏ sót "All 66" của cheatsheet (cây có 68) vì danh từ chỉ ngầm hiểu; câu đó nay được ghim ở cả hai ngôn ngữ.
🧭
Where to go next: the CLI family and its domains on the rig, the step engine and exit rungs on the cheatsheet, every term on the glossary.Đi tiếp: họ CLI và các domain ở bộ máy, engine bước và các nấc exit ở tra cứu nhanh, mọi thuật ngữ ở thuật ngữ.
Previous cutsCác bản trước

v7.2.0 · 2026-10-09 — plans that say where they stand, and lanes that take turnsv7.2.0 · 2026-10-09 — plan tự nói nó đang ở đâu, lane biết nhường lượt

plan_approval.py --status reads an approval's standing and writes nothing; a plan section can live in a reference file the approval hash pins; decision_register.py --amend rewords a live ruling; cook next answers phase_paused and names the phases ready_alongside. hs-rops runs on one lane take turns, --lock NAME queues across the machine, run --at <rev> runs a clean commit; hs-code graph grep tells a use from a mention and change impact --data-key follows a data key.plan_approval.py --status đọc tình trạng phê duyệt mà không ghi gì; một mục plan có thể nằm ở tệp tham chiếu mà băm phê duyệt ghim; decision_register.py --amend sửa lời một phán quyết còn hiệu lực; cook next trả phase_paused và nêu các phase ready_alongside. Các lượt hs-rops trên một lane lần lượt chạy, --lock NAME xếp hàng trên cả máy, run --at <rev> chạy một commit sạch; hs-code graph grep phân biệt chỗ dùng với chỗ nhắc tên và change impact --data-key lần theo một khoá dữ liệu.

v7.0.0 · 2026-09-29 — the harness keeps its own map of your codev7.0.0 · 2026-09-29 — harness giữ bản đồ riêng cho code của bạn

hs-code builds a structural map of the codebase and hs-run argues from facts that map can prove; hs-secrets gives agents attributed access to secrets, and a context firewall bounds what one read, search or shell call may pull into context. The skill catalog was cut to what the repo uses, and the tier-2 orchestrator and the unattended-run subsystem are gone.hs-code dựng bản đồ cấu trúc của codebase và hs-run lập luận từ những sự thật bản đồ đó chứng minh được; hs-secrets cho agent truy cập secret có ghi danh, và một tường lửa ngữ cảnh chặn trần những gì một lượt đọc, tìm kiếm hay lệnh shell được kéo vào ngữ cảnh. Bộ skill được cắt còn đúng những gì repo thực dùng, orchestrator tầng-2 và hệ chạy-không-người-trông đã bị gỡ.

v6.3.0 · 2026-09-10 — a smaller instruction layer, with checks behind three rulesv6.3.0 · 2026-09-10 — lớp chỉ dẫn nhỏ lại, ba luật có cổng đứng sau

953 → 784 tokens per turn by cutting prose written for older models; the no-orphan rule, the red step of red→green and the memory ceiling each got a gate.953 → 784 token mỗi lượt nhờ cắt văn xuôi viết cho model cũ; luật không-mồ-côi, bước ĐỎ của đỏ→xanh và trần memory mỗi thứ có một cổng.