agent hubПУТЕВОДИТЕЛЬ Начать

Документация

Ручное сквозное рабочее испытание

Руководство проверяет реализованные сценарии и важные пользовательские сбои. Среда — macOS с zsh/bash. Сначала пройдите рабочий путь в настоящих клиентах. Намеренное повреждение, смену привязок и полный reset выполняйте в отдельном лабораторном терминале.

Для каждого случая запишите PASS, FAIL либо SKIPPED и доказательство. Пропуск не считается успехом. Точные по времени аварии, конкуренция, сбои диска и истечение токенов остаются в автоматических тестах.

Сначала получите работающий Hub

Короткий путь — быстрый старт: проверьте ahub quick, подтвердите план в терминале либо примените выданную команду, перезапустите клиентов. Это общие инструменты, навыки и инструкции без проекта. Необязательный ahub project connect /path/to/project отдельно подключает память, контекст и hooks Git-проекта. В UI действия Set up shared Hub и Connect project memory разделены.

Нумерованный путь ниже намеренно использует отдельные команды и явные ID для подробного испытания. Если project connect уже зарегистрировал checkout, проверьте memory project ls и используйте его привязку, не назначая другой ID примера. Сбои проверяйте в лаборатории.

0. Подготовьте рабочий терминал

Установите CLI по быстрому старту. Используйте установленный ahub без shell-wrapper и привязки cwd к исходникам. Путь runtime нужен только для явного запуска Memory MCP ниже.

command -v ahub
ahub --version
export AHUB_NODE="$(command -v node)"
export AHUB_CLI="$(node -e 'process.stdout.write(require("node:fs").realpathSync(process.argv[1]))' "$(command -v ahub)")"
export AHUB_RUN="$(mktemp -d /tmp/agent-hub-manual.XXXXXX)"
chmod 700 "$AHUB_RUN"
node --version
ahub status
ahub memory project ls

Запишите коммит, версии клиентов, реальную папку Hub, профиль DSH, пути, backup ID и наблюдения в локальный лист результатов. Оригиналы и архивы должны оставаться закрытыми.

Используйте свои AGENT_HUB_HOME и переопределения клиентов; по умолчанию Hub — ~/.agent-hub. Ahub init --yes выполняйте только при намеренном создании нового Hub: init пишет файлы и не является preview.

Создайте два одноразовых репозитория:

export AHUB_PROJECT="$AHUB_RUN/project-a"
export AHUB_OTHER="$AHUB_RUN/project-b"
mkdir -p "$AHUB_PROJECT" "$AHUB_OTHER"
git -C "$AHUB_PROJECT" init -q
git -C "$AHUB_OTHER" init -q

Проекты одноразовые, но рабочий путь после подтверждения меняет настоящие настройки клиентов. Во время записи держите клиентов неактивными. До первого применения скопируйте затрагиваемые настройки и инструкции в закрытое место, отметьте отсутствующие файлы и цели ссылок. Сохраните recovery Hub: первый baseline может быть старше испытания.

Правило preview/apply

Для каждого dry run:

  1. Проверьте пути, действия и конфликты.
  2. Выполните точную выданную команду в том же настроенном терминале с --expect и любым --at.
  3. Сохраните ID копии и откат.
  4. Повторите preview: неизменённые входы не должны требовать новых управляемых изменений.

MCP import тоже сначала показывает план и требует точные --apply/--expect. Checkpoints и watcher пишут по включённой политике. Doctor запускает процессы и может сохранить диагностику.

1. Импорт MCP и выбор источника

ahub mcp ls
ahub import mcp --dry-run
ahub import mcp:SERVER_NAME --prefer claude-code --dry-run

Подставьте настоящее имя. Ожидается список действий, клиентов-источников и имён переменных секретов без значений. Конфигурации клиентов не меняются.

Если импорт верен, выполните точные --apply --expect из его плана. Пишутся описания и секреты Hub, не клиенты. Повтор пропускает существующую запись. --overwrite — только для осознанной проверенной замены. Если подходящего сервера нет, отметьте SKIPPED и используйте испытательный сервер раздела 4.

2. Зарегистрируйте проекты и проверьте области

ahub memory project register ahub-trial-a "$AHUB_PROJECT" --dry-run

Примените и повторите: изменений нет.

ahub memory project register ahub-trial-b "$AHUB_OTHER" --dry-run

Примените, затем:

ahub memory project ls --json
ahub memory ls --workspace "$AHUB_PROJECT"
ahub memory ls --workspace "$AHUB_OTHER"

Ожидаются разные проекты и пустые начальные коллекции. Регистрация не создаёт инструкции репозитория. Одноимённая папка не регистрируется автоматически.

Импортируйте существующую память до новых фактов

Обнаружьте источники проекта:

ahub memory discover --workspace "$AHUB_PROJECT"
ahub memory onboard --workspace "$AHUB_PROJECT" --follow --dry-run

У нового checkout подходящих источников может не быть — это нормально. В существующем проекте проверьте ID, сведения о checkout, форматы и замечания, затем примените план. Неясным источникам нужен явный --source ID; чужие известные проекты отклоняются. SQLite и графы не превращаются в заметки. Без --follow импорт одноразовый; с ним источники присоединяются к политике. Hooks устанавливаются отдельно, но существующие обработчики могут активироваться.

Проверьте факты внутри MEMORY.md, пропуск чистой навигации, неизменённые оригиналы, повтор без дубликатов и защищённый restore. В UI есть Find existing client memory с тем же выбором. При отсутствии реальных заметок используйте контролируемые источники раздела 10.

3. CRUD памяти проекта и импорт выбранного текста

cat > "$AHUB_RUN/fact.md" <<'NOTE'
For this trial project, reuse one idempotency key when retrying the same logical operation.
NOTE
ahub memory add trial-retry-rule --workspace "$AHUB_PROJECT" --title "Trial retry policy" --kind decision --file "$AHUB_RUN/fact.md" --source "Manual trial" --dry-run

До применения get должен сообщить, что записи нет. Примените план, затем:

ahub memory get trial-retry-rule --workspace "$AHUB_PROJECT" --json
ahub memory search "idempotency" --workspace "$AHUB_PROJECT"
ahub memory search "idempotency" --workspace "$AHUB_OTHER"

В project-a должны быть точные тело и ревизия, в project-b — отсутствие факта, в управляемом индексе MEMORY.md project-a — соответствующая строка.

Измените fact.md и подставьте текущую ревизию get:

ahub memory update trial-retry-rule --workspace "$AHUB_PROJECT" --file "$AHUB_RUN/fact.md" --record-revision RECORD_REVISION --dry-run

Примените и перечитайте. Старая ревизия и повторное создание того же ID должны отвергаться без дубликатов.

ahub memory import trial-selected-copy --workspace "$AHUB_PROJECT" --title "Selected local note" --file "$AHUB_RUN/fact.md" --dry-run

Примените и убедитесь, что источник не меняется. Копируется выбранный текст, не графовая база и не архивная сессия.

4. Доставьте один Memory MCP в DSH и Claude

Откройте существующий mcp/servers.yaml Hub. Добавьте запись в его текущий servers, подставив абсолютные AHUB_NODE, AHUB_CLI, AHUB_PROJECT и реальный Hub:

ahub-trial-memory:
  command: "/absolute/path/to/node"
  args:
    - "/absolute/path/to/installed/agent-hub/dist/cli.js"
    - memory
    - serve
    - --workspace
    - "/absolute/path/to/project-a"
  env:
    AGENT_HUB_HOME: "/absolute/path/to/your/hub"

Сохраните верхний version и прочие определения. Второй servers не создавайте: YAML не разворачивает shell-переменные. MCP add/rm не реализованы.

ahub mcp ls
ahub doctor ahub-trial-memory --timeout 20
ahub sync --area mcp --client dsh --dry-run

Doctor должен найти три read-only инструмента. Примените доставку DSH и повторите: изменений нет. Проверьте чужие плагины и настройки профиля.

ahub sync --area mcp --client claude-code --dry-run

Примените отдельно. Перезагрузите обоих клиентов, используйте проверенный профиль DSH и откройте project-a. Попросите каждого:

Через MCP ahub-trial-memory найдите idempotency, прочитайте полную запись и сообщите её ID и источник.

Оба должны настоящими tool calls прочитать точное актуальное project-a значение. Другие строки scope отклоняются. Это граница сервера, не независимого доступа агента к диску.

Для MCP-записей добавьте --allow-write в args этого сервера Hub и переподключите оба клиента. Sync может ничего не менять: запускатель читает реестр. Попросите A получить запись и показать обновление. Проверьте тело и область, затем явно поручите применить точные ID и ревизию. B должен увидеть новое без перезапуска. Не используйте одноимённые инструменты постороннего графового сервера.

5. Навыки: набор, доставка, обнаружение и импорт

mkdir -p "$AHUB_RUN/skills/ahub-manual-check/references"
cat > "$AHUB_RUN/skills/ahub-manual-check/SKILL.md" <<'SKILL'
---
name: ahub-manual-check
description: Report the harmless Agent Hub manual-trial marker without external actions.
---
# Manual check
When explicitly invoked, read references/marker.txt and report its exact text.
Do not make network requests or modify files.
SKILL
echo "AHUB_MANUAL_MARKER_A" > "$AHUB_RUN/skills/ahub-manual-check/references/marker.txt"
ahub skill add "$AHUB_RUN/skills/ahub-manual-check" --dry-run

Примените, затем:

ahub skill ls
ahub sync --area skills --client dsh --dry-run
ahub sync --area skills --client claude-code --dry-run

Применяйте планы отдельно, проверяя всех клиентов: Codex/DSH могут иметь общий физический корень. После перезапуска явно вызовите ahub-manual-check в обоих. Оба должны обнаружить навык и прочитать AHUB_MANUAL_MARKER_A из материала.

ahub import skills --dry-run

Эквивалентная ссылка не должна превращаться в конфликтующую копию. Для настоящего импорта выберите безопасный client-only навык и проверьте ahub import skills:ACTUAL_NAME --prefer CLIENT_ID --dry-run. После применения оригинал клиента неизменён. Разные копии требуют предпочтения.

Замену и удаление проверяйте в лаборатории, не меняя посторонние рабочие навыки.

6. Общие инструкции и общая память

Откройте instructions/AGENTS.md Hub, сохраните текст и добавьте явно помеченное испытательное правило:

Во время ручной проверки Agent Hub помечай временные примеры AHUB_TRIAL.

Создайте отдельную заметку с безопасным общим предпочтением, затем:

ahub memory add trial-shared-label --shared --title "Manual trial label" --kind preference --file "/absolute/path/to/shared-trial-note.md" --dry-run
ahub sync --area context --client dsh --dry-run
ahub sync --area context --client claude-code --dry-run

Сначала примените запись памяти, потом получите свежие планы контекста и примените раздельно. Личный текст клиентов должен сохраниться; Claude получает импорты, DSH — текст правил и индекса. Новые сессии распознают правило и читают общий факт.

Индекс project-a не должен попасть в глобальные инструкции. Общему чтению MCP нужен --include-shared, записи — дополнительно --allow-write --allow-shared-write. Без параметров запрос отклоняется.

Правка общего текста или индекса требует повторной доставки встроенного текста Codex/DSH: это не живая ссылка.

7. Подготовка репозитория и передача между агентами

ahub init-repo "$AHUB_PROJECT" --dry-run

Примените, проверьте AGENTS.md, CLAUDE.md, .agents/state/PROJECT.md и .agents/state/NOW.md. Старые заметки сохраняются, прогресс не выдумывается, Git не коммитится.

Заполните PROJECT.md проверенным контекстом. В NOW.md задайте небольшую задачу, например объяснить retry-правило в README. Попросите A выполнить часть и записать изменённые файлы, настоящие проверки и следующий шаг. В новой сессии B поручите продолжить по этим файлам и git status.

B должен корректно продолжить и сверить заметки с кодом. Повтор init-repo сохраняет заметки. Это обычные файлы, не автоматически извлечённая база задач.

8. Настоящее смысловое автосохранение

ahub memory auto enable --workspace "$AHUB_PROJECT" --client dsh --dry-run

Примените, проверьте статус и перезагрузите DSH:

ahub memory auto status --workspace "$AHUB_PROJECT" --json

В политике должен быть dsh, профиль должен загрузить встроенный dsh-memory.js. Чужие плагины сохраняются. Провайдер не устанавливается, разрешения не обходятся.

При желании добавьте --allow-auto в испытательный Memory MCP и переподключите его. Memory_checkpoint включается независимо от --allow-write. Без него hook даёт CLI-команду с обычными shell-разрешениями.

В новой DSH-сессии project-a:

Проверенное решение проекта: повторы испытательного API нужно прекращать после трёх попыток. Сохрани это как устойчивое знание при обычном checkpoint со стабильным ключом вроде trial-retry-limit. Заверши небольшую задачу обычным образом.

После завершения проверьте поиск и auto status: одно ограниченное продолжение, подтверждённый факт проекта, отсутствие необъяснённого ожидания и повторяющегося извлечения. Читайте настоящее тело и область, не предполагайте выбор конкретного ID моделью.

На приветствии допустим пустой массив без выдуманных знаний. Повтор решения не должен плодить эквивалентные записи. Ожидающий checkpoint требует записать реальную проблему hook, инструмента или разрешения; наличие конфигурации не считается успехом.

Включите Claude того же проекта отдельным планом memory auto enable --client claude-code и повторите. Для необязательного третьего клиента Codex выберите --client codex, проверьте доверие точным hooks в его UI и начните новую сессию.

9. Актуальность между клиентами и смена проекта

Попросите B прочитать retry-limit через испытательный MCP или CLI. Дайте явную поправку, дождитесь сохранения и попросите A перечитать. Второй канонический оригинал не нужен.

Новая сессия project-b не должна наследовать политику project-a. Испытательный сервер явно привязан к project-a и не доказывает изоляцию project-b. Отдельный сервер project-b должен видеть только свою коллекцию.

Привязанная сессия не должна сохранять в другой включённый проект после смены cwd. Начинайте новую сессию при смене проекта. Пользовательские forks DSH могут работать с памятью; делегированные субагенты не запрашивают отдельный checkpoint.

10. Нативные источники: дубликаты и конфликты

Сначала используйте контролируемые папки. Это входы теста, не доказательство, что нативный writer клиента уже пишет туда.

mkdir -p "$AHUB_RUN/native-claude" "$AHUB_RUN/native-dsh"
cat > "$AHUB_RUN/native-claude/trial.md" <<'NOTE'
# Trial native rule
Native trial imports preserve both source identities.
NOTE
cp "$AHUB_RUN/native-claude/trial.md" "$AHUB_RUN/native-dsh/trial.md"
ahub memory auto enable --workspace "$AHUB_PROJECT" --client claude-code --native-dir "$AHUB_RUN/native-claude" --dry-run

Сначала примените источник Claude, затем:

ahub memory auto enable --workspace "$AHUB_PROJECT" --client dsh --native-dir "$AHUB_RUN/native-dsh" --dry-run

Ожидаются один факт, две привязки и неизменённые оригиналы.

ahub memory search "both source identities" --workspace "$AHUB_PROJECT"
ahub memory auto sync --workspace "$AHUB_PROJECT" --dry-run

Измените тело Claude trial.md и примените новый sync. Старый источник DSH должен стать видимым конфликтом, не устаревшим дубликатом. После записи конфликта неизменённый повтор не должен предлагать запись.

ahub memory auto status --workspace "$AHUB_PROJECT"
ahub memory auto conflict get CONFLICT_ID --workspace "$AHUB_PROJECT"
ahub memory auto conflict resolve CONFLICT_ID --workspace "$AHUB_PROJECT" --take hub --dry-run

Возьмите ID из status, сравните тела и примените. Значение Hub остаётся, версия источника подтверждается. Неизменённый sync не ставит её в очередь снова.

Измените DSH-заметку ещё раз, проверьте конфликт и примените --take incoming. Перечитайте точную принятую версию. Другим источникам могут понадобиться отдельные решения: согласуйте контролируемые тела и подтвердите оставшиеся конфликты до стабильного preview.

Conflict get перечисляет неизменяемые хеши истории; --version HASH читает старые версии и после решения. В UI Review conflict показывает оба значения и защищённый выбор.

Для настоящего native-writer найдите реальную папку именно проекта, проверьте её добавление --native-dir и попросите клиента сохранить безопасную заметку. Подтвердите изменение файла и последующий импорт. Не выбирайте общую многопроектную коллекцию или обслуживаемую графовую базу. Hub не записывает свои факты обратно в источники.

11. Ручные правки, удаление, watcher и выключение

С контролируемым фактом:

  1. Обновите Hub через CLI/UI с текущей ревизией.
  2. Измените источник и выполните sync: ожидается конфликт с сохранённой ручной поправкой.
  3. Удалите запись проверенным memory rm.
  4. Повторите неизменённый sync: удаление сохраняется, конфликт виден.
  5. Разрешите --take hub: запись не воскресает.
  6. Удалите исходную заметку: знание Hub остаётся.

В другом терминале с тем же Hub и workspace:

ahub memory auto watch --workspace "$AHUB_PROJECT" --interval 5

Измените контролируемую заметку при неактивных клиентах. На следующем успешном сканировании видно добавление, обновление или конфликт. Ctrl+C должен завершить watcher. Это процесс терминала, не служба ОС.

ahub memory auto disable --workspace "$AHUB_PROJECT" --dry-run

После применения новые captures отклоняются, hooks проекта дают no-op, факты и оригиналы остаются. Watcher останавливается, увидев выключенную политику. Продолжение требует нового проверенного включения.

12. Локальный UI

cd "$AHUB_PROJECT"
ahub ui --port 0 --no-open

Откройте выданный адрес и проверьте:

Повторное применение ID запрещено; перезапуск UI теряет планы. Sessions и mcp add/rm не реализованы. Перед recovery остановите UI.

13. Откат одноразовой операции

Создайте уникальную испытательную запись и сразу сохраните content-backup ID. До дальнейших изменений:

ahub restore CONTENT_BACKUP_ID --dry-run

Примените точную команду. Запись исчезает вместе со своим индексом и владением, старые факты сохраняются.

Для stale restore создайте второй факт, сохраните копию, обновите факт и проверьте старый restore. Ожидается конфликт, не потеря нового значения. Не форсируйте старое: используйте актуальную операцию.

Restore/reset отзывают ожидающие токены. Старый не работает даже после восстановления прежних данных. Новый реальный prompt даёт новую возможность; лаборатория воспроизводит это без ожидания модели.

14. Очистка рабочего испытания

Решите, сохранять ли настройку. Убирайте только созданные вами записи, навык, правило и MCP, проверяя планы доставки. Одноимённое старое содержимое не удаляйте.

Для полного возврата остановите UI, watcher и клиентов и проверьте:

ahub reset --dry-run

Reset возвращает первый baseline, не начало руководства, и может заменить всё дерево Hub и учтённые файлы репозитория и клиентов. Перед рабочим reset нужны отдельная копия и проверка всех путей. Иначе используйте актуальные отдельные restore, полный reset оставьте лаборатории.

Внешние правки блокируют обычный reset. --archive-changes явно сохраняет текущие обычные файлы и папки перед полной заменой, не слиянием. Перенаправленные ссылки защищены. Сохраняйте оригиналы, результаты и recovery до проверки.

15. Лаборатория намеренных сбоев

Откройте новый терминал. Эти переменные изолируют все записи. Настоящий клиент с синтетическим DSH-профилем не запускайте.

export AHUB_SOURCE="/absolute/path/to/agent-hub"
export AHUB_NODE="$(command -v node)"
export AHUB_LAB="$(mktemp -d /tmp/agent-hub-failures.XXXXXX)"
export AGENT_HUB_HOME="$AHUB_LAB/hub"
export CLAUDE_CONFIG_DIR="$AHUB_LAB/claude"
export AGENT_HUB_CLAUDE_CONFIG="$AHUB_LAB/claude.json"
export CODEX_HOME="$AHUB_LAB/codex"
export DSH_HOME="$AHUB_LAB/dsh"
export DSH_AGENTS_HOME="$AHUB_LAB/agents"
export AGENT_HUB_SHARED_SKILLS="$AHUB_LAB/shared/skills"
export AGENT_HUB_DSH_PROFILE="trial"
command -v ahub
mkdir -p "$CLAUDE_CONFIG_DIR" "$CODEX_HOME" "$DSH_HOME/profiles/trial" "$AHUB_LAB/project" "$AHUB_LAB/native"
git -C "$AHUB_LAB/project" init -q
echo '{"mcpServers":{}}' > "$AGENT_HUB_CLAUDE_CONFIG"
echo '# Manual laboratory configuration' > "$CODEX_HOME/config.toml"
echo '[]' > "$DSH_HOME/profiles/trial/cordis.patch.yml"
ahub init --yes --no-git

Подготовьте локальный fixture MCP без запросов провайдерам:

"$AHUB_NODE" --input-type=module <<'JS'
import fs from 'node:fs';
import path from 'node:path';
const server = {
  command: process.env.AHUB_NODE,
  args: [path.join(process.env.AHUB_SOURCE, 'tests/fixtures/doctor-server.mjs')],
  env: { FIXTURE_MODE: 'healthy' }
};
fs.writeFileSync(path.join(process.env.AGENT_HUB_HOME, 'mcp/servers.yaml'), JSON.stringify({ version: 1, servers: { 'trial-demo': server } }, null, 2));
JS
ahub sync --area mcp --dry-run

Все цели должны быть внутри AHUB_LAB. Примените и повторите: изменений нет.

L1. Старые планы и конфликты клиентов

Сохраните apply из preview sync, добавьте комментарий в лабораторный Codex config и выполните старую команду. Она должна отвергнуть входы; свежий план сохраняет комментарий.

Измените command/args trial-demo в Codex. Обычный sync конфликтует. Проверьте ahub sync --client codex --replace=trial-demo --dry-run: его точная ревизия может заменить выбранный вариант, сохранив чужие настройки.

L2. Навыки, блоки и привязки

Создайте и доставьте безопасный навык как в разделе 5. Замените ссылку отличающейся папкой: обычный sync конфликтует, миграция требует точных --client/--replace. Удалите навык через skill rm, выполните sync: удаляются только неизменённые управляемые ссылки.

Доставьте безопасные правила, измените внутренность управляемого блока: доставка блокируется. Строка снаружи исправного блока сохраняется. Проверьте потерянные и дублированные маркеры и непустой Codex AGENTS.override.md. Между случаями возвращайте точные байты fixture.

Перенаправьте доставленную ссылку навыка: sync/reset сохраняет либо сообщает изменённую привязку. --archive-changes не должен молча разрешать такую замену.

L3. Проверка нативного импорта

ahub memory project register lab-project "$AHUB_LAB/project" --dry-run

Примените, затем:

ahub memory auto enable --workspace "$AHUB_LAB/project" --client dsh --native-dir "$AHUB_LAB/native" --dry-run

Добавьте файлы в лабораторный источник и проверяйте каждый случай через preview/apply и status:

Источник или входРезультат
MEMORY.md или скрытый файлЧистая навигация и скрытые записи не становятся фактами; знания внутри MEMORY.md проверяются отдельно
Две одинаковые тематические заметкиОдин факт с обеими привязками
Fenced-код с заголовком второго уровняЦелый пример без разбиения
Разные отступы PythonРазные знания, пробелы сохраняются
Неверный YAML или UTF-8Источник пропущен; тело отсутствует в status
Ссылка на внешнюю заметкуНе обходится, оригинал сохраняется
Нет папки источникаВидимая проблема
Повтор заголовков либо лимит файлов, размера или глубиныЯвный сбой без частичного пакета источника
Фиктивный sk-fixtureCredentialValueNeverPersist123456789Возможный секрет пропущен, тело не сохранено
Источник пересекается с HubОтклонён
Правка после previewСтарое применение отклонено

Только фиктивные секреты. Повреждайте YAML канонического Hub лишь здесь: чтение и запись должны отказать. Перед продолжением восстановите точные байты.

L4. Возможность сессии, одноразовый токен и повтор после restore

После включения DSH создайте Stop payload проекта лаборатории:

"$AHUB_NODE" --input-type=module <<'JS'
import fs from 'node:fs';
import path from 'node:path';
fs.writeFileSync(path.join(process.env.AHUB_LAB, 'stop.json'), JSON.stringify({
  cwd: path.join(process.env.AHUB_LAB, 'project'),
  session_id: 'manual-capability-session',
  hook_event_name: 'Stop'
}));
JS
ahub memory auto hook --client dsh < "$AHUB_LAB/stop.json"

Скопируйте токен и точную checkpoint-команду. Второй одинаковый Stop не должен выдавать продолжение. Передайте этой команде JSON через stdin:

{"session":"manual-capability-session","facts":[]}

Ожидается одно пустое подтверждение. Повтор, неверный токен или сессия, другой проект и выключенная политика отклоняются.

Для повторного использования после restore создайте UserPromptSubmit, затем Stop. Сохраните один безопасный подтверждённый факт, его backup и восстановите его. Старый токен должен отказать. В копии payload смените hook_event_name на UserPromptSubmit и добавьте реальный prompt. Истечение проверяется автоматически: ждать 24 часа вручную не нужно.

L5. Здоровье doctor и отмена

Меняйте FIXTURE_MODE в лабораторном реестре:

РежимРезультат
healthyТри инструмента на двух страницах
emptyУспех, ноль инструментов
resourcesРабочий сервер только ресурсов
tools-hangTimeout tools/list
unavailableОшибка сервиса без исходных секретов
package-cacheДиагностика кеша пакета
malformedСбой протокола
hangTimeout/отмена и очистка потомков

Запустите ahub doctor trial-demo --timeout 2 или отмените через UI. Верните healthy. Инструменты не вызываются. Для n8n готовность backend отделена от MCP: выключенный сервис даёт предупреждение без обязательного перезапуска кластера.

L6. Полный baseline и архивы

Сначала верните намеренно изменённые ссылки и повреждённое хранилище. Добавьте или измените факты и настройки. Обычный reset блокирует внешние правки клиентов.

ahub reset --dry-run
ahub reset --archive-changes --dry-run

Проверьте второй план и примените точно. После свежего init Hub должен исчезнуть, пустые первоначальные настройки вернуться, новые данные — остаться в указанном архиве. Нативные файлы вне Hub не меняются.

Живой или неясный владелец lock не снимается. --recover-lock — только для завершившегося владельца. Не завершайте настоящих клиентов и не переполняйте диск: аварийные записи покрывают fault-injection tests.

Закройте лабораторный терминал, чтобы переменные не попали в обычную работу. Recovery сохраните; рекурсивной команды удаления рабочего Hub здесь нет.

16. Завершение и ограничения

Рабочее испытание успешно, когда клиенты обнаруживают нужные навыки, инструкции и MCP, разделяют одни scoped-факты, сохраняют полезные подтверждённые знания либо честно пустой результат, сохраняют внешние правки, показывают разрешимые конфликты, стабилизируют sync и поддерживают откат. Запишите фактически проверенные клиенты и native writers.

Лаборатория должна доказать отказ устаревшим планам, диагностику плохих источников, защиту владения и ссылок, сохранение удаления, одноразовость токена и его отзыв, reset с архивами. Конкуренцию, время, аварии и искусственные сбои проверяйте автоматикой.

Не реализованы графовый обмен, индекс архивных сессий, mcp add/rm, автоизвлечение состояния задач и установленная фоновая служба. Удалённый CI, публичные имя и версия npm, размещение сайта — последующая работа.

Ссылки: память, автоматизация, контент, восстановление, проверки.

Регрессии удобства и отката сценариев

  1. Запустите ahub quick в терминале. Откажитесь и проверьте отсутствие изменений; повторите и подтвердите. Обычный import mcp только показывает план, применение без --expect отказывает.
  2. Различайте настройки и отсутствующие/старые проверки MCP. Установленные hooks без события ещё не наблюдены. Нулевой checkpoint — активность, не доказанное знание.
  3. Из неподключённой папки записи открываются в общей области и считаются как записи. Переключите два проекта, проверьте изоляцию и потерю старых previews.
  4. Создайте разные копии MCP и навыка. Проверьте оба направления карточки: меняется только выбранное, полная доставка узнаёт владение остальных.
  5. Сразу после настройки проверьте ahub undo <run-id> и возврат предшествующего состояния. После поздних fixture-правок undo обязан отказать и сохранить их. Первый reset остаётся доступен.
  6. Отключите fixture-проект по ID. Знания и заметки остаются, callbacks и MCP блокируются, токены удаляются. Reconnect той же Git-идентичности сохраняет факты; новая требует rebind.
  7. npm run install:check устанавливает tarball во временный prefix, удаляет архив и проверяет CLI/UI независимо от исходников.