mister-wolf 2.32.0 → 2.32.2
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/README.md +1 -1
- package/README.ru.md +1 -1
- package/dist/adapters/cli/commands/face.d.ts.map +1 -1
- package/dist/adapters/cli/commands/face.js +4 -2
- package/dist/adapters/cli/commands/face.js.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-scaffold.js +2 -1
- package/dist/adapters/cli/commands/memory-scaffold.js.map +1 -1
- package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
- package/dist/adapters/cli/commands/memory-upgrade.js +1 -0
- package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
- package/dist/adapters/fs/markdown-memory-store.d.ts.map +1 -1
- package/dist/adapters/fs/markdown-memory-store.js +9 -9
- package/dist/adapters/fs/markdown-memory-store.js.map +1 -1
- package/dist/app/use-cases/create-face-version.d.ts.map +1 -1
- package/dist/app/use-cases/create-face-version.js +28 -6
- package/dist/app/use-cases/create-face-version.js.map +1 -1
- package/dist/app/use-cases/decisions.d.ts +2 -0
- package/dist/app/use-cases/decisions.d.ts.map +1 -1
- package/dist/app/use-cases/decisions.js +11 -11
- package/dist/app/use-cases/decisions.js.map +1 -1
- package/dist/app/use-cases/record-council.d.ts +3 -0
- package/dist/app/use-cases/record-council.d.ts.map +1 -1
- package/dist/app/use-cases/record-council.js +3 -0
- package/dist/app/use-cases/record-council.js.map +1 -1
- package/dist/app/use-cases/scaffold-agent.d.ts.map +1 -1
- package/dist/app/use-cases/scaffold-agent.js +9 -0
- package/dist/app/use-cases/scaffold-agent.js.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -1
- package/dist/app/use-cases/seed-base-playbooks.js +3 -14
- package/dist/app/use-cases/seed-base-playbooks.js.map +1 -1
- package/dist/domain/face-body.d.ts +40 -0
- package/dist/domain/face-body.d.ts.map +1 -0
- package/dist/domain/face-body.js +62 -0
- package/dist/domain/face-body.js.map +1 -0
- package/package.json +1 -1
- package/templates/base/agents/worker-expert.md +78 -13
- package/templates/base/playbooks/worker-expert-playbook.md +27 -9
- package/templates/base/skills/using-skills/references/contracts.md +5 -0
- package/templates/base/skills/wolf-council/SKILL.md +50 -11
- package/update-map.json +12 -12
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Единственная граница «frontmatter → тело» для документов лиц и их шаблонов.
|
|
3
|
+
*
|
|
4
|
+
* 2.32.1: до этого границу разбирали ДВА разных regex. Посев и read-only предикат
|
|
5
|
+
* diverged оставляли в теле ведущий перевод строки после frontmatter (допускали
|
|
6
|
+
* ноль или один `\n`), а хранилище памяти съедало и терминатор, и следующий
|
|
7
|
+
* пустой перевод строки. Документы, различающиеся ТОЛЬКО этим переводом,
|
|
8
|
+
* помечались как diverged. Теперь граница одна: закрывающий `---`, его
|
|
9
|
+
* терминатор и не более одного следующего пустого перевода строки — часть
|
|
10
|
+
* разделителя, а не тела.
|
|
11
|
+
*
|
|
12
|
+
* Дополнительно (2.32.1): уже посеянные старым regex лица хранят ОДИН лишний
|
|
13
|
+
* ведущий перевод строки в теле. Для сравнения ведущие пустые строки срезаются
|
|
14
|
+
* (`bodiesEqual`): это шум границы frontmatter, а не содержание. Внутренние
|
|
15
|
+
* пробелы и переводы строк не нормализуются — содержательное расхождение
|
|
16
|
+
* обязано ловиться.
|
|
17
|
+
*/
|
|
18
|
+
export interface FrontmatterDocument {
|
|
19
|
+
/** Текст между строками-разделителями `---` (без самих разделителей). */
|
|
20
|
+
frontmatter: string;
|
|
21
|
+
/** Тело после разделителя (терминатор и один пустой перевод строки съедены). */
|
|
22
|
+
body: string;
|
|
23
|
+
}
|
|
24
|
+
/** Разбор границы; null — документ не начинается с frontmatter (вызывающий
|
|
25
|
+
* сам решает, как трактовать такой документ). */
|
|
26
|
+
export declare function splitFrontmatterDocument(raw: string): FrontmatterDocument | null;
|
|
27
|
+
/** Тело документа; документ без frontmatter возвращается как есть. */
|
|
28
|
+
export declare function documentBody(raw: string): string;
|
|
29
|
+
/** Плоские пары `ключ: значение` из текста frontmatter (без YAML-разбора:
|
|
30
|
+
* только однострочные скаляры, прецедент parseFrontmatter посева). */
|
|
31
|
+
export declare function frontmatterScalars(frontmatter: string): Record<string, string>;
|
|
32
|
+
/** Сырой документ → простые пары frontmatter + каноничное тело. */
|
|
33
|
+
export declare function parseFaceDocument(raw: string): {
|
|
34
|
+
meta: Record<string, string>;
|
|
35
|
+
body: string;
|
|
36
|
+
};
|
|
37
|
+
/** Равенство тел лиц с точностью до ведущих пустых строк; содержательные
|
|
38
|
+
* различия (фразы, секции, внутренние переводы строк) сохраняются. */
|
|
39
|
+
export declare function bodiesEqual(a: string, b: string): boolean;
|
|
40
|
+
//# sourceMappingURL=face-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-body.d.ts","sourceRoot":"","sources":["../../src/domain/face-body.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;CACd;AAQD;kDACkD;AAClD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAGhF;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;uEACuE;AACvE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAO9E;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAI7F;AAQD;uEACuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/domain/face-body.ts
|
|
2
|
+
/**
|
|
3
|
+
* Единственная граница «frontmatter → тело» для документов лиц и их шаблонов.
|
|
4
|
+
*
|
|
5
|
+
* 2.32.1: до этого границу разбирали ДВА разных regex. Посев и read-only предикат
|
|
6
|
+
* diverged оставляли в теле ведущий перевод строки после frontmatter (допускали
|
|
7
|
+
* ноль или один `\n`), а хранилище памяти съедало и терминатор, и следующий
|
|
8
|
+
* пустой перевод строки. Документы, различающиеся ТОЛЬКО этим переводом,
|
|
9
|
+
* помечались как diverged. Теперь граница одна: закрывающий `---`, его
|
|
10
|
+
* терминатор и не более одного следующего пустого перевода строки — часть
|
|
11
|
+
* разделителя, а не тела.
|
|
12
|
+
*
|
|
13
|
+
* Дополнительно (2.32.1): уже посеянные старым regex лица хранят ОДИН лишний
|
|
14
|
+
* ведущий перевод строки в теле. Для сравнения ведущие пустые строки срезаются
|
|
15
|
+
* (`bodiesEqual`): это шум границы frontmatter, а не содержание. Внутренние
|
|
16
|
+
* пробелы и переводы строк не нормализуются — содержательное расхождение
|
|
17
|
+
* обязано ловиться.
|
|
18
|
+
*/
|
|
19
|
+
/** Семантика прежнего FRONTMATTER_RE хранилища, плюс терпимость к CRLF.
|
|
20
|
+
* Терминатор после закрывающего `---` необязателен (документ может кончаться
|
|
21
|
+
* прямо на `---Body`); если он есть, вместе с ним съедается не более одного
|
|
22
|
+
* следующего пустого перевода строки. */
|
|
23
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n(?:\r?\n)?)?([\s\S]*)$/;
|
|
24
|
+
/** Разбор границы; null — документ не начинается с frontmatter (вызывающий
|
|
25
|
+
* сам решает, как трактовать такой документ). */
|
|
26
|
+
export function splitFrontmatterDocument(raw) {
|
|
27
|
+
const m = raw.match(FRONTMATTER_RE);
|
|
28
|
+
return m ? { frontmatter: m[1], body: m[2] } : null;
|
|
29
|
+
}
|
|
30
|
+
/** Тело документа; документ без frontmatter возвращается как есть. */
|
|
31
|
+
export function documentBody(raw) {
|
|
32
|
+
return splitFrontmatterDocument(raw)?.body ?? raw;
|
|
33
|
+
}
|
|
34
|
+
/** Плоские пары `ключ: значение` из текста frontmatter (без YAML-разбора:
|
|
35
|
+
* только однострочные скаляры, прецедент parseFrontmatter посева). */
|
|
36
|
+
export function frontmatterScalars(frontmatter) {
|
|
37
|
+
const meta = {};
|
|
38
|
+
for (const line of frontmatter.split('\n')) {
|
|
39
|
+
const kv = line.match(/^([\w-]+):\s*(.+)$/);
|
|
40
|
+
if (kv)
|
|
41
|
+
meta[kv[1]] = kv[2].trim();
|
|
42
|
+
}
|
|
43
|
+
return meta;
|
|
44
|
+
}
|
|
45
|
+
/** Сырой документ → простые пары frontmatter + каноничное тело. */
|
|
46
|
+
export function parseFaceDocument(raw) {
|
|
47
|
+
const doc = splitFrontmatterDocument(raw);
|
|
48
|
+
if (!doc)
|
|
49
|
+
return { meta: {}, body: raw };
|
|
50
|
+
return { meta: frontmatterScalars(doc.frontmatter), body: doc.body };
|
|
51
|
+
}
|
|
52
|
+
/** Форма тела для сравнения: срезаны ведущие пустые строки (шум границы
|
|
53
|
+
* frontmatter, в т.ч. единственный лишний `\n` старого посева). */
|
|
54
|
+
function comparableBody(body) {
|
|
55
|
+
return body.replace(/^(?:[ \t]*\r?\n)+/, '');
|
|
56
|
+
}
|
|
57
|
+
/** Равенство тел лиц с точностью до ведущих пустых строк; содержательные
|
|
58
|
+
* различия (фразы, секции, внутренние переводы строк) сохраняются. */
|
|
59
|
+
export function bodiesEqual(a, b) {
|
|
60
|
+
return comparableBody(a) === comparableBody(b);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=face-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face-body.js","sourceRoot":"","sources":["../../src/domain/face-body.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B;;;;;;;;;;;;;;;;GAgBG;AASH;;;0CAG0C;AAC1C,MAAM,cAAc,GAAG,2DAA2D,CAAC;AAEnF;kDACkD;AAClD,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,wBAAwB,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC;AACpD,CAAC;AAED;uEACuE;AACvE,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5C,IAAI,EAAE;YAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,GAAG,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;AACvE,CAAC;AAED;oEACoE;AACpE,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;uEACuE;AACvE,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: "Worker-expert (L2): ограниченная профессиональная позиция по вопросу; read-канал в границах проекта без записи, shell, субагентов и сети, env-файлы и типовые секрет-файлы под ask-guard; без вердикта приёмки."
|
|
3
3
|
mode: all
|
|
4
4
|
model: {{model.primary}}
|
|
5
5
|
permissions:
|
|
@@ -7,8 +7,44 @@ permissions:
|
|
|
7
7
|
resource: '*'
|
|
8
8
|
effect: 'deny'
|
|
9
9
|
- action: 'read'
|
|
10
|
-
resource: '
|
|
10
|
+
resource: '*'
|
|
11
|
+
effect: 'allow'
|
|
12
|
+
- action: 'glob'
|
|
13
|
+
resource: '*'
|
|
11
14
|
effect: 'allow'
|
|
15
|
+
- action: 'grep'
|
|
16
|
+
resource: '*'
|
|
17
|
+
effect: 'allow'
|
|
18
|
+
- action: 'read'
|
|
19
|
+
resource: '*.env'
|
|
20
|
+
effect: 'ask'
|
|
21
|
+
- action: 'read'
|
|
22
|
+
resource: '*.env.*'
|
|
23
|
+
effect: 'ask'
|
|
24
|
+
- action: 'read'
|
|
25
|
+
resource: '*.env.example'
|
|
26
|
+
effect: 'allow'
|
|
27
|
+
- action: 'read'
|
|
28
|
+
resource: '*.npmrc'
|
|
29
|
+
effect: 'ask'
|
|
30
|
+
- action: 'read'
|
|
31
|
+
resource: '*.netrc'
|
|
32
|
+
effect: 'ask'
|
|
33
|
+
- action: 'read'
|
|
34
|
+
resource: '*.git-credentials'
|
|
35
|
+
effect: 'ask'
|
|
36
|
+
- action: 'read'
|
|
37
|
+
resource: '*.pem'
|
|
38
|
+
effect: 'ask'
|
|
39
|
+
- action: 'read'
|
|
40
|
+
resource: '*.key'
|
|
41
|
+
effect: 'ask'
|
|
42
|
+
- action: 'read'
|
|
43
|
+
resource: '*id_rsa*'
|
|
44
|
+
effect: 'ask'
|
|
45
|
+
- action: 'read'
|
|
46
|
+
resource: '*id_ed25519*'
|
|
47
|
+
effect: 'ask'
|
|
12
48
|
- action: 'external_directory'
|
|
13
49
|
resource: '*'
|
|
14
50
|
effect: 'deny'
|
|
@@ -27,12 +63,36 @@ agent-id: worker-expert
|
|
|
27
63
|
|
|
28
64
|
## Права
|
|
29
65
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
66
|
+
Канал по умолчанию — tool-enabled чтение в границах проекта: файлы проекта,
|
|
67
|
+
включая код, читаются штатно, discover-инструменты (glob/grep) доступны, чтобы
|
|
68
|
+
найти нужный файл. Запись, shell/код, субагенты, webfetch, браузер, скиллы и
|
|
69
|
+
чтение вне проекта (`external_directory`) запрещены. Env-файлы и типовые секрет-файлы (`.npmrc`, `.netrc`,
|
|
70
|
+
`.git-credentials`, `*.pem`, `*.key`, `id_rsa`/`id_ed25519`) остаются под
|
|
71
|
+
ask-защитой: широкое чтение проекта не открывает их молча.
|
|
72
|
+
|
|
73
|
+
Выдача прав — только конфигурация базового набора/проекта; перечень путей
|
|
74
|
+
текстом в TASK выдачей не является. Проверить канал заранее — обязанность L1;
|
|
75
|
+
если канал фактически не работает, работай packet-only из доставленных
|
|
76
|
+
материалов и назови деградацию явно.
|
|
77
|
+
|
|
78
|
+
Условие пригодности tool-enabled канала: границу образуют ДВА разных свойства,
|
|
79
|
+
и оба обязательны.
|
|
80
|
+
|
|
81
|
+
1. **Путь** — `external_directory` запрещает адреса вне проекта (его root).
|
|
82
|
+
Это проверяет host.
|
|
83
|
+
2. **Разрешение ссылок** — host сравнивает путь, который ему передали, и НЕ
|
|
84
|
+
разрешает symlink: ссылка внутри проекта, ведущая наружу, читается как
|
|
85
|
+
внутренний путь, и `external_directory` не срабатывает. Поэтому до запуска L1
|
|
86
|
+
проводит аудит разрешения: ни одна ссылка внутри проекта не должна разрешаться
|
|
87
|
+
за его пределы (`find "$root" -type l`, затем `realpath` каждой и сравнение с
|
|
88
|
+
root и main-чекоутом). Ссылки внутри `node_modules`, ведущие внутрь проекта или
|
|
89
|
+
в main-чекоут, — норма, а не нарушение. Найдена утекающая ссылка — канал
|
|
90
|
+
непригоден: убери ссылку или работай packet-only.
|
|
91
|
+
Проверка «есть хоть одна ссылка» слишком груба: она отключает канал в любом
|
|
92
|
+
Node-проекте (`node_modules/.bin` — сплошь ссылки); проверяется именно
|
|
93
|
+
разрешение наружу. Аудит — точечная проверка перед запуском: host не
|
|
94
|
+
перепроверяет ссылки на каждом чтении.
|
|
95
|
+
|
|
36
96
|
Не снимай deny и не заменяй запрет альтернативным каналом.
|
|
37
97
|
Не пиши файлы, память или внешние системы; не выполняй shell/код, не запускай
|
|
38
98
|
проверяемую систему, тесты, эксперименты и сеть; не создавай скрипты/субагентов.
|
|
@@ -44,12 +104,13 @@ agent-id: worker-expert
|
|
|
44
104
|
покажи условия применимости и существенный риск. Не ищи изъян ради роли критика
|
|
45
105
|
и не имитируй определённость. Не пересматривай цель вместо ответа.
|
|
46
106
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
107
|
+
Перед каждым дополнительным поиском назови проверяемое утверждение и его влияние
|
|
108
|
+
на позицию. Дочитай адресный источник внутри scope; широкий поиск, недоступный
|
|
109
|
+
источник или нужный эксперимент верни L1 с объяснением. Если канал не работает,
|
|
110
|
+
факт содержимого не имитируй: скажи, что прочитать не смог.
|
|
50
111
|
Не расследуй до исчерпания лимита: достаточная позиция или существенный пробел
|
|
51
112
|
завершают вызов. Два шага без продвижения → возврат; без заданного лимита —
|
|
52
|
-
не позднее восьми
|
|
113
|
+
не позднее восьми обращений.
|
|
53
114
|
|
|
54
115
|
Первую позицию сформируй без чужих ответов и ожидаемого нового решения L1.
|
|
55
116
|
Уточняющий TASK может раскрыть конкретное противоречие: ответь только на него,
|
|
@@ -59,7 +120,11 @@ agent-id: worker-expert
|
|
|
59
120
|
|
|
60
121
|
Верни сообщение по профилю expert в доставленном contracts.md: позиция, claims,
|
|
61
122
|
evidence, допущения, confidence и существенные риски/условия пересмотра; LIMITS
|
|
62
|
-
для недостающих данных и нужной проверки.
|
|
123
|
+
для недостающих данных и нужной проверки. Первой строкой RESULT назови `channel:`
|
|
124
|
+
— фактическое состояние канала (`tool-enabled` | `packet-only` | `denied`), а не
|
|
125
|
+
намерение; при `channel != tool-enabled` заполни `isolation_limits`.
|
|
126
|
+
Неприменимые поля не заполняй шумом.
|
|
127
|
+
|
|
63
128
|
NEEDS_CONTEXT означает отсутствие обязательного входа. Если входы полны, но
|
|
64
129
|
оснований для позиции недостаточно, заверши экспертизу с LIMITS и текстовым
|
|
65
130
|
исходом «недостаточно оснований», не выдумывая claims. L1 сохраняет этот ответ
|
|
@@ -1,17 +1,35 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Worker Expert playbook
|
|
2
|
+
title: Worker Expert playbook — ограниченная позиция с read-каналом
|
|
3
3
|
owner_skill: worker-expert
|
|
4
|
-
version:
|
|
5
|
-
steps: Прочти
|
|
4
|
+
version: 3
|
|
5
|
+
steps: Прочти канал | Сопоставь основания | Верни позицию, channel и ограничения
|
|
6
6
|
tags: worker-expert playbook,playbook
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Эксперт: ограниченная позиция
|
|
9
|
+
# Эксперт: ограниченная позиция и рабочий read-канал
|
|
10
10
|
|
|
11
11
|
Применяй полную рамку worker-expert и профиль expert в доставленном contracts.md.
|
|
12
12
|
Лицо задаёт предметную линзу, но не права/бюджет и не право менять цель.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
|
|
14
|
+
Канал по умолчанию — tool-enabled чтение в границах проекта: код и документы
|
|
15
|
+
читаются штатно, glob/grep помогают найти файл. Запись, shell, субагенты,
|
|
16
|
+
webfetch, браузер, скиллы и внешние каталоги запрещены; env-файлы и типовые
|
|
17
|
+
секрет-файлы (`.npmrc`, `.netrc`, `.git-credentials`, `*.pem`, `*.key`,
|
|
18
|
+
`id_rsa`/`id_ed25519`) остаются под ask-защитой. Выдача прав — конфигурация
|
|
19
|
+
базового набора/проекта, а не перечень путей в TASK.
|
|
20
|
+
|
|
21
|
+
Граница чтения состоит из двух половин. Пути вне проекта отклоняет host
|
|
22
|
+
(`external_directory`), а symlink он при этой проверке НЕ разрешает: ссылка
|
|
23
|
+
внутри проекта, ведущая наружу, читается как внутренний путь. Поэтому канал
|
|
24
|
+
пригоден, только если ни одна ссылка внутри проекта не разрешается за его
|
|
25
|
+
пределы (проверяет L1 до запуска: `find` + `realpath`, ссылки `node_modules`
|
|
26
|
+
внутрь проекта — норма). Такая ссылка делает канал непригодным: убери её или
|
|
27
|
+
работай packet-only. Аудит точечный — host не перепроверяет ссылки на каждом
|
|
28
|
+
чтении.
|
|
29
|
+
|
|
30
|
+
Первой строкой RESULT назови фактический `channel` (tool-enabled | packet-only |
|
|
31
|
+
denied). Канал не работает — работай packet-only из доставленных материалов,
|
|
32
|
+
не имитируй факт содержимого и заполни `isolation_limits`. Дай позицию,
|
|
33
|
+
существенные основания, допущения и условия пересмотра. Недостаток данных верни
|
|
34
|
+
L1 с нужной проверкой, не запускай исследование сам. Не выдавай вердикт приёмки
|
|
35
|
+
и не записывай результат в память. Сохраняет L1.
|
|
@@ -82,6 +82,11 @@ wolf-debug: один осмысленный обход в scope, затем FRIC
|
|
|
82
82
|
RESULT: позиция/рекомендация и `claims/evidence/assumptions/confidence/risks/
|
|
83
83
|
failure_conditions/counterexamples`; существенное неизвестное/нужная проверка
|
|
84
84
|
в `LIMITS`. Confidence — low|medium|high с основанием, не числовая вероятность.
|
|
85
|
+
Первой строкой RESULT эксперт называет фактический `channel`
|
|
86
|
+
(`tool-enabled` | `packet-only` | `denied`) — состояние канала, а не намерение;
|
|
87
|
+
при `channel != tool-enabled` поле `isolation_limits` обязательно и называет,
|
|
88
|
+
какие факты не подтверждены чтением (методическое требование синтеза, не
|
|
89
|
+
валидация схемы записи). `channel` не меняет статусы RESULT.
|
|
85
90
|
Нет обязательного входа — `NEEDS_CONTEXT`. Входы полны, но позиции нет —
|
|
86
91
|
завершённая экспертиза с текстовым исходом «недостаточно оснований» и `LIMITS`,
|
|
87
92
|
без выдуманных claims. Это не новый status enum и не валидное opinion с claims=[].
|
|
@@ -39,16 +39,46 @@ worker-expert с предметными лицами и интегрирует
|
|
|
39
39
|
Дополнительное чтение — только для названного утверждения, влияющего на позицию,
|
|
40
40
|
в пределах разрешённых источников. Исследование/эксперимент — запрос, не действие.
|
|
41
41
|
|
|
42
|
+
Права эксперта задаёт конфигурация базового набора/проекта, а не текст поручения:
|
|
43
|
+
перечень путей в TASK выдачей прав не является и инструментов не включает.
|
|
44
|
+
Список файлов в промпте лишь направляет внимание; если профиль агента не содержит
|
|
45
|
+
read-правила, эксперт останется packet-only независимо от формулировки.
|
|
46
|
+
|
|
42
47
|
До запуска проверь фактически применённые права и изоляцию host. При
|
|
43
|
-
tool-enabled чтении
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
tool-enabled чтении обязательны два независимых шага — аудит изоляции и
|
|
49
|
+
функциональная проба канала:
|
|
50
|
+
|
|
51
|
+
1. **Аудит разрешения ссылок** (изоляция): host сравнивает путь, который ему
|
|
52
|
+
передали, и symlink не разрешает — ссылка внутри проекта, ведущая наружу,
|
|
53
|
+
читается как внутренний путь. Поэтому проверь, что ни одна ссылка внутри
|
|
54
|
+
проекта не разрешается за его пределы: `find "$root" -type l`, затем
|
|
55
|
+
`realpath` каждой и сравнение с root и его main-чекоутом (`git rev-parse
|
|
56
|
+
--git-common-dir`). Ссылки внутри `node_modules`, ведущие внутрь проекта или
|
|
57
|
+
в main-чекоут, — норма. Найдена утекающая ссылка — канал непригоден: убери
|
|
58
|
+
ссылку или работай packet-only. Проверка «есть хоть одна ссылка» слишком
|
|
59
|
+
груба и делает канал непригодным в любом Node-проекте (`node_modules/.bin` —
|
|
60
|
+
сплошь ссылки); проверяется именно разрешение наружу. Аудит — точечная
|
|
61
|
+
проверка перед запуском: host не перепроверяет ссылки на каждом чтении.
|
|
62
|
+
2. **Функциональная проба канала** (работоспособность): до первого раунда
|
|
63
|
+
запусти один короткий вызов эксперта с заданием прочитать адресный файл
|
|
64
|
+
проекта и вернуть конкретную строку/значение из него. Проба успешна только
|
|
65
|
+
если в ответе есть **факт содержимого** — сама строка или значение из файла.
|
|
66
|
+
|
|
67
|
+
Аудит разрешения ссылок доказывает изоляцию, но не работоспособность чтения, и
|
|
68
|
+
наоборот: это разные проверки, одна другую не заменяет. Проба считается проваленной, если
|
|
69
|
+
в ответе `permission.rejected`/«Permission denied», нет ни одного tool-вызова
|
|
70
|
+
(эксперт ответил из доставленного текста), либо ответ свёлся к NEEDS_CONTEXT,
|
|
71
|
+
LIMITS или обещанию прочитать позже. Провал пробы — канал не tool-enabled:
|
|
72
|
+
переходи на packet-only и назови деградацию явно; не выдавай пакет материалов
|
|
73
|
+
за доказательство кодового факта. Причина провала (права профиля агента,
|
|
74
|
+
платформа, отсутствующая выдача) — данные для отчёта L1, не повод повторять
|
|
75
|
+
пробу в надежде на другой результат.
|
|
76
|
+
|
|
77
|
+
Нужны отдельные свежие контексты без чужих ответов/ожидаемого вывода и без
|
|
78
|
+
пути их чтения через общую память, историю, файлы или альтернативные
|
|
79
|
+
инструменты. Разные имена и параллельность сами не доказывают независимость.
|
|
80
|
+
Последовательные fresh вызовы допустимы при том же запрете раскрытия.
|
|
81
|
+
Model/variant только реально доступные.
|
|
52
82
|
|
|
53
83
|
Если гарантировать область чтения нельзя, доставь материалы пакетами и отключи
|
|
54
84
|
инструменты; явно назови packet-only и ограничения. Если нельзя изолировать и
|
|
@@ -68,6 +98,13 @@ tool-enabled чтении обязателен pre-run аудит Location на
|
|
|
68
98
|
Не запускай обязательную взаимную оценку всех всеми или рейтинги экспертов.
|
|
69
99
|
4. Подготовь RESULT synthesis по contracts.md. Если оснований нет, укажи
|
|
70
100
|
insufficient_evidence и нужную проверку; не выдумывай accepted_claims.
|
|
101
|
+
`isolation_limits` обязателен, если хоть одна учтённая позиция пришла с
|
|
102
|
+
`channel != tool-enabled` (packet-only/denied) или функциональная проба
|
|
103
|
+
канала не прошла: назови, какие факты не подтверждены чтением. Поле
|
|
104
|
+
необязательно только при подтверждённом tool-enabled канале у всех позиций.
|
|
105
|
+
Это требование методики, проверяемое при приёмке синтеза, а не валидация
|
|
106
|
+
схемы записи: write-path проверяет форму envelope, а не наличие поля по
|
|
107
|
+
каналу.
|
|
71
108
|
5. Ответственный принимает решение отдельно. Только после принятия передай
|
|
72
109
|
его в DECISIONS[] следующего TASK с источником, ограничениями и проверками.
|
|
73
110
|
|
|
@@ -97,12 +134,14 @@ Envelope (`schema_version: 1`) несёт `record_kind` (question|opinion|synthe
|
|
|
97
134
|
- opinion: `expert_id`, `round`, `claims` (непустой), `evidence?` (`memory_id`
|
|
98
135
|
или `path` с контекстом `quote`/`note`), `assumptions?`, `confidence`
|
|
99
136
|
(low|medium|high), `risks?`, `failure_conditions?`, `counterexamples?`,
|
|
100
|
-
`recommendation
|
|
137
|
+
`recommendation?`, `channel?` (`packet-only` | `tool-enabled` | `denied`;
|
|
138
|
+
опциональное аддитивное поле — исторические записи без него читаются как есть);
|
|
101
139
|
- synthesis: `outcome` (ready|insufficient_evidence), `opinion_ids`,
|
|
102
140
|
`accepted_claims`, `rejected_alternatives?` (пары `claim`+`reason`),
|
|
103
141
|
`unresolved_dissent`, `required_validation`, `confidence`,
|
|
104
142
|
`actual_participants`, `missing_participants?`, `cost_note?`,
|
|
105
|
-
`isolation_limits
|
|
143
|
+
`isolation_limits?` (обязателен, если учтённая позиция пришла с
|
|
144
|
+
`channel != tool-enabled`; иначе опускается).
|
|
106
145
|
|
|
107
146
|
Запись хранится как note (facet `context`) с тегом `wolf:council-record:v1` и
|
|
108
147
|
canonical JSON envelope в body. Запись идемпотентна по `request_key`;
|
package/update-map.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "2.32.
|
|
3
|
-
"prev": "2.
|
|
2
|
+
"version": "2.32.2",
|
|
3
|
+
"prev": "2.32.1",
|
|
4
4
|
"files": [
|
|
5
5
|
{
|
|
6
6
|
"path": "base/agents/executor-lead.md",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
{
|
|
21
21
|
"path": "base/agents/worker-expert.md",
|
|
22
22
|
"kind": "agent",
|
|
23
|
-
"category": "
|
|
23
|
+
"category": "changed"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"path": "base/agents/worker-implementer.md",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
{
|
|
96
96
|
"path": "base/skills/using-skills/references/contracts.md",
|
|
97
97
|
"kind": "skill",
|
|
98
|
-
"category": "
|
|
98
|
+
"category": "changed"
|
|
99
99
|
},
|
|
100
100
|
{
|
|
101
101
|
"path": "base/skills/using-skills/references/division-of-labor.md",
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
{
|
|
106
106
|
"path": "base/skills/using-skills/references/project-rules.md",
|
|
107
107
|
"kind": "skill",
|
|
108
|
-
"category": "
|
|
108
|
+
"category": "unchanged"
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
"path": "base/skills/using-skills/references/project-tools.md",
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
{
|
|
156
156
|
"path": "base/skills/wolf-brainstorm/SKILL.md",
|
|
157
157
|
"kind": "skill",
|
|
158
|
-
"category": "
|
|
158
|
+
"category": "unchanged"
|
|
159
159
|
},
|
|
160
160
|
{
|
|
161
161
|
"path": "base/skills/wolf-code-craft/SKILL.md",
|
|
@@ -170,7 +170,7 @@
|
|
|
170
170
|
{
|
|
171
171
|
"path": "base/skills/wolf-council/SKILL.md",
|
|
172
172
|
"kind": "skill",
|
|
173
|
-
"category": "
|
|
173
|
+
"category": "changed"
|
|
174
174
|
},
|
|
175
175
|
{
|
|
176
176
|
"path": "base/skills/wolf-debug/references/techniques.md",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
{
|
|
211
211
|
"path": "base/skills/wolf-feedback/references/complaints.md",
|
|
212
212
|
"kind": "skill",
|
|
213
|
-
"category": "
|
|
213
|
+
"category": "unchanged"
|
|
214
214
|
},
|
|
215
215
|
{
|
|
216
216
|
"path": "base/skills/wolf-feedback/references/session-diagnosis.md",
|
|
@@ -245,7 +245,7 @@
|
|
|
245
245
|
{
|
|
246
246
|
"path": "base/skills/wolf-plan/SKILL.md",
|
|
247
247
|
"kind": "skill",
|
|
248
|
-
"category": "
|
|
248
|
+
"category": "unchanged"
|
|
249
249
|
},
|
|
250
250
|
{
|
|
251
251
|
"path": "base/skills/wolf-release-docs/SKILL.md",
|
|
@@ -305,7 +305,7 @@
|
|
|
305
305
|
{
|
|
306
306
|
"path": "opencode/plugins/wolf-session-start.js",
|
|
307
307
|
"kind": "plugin",
|
|
308
|
-
"category": "
|
|
308
|
+
"category": "unchanged"
|
|
309
309
|
}
|
|
310
310
|
],
|
|
311
311
|
"faces": [
|
|
@@ -330,7 +330,7 @@
|
|
|
330
330
|
{
|
|
331
331
|
"template": "base/playbooks/worker-expert-playbook.md",
|
|
332
332
|
"owner_skill": "worker-expert",
|
|
333
|
-
"category": "
|
|
333
|
+
"category": "changed",
|
|
334
334
|
"seed": true
|
|
335
335
|
},
|
|
336
336
|
{
|
|
@@ -353,7 +353,7 @@
|
|
|
353
353
|
}
|
|
354
354
|
],
|
|
355
355
|
"agents_md": {
|
|
356
|
-
"category": "
|
|
356
|
+
"category": "unchanged",
|
|
357
357
|
"mode": "append-block"
|
|
358
358
|
},
|
|
359
359
|
"schema_migrations": [],
|