@ssheleg/agent-sync 1.18.6 → 1.19.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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,85 @@
1
+ ## v1.19.0 — the skill now promises the finish it has always performed
2
+
3
+ Wave-4 close-out of the 2026-08-29 family audit (ASY-10), filed by this
4
+ repository's own first eval run. One front-matter line changes; no behaviour
5
+ does.
6
+
7
+ - **ASY-10 — the submodule-finish request reached nothing, and now reaches this
8
+ skill on every sample.** `finish` exists for exactly one silent failure — a
9
+ submodule pushed while the parent still points at the commit before it — and
10
+ the description advertised none of its words, so "Finish a submodule change so
11
+ the parent points at the pushed commit" (eval q06) routed past the skill on
12
+ every probe of the v1.18.7 run. The *Use when* clause now names it, in the
13
+ words `finish` itself prints (`finishing work across a parent repo and its
14
+ submodules - clean, pushed, and pointed at`), and the trigger list carries the
15
+ symptom in both languages: `'the submodule is pushed, the parent points at the
16
+ old commit' / 'сабмодуль запушен, родитель на старом коммите'`. The
17
+ description is **951 characters — against the 970 house working limit, not the
18
+ 1024 spec cap**: a first draft at 1017 passed `test/validate.py` and was
19
+ refused by the family's pinned auditor (`GAP DESC_HEADROOM`, exit 1, a CI
20
+ failure), so it was rewritten rather than shipped. `yaml.safe_load` reads the
21
+ front matter — the two things this family has shipped broken before.
22
+ - **The fix is measured, not asserted, and both arms ran in this session.** Two
23
+ corpus files differing in exactly one line (`- agent-sync: …`, old vs new),
24
+ one enforced protocol, fresh context-free subagents: **q06 went 0/3 → 3/3 on
25
+ haiku and 0/3 → 3/3 on sonnet**, and every number in the results file comes
26
+ from the text that ships — the discarded 1017-char draft was re-measured from
27
+ scratch after the rewrite rather than having its numbers carried over. The
28
+ pilot probes are reported too, because
29
+ they changed the protocol: offered the corpus rather than required to read it,
30
+ all three sonnet probes answered with no tool call at all, from the machine's
31
+ own installed listing — so the read was made mandatory and provable, and both
32
+ arms re-run under it.
33
+ - **Every other query was re-probed, because a widened trigger steals a
34
+ neighbour's.** All twelve queries × two models: **12/12 on both, train 6/6 and
35
+ validation 6/6**, up from 11/12. Nothing moved except q06 — including q07
36
+ (solo git branching) and q08 (the full delivery cycle), the two negatives with
37
+ the most to lose from submodule and finish vocabulary. Tables, the 68-probe
38
+ accounting across three arms and the limits are in `test/evals/RESULTS.md`;
39
+ the v1.18.7 rows are left standing beside the new ones rather than rewritten.
40
+ - Ten routed triggers still advertised — the umbrella's own
41
+ `advertised_check.js` was run against this checkout (`ok: agent-sync
42
+ advertises all 10 routed trigger(s)`), not a copy of its table.
43
+ - **Filed, not fixed: AS-10.** `npm test` accepts a description up to 1024
44
+ characters and CI's pinned auditor refuses one past 970, so a description in
45
+ that band goes green locally and red on the runner. That is AS-06's shape a
46
+ second time — the same auditor, the other half of the same budget — and the
47
+ fix belongs in `test/validate.py` with a planted self-test, not inside a
48
+ release whose subject is one description line. The retro entry records what
49
+ the divergence cost here.
50
+
51
+ ## v1.18.7 — the evals stop being a claim, and the manifests say what shapes them
52
+
53
+ Wave-3 close-out of the 2026-08-29 family audit (ASY-03, ASY-09). No behavior
54
+ changes; a measurement that did not exist now does, and two manifests declare
55
+ their schemas.
56
+
57
+ - **ASY-03 — the behavioral evals were executed, dated, and the numbers are worse
58
+ than silence pretended.** `test/evals/RESULTS.md` had one row: "no run yet".
59
+ It now carries two dated rows (2026-08-31, haiku and sonnet): 24 blind
60
+ fresh-context trigger probes — one per query per model, the query verbatim plus
61
+ the installed family list, nothing else — and all six scenario lines driven as
62
+ real agent sessions against scratch repositories, end states verified on disk.
63
+ Both models score 11/12 on triggers (train 6/6, validation 5/6) and fail the
64
+ SAME query: **q06, the submodule-finish positive, 0/3 samples on each model** —
65
+ the description has no submodule vocabulary to catch it. That gap is filed as
66
+ ASY-10 (a description change is a minor release, not this patch). The Method
67
+ section states the harness limits out loud: n=1 sampling except the failing
68
+ query, the operator's routing doctrine present in probe context, fs-backend
69
+ `reserve` refusing by design in s02, model aliases rather than pinned snapshot
70
+ ids. SKILL-CARD.md's "never executed" line now points at the dated rows.
71
+ - **ASY-09 — both plugin manifests declare `$schema`.**
72
+ `.claude-plugin/marketplace.json` names
73
+ `https://json.schemastore.org/claude-code-marketplace.json` and
74
+ `plugins/agent-sync/.claude-plugin/plugin.json` names
75
+ `https://json.schemastore.org/claude-code-plugin-manifest.json`; both files
76
+ validate against the schemas those addresses serve (fetched and checked at
77
+ edit time), and `claude plugin validate --strict` stays green on both. The
78
+ repo's own no-host-address rule refused the plugin manifest — correctly, by
79
+ its letter — so `json.schemastore.org` joined `ALLOWED_HOSTS` beside
80
+ `json-schema.org`: a vendor-neutral public schema registry, not an instance
81
+ address. The planted `leaked host` self-test still proves the check can fail.
82
+
1
83
  ## v1.18.6 — the guard keeps its own header's promise, and /clear gets its own identity
2
84
 
3
85
  Wave-2 hardening from the 2026-08-29 family audit (ASY-07, ASY-08, ASY-06, ASY-01).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ssheleg/agent-sync",
3
- "version": "1.18.6",
3
+ "version": "1.19.0",
4
4
  "description": "Let concurrent coding agents share one project without colliding — leases with TTL, race-free id reservation, a run journal and a generated board, over a pluggable knowledge cloud.",
5
5
  "bin": {
6
6
  "agent-sync": "bin/agent-sync.js"
@@ -1,7 +1,8 @@
1
1
  {
2
+ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
2
3
  "name": "agent-sync",
3
4
  "displayName": "Agent Sync",
4
- "version": "1.18.6",
5
+ "version": "1.19.0",
5
6
  "description": "Coordination layer for multi-agent repositories — leases with TTL, race-free ID reservation, a run journal, a cross-repo signal feed and a generated board, over a pluggable knowledge cloud.",
6
7
  "author": {
7
8
  "name": "ssheleg",
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: agent-sync
3
- description: "Use when several coding agents work one repository at the same time and must not collide - claiming a task, reserving the next decision/question/ticket id, journaling a run, filing or answering a cross-repo dependency, or regenerating the shared board. Triggers - 'claim this task' / 'возьми задачу', 'who is working on X' / 'кто сейчас делает X', 'reserve an id' / 'зарезервируй id', 'sync the board' / 'обнови доску', 'set up agent coordination' / 'настрой координацию агентов', /agent-sync. Use it BEFORE editing any shared registry file (decisions, open questions, roadmap, workstreams, dependencies) in a project that has .claude/agent-sync.json, even when the user never mentions coordination - an unclaimed edit to those files is how two agents overwrite each other."
3
+ description: "Use when several coding agents work one repository at the same time and must not collide - claiming a task, reserving the next decision/question/ticket id, journaling a run, moving a cross-repo dependency, regenerating the board, or finishing work across a parent repo and its submodules - clean, pushed, and pointed at. Triggers - 'claim this task' / 'возьми задачу', 'who is working on' / 'кто сейчас делает', 'reserve an id' / 'зарезервируй id', 'sync the board' / 'обнови доску', 'set up agent coordination' / 'настрой координацию агентов', 'the submodule is pushed, the parent points at the old commit' / 'сабмодуль запушен, родитель на старом коммите', /agent-sync. Use it BEFORE editing any shared registry file (decisions, open questions, roadmap, workstreams, dependencies) in a project that has .claude/agent-sync.json, even when the user never mentions coordination - an unclaimed edit to those files is how two agents overwrite each other."
4
4
  compatibility: "Requires the task-pipeline skill for its stages (npx sshlg-skills install). Needs python3 3.9+ (stdlib only, HTTP included - nothing to pip install) and bash for the hooks. The knowledge backend is configured per project; with none configured it degrades to git-file leases. Enforcement hooks are Claude Code only - on other agents the same checks run as a self-check."
5
5
  license: MIT
6
6
  metadata:
7
- version: "1.18.6"
7
+ version: "1.19.0"
8
8
  author: ssheleg
9
9
  ---
10
10
 
@@ -33,7 +33,7 @@ from datetime import datetime, timezone
33
33
  from pathlib import Path
34
34
  from typing import Any
35
35
 
36
- VERSION = "1.18.6"
36
+ VERSION = "1.19.0"
37
37
 
38
38
  CONFIG_PATH = Path(".claude/agent-sync.json")
39
39
  ENV_FILE = Path(".env.agent-sync")