@xingular/harness 1.2.0 → 1.3.1-unstable.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +10 -5
  3. package/dist/cli.js +5560 -5056
  4. package/dist/sdk/agents/builtin.js +3 -3
  5. package/dist/sdk/agents/planResearch.d.ts +23 -1
  6. package/dist/sdk/agents/planResearch.js +71 -8
  7. package/dist/sdk/agents/profiles.d.ts +4 -1
  8. package/dist/sdk/agents/profiles.js +17 -6
  9. package/dist/sdk/capabilities/runSnapshot.js +10 -4
  10. package/dist/sdk/commands/registry.d.ts +11 -3
  11. package/dist/sdk/commands/registry.js +3 -2
  12. package/dist/sdk/core/shell.d.ts +20 -0
  13. package/dist/sdk/core/shell.js +73 -0
  14. package/dist/sdk/core/workspaceBashTool.d.ts +17 -1
  15. package/dist/sdk/core/workspaceBashTool.js +16 -2
  16. package/dist/sdk/core/workspaceSandbox.d.ts +10 -0
  17. package/dist/sdk/core/workspaceSandbox.js +52 -12
  18. package/dist/sdk/core/workspaceWriteOperations.d.ts +11 -0
  19. package/dist/sdk/core/workspaceWriteOperations.js +26 -8
  20. package/dist/sdk/doctor/checks.js +71 -12
  21. package/dist/sdk/hub/hub.js +5 -3
  22. package/dist/sdk/index.d.ts +2 -2
  23. package/dist/sdk/index.js +1 -1
  24. package/dist/sdk/plugins/builtin.js +3 -3
  25. package/dist/sdk/plugins/install.d.ts +6 -2
  26. package/dist/sdk/plugins/install.js +29 -5
  27. package/dist/sdk/plugins/inventory.js +2 -2
  28. package/dist/sdk/prompt/compile.d.ts +2 -2
  29. package/dist/sdk/prompt/compile.js +14 -16
  30. package/dist/sdk/server/methods.js +4 -2
  31. package/dist/sdk/sessions/compactionCheckpoint.d.ts +3 -3
  32. package/dist/sdk/sessions/compactionCheckpoint.js +12 -12
  33. package/dist/sdk/sessions/continuation.d.ts +4 -2
  34. package/dist/sdk/sessions/continuation.js +7 -6
  35. package/dist/sdk/sessions/contracts.d.ts +22 -4
  36. package/dist/sdk/sessions/contracts.js +12 -7
  37. package/dist/sdk/sessions/planMode.js +2 -2
  38. package/dist/sdk/sessions/runStore.js +3 -1
  39. package/dist/sdk/sessions/runner.js +2 -2
  40. package/dist/sdk/sessions/sessions.js +29 -11
  41. package/dist/sdk/sessions/subagentService.d.ts +15 -0
  42. package/dist/sdk/sessions/subagentService.js +194 -54
  43. package/dist/sdk/sessions/subagents.d.ts +10 -1
  44. package/dist/sdk/sessions/subagents.js +4 -0
  45. package/dist/sdk/sessions/workSlice.d.ts +8 -5
  46. package/dist/sdk/sessions/workSlice.js +77 -45
  47. package/dist/sdk/terminal/controller.d.ts +20 -0
  48. package/dist/sdk/terminal/controller.js +43 -18
  49. package/dist/sdk/terminal/opentui/ansi.d.ts +25 -0
  50. package/dist/sdk/terminal/opentui/ansi.js +192 -0
  51. package/dist/sdk/terminal/opentui/model.d.ts +163 -0
  52. package/dist/sdk/terminal/opentui/model.js +482 -0
  53. package/dist/sdk/terminal/opentui/subagentsWidget.d.ts +3 -3
  54. package/dist/sdk/terminal/opentui/subagentsWidget.js +7 -5
  55. package/dist/sdk/terminal/opentui/theme.js +1 -0
  56. package/dist/sdk/terminal/piExtension.js +28 -14
  57. package/dist/sdk/terminal/subagentMonitor.d.ts +17 -4
  58. package/dist/sdk/terminal/subagentMonitor.js +29 -8
  59. package/dist/sdk/terminal/terminals.d.ts +7 -0
  60. package/dist/sdk/terminal/terminals.js +86 -14
  61. package/dist/sdk/terminal/trajectory.d.ts +6 -1
  62. package/dist/sdk/terminal/trajectory.js +8 -0
  63. package/dist/sdk/terminal/tui/chrome.d.ts +4 -0
  64. package/dist/sdk/terminal/tui/chrome.js +13 -0
  65. package/dist/sdk/terminal/tui/commandPages.js +14 -4
  66. package/dist/sdk/terminal/tui/commands.d.ts +4 -0
  67. package/dist/sdk/terminal/tui/commands.js +8 -0
  68. package/dist/sdk/terminal/tui/pageOverlay.js +13 -6
  69. package/dist/sdk/terminal/tui/pages/browserPage.js +5 -4
  70. package/dist/sdk/terminal/tui/pages/hubPage.d.ts +14 -1
  71. package/dist/sdk/terminal/tui/pages/hubPage.js +192 -28
  72. package/dist/sdk/terminal/tui/pages/pluginsPage.d.ts +8 -1
  73. package/dist/sdk/terminal/tui/pages/pluginsPage.js +197 -25
  74. package/dist/sdk/terminal/tui/pages/subagentsPage.js +8 -5
  75. package/dist/sdk/tools/sessionName.d.ts +2 -0
  76. package/dist/sdk/tools/sessionName.js +5 -3
  77. package/dist/sdk/tools/spawnSubagent.js +9 -7
  78. package/dist/sdk/tools/todo.d.ts +15 -0
  79. package/dist/sdk/tools/todo.js +64 -0
  80. package/dist/terminal-opentui.js +1416 -348
  81. package/dist/terminal-pi.js +315 -126
  82. package/docs/architecture/00-overview.md +1 -1
  83. package/docs/architecture/01-extension-points.md +1 -1
  84. package/docs/architecture/02-sessions-and-runs.md +65 -34
  85. package/docs/architecture/04-prompt.md +8 -6
  86. package/docs/architecture/06-plugins-and-capabilities.md +10 -6
  87. package/docs/architecture/07-tools-and-gate.md +31 -5
  88. package/docs/architecture/09-accounts-and-connectors.md +8 -2
  89. package/docs/architecture/10-server-protocol.md +16 -9
  90. package/docs/architecture/11-terminal.md +51 -26
  91. package/docs/architecture/14-surfaces-and-parity.md +4 -1
  92. package/docs/architecture/README.md +18 -17
  93. package/docs/architecture/proposals/PROP-0006-run-checklist.md +2 -0
  94. package/docs/architecture/proposals/PROP-0041-bounded-work-slices.md +32 -21
  95. package/docs/architecture/proposals/PROP-0044-work-slice-defaults.md +93 -0
  96. package/docs/architecture/proposals/PROP-0045-rename-checklist-to-todo.md +132 -0
  97. package/docs/architecture/proposals/PROP-0046-progress-aware-stall-guards.md +82 -0
  98. package/docs/architecture/proposals/PROP-0047-plugins-hub-separation.md +122 -0
  99. package/docs/architecture/proposals/README.md +10 -6
  100. package/docs/decisions/ADR-0039-progress-aware-stall-guards.md +39 -0
  101. package/docs/decisions/ADR-0040-architecture-change-workflow.md +31 -0
  102. package/docs/decisions/ADR-0041-plugins-hub-separation.md +41 -0
  103. package/docs/decisions/ADR-0042-windows-shell-without-sandbox.md +40 -0
  104. package/docs/decisions/ADR-0043-parents-continue-stopped-subagents.md +49 -0
  105. package/docs/doctor.md +14 -1
  106. package/docs/parity.md +9 -9
  107. package/docs/releases/1.3.0.md +21 -0
  108. package/docs/releases/README.md +2 -2
  109. package/docs/terminal-tui.md +85 -46
  110. package/package.json +1 -1
  111. package/dist/sdk/tools/checklist.d.ts +0 -9
  112. package/dist/sdk/tools/checklist.js +0 -55
@@ -1,16 +1,16 @@
1
1
  # Architecture proposals
2
2
 
3
- A proposal is required before any change that alters a contract, an invariant, a layer
4
- boundary, an extension point, or the storage layout described in [the specification](../README.md).
5
- The author writes it and stops; the user reviews it. Code and spec pages change only after the
6
- proposal is `Accepted`.
3
+ Proposals are optional design records for changes to contracts, invariants, layer boundaries,
4
+ extension points, or storage layout in [the specification](../README.md). They may be written before
5
+ or alongside implementation, but do not gate code or spec changes. When a proposal is created, add
6
+ it to the index and update its status as the work progresses.
7
7
 
8
8
  ## Status
9
9
 
10
10
  | Status | Meaning |
11
11
  |---|---|
12
- | `Proposed` | Written, waiting for the user. Nothing has changed. |
13
- | `Accepted` | The user approved it. Implement it and update the spec pages in the same change. |
12
+ | `Proposed` | A draft design record; implementation status is tracked separately. |
13
+ | `Accepted` | The user approved the design. Approval is not a prerequisite to implementation. |
14
14
  | `Implemented` | Code and spec pages match the proposal. Link the commit or ADR. |
15
15
  | `Rejected` | The user declined it. The file stays as a record. |
16
16
  | `Withdrawn` | The author dropped it before review. |
@@ -73,6 +73,10 @@ proposal is `Accepted`.
73
73
  | [PROP-0041](PROP-0041-bounded-work-slices.md) | Bounded work slices, a durable checkpoint, and a stall guard for long replies | Implemented; terminal card, App presentation and /slices open (PAR-004) | INV-RUN-2/3/4/12, INV-PRM-1/2/4/5/10, INV-GATE-2, INV-STO-3, INV-PAR-1/2, 02, 04, 07, 10–12, 14, parity | 2026-10-26 |
74
74
  | [PROP-0042](PROP-0042-usage-and-provider-limits.md) | Usage analytics and provider limits as a built-in capability | Accepted; implemented | INV-MEM-5/6, INV-STO-2, INV-SRV-1, INV-PLG-10, INV-ACC-3, 02, 06, 08–12, 14, parity, ADR-0037 | 2026-10-26 |
75
75
  | [PROP-0043](PROP-0043-read-only-plan-bash.md) | Read-only Bash in plan mode, enforced by the OS sandbox | Accepted; implemented | INV-RUN-8, INV-GATE-3/8, 02, 07, 11, terminal-tui, parity, ADR-0038 | 2026-10-26 |
76
+ | [PROP-0044](PROP-0044-work-slice-defaults.md) | Raise the work-slice defaults to 320 tool calls and 60 minutes, with no token cap | Accepted; implemented | INV-RUN-13, 02, 10, 11, PROP-0041 | 2026-10-26 |
77
+ | [PROP-0045](PROP-0045-rename-checklist-to-todo.md) | Rename the run checklist to todo and add the /todo command | Accepted; implemented | 02, 04, 06, 07, 10, 11, 14, parity, terminal-tui, README, PROP-0006 | 2026-10-26 |
78
+ | [PROP-0046](PROP-0046-progress-aware-stall-guards.md) | Progress-aware stall guards and bounded plan research children | Implemented; ADR-0039 | INV-RUN-13, 02-sessions-and-runs.md, PROP-0041, terminal-tui.md, ADR-0039 | 2026-10-27 |
79
+ | [PROP-0047](PROP-0047-plugins-hub-separation.md) | Separate local plugin management from Community Hub discovery | Implemented; ADR-0041 | INV-MCP-4, INV-TUI-2/4, INV-PAR-1/2, 06, 09, 10, 11, 14, terminal-tui.md, parity.md | 2026-10-27 |
76
80
 
77
81
  Numbers are four digits, start at `0001`, and are never reused.
78
82
 
@@ -0,0 +1,39 @@
1
+ ---
2
+ id: ADR-0039
3
+ title: Progress-aware stall guards and bounded plan research children
4
+ status: Accepted
5
+ created: 2026-10-27
6
+ proposal: PROP-0046
7
+ ---
8
+
9
+ # ADR-0039: Progress-aware stall guards and bounded plan research children
10
+
11
+ ## Decision
12
+
13
+ Remove the global file-change/check no-progress trigger. Keep the targeted protections for repeated
14
+ calls, repeated failing checks, per-path edit churn, compaction thrash, and the independent
15
+ work-slice call/time budgets. Count edit churn only from successful native `edit`/`write` results
16
+ with a path. A successful edit/write clears failed-check counts, exact Bash-check repetition counts
17
+ and the pending nudge, but preserves edit counts and repeats of other calls; a passing check clears
18
+ edit churn.
19
+
20
+ Bound plan-research children with the configured work-slice policy without adding
21
+ `checkpoint_write` or any other capability. When that tool is absent, a budget or stall refusal asks
22
+ the child to stop and return partial findings; another tool call ends the reply, and the runner
23
+ records an evidence-derived checkpoint. Children do not auto-continue. Plan-mode browser and
24
+ connected-app restrictions remain unchanged.
25
+
26
+ ## Rationale
27
+
28
+ Distinct reads are not evidence of a stall, and the former 25-call threshold imposed an arbitrary
29
+ file/check-progress boundary. Tool results are the shared, observable signal for whether a native
30
+ edit succeeded; treating failed or blocked attempts as edits would consume the churn allowance
31
+ without changing code. Resetting check-retry state after a successful edit lets the same check run
32
+ against changed input without weakening protection when code is unchanged. A derived checkpoint
33
+ bounds read-only research children without widening their frozen capability set.
34
+
35
+ ## Consequences
36
+
37
+ Long sequences of distinct reads are limited by the configured slice budget and targeted loop
38
+ protections, not by missing file/check progress. No run-event schema, stored-data layout or server protocol changes are introduced; the terminal
39
+ uses the same guard rules. See [PROP-0046](../architecture/proposals/PROP-0046-progress-aware-stall-guards.md).
@@ -0,0 +1,31 @@
1
+ ---
2
+ id: ADR-0040
3
+ title: Architecture changes do not require proposal approval first
4
+ status: Accepted
5
+ created: 2026-10-27
6
+ ---
7
+
8
+ # ADR-0040: Architecture changes do not require proposal approval first
9
+
10
+ ## Decision
11
+
12
+ The architecture specification remains binding, and changes that alter its contracts, invariants,
13
+ layer boundaries, extension points, or storage layout must update the affected specification pages
14
+ in the same change. Such work does not require a proposal or user approval before implementation.
15
+
16
+ Proposals remain optional design records. When used, they may be created before or alongside
17
+ implementation and should be indexed and status-tracked. Add an ADR for a lasting architectural
18
+ choice. Report existing code/spec drift and resolve relevant drift by updating both sides together
19
+ within the requested scope.
20
+
21
+ ## Rationale
22
+
23
+ A binding specification and same-change documentation keep implementation accountable to the
24
+ architecture without making a separate proposal review a prerequisite to requested work. Optional
25
+ proposals remain available when a design benefits from a written comparison or durable rationale.
26
+
27
+ ## Consequences
28
+
29
+ Coding agents read the affected specification pages, implement the requested change, update the
30
+ specification in the same change, and run relevant checks. Proposal status records design review or
31
+ implementation progress but does not gate implementation.
@@ -0,0 +1,41 @@
1
+ ---
2
+ id: ADR-0041
3
+ title: Separate local plugin management from Community Hub discovery
4
+ status: Accepted
5
+ created: 2026-10-27
6
+ proposal: PROP-0047
7
+ ---
8
+
9
+ # ADR-0041: Separate local plugin management from Community Hub discovery
10
+
11
+ ## Decision
12
+
13
+ - `/plugins` is the dedicated local installed-plugin manager: switching, code trust, settings, and
14
+ local package install, update and removal. It does not browse the public catalog.
15
+ - `/hub` is a distinct public-catalog page. Its Catalog view shows Community entries across active
16
+ supported types; its Installed view shows receipts from every channel with the channel visible.
17
+ The broad `/harness` resource browser remains available.
18
+ - Opening Hub shows cached or bundled entries first, then refreshes remotely. The page retains the
19
+ data origin, last-refresh time and any fallback/error status. Registry/document entries keep a
20
+ bounded payload Preview; Pi packages have no payload Preview.
21
+ - A Hub-owned package cannot be silently floated by `plugins.update`. Removing it through
22
+ `plugins.remove` delegates to Hub's exact-receipt uninstall operation; Hub remains the writer of
23
+ its receipt and owned resources. Replacing it requires an explicit, exact catalog version.
24
+ - Host presentations use the same filtering, refresh and receipt lifecycle while choosing their own
25
+ layouts. No new capability, loader, storage format or server response schema is introduced.
26
+
27
+ ## Rationale
28
+
29
+ Local plugin management and public catalog discovery have different owners and different safety
30
+ contracts. Separating the direct pages makes that visible without duplicating the services: local
31
+ packages use the plugin manager, while Hub installs are pinned catalog releases with receipts. A
32
+ Community-only catalog view also avoids presenting official items as community submissions, while
33
+ retaining existing Official receipts for management.
34
+
35
+ ## Consequences
36
+
37
+ The direct terminal and host routes have distinct screens, but `/harness` stays a broad resource
38
+ browser. Catalog filtering is presentation-only; `hub.list` remains unfiltered for other callers.
39
+ Existing receipts and plugin settings need no migration. The current public catalog has no
40
+ Community Pi-package entry, so no Community plugin appears until a publisher adds one. See
41
+ [PROP-0047](../architecture/proposals/PROP-0047-plugins-hub-separation.md).
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: ADR-0042
3
+ title: Run Windows commands behind a per-call approval instead of a sandbox
4
+ status: Accepted
5
+ created: 2026-10-27
6
+ ---
7
+
8
+ # ADR-0042: Run Windows commands behind a per-call approval instead of a sandbox
9
+
10
+ ## Context
11
+
12
+ Bash runs inside an OS write-boundary sandbox: `sandbox-exec` on macOS, bubblewrap on Linux
13
+ (INV-GATE-3, INV-GATE-8). Windows has neither, and missing enforcement fails closed, so on Windows
14
+ every Bash call, and every native `write` and `edit` (whose helper was launched through the same
15
+ sandbox), failed before it started. The shell lookup also searched only `/bin/bash`. A harness
16
+ installed from npm on Windows could not run a command or change a file.
17
+
18
+ ## Decision
19
+
20
+ - **Shell.** On Windows, commands run in Git Bash (`%ProgramFiles%\Git\bin\bash.exe`,
21
+ `%ProgramFiles(x86)%\Git\bin\bash.exe`, then `bash.exe` on `PATH`, never the WSL launcher in
22
+ `System32`), otherwise in PowerShell (`pwsh.exe`, PowerShell 7 in Program Files, then Windows
23
+ PowerShell). The capability and tool keep the name `bash`, so capability sets, the gate, plan
24
+ lists and approvals are unchanged; the description names the shell.
25
+ - **Bash.** Every Windows command takes the existing `outside` path: a human-only one-call approval
26
+ or an eligible Full Permission answer, then it runs once unconfined. Remembered tool grants never
27
+ answer it. Plan-mode (read-only) Bash is refused on Windows.
28
+ - **Write and edit.** On Windows the atomic helper runs with Node directly. The target is still
29
+ canonicalized, authorized, revalidated, and replaced by rename; outside targets still need their
30
+ one-call approval. In-workspace writes do not ask.
31
+ - `/doctor` reports the Windows shell as a warning that names it and the approval rule.
32
+
33
+ ## Consequences
34
+
35
+ - The harness works on Windows right after `npm install`, with no Git or native helper required.
36
+ - Windows commands are unconfined once approved. The guarantee comes from the person, not the OS.
37
+ - On Windows, a junction or symlink swap between the write check and the rename is not prevented
38
+ by the OS. Atomic replacement still keeps a write from going through a hard-link alias.
39
+ - A real Windows sandbox (restricted token and ACLs through a native helper) would let Windows use
40
+ the macOS/Linux rules again. It is not built.
@@ -0,0 +1,49 @@
1
+ ---
2
+ id: ADR-0043
3
+ title: A parent continues its stopped subagents; the monitor shows the main agent and survives reopening
4
+ status: Accepted
5
+ created: 2026-10-27
6
+ ---
7
+
8
+ # ADR-0043: A parent continues its stopped subagents
9
+
10
+ ## Decision
11
+
12
+ - `spawn_subagent { continue: <runId> }` (and `subagents.spawn { continue }`) continues a child that
13
+ stopped before finishing (`interrupted` or `failed`, with saved history). It is a new child run
14
+ with `continueFrom`. It reopens the first link's history folder
15
+ (`<parent sessionDir>/subagents/<first child run id>`) and keeps the earlier child's session id,
16
+ profile, title, goal, account, variant version and frozen capability set. That set must still lie
17
+ within the parent's ceiling; `agent` and `tools` are refused with `continue`. The id may name any
18
+ link of a chain: the newest link is the one continued, and an active or completed newest link is
19
+ refused.
20
+ - The model decides. A subagent never continues itself, and a restarted harness never restarts
21
+ model work (INV-RUN-4). Children an earlier reply left stopped are delivered **before** the next
22
+ reply's first request: a hidden `xingular-subagent-results` message with a receipt, which says
23
+ each child can be continued. A stopped child that has a continuation is reported through that
24
+ continuation instead.
25
+ - Recovery of an earlier parent's children is keyed on the native history branch: the owner
26
+ marker, the same native history id, account, agent, project and working folder. The Harness
27
+ session id is not compared, because a host may give each launch of one conversation a new one.
28
+ - `main` is a reserved profile name. The terminal monitor projects the parent run itself as a
29
+ `main` row: account, model, effort, usage, activity and todo counts, like a child. The
30
+ `/subagents` page shows it pinned first; the rows under the status line omit it.
31
+ - The terminal marks every turn's run on the branch (`xingular-subagent-owner`). When a
32
+ conversation opens with no run active, it rebuilds the monitor from the branch's latest parent
33
+ run in that folder and its descendants, by folding their saved events. The rows keep their final
34
+ status until the next run begins.
35
+ - Run records carry the launch `model` and `effort` (the opened session's model supersedes the
36
+ selection), so a rebuilt row can show them.
37
+
38
+ ## Rationale
39
+
40
+ Esc on a parent interrupts every child, and until now the next turn was told to start them again.
41
+ That lost work that was saved on disk. Reopening a child's own history keeps every pin a run
42
+ already has, so no capability or account can change, and leaving the choice to the model keeps
43
+ INV-RUN-4.
44
+
45
+ ## Consequences
46
+
47
+ The monitor stays a private, read-only terminal projection; no event or public method is added.
48
+ Records written before this change have no `model` or `effort`, and their rebuilt rows show `—`.
49
+ A person cannot continue a child from the page directly; they ask the parent.
package/docs/doctor.md CHANGED
@@ -8,10 +8,23 @@ provider requests, token refreshes, browser launch, permission prompts or comput
8
8
  pass does not establish live connectivity. Other accounts show their saved status and timestamp.
9
9
  Providers without diagnostics report unverified. Disabled capabilities are not failures.
10
10
 
11
+ The shell check reports which `bash` the session would run and whether the platform's
12
+ write-boundary sandbox (sandbox-exec on macOS, bubblewrap on Linux) is installed, because a missing
13
+ backend stops every Bash call before the command starts. It runs nothing. On Windows it reports a
14
+ warning naming the shell (Git Bash or PowerShell) and that each command asks for approval, because
15
+ Windows has no write-boundary sandbox; the live shell check reports unverified there, since a
16
+ command would need a person to approve it.
17
+
11
18
  Press `l` to choose live checks, then review the account/model, destinations, possible charges and
12
19
  isolation notice. The model check makes one synthetic request with at most 64 output tokens;
13
20
  usage appears on a separate diagnostic run. Web checks fetch example.com and search for “example
14
- domain”. MCP checks connect/list only. Browser checks use a disposable headless profile and an
21
+ domain”. The shell check runs one fixed command written by the harness (`printf`) in the working
22
+ folder through the same root, hard-link scan and write-boundary sandbox a normal Bash call uses, and
23
+ reports only the exit status: no model input is sent, no file is written and no network request is
24
+ made. A diagnostic never widens the boundary, so Full Permission cannot change its result; when the
25
+ boundary refuses before the shell starts (for example a hard-link alias in the workspace), the
26
+ finding is blocked with that reason instead of claiming the shell is broken. MCP checks
27
+ connect/list only. Browser checks use a disposable headless profile and an
15
28
  offline synthetic page; configured CDP attachment is blocked. Computer input is blocked unless the
16
29
  host supplies a disposable diagnostic surface; the current desktop host supplies readiness only.
17
30
 
package/docs/parity.md CHANGED
@@ -22,22 +22,22 @@ implemented is not a parity claim; acceptance is tracked per command.
22
22
  | Capability | Harness owner | Method or tool | Terminal surface | App surface | Status | Gap |
23
23
  |---|---|---|---|---|---|---|
24
24
  | Sessions and turns | `sessions/` | `sessions.run`, `terminal.*` | the terminal itself | Solo chat | parity | — |
25
- | Plan mode | `sessions/planMode.ts` | `plan: true` | `/plan`, Shift+Tab, plan card; bounded plan/checklist context is restored after compaction | plan request, PlanCard; shared Harness checkpoint behavior | parity | — |
25
+ | Plan mode | `sessions/planMode.ts` | `plan: true` | `/plan`, Shift+Tab, plan card; bounded plan/todo context is restored after compaction | plan request, PlanCard; shared Harness checkpoint behavior | parity | — |
26
26
  | Capability discovery | `tools/getCapabilities.ts` | read-only `get_capabilities` | terminal extension reports Pi's active tools and schemas; shared plan allowlist includes it | structured Harness run uses the same tool; no duplicate App-owned tool | implemented; acceptance not recertified | — |
27
27
  | Bash command mode | `sessions/sessions.ts`, `sessions/initialBash.ts` | `initialBashCommand`; Bash `workspaceWriteScope` | `!command` defaults to workspace; `!outside command` asks before running once | same `!command` and `!outside command` composer semantics | parity | — |
28
- | Workspace-scoped writes | `core/workspace.ts`, `sessions/workspaceBoundary.ts`, `core/workspaceBashTool.ts`, `core/workspaceSandbox.ts`, `core/workspaceWriteOperations.ts` | pinned non-root `RunRecord.workspaceRoot`; native `edit`/`write`; Bash scope | revalidated atomic native writes; external-hard-link scan and Bash sandbox; complete escaped outside command in scrollable approval details (deny if too small); no output-triggered retry | same Harness gate and full approval action in scrollable App details; App policy can tighten scope; Full Permission remains the eligible explicit bypass | parity | — |
28
+ | Workspace-scoped writes | `core/workspace.ts`, `sessions/workspaceBoundary.ts`, `core/workspaceBashTool.ts`, `core/workspaceSandbox.ts`, `core/workspaceWriteOperations.ts` | pinned non-root `RunRecord.workspaceRoot`; native `edit`/`write`; Bash scope | revalidated atomic native writes; external-hard-link scan and Bash sandbox (Windows: no sandbox, each Bash call asks once, plan-mode Bash refused; ADR-0042); complete escaped outside command in scrollable approval details (deny if too small); no output-triggered retry | same Harness gate and full approval action in scrollable App details; App policy can tighten scope; Full Permission remains the eligible explicit bypass | parity | — |
29
29
  | Side questions | `sessions/sideQuestions.ts` | `sideQuestions.start/read/interrupt`; terminal `terminal.sideQuestions.*` | `/btw` contextual dock with scroll and copy | side-question dock through the shared service | parity | — |
30
30
  | Approvals and standing approvals | `sessions/approvals.ts` | `approvals.*` | decision dock, `/permissions` | approvals dock, settings | parity | — |
31
31
  | Questions (`ask_user`) | `tools/askUser.ts` | shared `ask_user` tool | plan-mode dock: strict aligned columns, bounded body scroll, 80×24 source sketch viewport; connected structural projection with high-confidence boundary normalization (PROP-0026, PROP-0028) | plan-mode form accepts the same 80×24 ASCII source contract with literal preview and accessible overflow; no typography change required | parity; terminal projection verified in isolated fixtures | — |
32
- | Subagents | `sessions/subagentService.ts` | `spawn_subagent` (requires `title`, PROP-0030), `subagents.*`; plan mode allows only named eligible read-only research profiles | `/subagents` page and live rows under the status line (mark, profile, parent-set title, `n of m tasks`); plan-mode research delegation uses the same Harness gate | reply trajectory; plan-mode research delegation uses the same Harness gate | parity | — |
32
+ | Subagents | `sessions/subagentService.ts` | `spawn_subagent` (requires `title`, PROP-0030; `continue` resumes a stopped child, ADR-0043), `subagents.*`; plan mode allows only named eligible read-only research profiles | `/subagents` page with the `main` row pinned first, and live rows under the status line (mark, profile, parent-set title, `n of m tasks`), both rebuilt from saved runs when a conversation reopens; plan-mode research delegation uses the same Harness gate | reply trajectory; plan-mode research delegation uses the same Harness gate | parity | — |
33
33
  | Agent profiles | `agents/profiles.ts` | `spawn_subagent { agent }`, `agents.list/get/create/remove`; terminal `terminal.agents.*` | `/agents` page: browse, create, edit in `$EDITOR`, copy, delete | Solo `/agents` lists profiles; profile details and management are not wired | partial | PAR-010 |
34
- | Run checklist | `tools/checklist.ts` | `checklist_write`, `runs.checklist`; terminal `checklist` telemetry | registered in terminal sessions and their subagents; each write shows as a checklist block in the transcript; a subagent row shows its `n of m tasks` | not shown | terminal done; App planned | PAR-001 |
34
+ | Run todo list | `tools/todo.ts` | `todo_write`, `runs.todo` (`runs.checklist` deprecated); terminal `todo` telemetry | registered in terminal sessions and their subagents; each write shows as a todo block in the transcript; `/todo` shows the current list; a subagent row shows its `n of m tasks` | `/todo` shows the current list on demand; each write is not rendered inline | terminal done; App shows it on demand | PAR-001 |
35
35
  | Continuation of a stopped run | `sessions/continuation.ts` | `continueFrom`, `runs.continuation` | not offered (`/resume` reopens history only) | not offered | planned | PAR-003 |
36
36
  | Bounded replies and checkpoints (PROP-0041) | `sessions/workSlice.ts`, `tools/checkpoint.ts`, `sessions/runner.ts` | `checkpoint_write`, `workSlice`, `runs.continuation.checkpoint`, `checkpoint`/`heartbeat` events | guard on every terminal reply with the shared tool; the handoff is recorded on the run; no checkpoint card or slice control yet | not wired | implemented; terminal card, App presentation and `/slices` open | PAR-004 |
37
37
  | Accounts | `accounts/` | `accounts.*` | `/accounts` | Accounts | parity | — |
38
38
  | Models and effort | `accounts/choices.ts` | — | `/model`, `/effort` | composer pickers | parity | — |
39
39
  | Skills | `plugins/`, `tools/dispatch.ts` | `skill_load` | `$name`, `/skill:name`, browser Skills tab | Capability, composer | parity | — |
40
- | Plugins and Hub | `plugins/`, `hub/` | `plugins.*`, `hub.*` | resource browser | Capability | parity | — |
40
+ | Plugins and Hub | `plugins/`, `hub/` | `plugins.*`, `hub.*` | full-screen `/plugins` local manager; separate full-screen `/hub` Community catalog with bounded registry/document Preview (no Pi-package Preview) | local Plugins manager; Community Hub with payload Preview for non-package entries | parity | — |
41
41
  | Connected apps (MCP) | `mcp/` | `connections.*`, broker tools | resource browser Connections tab | Connections | parity | — |
42
42
  | Web search and page reading | `web/` | `web_search`, `web_fetch` | world tools | world tools | parity | — |
43
43
  | Isolated browser | `browser/` | shared `browser_*` schemas | isolated world tools, headed on request, `/settings` Browser tab | native WebKit: navigate, tabs, visible-text read and page scroll without refs; unsupported operations refuse explicitly | partial; native backend gap | PAR-015 |
@@ -92,13 +92,13 @@ this fixed table.
92
92
  | `/connections` | Connections browser | Opens App connectors | Not certified per command |
93
93
  | `/mcp` | Connections browser shortcut | Opens the same App connectors view | Not certified per command |
94
94
  | `/tools` | Tools page | Opens Capability tools | Not certified per command |
95
- | `/plugins` | Plugins page | Opens Capability plugins | Not certified per command |
96
- | `/hub` | Hub browser | Opens Capability Hub | Not certified per command |
95
+ | `/plugins` | Full-screen local Plugins manager | Opens local Plugins manager | Not certified per command |
96
+ | `/hub` | Separate full-screen Community Hub catalog | Opens Community Hub | Not certified per command |
97
97
  | `/components` | Components browser | Opens App Harness components | Not certified per command |
98
98
  | `/settings` | Terminal settings | Opens App settings | Not certified per command |
99
99
  | `/doctor` | Doctor checks, including explicitly confirmed live probes | Runs local readiness checks only | Not certified; App route does not expose live checks |
100
100
  | `/worktree` | Managed-worktree page and actions | Lists worktrees; Solo has no typed create/status/remove methods wired, and no worktree level | PAR-012; management actions unavailable; not certified |
101
- | `/subagents` | Live monitor and roster | Opens latest run's trajectory, not a dedicated subagent roster | Not certified; surfaces differ |
101
+ | `/subagents` | Live monitor and roster with the `main` row, restored on reopen | Opens latest run's trajectory, not a dedicated subagent roster | Not certified; surfaces differ |
102
102
  | `/agents` | Browse/create/edit/copy/delete profiles | Lists profiles only; detail/create/remove methods are not wired into Solo | PAR-010; management actions unavailable; not certified |
103
103
  | `/log` | Harness diagnostics and current run events | Opens latest run's trajectory, not a separate log reader | Not certified; surfaces differ |
104
104
  | `/hotkeys` | Keyboard controls | Opens App shortcut settings | Not certified per command |
@@ -116,7 +116,7 @@ or live-model sketch quality.
116
116
 
117
117
  | ID | Gap | Planned change |
118
118
  |---|---|---|
119
- | PAR-001 | Checklist absent from the App | The terminal registers the tool and renders a checklist block; the App renders it too. |
119
+ | PAR-001 | Todo list not rendered inline in the App | Both surfaces can show the current list: the terminal renders each write as a todo block and `/todo` shows a snapshot; the App's `/todo` shows a read-only list. The App still does not draw an inline block for each write. |
120
120
  | PAR-002 | Acceptance of terminal-model History/Wiki/skill tools | Source gap resolved: `Terminals.ownTools` registers History/trajectory, Wiki-read and skill tools over the session socket; `xagent-wiki` is a user-facing shell utility, not the model's only route. Acceptance has not been recertified in this documentation pass. |
121
121
  | PAR-003 | Continuation unused | `/resume` lists interrupted runs and continues one with `continueFrom`; the App offers Continue. |
122
122
  | PAR-004 | Refinement and adoption only in the App | Variant tab actions: start, candidates, adopt, trust. |
@@ -0,0 +1,21 @@
1
+ # Xingular Harness 1.3.0
2
+
3
+ This minor release builds on 1.2.0 with clearer run progress, more reliable work-slice limits, bounded plan research, and distinct local-plugin and Community Hub experiences.
4
+
5
+ ## Run progress and work slices
6
+
7
+ - `session_name` guidance names the session before the first tool call when a request needs tools or changes state. Multi-step work uses `todo_write`; the prompt and tool descriptions share the same concrete guidance.
8
+ - The run checklist is now a todo list: `todo_write`, `todo.updated`, `runs.todo`, the `todo` plugin and a terminal todo block. `/todo` displays the current list without a model request; `/checklist` remains an alias. Existing `checklist.updated` events are still read, and legacy pinned tools and server methods remain available as deprecated compatibility aliases for one release.
9
+ - Work slices default to 320 tool calls and 60 minutes, with no token cap unless configured. Stall detection recognizes meaningful progress, bounds repeated calls by name and arguments within each reply, and resets its counters between replies.
10
+ - Plan research can delegate only to named profiles whose effective tools and plugins qualify for read-only research. The active plan and latest todo list are restored after compaction.
11
+
12
+ ## Plugins and Community Hub
13
+
14
+ - `/plugins` is a dedicated local plugin manager for installed packages, switching, trust, settings, install, update and removal. `/hub` is a separate Community catalog with Catalog and Installed views; Installed retains receipts from every channel and labels each channel.
15
+ - Hub shows cached or bundled catalog entries before refreshing remotely, and exposes origin, refresh time and stale/error status. Registry/document entries keep a bounded payload Preview; Pi packages have no payload Preview. Hub-owned packages remain pinned to receipt versions: removal is receipt-aware, and floating plugin updates cannot silently replace them.
16
+ - No catalog schema or storage migration is required; existing receipts, settings and trust remain intact. The broad `/harness` resource browser remains available.
17
+
18
+ ## Terminal
19
+
20
+ - Skill completion and syntax highlighting distinguish enabled skill invocations, command names and arguments while retaining the existing composer workflow.
21
+ - Doctor's Bash readiness check now requires the platform write-boundary sandbox. Its live check runs one fixed, no-network command through the same workspace boundary as normal Bash, reports only the exit status, and stays subject to policy without being widened by Full Permission.
@@ -29,8 +29,8 @@ intentional 1.0.0 reset does not rewrite historical decisions or claim an orderi
29
29
 
30
30
  ## Historical 4.0.0 candidate evidence
31
31
 
32
- The following report records a prior candidate and registry snapshot; it is not evidence for the
33
- 1.2.0 candidate or a description of the current release gates.
32
+ The following report records a prior candidate and registry snapshot; it is not evidence for any
33
+ current candidate or a description of the current release gates.
34
34
 
35
35
  At the time, local checks on that candidate source passed: Harness `npm run ci` (typecheck, 134 test
36
36
  files with 1,004 passing tests and 3 skipped, plus the standalone proof); App typecheck, `npm test`
@@ -1,6 +1,6 @@
1
1
  # Harness terminal frontend
2
2
 
3
- Status: current terminal behavior, checked against `@xingular/harness` 1.2.0. Last updated: 2026-11-19.
3
+ Status: current terminal behavior, checked against `@xingular/harness` 1.3.0. Last updated: 2026-11-19.
4
4
  Decision: [ADR-0001](decisions/ADR-0001-owned-terminal.md),
5
5
  [ADR-0006](decisions/ADR-0006-opentui-only-terminal.md),
6
6
  [ADR-0009](decisions/ADR-0009-xharness-command.md),
@@ -93,9 +93,9 @@ The frontend is verified with a real isolated PTY and a loopback provider. Run
93
93
  `python3 scripts/verify-terminal.py --welcome-only --sizes 40x20,80x24,120x40` to check the empty
94
94
  welcome, product label, accent colors and `/help` transition. Run
95
95
  `python3 scripts/verify-terminal.py --composer-only` for recognized slash-command colors in the composer
96
- and a user bubble, unknown-command and argument colors, explicit-newline and soft-wrap checks of both
97
- prompt gutters, and normal/plan/Bash mode exclusivity. Run it with `--sizes 40x20,80x24,120x40` for
98
- compact through wide layouts. Use `--dialog-paste-only` to verify bracketed paste into a centered
96
+ and a user bubble, enabled-skill colors in the composer, unknown-token and argument colors,
97
+ explicit-newline and soft-wrap checks of both prompt gutters, and normal/plan/Bash mode exclusivity.
98
+ Run it with `--sizes 40x20,80x24,120x40` for compact through wide layouts. Use `--dialog-paste-only` to verify bracketed paste into a centered
99
99
  input dialog, `--file-completion-only` for filesystem completion and insertion,
100
100
  `--history-only` for active-session history across `/new` and `/session`, `--resume-only` for the full-screen searchable, unnumbered two-line saved-session picker, `--help-only` for `/help` replacing the welcome screen with grouped two-column output that wraps without per-command gaps, `--questions-only` for multi-select marker glyphs, recommended choices,
101
101
  selected-row and Continue/Submit colors, `--jump-latest-only` for scroll-away badge visibility and click-to-latest (screen-level click assertions use optional `pyte`), and choice-backed “Something else” answers, or `--thinking-only` for `/thinking` visibility toggles. The full suite covers a complete turn, `read`, `bash` approval, `ask_user_question` approval and picker, plugin overlay/widget/status
@@ -124,16 +124,24 @@ and a searchable `/subagents` page. The rows poll a private monitor route once p
124
124
  during a turn and make a final read at settlement. They sit one blank row below the status line, with
125
125
  no heading, and each reads: the status mark, the agent profile name in its colour (`subagent` for a
126
126
  copy of the parent), the title the parent gave the child (PROP-0030), and `n of m tasks` from the
127
- child's own checklist. At most three show, active first, then `+N more · /subagents`. The
127
+ child's own todo list. At most three show, active first, then `+N more · /subagents`. The
128
128
  `/subagents` page uses a colored profile and normal-color title on the first line, then muted account,
129
129
  effective model, effort and cumulative usage metadata on the second. One blank row separates each
130
130
  two-line entry. The page also shows status, elapsed time and the latest tool name. Runtime metadata
131
131
  stays in the private terminal projection.
132
132
  Usage contains safe token/cache/cost/context totals, not per-request payloads or reasoning summaries.
133
133
  The projection is read-only, flat across nested descendants, and scoped to the latest parent run in
134
- this terminal session; finished rows remain visible until the next parent run starts. It is cleared
135
- on session replacement or terminal disposal. It never includes tool arguments (beyond the title),
136
- output or checklist item text.
134
+ this terminal session; finished rows remain visible until the next parent run starts. The page also
135
+ pins a `main` row for the parent run itself, with the same details; the rows under the status line
136
+ leave it out. Reopening a conversation (a new launch, `/resume`, or a switch) rebuilds the rows from
137
+ the branch's latest parent run and its saved child runs, with their final status, until the next run
138
+ starts. A switch to a conversation without one clears them, as does disposal. It never includes tool
139
+ arguments (beyond the title), output or todo item text.
140
+
141
+ An interrupted or failed child keeps its saved conversation. The next reply is told which children
142
+ stopped before it answers, and the parent continues one with `spawn_subagent { continue: <runId> }`,
143
+ which reopens that child's own history with its profile and tools (ADR-0043). Esc therefore does
144
+ not lose a child's progress.
137
145
 
138
146
  `/agents` opens the Agents page (PROP-0029): built-in, global, project and variant profiles with
139
147
  their tools, plugins, variant, model and instructions. Enter on a row edits a person's own profile
@@ -215,7 +223,7 @@ rule; then the work that followed. The summary is shown by default. Clicking eit
215
223
  shows it, and Ctrl+O shows every summary again. On a narrow screen the rule drops the click hint, then
216
224
  the token count. Earlier compactions in the same session keep their own rules and summary in place.
217
225
  Notices stay after the message they followed. The model sees the summary and recent messages plus a
218
- bounded, hidden checkpoint of the active request, checklist and plan instructions when available;
226
+ bounded, hidden checkpoint of the active request, todo list and plan instructions when available;
219
227
  the checkpoint is regenerated for each post-compaction request until the run settles. The visible
220
228
  transcript remains a presentation of the full history, not the model context.
221
229
  Transcript entry ids follow positions in the displayed message list, so when a rebuilt list moves a
@@ -268,15 +276,20 @@ OSC 8 support. Inline and fenced code use a subtle panel fill with syntax colors
268
276
  list markers, tables, dividers and task-list markers use the existing titanium palette. Images
269
277
  display their alt text and are not fetched or rendered as image files.
270
278
 
271
- ## Checklist block
279
+ ## Todo block
272
280
 
273
- `checklist_write` is registered in terminal sessions (PAR-001). Each call renders in the
274
- transcript as a checklist block: a status mark, `Checklist · n of m done`, then one line per item
275
- with `✓` (done, success colour), `●` (in progress, warning yellow, bold) or `○` (pending, dim).
276
- Each row reserves a one-cell status column and one-cell gap; item text and wrapped lines share the
277
- same starting column. A call whose arguments are not a checklist, or that failed, stays an ordinary
278
- tool row. The prompt's Progress group asks the model to keep the list current and write a final
279
- update before replying; unfinished work remains unfinished rather than being marked complete.
281
+ `todo_write` is registered in terminal sessions (PAR-001). Each call renders in the transcript as
282
+ a todo block: a status mark, `Todo · n of m done`, then one line per item with `✓` (done, success
283
+ colour), `●` (in progress, warning yellow, bold) or `○` (pending, dim). Each row reserves a one-cell
284
+ status column and one-cell gap; item text and wrapped lines share the same starting column. A call
285
+ whose arguments are not a todo list, or that failed, stays an ordinary tool row. The prompt's
286
+ Progress group asks the model to keep the list current and write a final update before replying;
287
+ unfinished work remains unfinished rather than being marked complete.
288
+
289
+ `/todo` (alias `/checklist`) appends a snapshot of the current list: the same header and rows, with
290
+ no status mark on the header, because it is not a tool call. It reads the latest non-side-question
291
+ run of this terminal's native session and makes no model request; an empty list is a one-line
292
+ notice.
280
293
 
281
294
  ## Blocks and pages
282
295
 
@@ -301,20 +314,36 @@ frontends draw that field from the same muted-blue selection palette (`selection
301
314
  explicit high-contrast text on it instead of the accent colour, so a choice reads the same in every
302
315
  list. Rules use the theme's `warning` and `dim` colors, so a custom theme restyles them.
303
316
 
304
- The Harness resource browser (PROP-0013) unifies Overview, Foundation, Variant, Skills, Plugins,
305
- Connections, Tools and Library. `/harness` opens Overview; `/skills`, `/plugins`, `/connections`
306
- (`/mcp`) and `/tools` open sections. `/hub` selects Discover and `/components` selects Library.
307
- The existing Accounts, Permissions, Settings, Trajectory and Log pages retain their own tabs.
317
+ The broad Harness resource browser (PROP-0013) unifies Overview, Foundation, Variant, Skills,
318
+ Plugins, Connections, Tools and Library. `/harness` opens Overview; `/skills`, `/connections`
319
+ (`/mcp`), `/tools` and `/components` open sections. `/plugins` is a separate
320
+ full-screen local manager with Plugins, Trust and Packages tabs; `/hub` is a separate
321
+ full-screen Community catalog with Catalog and Installed tabs. Both keep a searchable
322
+ inventory beside selected-item details on wide terminals, stacking details below the list
323
+ on compact terminals. The existing Accounts, Permissions, Settings, Trajectory and Log
324
+ pages retain their own tabs.
308
325
 
309
326
  `/settings` includes a Browser tab with the device-local **Private address access** setting. It is
310
327
  off by default. Enabling it asks for confirmation and allows agent browsing and annotation capture
311
328
  to reach localhost and private networks.
312
329
 
313
- Resource sections share Installed/Discover and source filters. Installed includes locally present
314
- resources; current-session availability comes only from the runtime loader and active tool registry.
315
- Discover uses the existing Hub with All/Community/Official filtering and an explicit remote refresh.
316
- No matching community entries is an empty result, never replaced with built-in resources.
317
- The view preserves search across source switches and restores section selection on return.
330
+ Within the broad `/harness` browser, resource sections share Installed/Discover and source filters.
331
+ Installed includes locally present resources; current-session availability comes only from the runtime
332
+ loader and active tool registry. Discover uses the unfiltered Hub service with All/Community/Official
333
+ filters and an explicit refresh. No matching Community entries is an empty result, never replaced with
334
+ built-in resources. The view preserves search across source switches and restores section selection.
335
+
336
+ The dedicated `/hub` Catalog shows Community entries across supported types only. Its Installed tab
337
+ shows receipts from every channel with the channel labeled. On each page entry, cached/bundled entries
338
+ appear first, then the remote catalog refreshes; the status keeps the origin, last-refresh time and any
339
+ stale/error feedback visible. Manual refresh remains available. Catalog installs are pinned to the
340
+ selected version, and Hub uninstalls remove only receipt-owned resources. Registry/document entries
341
+ offer a bounded payload Preview; Pi packages have no JSON payload Preview.
342
+
343
+ The `/plugins` manager keeps local switching, code trust and settings separate from public discovery.
344
+ Its Packages tab adds local package installation, update and removal. Hub-owned packages remain pinned
345
+ to exact catalog versions; removal goes through Hub receipt cleanup, and updating requires an explicit
346
+ Hub version replacement.
318
347
 
319
348
  The browser fills the terminal (PROP-0014), with Overview, Foundation, Variant, Skills, Plugins,
320
349
  Connections, Tools and Library as persistent top tabs. The section dropdown and sidebar are removed.
@@ -329,8 +358,8 @@ Left/Right changes the focused tab or control; Enter on the tab strip returns to
329
358
  Ctrl+F focuses search. Escape returns from content to actions, returns to the list, clears search,
330
359
  then closes. Mouse clicks select tabs directly, activate resource actions and focus filters;
331
360
  wheel scrolling targets the list or inspector under the pointer. Other command pages keep their
332
- centered presentation; `/settings` and `/accounts` use full-screen page layouts. Closing the browser preserves
333
- the composer draft and attachments.
361
+ centered presentation; `/settings`, `/accounts`, `/plugins` and `/hub` use full-screen page layouts.
362
+ Closing the browser preserves the composer draft and attachments.
334
363
 
335
364
  Foundation explains fixed runtime ownership; it is read-only. Variant shows c1–c8 with the
336
365
  prepared version and current head separately. It previews pinned files from the preparation
@@ -384,16 +413,21 @@ Use `/plan <brief>` for one read-only planning request. A plan waits outside Pi'
384
413
  queue until the active response settles, then runs by itself. Later messages remain behind it, even
385
414
  when Pi's follow-up mode is `all`. During that run the session narrows to read-only inspection
386
415
  (`read`, `grep`, `find`, `ls`), web search/page reading, questions (`ask_user`, `ask_user_question`)
387
- and recall (history and Wiki reads, `memory_facts`). It may also delegate bounded research to a
388
- named profile whose effective tool and plugin allowlists qualify for research; the child inherits
389
- plan mode and receives only the intersection of the parent's frozen capabilities, profile and
390
- plan-research set. Children cannot write, run commands, ask the user, use connectors or spawn more
391
- children. Normal mode omits both question tools from the active set; the plan request enables
392
- registered questions and research delegation temporarily and restores the normal set when it settles,
393
- including on failure or interruption. Providers may mark individual calls as safe for research; every
394
- other call is blocked before approval. Edits, writes, shell commands, memory writes and connected-app
395
- tools remain unavailable to the parent and child. The plan instructions arrive as a request-scoped
396
- prompt section, which the next ordinary request withdraws.
416
+ and recall (history and Wiki reads, `memory_facts`). The parent may also run Bash in the
417
+ OS-enforced read-only sandbox: no network and no writes except a discarded per-command temporary
418
+ directory (PROP-0043). It may delegate bounded research to a named profile whose effective tool and
419
+ plugin allowlists qualify for research; the child inherits plan mode and receives only the
420
+ intersection of the parent's frozen capabilities, profile and plan-research set. Children cannot
421
+ write, run commands, ask the user, use connectors or spawn more children; they remain bounded by the
422
+ configured work-slice policy without gaining `checkpoint_write`, and the Harness records an
423
+ evidence-derived checkpoint if the child stops at a boundary. Normal mode omits both question tools
424
+ from the active set; the plan request enables registered questions and research delegation
425
+ temporarily and restores the normal set when it settles, including on failure or interruption.
426
+ Providers may mark individual calls as safe for research; every other call is blocked before
427
+ approval. Edits, writes, memory writes and connected-app tools remain unavailable to parent and
428
+ child; generic browser controls are also blocked. Sandboxed read-only Bash is the parent's only
429
+ plan-mode shell exception; children cannot run commands. The plan instructions arrive as a
430
+ request-scoped prompt section, which the next ordinary request withdraws.
397
431
 
398
432
  Each mode keeps its own model and effort for the account. Every selection the person makes (the model
399
433
  picker, `/effort`, Shift+Up/Down, Ctrl+P) is saved against the mode it was made in, so Shift+Tab switches to that
@@ -699,12 +733,16 @@ normal-color title and a muted second line with relative activity time, `<projec
699
733
  file size separated by ` · `. One blank line separates each session. Enter resumes the selected
700
734
  session; account and folder scope checks
701
735
  remain enforced. Supplying an explicit path continues directly without opening the picker.
702
- The separate `$` palette completes enabled skill invocations; `/skills` always browses skills. `/help`
703
- renders the command list as one transcript entry, grouped under Core, Run, Model, Session, Inspect,
704
- Harness, Plugins and Prompts; command names and descriptions wrap in aligned columns, with no
705
- blank rows between choices. `/plugins` opens the browser with protected code trust and plugin settings actions. Settings use
706
- `plugins.configure`; on/off settings and bounded whole-number settings keep their existing ranges.
707
- Saved settings are read when the plugin next uses them and do not require a restart. The standalone
736
+ The `$` palette completes enabled skill invocations using the same two-column palette as slash
737
+ commands; `/skills` always browses skills. Choosing a skill inserts `$name ` without submitting.
738
+ A recognized leading `$name` uses the blue accent in the composer, while its arguments, unavailable
739
+ names and ordinary currency text keep the normal color. `/help` renders the command list as one
740
+ transcript entry, grouped under Core, Run, Model, Session, Inspect, Harness, Plugins and Prompts;
741
+ command names and descriptions wrap in aligned columns, with no blank rows between choices. `/plugins`
742
+ opens the focused local manager; its Packages tab installs, updates and removes packages with protected
743
+ Harness operations. Settings use `plugins.configure`; on/off settings and bounded whole-number settings
744
+ keep their existing ranges. Saved settings are read when the plugin next uses them and do not require a
745
+ restart. The standalone
708
746
  terminal no longer has separate `/login`, `/trust`, `/bug`, `/changelog`, `/share`, `/scoped-mode` or
709
747
  `/import` commands. `/btw <question>` (or `/side <question>`) starts a separate Harness run with the
710
748
  main run's effective instructions, visible conversation and redacted public tool inputs/results.
@@ -894,8 +932,9 @@ inherit that retained ledger.
894
932
 
895
933
  ## Agent-managed session names
896
934
 
897
- Agents can use `session_name({ name: string })` to name meaningful work early and revise
898
- its name when the objective changes. Names submitted by agents are short imperative
935
+ Agents can use `session_name({ name: string })` to name work before their first other tool call
936
+ when a request needs tools or changes state, and revise the name only when the objective changes.
937
+ Names submitted by agents are short imperative
899
938
  sentences with at most six words. The agent may revise a manual name; `/name` remains
900
939
  available and manual names have no new word limit. Pi stores the name in native history,
901
940
  so resuming the same conversation restores it without another model request.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xingular/harness",
3
- "version": "1.2.0",
3
+ "version": "1.3.1-unstable.0",
4
4
  "type": "module",
5
5
  "description": "Xingular Harness — a Pi agent harness built on recursive harnessing (Harness²): versioned eight-component variants, refinement from evidence, multi-account sessions, a compiled prompt, project notes, tools, and MCP",
6
6
  "repository": {
@@ -1,9 +0,0 @@
1
- import { type ChecklistItem, type RunEvent } from "../sessions/contracts.js";
2
- import type { ActiveRun } from "../sessions/registry.js";
3
- import type { ToolSpec } from "./types.js";
4
- export declare const CHECKLIST_WRITE = "checklist_write";
5
- /** The checklist as the model reads it back. */
6
- export declare function describeChecklist(items: readonly ChecklistItem[]): string;
7
- /** The latest checklist a run wrote, or an empty list. */
8
- export declare function checklistOf(events: readonly RunEvent[]): ChecklistItem[];
9
- export declare function checklistTool(run: Pick<ActiveRun, 'emit'>): ToolSpec;