@staix/agent-hub 0.12.23 → 0.12.25
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.
- package/CHANGELOG.md +109 -1
- package/README.md +8 -3
- package/docs/addons/claude-mem.md +24 -0
- package/docs/addons/codex-plugin.md +8 -0
- package/docs/addons/dot-admit.md +8 -0
- package/docs/addons/open-code-review.md +8 -0
- package/docs/addons/ponytail.md +23 -0
- package/docs/addons/ripwire.md +22 -0
- package/docs/agent-notes/README.md +5 -0
- package/docs/agent-notes/adapters.md +10 -1
- package/docs/agent-notes/bus.md +3 -1
- package/docs/agent-notes/daemon.md +7 -1
- package/docs/agent-notes/local-worker.md +4 -2
- package/docs/agent-notes/tasks.md +8 -0
- package/docs/agent-notes/tests.md +5 -1
- package/docs/bench.md +28 -3
- package/docs/cooperbench.md +4 -0
- package/docs/data-policy.md +36 -0
- package/docs/events.md +3 -0
- package/docs/gsd-collaboration-analysis.md +48 -0
- package/docs/memory.md +231 -0
- package/docs/operations.md +666 -19
- package/docs/plans/2026-10-11-issues-109-sequential.md +81 -0
- package/docs/plans/2026-10-11-routing-evaluation-proposal.md +30 -0
- package/docs/profiles.md +57 -0
- package/docs/quickstart.md +2 -2
- package/docs/research.md +31 -1
- package/docs/roles.md +85 -0
- package/docs/sdlc.md +170 -0
- package/docs/security.md +111 -4
- package/docs/smoke.md +288 -0
- package/docs/specs/2026-09-19-agent-hub-design.md +633 -7
- package/docs/specs/2026-10-12-backlog-implementation-plan.md +186 -0
- package/docs/specs/2026-10-12-office-view-design.md +212 -0
- package/docs/text-projection.md +19 -0
- package/docs/verification/2026-10-11-acp-watch-t0.md +33 -0
- package/docs/verification/2026-10-11-agent-config-inventory.md +20 -0
- package/docs/verification/2026-10-11-jcode-peer-contract.md +27 -0
- package/docs/verification/2026-10-13-0.12.24.md +94 -0
- package/docs/verification/2026-10-13-board-phone.md +31 -0
- package/docs/verification/2026-10-13-fsmonitor-fixture-attribution.md +19 -0
- package/docs/verification/2026-10-14-0.12.24-audit.md +123 -0
- package/docs/verification/2026-10-14-0.12.25.md +27 -0
- package/docs/verified.json +22 -13
- package/package.json +2 -1
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/ROLE-NOTICE.md +26 -0
- package/plugins/agent-hub/server.js +1175 -339
- package/scripts/check-docs.mjs +129 -0
- package/src/adapters/acp.ts +112 -13
- package/src/adapters/claude-channel.ts +48 -11
- package/src/adapters/codex-appserver.ts +11 -0
- package/src/adapters/jcode.ts +110 -0
- package/src/adapters/local-worker.ts +10 -7
- package/src/adapters/pi.ts +171 -23
- package/src/cli/attention.ts +60 -0
- package/src/cli/bench.ts +24 -5
- package/src/cli/board-read.ts +12 -0
- package/src/cli/console-state.ts +103 -17
- package/src/cli/console.ts +54 -8
- package/src/cli/facts-hook.ts +12 -4
- package/src/cli/help.ts +35 -9
- package/src/cli/identity.ts +18 -7
- package/src/cli/init.ts +48 -10
- package/src/cli/jcode-mcp.ts +58 -0
- package/src/cli/kimi-mcp.ts +53 -0
- package/src/cli/launch.ts +16 -1
- package/src/cli/main.ts +392 -57
- package/src/cli/memory.ts +193 -0
- package/src/cli/output.ts +45 -4
- package/src/cli/pet-config.ts +1 -0
- package/src/cli/pet.ts +83 -0
- package/src/cli/preview.ts +38 -5
- package/src/cli/status-lines.ts +1 -1
- package/src/cli/tail-render.ts +1 -0
- package/src/cli/upgrade-runtime.ts +32 -3
- package/src/cli/watch.ts +31 -0
- package/src/hub/activity.ts +53 -0
- package/src/hub/ask.ts +10 -5
- package/src/hub/bench.ts +10 -3
- package/src/hub/board.ts +222 -16
- package/src/hub/bus.ts +48 -9
- package/src/hub/citations.ts +7 -0
- package/src/hub/conductor.ts +12 -7
- package/src/hub/config-trust.ts +4 -2
- package/src/hub/crash.ts +9 -0
- package/src/hub/daemon.ts +914 -120
- package/src/hub/delivery-journal.ts +5 -0
- package/src/hub/envelope.ts +1 -1
- package/src/hub/events.ts +12 -2
- package/src/hub/facts.ts +26 -7
- package/src/hub/git.ts +8 -2
- package/src/hub/github-import.ts +28 -0
- package/src/hub/hub-tools.ts +49 -10
- package/src/hub/inference.ts +1 -1
- package/src/hub/lifecycle-schema.ts +17 -0
- package/src/hub/listen.ts +15 -0
- package/src/hub/manager.ts +12 -5
- package/src/hub/path-policy.ts +115 -0
- package/src/hub/peer-catalog.ts +28 -0
- package/src/hub/permission-mode.ts +19 -5
- package/src/hub/planning.ts +70 -0
- package/src/hub/profiles.ts +74 -0
- package/src/hub/projected-diff.ts +73 -0
- package/src/hub/projection-exec.ts +24 -0
- package/src/hub/research.ts +144 -21
- package/src/hub/roles.ts +123 -0
- package/src/hub/roster.ts +23 -0
- package/src/hub/routing.ts +18 -5
- package/src/hub/sdlc-queue.ts +112 -0
- package/src/hub/sdlc-release.ts +125 -0
- package/src/hub/sdlc.ts +250 -0
- package/src/hub/settings.ts +34 -15
- package/src/hub/shipped-roles.ts +25 -0
- package/src/hub/snapshots.ts +89 -15
- package/src/hub/start-mode.ts +7 -5
- package/src/hub/supervision.ts +1 -0
- package/src/hub/task-sweep.ts +1 -1
- package/src/hub/tasks.ts +905 -89
- package/src/hub/text-projection.ts +151 -0
- package/src/hub/tooling.ts +170 -0
- package/src/hub/ui.ts +16 -2
- package/src/hub/workflow.ts +71 -0
- package/src/local/sandbox.ts +6 -4
- package/src/local/tools.ts +11 -6
- package/src/memory/brief.ts +28 -14
- package/src/memory/import.ts +55 -0
- package/src/memory/recall.ts +84 -0
- package/src/memory/store.ts +757 -0
- package/src/memory/sync.ts +145 -0
- package/src/pet/NOTICE.md +10 -0
- package/src/pet/characters.ts +1438 -0
- package/src/pet/config.ts +31 -0
- package/src/pet/frame.ts +17 -0
- package/src/pet/pixels.ts +28 -0
- package/src/pi/extension.ts +40 -5
- package/src/role-text.d.ts +1 -0
- package/src/ui/index.html +843 -46
- package/src/ui/needs.ts +58 -0
- package/src/ui/office-model.ts +440 -0
- package/src/ui/peer-palette.ts +16 -0
- package/src/ui/task-board.ts +49 -0
- package/src/ui/task-progress.ts +5 -1
- package/templates/AGENTS.block.md +3 -2
- package/templates/config.json +5 -1
- package/templates/profiles/dev.json +22 -0
- package/templates/profiles/general.json +26 -0
- package/templates/profiles/research.json +57 -0
- package/templates/profiles/writing.json +28 -0
- package/templates/roles/NOTICE.md +26 -0
- package/templates/roles/dev/backend-engineer.md +26 -0
- package/templates/roles/dev/code-reviewer.md +26 -0
- package/templates/roles/dev/frontend-engineer.md +26 -0
- package/templates/roles/dev/security-reviewer.md +26 -0
- package/templates/roles/dev/software-architect.md +26 -0
- package/templates/roles/dev/test-engineer.md +26 -0
- package/templates/roles/research/analyst.md +26 -0
- package/templates/roles/research/fact-checker.md +26 -0
- package/templates/roles/research/research-lead.md +26 -0
- package/templates/roles/research/researcher.md +26 -0
- package/templates/roles/research/statistician.md +26 -0
package/docs/memory.md
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Hub memory
|
|
2
|
+
|
|
3
|
+
The hub's own memory (#258): notes the agents and the hub save while they work, kept in two tiers and linked into a
|
|
4
|
+
graph by what they are about. It sits beside claude-mem, which stays the capture and session-recall source where it is
|
|
5
|
+
installed. Every machine keeps its own copy in `~/.agenthub/memory/` (directory 0700, files 0600).
|
|
6
|
+
|
|
7
|
+
## Turning it on and off
|
|
8
|
+
|
|
9
|
+
On with any project config (`.agenthub/config.json`); `"memory": { "native": false }` turns it off for a project.
|
|
10
|
+
`memory.short_ttl_days` (default 14, a whole number from 1 to 3650; anything else fails the config) sets how long
|
|
11
|
+
short-term entries live after their task is approved, and `memory.sync_interval_min` (default 10, 0 off, at most 1440) how often a running
|
|
12
|
+
hub syncs once a remote is set. Writing and
|
|
13
|
+
reading are fail-open: a store that cannot be written costs one notice, and never a tool call or a turn.
|
|
14
|
+
|
|
15
|
+
## Tiers
|
|
16
|
+
|
|
17
|
+
- **Short-term**: notes saved against a task that is still open, and notes saved with no task. They stay on this
|
|
18
|
+
machine (`local/<machine>.jsonl`) and leave the index `short_ttl_days` after their task is approved (a note with no
|
|
19
|
+
task, or saved with `horizon: "short"` on purpose: after it was written, and it is never promoted; a demoted entry:
|
|
20
|
+
after the demotion; a note on a task that is never approved: 180 days after it was written, the same for every
|
|
21
|
+
reader). The deadline is written into the entry (`expires`)
|
|
22
|
+
or the op (`settle`, `demote`) when it is set, so every process reading the store prunes the same rows whatever its
|
|
23
|
+
own setting. Their log lines stay on disk.
|
|
24
|
+
- **Long-term**: decisions, contracts and fails that outlive their task. When a task is approved, its decision, contract
|
|
25
|
+
and fail notes are copied to long-term automatically (findings are not), and the short-term originals are hidden.
|
|
26
|
+
Each is screened again first under the project's current PII patterns and `pii.paths`; one that fails stays
|
|
27
|
+
short-term on this machine and expires. An
|
|
28
|
+
agent can save straight to long-term with `hub_remember(..., horizon: "long")`; a note against an already approved
|
|
29
|
+
task that is a decision, contract or fail is long-term at once. Long-term entries go to `log/<machine>.jsonl`, the
|
|
30
|
+
segment machine sync will carry.
|
|
31
|
+
- **Scope**: `project` (default) entries are read only in the project that wrote them; `shared`
|
|
32
|
+
(`hub_remember(..., scope: "shared")`) entries are read from every project on the machine.
|
|
33
|
+
|
|
34
|
+
A project is named by its `origin` remote, normalized to host and path (`github.com/owner/repo`, lowercased on GitHub, whose
|
|
35
|
+
names ignore case; a URL keeps a port that is not its scheme's default), the same on every machine; a repository without one is named by its git chain plus a hash of its directory, so two unrelated
|
|
36
|
+
repositories with the same name never share entries (that name is this machine's only).
|
|
37
|
+
|
|
38
|
+
## What gets written
|
|
39
|
+
|
|
40
|
+
- `hub_remember` from any peer or `ahub remember`, after the existing checks: a note about a PII task, or one matching a
|
|
41
|
+
PII pattern, is refused; the PII screen (#198) must clear it; a note that looks like it holds a secret (a private key,
|
|
42
|
+
a cloud or GitHub token, `password: ...`) is refused.
|
|
43
|
+
- The hub's own notes on a task: the done summary (finding), the review verdict and an escalation (decision), with the
|
|
44
|
+
same PII and secret rules. Nothing about a PII task is written.
|
|
45
|
+
- Notes still go to claude-mem when it is enabled, as before; the other peers get the note line on their next delivery.
|
|
46
|
+
|
|
47
|
+
## Entries (`agent-hub.memory/v1`)
|
|
48
|
+
|
|
49
|
+
One JSON line each. The id is the first 32 hex characters of the SHA-256 of the entry's canonical JSON (sorted keys,
|
|
50
|
+
without `id`), so the same content always has the same id and a line whose id does not match is skipped. Nothing is
|
|
51
|
+
ever rewritten: a change is a new entry.
|
|
52
|
+
|
|
53
|
+
| `op` | Fields |
|
|
54
|
+
| --- | --- |
|
|
55
|
+
| `note` | `project`, `scope`, `tier`, `kind` (`decision`, `finding`, `contract`, `fail`), `peer`, `title?`, `text` (at most 4000 characters), `task?` (`<project>#<id>@<created ms>`), `about` (nodes), `supersedes?`, `promotedFrom?`, `source` (`hub`, `person`, `claude-mem`), `expires?` (a short-term note with no task, on a task already settled, or saved short-term on purpose: its own deadline, whatever the task does); a promoted copy is dated as its source and keeps its fields, whoever promotes it |
|
|
56
|
+
| `forget` | `target`: the entry is gone from the index, and so is its promoted copy or original |
|
|
57
|
+
| `supersede` | `target`, `by`: the newer entry; superseded entries are dropped from briefs and recall while the newer one is live (forgetting it shows the old one again) |
|
|
58
|
+
| `demote` | `target`, `by`: a long-term entry becomes short-term and leaves the index at `by` |
|
|
59
|
+
| `settle` | `target`: a task key, `by`: when its short-term entries leave the index (written when the task is approved; a settlement a crash cut short is finished at the next read, and a held decision, contract or fail whose replacement is forgotten or expires moves to long-term then too) |
|
|
60
|
+
|
|
61
|
+
Every entry also has `schema`, `id`, `at` (ISO time) and `machine` (a random id per `~/.agenthub`, in
|
|
62
|
+
`memory/machine.json`, with a label a person can edit).
|
|
63
|
+
|
|
64
|
+
## The graph
|
|
65
|
+
|
|
66
|
+
Nodes are entries (`mem:<id>`), files (`path:src/a.ts`, relative to the project root), symbols (`symbol:parse@src/a.ts`,
|
|
67
|
+
with the path when the task's plan names exactly one), issues (`issue:owner/repo#12`, the repo from the project's
|
|
68
|
+
`origin` remote on GitHub, else the project name), board tasks (`task:<project>#3@<proposal ms>` for the task a note was saved against, so a task id reused after
|
|
69
|
+
`ahub reset --all` is another node; `task #N` in a text names `task:<project>#N`), peers, machines and projects.
|
|
70
|
+
Edges are deterministic and fixed when the entry is written, so a rebuild never depends on the file system:
|
|
71
|
+
|
|
72
|
+
- `about`: from the task's refs and plan paths, plan symbols, paths named in the text that exist in the project at
|
|
73
|
+
write time (denylisted paths are left out), `#N` and `task #N`, and the task the note was saved against. A `fail`
|
|
74
|
+
draws them as `rules_out`.
|
|
75
|
+
- `by` (peer, machine) and `in` (project), from the entry's fields; `supersedes` between entries.
|
|
76
|
+
|
|
77
|
+
- `part_of` (board task to long-term task) and `depends_on` (between long-term tasks), from the links below.
|
|
78
|
+
|
|
79
|
+
- Model-suggested edges, off by default (`"memory": { "suggest_edges": true }`): after a note is saved, the hub's model
|
|
80
|
+
(the same route as digest condensation) names `contradicts` or `same_topic` between it and up to six near entries.
|
|
81
|
+
Its answer is read line by line against that closed list and stored as a suggestion by `hub-model` (`suggest`,
|
|
82
|
+
`confirm`, `reject` entries). Suggestions are drawn dashed on the dashboard and are never evidence: briefs, recall and
|
|
83
|
+
`ahub ask` ignore them until a person confirms one (`ahub memory confirm <id>`); a rejected one disappears.
|
|
84
|
+
|
|
85
|
+
## Long-term tasks
|
|
86
|
+
|
|
87
|
+
A long-term task (a goal) spans sessions, board tasks, projects and machines: an epic issue, a migration. It has a
|
|
88
|
+
state (`open`, `active`, `blocked`, `done`, `dropped`), milestones, the long-term tasks it depends on, its linked board
|
|
89
|
+
tasks (project, task id and proposal time, so a reset's reused ids never join it) and a lease. All of it lives in the
|
|
90
|
+
synced log as entries:
|
|
91
|
+
|
|
92
|
+
| `op` | Fields |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `goal` | `project`, `scope`, `title`, `milestones`, `dependsOn`, `actor` |
|
|
95
|
+
| `goal_state` | `target`, `by`: the state |
|
|
96
|
+
| `goal_link` | `target`, `by`: the board task key |
|
|
97
|
+
| `lease`, `lease_force` | `target`, `by`: until when (ISO) |
|
|
98
|
+
|
|
99
|
+
- **Titles** and milestones are kept to one line (whatever another machine wrote), and recall lines are sanitized, so
|
|
100
|
+
they cannot carry a forged message header into an agent's context.
|
|
101
|
+
- **Links**: a peer joins its own board task to one of this project's long-term tasks with
|
|
102
|
+
`hub_task_propose(..., goal: "<id>")`; a person links any board task of the project to any long-term task with
|
|
103
|
+
`ahub goal link <id> <task>` (through the running hub, so the board task is checked). Nothing about a PII task is linked.
|
|
104
|
+
- **Lease**: while a linked board task is in progress on this machine's hub, the hub holds the long-term task's lease
|
|
105
|
+
(default 4 hours, renewed past half its time). It looks at every in-progress task at start, every 10 minutes, when
|
|
106
|
+
a task changes on the board and when a person links one, so a task worked on for hours keeps its lease. It never takes a lease another machine holds: the console says who
|
|
107
|
+
holds it, and a person takes it over with `ahub goal take <id> --force`, which voids every earlier claim. A lease that
|
|
108
|
+
expired is free for anyone.
|
|
109
|
+
- **Conflicts**: sync is eventually consistent, so a lease is advisory. Two machines that claim inside one sync window
|
|
110
|
+
both stand: the earlier claim holds and the other shows as a conflict everywhere (status, dashboard, `ahub goal`)
|
|
111
|
+
until a person settles it with `--force`. There is no consensus; a broker would make it a real lock if concurrent
|
|
112
|
+
work across machines ever needs one.
|
|
113
|
+
- **Where it shows**: at hub start (a console line per open long-term task of the project), in `ahub status`, in
|
|
114
|
+
`ahub goal list`, on the dashboard's Long-term tasks tab, and leading the session-start recall. Briefs bring along
|
|
115
|
+
the entries of the long-term task's other board tasks.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
ahub goal new "native memory" --milestone "phase 1" --milestone "phase 2" # a person's
|
|
119
|
+
ahub goal link 1a2b3c4d 12
|
|
120
|
+
ahub goal # open long-term tasks, their state and lease
|
|
121
|
+
ahub goal show 1a2b3c4d
|
|
122
|
+
ahub goal take 1a2b3c4d [--force]
|
|
123
|
+
ahub goal state 1a2b3c4d blocked
|
|
124
|
+
ahub goal done 1a2b3c4d
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Machine sync
|
|
128
|
+
|
|
129
|
+
The memory directory is a git repository that tracks only `log/*.jsonl` (and its `.gitignore`); the index, the local
|
|
130
|
+
short-term segment and `machine.json` never leave the machine. Each machine commits only its own segment and starts
|
|
131
|
+
its own history, so merging another machine's history never conflicts.
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
ahub memory sync --remote git@github.com:you/agent-hub-memory.git # once per machine, a person's
|
|
135
|
+
ahub memory sync # pull, then push, now
|
|
136
|
+
ahub memory machine --label "office mac" # a name shown beside the id
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
- A sync commits this machine's segment, fetches, merges the remote's history, pushes (once more after a merge when
|
|
140
|
+
another machine pushed in between) and indexes what arrived. One sync runs per machine at a time.
|
|
141
|
+
- A running hub syncs 5 seconds after it starts and every `memory.sync_interval_min` minutes (default 10; 0 turns it
|
|
142
|
+
off) once a remote is set. A failure is one `hub.log` line and never blocks a turn; a store without a remote does
|
|
143
|
+
nothing and creates nothing.
|
|
144
|
+
- The remote must be private: long-term entries hold note text. A GitHub remote is checked with `gh repo view` and a
|
|
145
|
+
public one is refused; any other host, or a `gh` that cannot answer, is unknown and the sync goes on with a warning.
|
|
146
|
+
- Use an SSH remote, or HTTPS with a credential helper in your global git config: the hub keeps your credential helper
|
|
147
|
+
for this repository only, and never prompts.
|
|
148
|
+
- A forgotten entry stays in the remote's git history; removing it from there is a person's history rewrite.
|
|
149
|
+
|
|
150
|
+
## Index
|
|
151
|
+
|
|
152
|
+
`index.db` (SQLite) is derived from the logs: entries, ops and edges are inserted with `INSERT OR IGNORE`, and every
|
|
153
|
+
state (superseded, forgotten, promoted, demoted, expired) is computed from those rows, so reading the segments in any
|
|
154
|
+
order gives the same index, and the index each hub keeps up to date as it writes equals a rebuild from the logs. Each
|
|
155
|
+
reader keeps the byte offset it reached per segment and reads only what was appended since; a line still being written
|
|
156
|
+
waits for the next read. A segment that got shorter, disappeared or was rewritten in place (the indexed part no longer
|
|
157
|
+
hashes to what was indexed) makes the reader rebuild the index from every segment. Malformed lines and lines whose id does
|
|
158
|
+
not match their content are skipped with one log line.
|
|
159
|
+
`ahub memory rebuild` drops the rows and reads every segment again; deleting `index.db` does the same on the next start.
|
|
160
|
+
|
|
161
|
+
## Reading it
|
|
162
|
+
|
|
163
|
+
- **Task briefs**: when a task is handed to an owner, its brief lists hub memory first (entries one or two hops from
|
|
164
|
+
the task's paths, symbols, issue and task: a linked fail first, then nearer, then newer; superseded entries dropped;
|
|
165
|
+
other projects' entries only when shared), then claude-mem's, `memory.brief_items` lines in all. A peer is never
|
|
166
|
+
shown the same entry twice in one hub run.
|
|
167
|
+
- **Session-start recall**: this project's long-term decisions, contracts and fails (and shared ones), newest first,
|
|
168
|
+
lead the recall block; claude-mem's recent work follows. Each gets half of `memory.inject_tokens` when both answer.
|
|
169
|
+
- **`ahub ask`**: entries that match the question and the graph neighbourhood of what they are about are evidence, cited
|
|
170
|
+
as `[mem:<8 hex>]`. A question that carries PII skips them. `ahub ask --remember` still saves only to claude-mem, so a
|
|
171
|
+
model's answer never becomes hub memory.
|
|
172
|
+
- **`ahub memory`** (no hub needed; reading is anyone's):
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
ahub memory # this project's entries, newest first, with tier counts
|
|
176
|
+
ahub memory list --tier long --kind fail --peer codex --since 2026-10-01 --json
|
|
177
|
+
ahub memory search parser quoting # every word must match the title, text or nodes
|
|
178
|
+
ahub memory show 1a2b3c4d # one entry with provenance and edges (this project's or a shared one)
|
|
179
|
+
ahub memory graph 1a2b3c4d --hops 2 # its neighbourhood as edges, a person's (labels are unscreened); also a node: path:src/csv.ts
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- **The dashboard** has a Memory section: short- and long-term tabs, search, filters by kind, peer, machine and time,
|
|
183
|
+
the list of entries, and for a selected entry or node its neighbourhood (one or two hops, at most 200 nodes) as an
|
|
184
|
+
inline SVG drawn in the page with the same edges as a text list, and its detail with provenance. It is read-only and
|
|
185
|
+
stays inside the page's content security policy: no requests other than the dashboard's own snapshot.
|
|
186
|
+
|
|
187
|
+
## Changing it
|
|
188
|
+
|
|
189
|
+
`list`, `search` and `show` may run in agent shells, so they leave out notes that match the project's current PII
|
|
190
|
+
patterns or are about a path its `pii.paths` makes private (a shared note was accepted under another project's patterns) and say how many; the dashboard shows a person
|
|
191
|
+
everything. A person's, from a terminal (agent shells are refused):
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
ahub memory promote 1a2b3c4d # a short-term entry gets a long-term copy
|
|
195
|
+
ahub memory demote 1a2b3c4d # a long-term entry becomes short-term and expires
|
|
196
|
+
ahub memory forget 1a2b3c4d # gone from the index here, and on other machines once synced
|
|
197
|
+
ahub memory supersede <old> <new> # the old one is dropped from briefs and recall
|
|
198
|
+
ahub memory rebuild
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
A forgotten long-term entry stays in the log file and in the sync remote's git history; removing it from there is a
|
|
202
|
+
person's rewrite of that history.
|
|
203
|
+
|
|
204
|
+
## Importing from claude-mem
|
|
205
|
+
|
|
206
|
+
`ahub memory import claude-mem [--db <path>] [--limit N]` (a person's) copies the hub's own notes from claude-mem
|
|
207
|
+
(observations whose metadata names a `peer`: `hub_remember` and the hub's task notes) into long-term hub memory as
|
|
208
|
+
`source: claude-mem`, for this project only (claude-mem files them under the repository's own name; a superproject's
|
|
209
|
+
notes stay out, and two unrelated repositories with one name share it). Model answers from `ahub ask --remember`, text
|
|
210
|
+
matching a PII pattern, text about a path the project's `pii.paths` makes private and secret-looking text are skipped. An
|
|
211
|
+
imported note is placed in the graph by the paths and symbols in its text (claude-mem keeps no task proposal time).
|
|
212
|
+
claude-mem's database is opened read-only and never changed; an observation always maps to the same entry, on any
|
|
213
|
+
machine, so importing again adds nothing.
|
|
214
|
+
|
|
215
|
+
## Measuring it
|
|
216
|
+
|
|
217
|
+
Whether hub memory helps is measured, not assumed (#258 AC11, with #248):
|
|
218
|
+
|
|
219
|
+
- Each task brief writes a `memory_brief` event with counts only (hub-memory items, fails among them, claude-mem
|
|
220
|
+
items); research records keep `briefs` (`delivered`, `withFail`), and `ahub research` splits approved tasks into
|
|
221
|
+
"a fail note in its brief", "brief without a fail note" and "no brief recorded" (first pass, rework, check failures).
|
|
222
|
+
- `ahub bench run --memory off|claude-mem|native|both` declares an arm's memory and refuses a hub that runs with other
|
|
223
|
+
settings; compare the arms with `ahub bench compare`.
|
|
224
|
+
- Whether an agent retried an approach a fail note had ruled out cannot be read from ids and counts. A task whose brief
|
|
225
|
+
carried a fail note and was still sent back or failed a check is a candidate, to read by hand.
|
|
226
|
+
|
|
227
|
+
## Privacy
|
|
228
|
+
|
|
229
|
+
- Nothing about a PII task enters the store: the tool refuses it and the hub's own notes skip it. Text that matches a
|
|
230
|
+
PII pattern, that the PII screen does not clear, or that looks like a secret is refused or skipped with a notice.
|
|
231
|
+
- Hub log lines about memory carry ids and counts only.
|