@fenglimg/fabric-shared 2.0.0-rc.36 → 2.0.0-rc.37

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.
@@ -269,6 +269,16 @@ var enMessages = {
269
269
  // v2.0.0-rc.33 W3-1 (P0-6): archive-history mode — direct users to mv the broken ledger into events.archive/ before recreating, preserving history rather than rm'ing it. Mirrors rotateEventLedgerIfNeeded's events-rotated-YYYY-MM-DD.jsonl naming convention (events-corrupted-YYYY-MM-DD.jsonl distinguishes this archive cause from sliding-window rotation).
270
270
  "doctor.check.event_ledger.remediation.invalid": "Archive history first (`mkdir -p .fabric/events.archive && mv .fabric/events.jsonl .fabric/events.archive/events-corrupted-$(date +%Y-%m-%d).jsonl`), then run `fabric doctor --fix` to create a new empty ledger. Historical events are preserved under events.archive/.",
271
271
  "doctor.check.event_ledger.ok": ".fabric/events.jsonl exists, is writable, and is parseable.",
272
+ // v2.0.0-rc.37 Wave B (B5): composite hard-gate check for events.jsonl /
273
+ // metrics.jsonl health (G7 size / G8 metric_leak / G9 metrics_stale /
274
+ // G10 rotation_overdue).
275
+ "doctor.check.events_jsonl_health.name": "Events ledger health (rc.37 Plan B 5 hard gate)",
276
+ "doctor.check.events_jsonl_health.ok": ".fabric/events.jsonl size, freshness, and metric isolation all healthy.",
277
+ "doctor.check.events_jsonl_health.message.size": ".fabric/events.jsonl is {sizeMb} MB, above the 10 MB threshold.",
278
+ "doctor.check.events_jsonl_health.message.metric_leak": ".fabric/events.jsonl contains {count} rows with metric-counter event_types ({samples}). Those events should be aggregated in metrics.jsonl, not in the audit ledger.",
279
+ "doctor.check.events_jsonl_health.message.metrics_stale": ".fabric/metrics.jsonl hasn't been updated for {minutes} minutes; the server-side 60s flush may be stalled.",
280
+ "doctor.check.events_jsonl_health.message.rotation_overdue": ".fabric/events.jsonl hasn't rotated for {days} days; the 6h rotation tick may not be running.",
281
+ "doctor.check.events_jsonl_health.remediation": "Run `fabric doctor --fix` to trigger a rotation; restart the MCP server so startMetricsFlush + startRotationTick reschedule. If metric_leak fires, audit recent code changes for direct appendEventLedgerEvent calls bypassing bumpCounter for one of the 4 metric-managed event_types.",
272
282
  "doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config location",
273
283
  "doctor.check.mcp_config_in_wrong_file.message": ".claude/settings.json contains mcpServers.fabric \u2014 this file is for hooks/permissions only. Run --fix to remove it, then re-run fabric install to write .mcp.json.",
274
284
  "doctor.check.mcp_config_in_wrong_file.remediation": "Run `fabric doctor --fix` to remove mcpServers.fabric from .claude/settings.json, then run `fabric install` to write .mcp.json.",
@@ -314,6 +324,12 @@ var enMessages = {
314
324
  "doctor.check.draft_backlog.ok": "draft-maturity entry ratio is healthy (< 50%, or workspace too small to compute).",
315
325
  "doctor.check.draft_backlog.message": "{draftCount}/{totalCount} ({pct}%) canonical knowledge entries are stuck at draft maturity \u2014 promote loop is broken (rc.32 baseline was 92%).",
316
326
  "doctor.check.draft_backlog.remediation": "Run `/fabric-review` to triage drafts: approve to promote to verified/proven, reject to drop, modify to fix. A long-standing draft backlog usually means archive produces drafts faster than review can promote them.",
327
+ // rc.37 NEW-38: knowledge auto-promote (info surface; --fix applies).
328
+ "doctor.check.draft_auto_promote.name": "Knowledge auto-promote",
329
+ "doctor.check.draft_auto_promote.ok": "No settled drafts awaiting auto-promote (drafts are younger than 14 days or flagged drifted).",
330
+ "doctor.check.draft_auto_promote.message": "{count} draft entries have settled for \u226514 days with no drift ({sample}{suffix}) \u2014 eligible for auto-promote to verified. Run `fabric doctor --fix` to apply.",
331
+ "doctor.check.draft_auto_promote.remediation": "Run `fabric doctor --fix` to auto-promote these settled drafts to verified (drains draft_backlog); or run `/fabric-review` to triage each manually.",
332
+ "doctor.check.draft_auto_promote.fixed": "Auto-promoted {count} settled draft entries \u2192 verified.",
317
333
  // rc.36 TASK-05 (P0-8): empty-tags ratio warn.
318
334
  "doctor.check.knowledge_tags_empty.name": "Knowledge tags coverage",
319
335
  "doctor.check.knowledge_tags_empty.ok": "empty-tag ratio is healthy (\u2264 50%, or workspace too small to compute).",
@@ -323,7 +339,7 @@ var enMessages = {
323
339
  "doctor.check.drift_unconsumed.name": "Knowledge drift unconsumed",
324
340
  "doctor.check.drift_unconsumed.ok": "knowledge_drift_detected events in the last 30 days have been consumed by paired knowledge_demoted, or event volume is too low to compute.",
325
341
  "doctor.check.drift_unconsumed.message": "{driftCount} knowledge_drift_detected events in the last 30 days, but only {demoteCount} knowledge_demoted. Drift > demote by \u2265 5 means part of the drift is going unconsumed \u2014 KB slowly stales.",
326
- "doctor.check.drift_unconsumed.remediation": "rc.36 has no auto-demote pipeline; act manually: run `fabric doctor --fix` to trigger orphan-demote / stale-archive auto-heal, or invoke `/fabric-review` to manually triage drift-flagged entries. Automatic 14-day demote is planned for rc.37.",
342
+ "doctor.check.drift_unconsumed.remediation": "Run `fabric doctor --fix` to trigger orphan-demote / stale-archive auto-heal, or invoke `/fabric-review` to manually triage drift-flagged entries.",
327
343
  "doctor.check.meta_manually_diverged.name": "Meta manual divergence",
328
344
  "doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json not readable; skipping divergence check.",
329
345
  "doctor.check.meta_manually_diverged.message.extra.singular": "agents.meta.json has {count} entry with no backing file on disk. Run --fix to reconcile.",
@@ -399,7 +415,7 @@ var enMessages = {
399
415
  "doctor.check.narrow_no_paths.ok": "No narrow-scope canonical entries have an empty relevance_paths array.",
400
416
  "doctor.check.narrow_no_paths.message.singular": "{count} narrow-scope canonical entry has an empty relevance_paths array (silent recall risk \u2014 narrow without anchors can never match a target path). First: {detail}.",
401
417
  "doctor.check.narrow_no_paths.message.plural": "{count} narrow-scope canonical entries have an empty relevance_paths array (silent recall risk \u2014 narrow without anchors can never match a target path). First: {detail}.",
402
- "doctor.check.narrow_no_paths.remediation": "Either add path anchors to relevance_paths or widen the entry's relevance_scope to broad.",
418
+ "doctor.check.narrow_no_paths.remediation": "Run `/fabric-review`, select the entry \u2192 modify to add path anchors to relevance_paths or widen relevance_scope to broad; or edit the entry frontmatter directly.",
403
419
  "doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
404
420
  "doctor.check.relevance_paths_dangling.ok": "All relevance_paths globs resolve to at least one file under the workspace root.",
405
421
  "doctor.check.relevance_paths_dangling.message.singular": "{count} relevance_paths glob resolves to zero files in the current workspace. First: {detail}.",
@@ -411,6 +427,16 @@ var enMessages = {
411
427
  "doctor.check.relevance_paths_drift.message.singular": "{count} narrow-scope canonical entry has relevance_paths whose globs match no file touched in the last {windowDays}d of git history. First: {detail}.",
412
428
  "doctor.check.relevance_paths_drift.message.plural": "{count} narrow-scope canonical entries have relevance_paths whose globs match no file touched in the last {windowDays}d of git history. First: {detail}.",
413
429
  "doctor.check.relevance_paths_drift.remediation": "Review whether the entry is still relevant \u2014 use `fab_review.modify` to refresh the anchors or `fab_review.reject` to archive.",
430
+ "doctor.check.personal_layer_path_misclassify.name": "Personal-layer path misclassify",
431
+ "doctor.check.personal_layer_path_misclassify.ok": "No personal-layer entries declare relevance_paths that resolve against the current project.",
432
+ "doctor.check.personal_layer_path_misclassify.message.singular": "{count} personal-layer entry declares relevance_paths that match files in the current project (personal layer should be project-agnostic). First: {detail}.",
433
+ "doctor.check.personal_layer_path_misclassify.message.plural": "{count} personal-layer entries declare relevance_paths that match files in the current project (personal layer should be project-agnostic). First: {detail}.",
434
+ "doctor.check.personal_layer_path_misclassify.remediation": 'Use `fab_review.modify` with `layer: "team"` to flip the entry, or rewrite the relevance_paths so the anchors are project-agnostic (e.g. drop project-specific globs).',
435
+ "doctor.check.suspicious_kb.name": "Suspicious KB injection",
436
+ "doctor.check.suspicious_kb.ok": "No canonical knowledge bodies match known prompt-injection patterns.",
437
+ "doctor.check.suspicious_kb.message.singular": "{count} canonical entry body contains tokens matching prompt-injection patterns (likely legacy pre-NEW-31 archive). First: {detail}.",
438
+ "doctor.check.suspicious_kb.message.plural": "{count} canonical entry bodies contain tokens matching prompt-injection patterns (likely legacy pre-NEW-31 archive). First: {detail}.",
439
+ "doctor.check.suspicious_kb.remediation": "Review the flagged entries \u2014 use `fab_review.modify` to scrub the injection tokens from the body, or `fab_review.reject` to archive entries that should not have been canonicalised.",
414
440
  "doctor.check.narrow_too_few.name": "Knowledge narrow too few",
415
441
  "doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}% ({narrowCount}/{totalCount}); {teleNote}.",
416
442
  "doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped (no edit-counter fires in window)",
@@ -445,6 +471,20 @@ var enMessages = {
445
471
  "doctor.check.hooks_wired.message.missing_settings": ".claude/ exists but .claude/settings.json is absent or unparseable; fabric install may have never run successfully, or the file was wiped externally.",
446
472
  "doctor.check.hooks_wired.message.incomplete": ".claude/settings.json is missing fabric hook injections: {missing}. fabric install dry-run report does not match actual state (rc.30 audit BUG-M3 / NEW-4).",
447
473
  "doctor.check.hooks_wired.remediation": "Run `fabric install` to re-inject hooks (idempotent; only fills missing slots). If hooks config was accidentally wiped, back up .claude/settings.json before running.",
474
+ // v2.0.0-rc.37 NEW-20: hooks_runtime — shebang + Node.js syntax validity
475
+ // of installed *.cjs hook files (one layer below hooks_wired).
476
+ "doctor.check.hooks_runtime.name": "Hooks runtime health",
477
+ "doctor.check.hooks_runtime.ok.skipped": "No installed hook files found under .claude/hooks/ / .codex/hooks/ / .cursor/hooks/; skipping hooks_runtime check.",
478
+ "doctor.check.hooks_runtime.ok.healthy": "Scanned {count} hook .cjs file(s); shebang and Node.js syntax parse all pass.",
479
+ "doctor.check.hooks_runtime.message.singular": "{count} hook file is unhealthy at runtime; first: {first_path} ({first_detail}).",
480
+ "doctor.check.hooks_runtime.message.plural": "{count} hook files are unhealthy at runtime; first: {first_path} ({first_detail}).",
481
+ "doctor.check.hooks_runtime.remediation": "Run `fabric install` to overwrite broken hook files (idempotent). If a hook was corrupted by an external process, confirm the cause before re-running install.",
482
+ // v2.0.0-rc.37 NEW-27: hooks_content_drift — cross-client sha256 parity.
483
+ "doctor.check.hooks_content_drift.name": "Hooks cross-client content parity",
484
+ "doctor.check.hooks_content_drift.ok.skipped": "No hook files co-exist across multiple clients (single-client install or no hooks present); skipping hooks_content_drift check.",
485
+ "doctor.check.hooks_content_drift.ok.aligned": "Scanned {count} hook copies; sha256 of every basename matches across .claude / .codex / .cursor.",
486
+ "doctor.check.hooks_content_drift.message": "{count} hook basename(s) drift across clients; first: {first_basename} (involves {first_clients}). `fabric install` copies the same template to all three clients \u2014 drift usually comes from manual edits.",
487
+ "doctor.check.hooks_content_drift.remediation": "Run `fabric install` to restore each client's hook copy to the canonical template. If you actually need client-specific behavior, modify a shared lib/ helper or templates/hooks/configs/ wiring instead of editing the installed .cjs in place.",
448
488
  // rc.31 BUG-G2/G5: promote-ledger invariant check.
449
489
  "doctor.check.promote_ledger_invariant.name": "Promote ledger invariant",
450
490
  "doctor.check.promote_ledger_invariant.ok": "knowledge_proposed={proposed} >= knowledge_promote_started={started} >= knowledge_promoted={promoted}; ledger invariant holds.",
@@ -485,6 +525,12 @@ var enMessages = {
485
525
  "doctor.archive-history.table.outcome": "Outcome",
486
526
  "doctor.archive-history.table.candidates": "Candidates",
487
527
  "doctor.archive-history.table.coveredGap": "Covered gap",
528
+ // rc.37 NEW-33: unified --history <mode> view (archive | fix | all).
529
+ "cli.doctor.args.history.description": "Render unified per-day history (mode: archive | fix | all). Read-only; mutex with --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions / --archive-history.",
530
+ "cli.doctor.errors.history-mutex": "--history cannot be combined with --fix, --fix-knowledge, --cite-coverage, --enrich-descriptions, or --archive-history. Run them separately.",
531
+ "cli.doctor.errors.invalid-history-mode": "Invalid --history mode '{input}'. Use archive | fix | all.",
532
+ "doctor.history.header": "Doctor history (mode={mode}, last {sinceLabel}, {days} day(s))",
533
+ "doctor.history.empty": "No doctor or archive activity within the --since={sinceLabel} window (mode={mode}).",
488
534
  "cli.hooks.description": "Manage Fabric Git hook templates.",
489
535
  "cli.hooks.install.description": "Install the Fabric Husky pre-commit hook template.",
490
536
  "cli.hooks.install.args.target.description": "Target project path, default is the current working directory.",
@@ -511,6 +557,12 @@ var enMessages = {
511
557
  "cli.install.force-skills-only.uninitialised.message": "fabric install --force-skills-only: project is not initialised (.fabric/agents.meta.json is missing).",
512
558
  "cli.install.force-skills-only.uninitialised.hint": "Run `fabric install` (without --force-skills-only) first to lay down the base scaffold, then re-run with --force-skills-only for subsequent Skill refreshes.",
513
559
  "cli.install.force-skills-only.summary": "Skills refresh complete \u2014 written: {written}, skipped: {skipped}, errors: {errors}",
560
+ // v2.0.0-rc.37 NEW-26: --force-hooks-only mirror of --force-skills-only.
561
+ "cli.install.args.force-hooks-only.description": "Skip bootstrap / MCP / skills / settings; only refresh fabric hook scripts + per-client hook config merges (.claude/.codex/.cursor/hooks/*).",
562
+ "cli.install.force-hooks-only.banner": "Refreshing fabric hooks only",
563
+ "cli.install.force-hooks-only.uninitialised.message": "fabric install --force-hooks-only: project not initialised (.fabric/agents.meta.json missing).",
564
+ "cli.install.force-hooks-only.uninitialised.hint": "Run `fabric install` (without --force-hooks-only) first to lay down the base scaffold; then re-run with --force-hooks-only to refresh hooks.",
565
+ "cli.install.force-hooks-only.summary": "Hooks refresh complete \u2014 written: {written}, skipped: {skipped}, errors: {errors}",
514
566
  "cli.install.mcp.install.global": "Using globally-installed @fenglimg/fabric-server",
515
567
  "cli.install.mcp.install.local": "Installing @fenglimg/fabric-server to project devDependencies",
516
568
  "cli.install.mcp.local.installing": "Running {manager} add -D @fenglimg/fabric-server...",
@@ -568,6 +620,10 @@ var enMessages = {
568
620
  "cli.install.wizard.invalid-select": "Invalid value. Use one of: {options}.",
569
621
  "cli.install.wizard.cancelled": "Fabric install cancelled before execution.",
570
622
  "cli.install.capabilities.title": "Client capability summary",
623
+ // v2.0.0-rc.37 NEW-22: post-install restart banner. The MCP server is
624
+ // spawned by the client; already-running Claude Code / Cursor / Codex
625
+ // sessions won't pick up the new mcp config until they restart.
626
+ "cli.install.restart-banner": "Restart hint: any already-running Claude Code / Cursor / Codex CLI session must restart to pick up the new MCP server config; new sessions will autoload the Fabric tools.",
571
627
  "cli.install.capabilities.none": "No supported client was detected for bootstrap or MCP follow-up.",
572
628
  "cli.install.capabilities.header.client": "Client",
573
629
  "cli.install.capabilities.header.bootstrap": "Bootstrap",
@@ -678,17 +734,10 @@ var enMessages = {
678
734
  "cli.scan.recommendation.contributing": "L0: Add CONTRIBUTING.md or leave a bootstrap TODO reference for contribution flow.",
679
735
  "cli.scan.recommendation.unknown-framework": "L1: Add tech-stack TODOs manually because no framework marker was detected.",
680
736
  "cli.scan.recommendation.framework-dirs": "L1: Review {framework} directories for future scoped Fabric rule files.",
681
- "cli.serve.description": "Start the local Fabric MCP HTTP service.\n\nExamples:\n fabric serve bind 127.0.0.1:7373 (default)\n fabric serve --port 8787 use a custom port\n FABRIC_AUTH_TOKEN=<token> fabric serve --host 0.0.0.0 bind non-loopback with Bearer auth",
682
- "cli.serve.args.port.description": "Listen port, default 7373.",
683
- "cli.serve.args.host.description": "Listen host, default 127.0.0.1. Non-loopback hosts (e.g. 0.0.0.0) require FABRIC_AUTH_TOKEN to enable Bearer auth, otherwise serve falls back to 127.0.0.1.",
684
- "cli.serve.args.target.description": "Target project path. Defaults to --target, then EXTERNAL_FIXTURE_PATH, then cwd.",
685
- "cli.serve.args.debug.description": "Print target resolution details to stderr.",
686
- "cli.serve.args.allow-loopback-no-auth.description": "Opt in to running the loopback HTTP server without Bearer auth (default-deny). Use only on a trusted single-user machine; any local process can then read your knowledge ledger.",
687
- "cli.serve.ready.title": "Fabric Dashboard",
688
- "cli.serve.lock-held.action-hint": "A `fabric serve` instance (PID {pid}) is holding the workspace lock. Stop it (Ctrl-C in that terminal or `kill {pid}`) before running this command.",
689
- "cli.serve.warning.host-fallback": "--host {host} requires FABRIC_AUTH_TOKEN for non-loopback exposure; falling back to 127.0.0.1. To bind {host}, run: FABRIC_AUTH_TOKEN=<token> fabric serve --host {host}",
690
- "cli.serve.warning.loopback-deny-default": "FABRIC_AUTH_TOKEN is not set: /api /events /mcp will return 401 by default (any local process could otherwise read .fabric/agents.meta.json + forensic.json + events.jsonl). Set FABRIC_AUTH_TOKEN=<secret> or pass --allow-loopback-no-auth to opt in.",
691
- "cli.serve.error.port-in-use": "Port {port} in use - try --port {nextPort}",
737
+ // v2.0.0-rc.37 Wave A2 Part 2: cli.serve.* + FABRIC_AUTH_TOKEN keys removed
738
+ // alongside `fabric serve` quarantine to packages/server-http-experimental/
739
+ // per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
740
+ // the web UI surface is re-enabled.
692
741
  // v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage i18n keys.
693
742
  "cli.onboard-coverage.description": "Report S5 onboard-slot coverage for the workspace. Used by the fabric-archive Skill's first-run phase to detect unclaimed project-tone slots.",
694
743
  "cli.onboard-coverage.args.json.description": "Emit machine-readable JSON to stdout instead of the human table.",
@@ -1171,6 +1220,15 @@ var zhCNMessages = {
1171
1220
  // v2.0.0-rc.33 W3-1 (P0-6): archive-history 模式 — 引导用户先 mv 备份到 events.archive/ 保留历史, 再跑 --fix 重建空 ledger。与 rotateEventLedgerIfNeeded 的命名约定一致 (events-rotated-YYYY-MM-DD.jsonl 是滑窗 rotation; events-corrupted-YYYY-MM-DD.jsonl 是 invalid-fix 归档)。
1172
1221
  "doctor.check.event_ledger.remediation.invalid": "\u5148\u5F52\u6863\u5386\u53F2 (`mkdir -p .fabric/events.archive && mv .fabric/events.jsonl .fabric/events.archive/events-corrupted-$(date +%Y-%m-%d).jsonl`), \u518D\u8FD0\u884C `fabric doctor --fix` \u521B\u5EFA\u65B0\u7A7A ledger\u3002\u5386\u53F2\u4E8B\u4EF6\u4FDD\u7559\u5728 events.archive/ \u4E0D\u4E22\u3002",
1173
1222
  "doctor.check.event_ledger.ok": ".fabric/events.jsonl \u5DF2\u5B58\u5728\uFF0C\u53EF\u5199\uFF0C\u4E14\u53EF\u89E3\u6790\u3002",
1223
+ // v2.0.0-rc.37 Wave B (B5): 复合 hard-gate 检查 events.jsonl/metrics.jsonl 健康
1224
+ // (G7 size / G8 metric_leak / G9 metrics_stale / G10 rotation_overdue)。
1225
+ "doctor.check.events_jsonl_health.name": "Events ledger \u5065\u5EB7 (rc.37 Plan B 5 hard gate)",
1226
+ "doctor.check.events_jsonl_health.ok": ".fabric/events.jsonl \u5927\u5C0F\u3001\u65B0\u9C9C\u5EA6\u3001metric \u9694\u79BB\u5168\u90E8\u6B63\u5E38\u3002",
1227
+ "doctor.check.events_jsonl_health.message.size": ".fabric/events.jsonl \u5DF2 {sizeMb} MB\uFF0C\u8D85\u8FC7 10 MB \u9608\u503C\u3002",
1228
+ "doctor.check.events_jsonl_health.message.metric_leak": ".fabric/events.jsonl \u542B {count} \u884C metric-counter \u7C7B event_type ({samples})\u3002\u8FD9\u4E9B event \u5E94\u7531 metrics.jsonl \u8BA1\u6570, \u4E0D\u518D\u8FDB\u5165 audit ledger\u3002",
1229
+ "doctor.check.events_jsonl_health.message.metrics_stale": ".fabric/metrics.jsonl \u5DF2 {minutes} \u5206\u949F\u672A\u66F4\u65B0\uFF1Bserver-side 60s flush \u53EF\u80FD stalled\u3002",
1230
+ "doctor.check.events_jsonl_health.message.rotation_overdue": ".fabric/events.jsonl \u5DF2 {days} \u5929\u672A rotate\uFF1B6h rotation tick \u53EF\u80FD\u672A\u8FD0\u884C\u3002",
1231
+ "doctor.check.events_jsonl_health.remediation": "\u8FD0\u884C `fabric doctor --fix` \u89E6\u53D1 rotation; \u91CD\u542F MCP server \u8BA9 startMetricsFlush + startRotationTick \u91CD\u65B0\u8C03\u5EA6\u3002\u82E5 metric_leak \u547D\u4E2D, \u68C0\u67E5\u6700\u8FD1\u4EE3\u7801\u6539\u52A8\u662F\u5426\u7ED5\u8FC7 bumpCounter API \u76F4\u63A5 appendEventLedgerEvent \u5199\u4E86 4 \u4E2A metric-managed event_type \u4E4B\u4E00\u3002",
1174
1232
  "doctor.check.mcp_config_in_wrong_file.name": "Claude MCP config \u4F4D\u7F6E",
1175
1233
  "doctor.check.mcp_config_in_wrong_file.message": ".claude/settings.json \u5305\u542B mcpServers.fabric\uFF1B\u6B64\u6587\u4EF6\u4EC5\u7528\u4E8E hooks/permissions\u3002\u8FD0\u884C --fix \u79FB\u9664\u5B83\uFF0C\u7136\u540E\u91CD\u65B0\u8FD0\u884C fabric install \u5199\u5165 .mcp.json\u3002",
1176
1234
  "doctor.check.mcp_config_in_wrong_file.remediation": "\u8FD0\u884C `fabric doctor --fix` \u4ECE .claude/settings.json \u4E2D\u79FB\u9664 mcpServers.fabric\uFF0C\u7136\u540E\u8FD0\u884C `fabric install` \u5199\u5165 .mcp.json\u3002",
@@ -1216,6 +1274,12 @@ var zhCNMessages = {
1216
1274
  "doctor.check.draft_backlog.ok": "canonical knowledge entries \u4E2D draft \u5360\u6BD4\u6B63\u5E38 (< 50%, \u6216 workspace \u592A\u5C0F\u4E0D\u8BC4)\u3002",
1217
1275
  "doctor.check.draft_backlog.message": "{draftCount}/{totalCount} ({pct}%) canonical knowledge entries \u5361\u5728 draft maturity \u2014 promote \u65AD\u6D41 (rc.32 baseline 92%)\u3002",
1218
1276
  "doctor.check.draft_backlog.remediation": "\u8C03 `/fabric-review` \u6279\u91CF\u5BA1 draft entries: approve \u5347 verified/proven, reject \u4E22, modify \u4FEE\u3002draft \u957F\u671F\u5806\u79EF\u901A\u5E38\u610F\u5473\u7740 archive skill \u4EA7 draft \u592A\u5FEB\u6216 review skill \u6CA1\u8DDF\u4E0A\u3002",
1277
+ // rc.37 NEW-38: knowledge auto-promote (info surface; --fix 执行).
1278
+ "doctor.check.draft_auto_promote.name": "Knowledge auto-promote",
1279
+ "doctor.check.draft_auto_promote.ok": "\u65E0 settled draft \u5F85\u81EA\u52A8 promote (draft \u5747\u672A\u6EE1 14 \u5929\u6216\u5DF2\u88AB drift \u6807\u8BB0)\u3002",
1280
+ "doctor.check.draft_auto_promote.message": "{count} \u4E2A draft entries \u5DF2\u6C89\u6DC0 \u226514 \u5929\u4E14\u65E0 drift ({sample}{suffix}) \u2014 \u53EF\u81EA\u52A8 promote \u5230 verified\u3002\u8DD1 `fabric doctor --fix` \u6267\u884C\u3002",
1281
+ "doctor.check.draft_auto_promote.remediation": "\u8DD1 `fabric doctor --fix` \u628A\u8FD9\u4E9B settled draft \u81EA\u52A8\u5347\u5230 verified (\u6392\u6389 draft_backlog); \u6216\u8C03 `/fabric-review` \u624B\u52A8\u9010\u6761\u5B9A\u593A\u3002",
1282
+ "doctor.check.draft_auto_promote.fixed": "\u81EA\u52A8 promote {count} \u4E2A settled draft entries \u2192 verified\u3002",
1219
1283
  // rc.36 TASK-05 (P0-8): empty-tags ratio warn.
1220
1284
  "doctor.check.knowledge_tags_empty.name": "Knowledge tags coverage",
1221
1285
  "doctor.check.knowledge_tags_empty.ok": "canonical knowledge entries \u4E2D empty tags \u5360\u6BD4\u6B63\u5E38 (\u2264 50%, \u6216 workspace \u592A\u5C0F\u4E0D\u8BC4)\u3002",
@@ -1225,7 +1289,7 @@ var zhCNMessages = {
1225
1289
  "doctor.check.drift_unconsumed.name": "Knowledge drift unconsumed",
1226
1290
  "doctor.check.drift_unconsumed.ok": "\u8FD1 30 \u5929\u5185 knowledge_drift_detected \u4E8B\u4EF6\u5DF2\u88AB\u5BF9\u5E94 knowledge_demoted \u6D88\u5316,\u6216\u4E8B\u4EF6\u6570\u592A\u5C11\u4E0D\u8BC4\u3002",
1227
1291
  "doctor.check.drift_unconsumed.message": "\u8FD1 30 \u5929\u5185 knowledge_drift_detected \u4E8B\u4EF6 {driftCount} \u6B21,knowledge_demoted \u4E8B\u4EF6 {demoteCount} \u6B21\u3002drift > demote \u81F3\u5C11 5 \u2192 \u90E8\u5206 drift \u6CA1\u88AB\u6D88\u5316,KB \u4F1A\u7F13\u6162\u5931\u6D3B\u3002",
1228
- "doctor.check.drift_unconsumed.remediation": "rc.36 \u6CA1\u6709 auto-demote pipeline,\u9700\u624B\u52A8\u5904\u7406:\u8FD0\u884C `fabric doctor --fix` \u89E6\u53D1 orphan-demote / stale-archive \u81EA\u6108\u6D41,\u6216\u8C03 `/fabric-review` \u4E3B\u52A8\u5BA1 drift \u6807\u8BB0\u7684\u6761\u76EE\u3002rc.37 \u8BA1\u5212\u4E0A\u7EBF\u81EA\u52A8 14-day demote\u3002",
1292
+ "doctor.check.drift_unconsumed.remediation": "\u8FD0\u884C `fabric doctor --fix` \u89E6\u53D1 orphan-demote / stale-archive \u81EA\u6108\u6D41,\u6216\u8C03 `/fabric-review` \u4E3B\u52A8\u5BA1 drift \u6807\u8BB0\u7684\u6761\u76EE\u3002",
1229
1293
  "doctor.check.meta_manually_diverged.name": "Meta manual divergence",
1230
1294
  "doctor.check.meta_manually_diverged.ok.unreadable": "agents.meta.json \u4E0D\u53EF\u8BFB\uFF0C\u8DF3\u8FC7 divergence \u68C0\u67E5\u3002",
1231
1295
  "doctor.check.meta_manually_diverged.message.extra.singular": "agents.meta.json \u4E2D\u6709 {count} \u4E2A entry \u5728\u78C1\u76D8\u4E0A\u6CA1\u6709\u5BF9\u5E94\u6587\u4EF6\u3002\u8FD0\u884C --fix \u6267\u884C reconcile\u3002",
@@ -1301,7 +1365,7 @@ var zhCNMessages = {
1301
1365
  "doctor.check.narrow_no_paths.ok": "\u6CA1\u6709 narrow-scope canonical entries \u7684 relevance_paths array \u4E3A\u7A7A\u3002",
1302
1366
  "doctor.check.narrow_no_paths.message.singular": "{count} \u4E2A narrow-scope canonical entry \u7684 relevance_paths array \u4E3A\u7A7A\uFF08silent recall risk \u2014 narrow without anchors can never match a target path\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1303
1367
  "doctor.check.narrow_no_paths.message.plural": "{count} \u4E2A narrow-scope canonical entries \u7684 relevance_paths array \u4E3A\u7A7A\uFF08silent recall risk \u2014 narrow without anchors can never match a target path\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1304
- "doctor.check.narrow_no_paths.remediation": "\u4E3A relevance_paths \u6DFB\u52A0 path anchors\uFF0C\u6216\u5C06 entry \u7684 relevance_scope \u653E\u5BBD\u5230 broad\u3002",
1368
+ "doctor.check.narrow_no_paths.remediation": "\u8C03 `/fabric-review` \u9009\u8BE5 entry \u2192 modify \u4E3A relevance_paths \u6DFB\u52A0 path anchors\uFF0C\u6216\u5C06 relevance_scope \u653E\u5BBD\u5230 broad\uFF1B\u4E5F\u53EF\u76F4\u63A5\u7F16\u8F91 entry frontmatter\u3002",
1305
1369
  "doctor.check.relevance_paths_dangling.name": "Knowledge relevance_paths dangling",
1306
1370
  "doctor.check.relevance_paths_dangling.ok": "\u6240\u6709 relevance_paths globs \u90FD\u80FD\u5728 workspace root \u4E0B\u89E3\u6790\u5230\u81F3\u5C11 1 \u4E2A\u6587\u4EF6\u3002",
1307
1371
  "doctor.check.relevance_paths_dangling.message.singular": "{count} \u4E2A relevance_paths glob \u5728\u5F53\u524D workspace \u4E2D\u89E3\u6790\u5230 0 \u4E2A\u6587\u4EF6\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
@@ -1313,6 +1377,16 @@ var zhCNMessages = {
1313
1377
  "doctor.check.relevance_paths_drift.message.singular": "{count} \u4E2A narrow-scope canonical entry \u7684 relevance_paths globs \u6CA1\u6709\u5339\u914D\u5230\u6700\u8FD1 {windowDays}d git history \u4E2D\u89E6\u78B0\u8FC7\u7684\u6587\u4EF6\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1314
1378
  "doctor.check.relevance_paths_drift.message.plural": "{count} \u4E2A narrow-scope canonical entries \u7684 relevance_paths globs \u6CA1\u6709\u5339\u914D\u5230\u6700\u8FD1 {windowDays}d git history \u4E2D\u89E6\u78B0\u8FC7\u7684\u6587\u4EF6\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1315
1379
  "doctor.check.relevance_paths_drift.remediation": "\u5BA1\u9605\u8BE5 entry \u662F\u5426\u4ECD\u7136\u76F8\u5173 \u2014 \u4F7F\u7528 `fab_review.modify` \u5237\u65B0 anchors\uFF0C\u6216\u4F7F\u7528 `fab_review.reject` \u5F52\u6863\u3002",
1380
+ "doctor.check.personal_layer_path_misclassify.name": "Personal-layer path misclassify",
1381
+ "doctor.check.personal_layer_path_misclassify.ok": "\u6CA1\u6709 personal-layer entries \u7684 relevance_paths \u89E3\u6790\u5230\u5F53\u524D\u9879\u76EE\u5185\u7684\u6587\u4EF6\u3002",
1382
+ "doctor.check.personal_layer_path_misclassify.message.singular": "{count} \u4E2A personal-layer entry \u7684 relevance_paths \u547D\u4E2D\u5F53\u524D\u9879\u76EE\u5185\u7684\u6587\u4EF6\uFF08personal \u5C42\u5E94\u4FDD\u6301\u9879\u76EE\u65E0\u5173\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1383
+ "doctor.check.personal_layer_path_misclassify.message.plural": "{count} \u4E2A personal-layer entries \u7684 relevance_paths \u547D\u4E2D\u5F53\u524D\u9879\u76EE\u5185\u7684\u6587\u4EF6\uFF08personal \u5C42\u5E94\u4FDD\u6301\u9879\u76EE\u65E0\u5173\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1384
+ "doctor.check.personal_layer_path_misclassify.remediation": "\u7528 `fab_review.modify` \u628A layer \u7FFB\u6210 team\uFF0C\u6216\u91CD\u5199 relevance_paths \u8BA9 anchors \u4FDD\u6301\u9879\u76EE\u65E0\u5173\uFF08\u5220\u6389\u9879\u76EE\u7279\u5B9A globs\uFF09\u3002",
1385
+ "doctor.check.suspicious_kb.name": "Suspicious KB injection",
1386
+ "doctor.check.suspicious_kb.ok": "\u6240\u6709 canonical knowledge body \u5747\u672A\u547D\u4E2D\u5DF2\u77E5 prompt-injection \u6A21\u5F0F\u3002",
1387
+ "doctor.check.suspicious_kb.message.singular": "{count} \u4E2A canonical entry body \u542B\u547D\u4E2D prompt-injection \u6A21\u5F0F\u7684 token\uFF08\u591A\u534A\u662F NEW-31 \u4E4B\u524D\u5F52\u6863\u7684 legacy \u6761\u76EE\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1388
+ "doctor.check.suspicious_kb.message.plural": "{count} \u4E2A canonical entry bodies \u542B\u547D\u4E2D prompt-injection \u6A21\u5F0F\u7684 token\uFF08\u591A\u534A\u662F NEW-31 \u4E4B\u524D\u5F52\u6863\u7684 legacy \u6761\u76EE\uFF09\u3002\u9996\u4E2A\uFF1A{detail}\u3002",
1389
+ "doctor.check.suspicious_kb.remediation": "\u5BA1\u9605\u88AB\u6807\u8BB0\u7684\u6761\u76EE \u2014 \u7528 `fab_review.modify` \u64E6\u6389 body \u4E2D\u7684 injection token\uFF0C\u6216 `fab_review.reject` \u5F52\u6863\u4E0D\u8BE5 canonicalize \u7684\u6761\u76EE\u3002",
1316
1390
  "doctor.check.narrow_too_few.name": "Knowledge narrow too few",
1317
1391
  "doctor.check.narrow_too_few.ok": "Narrow-with-paths ratio {ratioPct}%\uFF08{narrowCount}/{totalCount}\uFF09\uFF1B{teleNote}\u3002",
1318
1392
  "doctor.check.narrow_too_few.message.telemetry_skipped": "telemetry skipped\uFF08no edit-counter fires in window\uFF09",
@@ -1347,6 +1421,20 @@ var zhCNMessages = {
1347
1421
  "doctor.check.hooks_wired.message.missing_settings": ".claude/ \u76EE\u5F55\u5B58\u5728\u4F46 .claude/settings.json \u7F3A\u5931\u6216\u65E0\u6CD5\u89E3\u6790\uFF1Bfabric install \u53EF\u80FD\u4ECE\u672A\u8DD1\u6210\u529F\uFF0C\u6216\u6587\u4EF6\u88AB\u5916\u90E8\u6E05\u7A7A\u3002",
1348
1422
  "doctor.check.hooks_wired.message.incomplete": ".claude/settings.json \u7F3A\u5C11 fabric hook \u6CE8\u5165\uFF1A{missing}\u3002fabric install \u7684 dry-run \u62A5\u544A\u4E0E\u5B9E\u9645\u72B6\u6001\u4E0D\u4E00\u81F4\uFF08rc.30 audit BUG-M3 / NEW-4\uFF09\u3002",
1349
1423
  "doctor.check.hooks_wired.remediation": "\u8FD0\u884C `fabric install` \u91CD\u65B0\u6CE8\u5165 hooks\uFF08\u5E42\u7B49\uFF1B\u53EA\u8865\u7F3A\u5931\u9879\uFF09\u3002\u82E5\u610F\u5916\u8986\u76D6\u4E86 hooks \u914D\u7F6E\uFF0C\u5148\u5907\u4EFD .claude/settings.json \u518D\u8DD1\u3002",
1424
+ // v2.0.0-rc.37 NEW-20: hooks_runtime — shebang + Node.js syntax validity
1425
+ // of installed *.cjs hook files (one layer below hooks_wired).
1426
+ "doctor.check.hooks_runtime.name": "Hooks \u8FD0\u884C\u65F6\u5065\u5EB7",
1427
+ "doctor.check.hooks_runtime.ok.skipped": "\u672A\u53D1\u73B0\u5DF2\u5B89\u88C5\u7684 hook \u6587\u4EF6\uFF08.claude/hooks/ / .codex/hooks/ / .cursor/hooks/ \u90FD\u7F3A\uFF09\uFF1B\u8DF3\u8FC7 hooks_runtime \u68C0\u67E5\u3002",
1428
+ "doctor.check.hooks_runtime.ok.healthy": "\u5DF2\u626B\u63CF {count} \u4E2A hook .cjs \u6587\u4EF6\uFF0Cshebang \u4E0E Node.js \u8BED\u6CD5\u89E3\u6790\u5168\u90E8\u901A\u8FC7\u3002",
1429
+ "doctor.check.hooks_runtime.message.singular": "{count} \u4E2A hook \u6587\u4EF6 runtime \u4E0D\u5065\u5EB7\uFF1B\u9996\u4F8B\uFF1A{first_path}\uFF08{first_detail}\uFF09\u3002",
1430
+ "doctor.check.hooks_runtime.message.plural": "{count} \u4E2A hook \u6587\u4EF6 runtime \u4E0D\u5065\u5EB7\uFF1B\u9996\u4F8B\uFF1A{first_path}\uFF08{first_detail}\uFF09\u3002",
1431
+ "doctor.check.hooks_runtime.remediation": "\u8FD0\u884C `fabric install` \u91CD\u5199\u635F\u574F\u7684 hook \u6587\u4EF6\uFF08\u8986\u76D6\u5F0F\uFF0C\u5E42\u7B49\uFF09\u3002\u82E5\u6587\u4EF6\u662F\u88AB\u5916\u90E8\u8FDB\u7A0B\u7834\u574F\u7684\uFF0C\u786E\u8BA4\u6E90\u5934\u518D\u8DD1 install\u3002",
1432
+ // v2.0.0-rc.37 NEW-27: hooks_content_drift — cross-client sha256 parity.
1433
+ "doctor.check.hooks_content_drift.name": "Hooks \u8DE8\u5BA2\u6237\u7AEF\u5185\u5BB9\u4E00\u81F4\u6027",
1434
+ "doctor.check.hooks_content_drift.ok.skipped": "\u672A\u53D1\u73B0\u8DE8\u5BA2\u6237\u7AEF\u5171\u5B58\u7684 hook \u6587\u4EF6\uFF08\u5355 client \u5B89\u88C5\u6216\u5168\u90E8\u7F3A\u5931\uFF09\uFF1B\u8DF3\u8FC7 hooks_content_drift \u68C0\u67E5\u3002",
1435
+ "doctor.check.hooks_content_drift.ok.aligned": "\u5DF2\u626B\u63CF {count} \u4E2A hook \u526F\u672C\uFF0C\u8DE8 client (.claude / .codex / .cursor) sha256 \u5168\u90E8\u4E00\u81F4\u3002",
1436
+ "doctor.check.hooks_content_drift.message": "{count} \u4E2A hook basename \u5728 client \u4E4B\u95F4\u5185\u5BB9 drift\uFF1B\u9996\u4F8B\uFF1A{first_basename}\uFF08\u6D89\u53CA {first_clients}\uFF09\u3002`fabric install` \u590D\u5236\u540C\u4E00\u6A21\u677F\u5230\u4E09 client\uFF0Cdrift \u901A\u5E38\u6765\u81EA\u624B\u52A8\u7F16\u8F91\u3002",
1437
+ "doctor.check.hooks_content_drift.remediation": "\u8FD0\u884C `fabric install` \u628A\u6240\u6709 client \u7684 hook \u526F\u672C\u6062\u590D\u5230 canonical \u6A21\u677F\u3002\u82E5\u4F60\u786E\u5B9E\u9700\u8981 client-specific hook \u884C\u4E3A\uFF0C\u5EFA\u8BAE\u6539 lib/ \u5171\u4EAB\u811A\u672C\u6216 templates/hooks/configs/ \u914D\u7F6E\u800C\u975E\u76F4\u63A5\u7F16\u8F91\u5B89\u88C5\u540E\u7684 .cjs\u3002",
1350
1438
  // rc.31 BUG-G2/G5: promote-ledger invariant check.
1351
1439
  "doctor.check.promote_ledger_invariant.name": "Promote ledger invariant",
1352
1440
  "doctor.check.promote_ledger_invariant.ok": "knowledge_proposed={proposed} \u2265 knowledge_promote_started={started} \u2265 knowledge_promoted={promoted}\uFF0Cledger \u4E0D\u53D8\u91CF\u6301\u6709\u3002",
@@ -1385,6 +1473,12 @@ var zhCNMessages = {
1385
1473
  "doctor.archive-history.table.outcome": "\u7ED3\u679C",
1386
1474
  "doctor.archive-history.table.candidates": "\u5019\u9009\u6570",
1387
1475
  "doctor.archive-history.table.coveredGap": "\u8986\u76D6\u8DDD\u4ECA",
1476
+ // rc.37 NEW-33: 统一 --history <mode> 视图 (archive | fix | all)。
1477
+ "cli.doctor.args.history.description": "\u6E32\u67D3\u7EDF\u4E00\u7684\u9010\u65E5 doctor / archive \u5386\u53F2 (mode: archive | fix | all)\u3002\u53EA\u8BFB;\u4E0E --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions / --archive-history \u4E92\u65A5\u3002",
1478
+ "cli.doctor.errors.history-mutex": "--history \u4E0D\u80FD\u4E0E --fix / --fix-knowledge / --cite-coverage / --enrich-descriptions / --archive-history \u7EC4\u5408\u3002\u8BF7\u5206\u522B\u8FD0\u884C\u3002",
1479
+ "cli.doctor.errors.invalid-history-mode": "\u65E0\u6548\u7684 --history mode '{input}'\u3002\u53EF\u9009: archive | fix | all\u3002",
1480
+ "doctor.history.header": "Doctor \u5386\u53F2 (mode={mode}, \u8FD1 {sinceLabel}, \u5171 {days} \u5929)",
1481
+ "doctor.history.empty": "--since={sinceLabel} \u7A97\u53E3\u5185\u65E0 doctor \u6216 archive \u6D3B\u52A8 (mode={mode})\u3002",
1388
1482
  "cli.hooks.description": "\u7BA1\u7406 Fabric Git \u94A9\u5B50\u6A21\u677F\u3002",
1389
1483
  "cli.hooks.install.description": "\u5B89\u88C5 Fabric Husky pre-commit \u94A9\u5B50\u6A21\u677F\u3002",
1390
1484
  "cli.hooks.install.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\uFF0C\u9ED8\u8BA4\u4E3A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",
@@ -1411,6 +1505,12 @@ var zhCNMessages = {
1411
1505
  "cli.install.force-skills-only.uninitialised.message": "fabric install --force-skills-only: \u9879\u76EE\u672A\u521D\u59CB\u5316(\u627E\u4E0D\u5230 .fabric/agents.meta.json)\u3002",
1412
1506
  "cli.install.force-skills-only.uninitialised.hint": "\u8BF7\u5148\u8FD0\u884C `fabric install`(\u4E0D\u5E26 --force-skills-only)\u94FA\u8BBE\u57FA\u7840 scaffold;\u4E4B\u540E\u518D\u7528 --force-skills-only \u505A\u540E\u7EED Skill \u5237\u65B0\u3002",
1413
1507
  "cli.install.force-skills-only.summary": "Skill \u5237\u65B0\u5B8C\u6210 \u2014 \u5199\u5165: {written}, \u8DF3\u8FC7: {skipped}, \u9519\u8BEF: {errors}",
1508
+ // v2.0.0-rc.37 NEW-26: --force-hooks-only mirror of --force-skills-only。
1509
+ "cli.install.args.force-hooks-only.description": "\u8DF3\u8FC7 bootstrap / MCP / skills / settings,\u53EA\u91CD\u65B0\u5237\u65B0 fabric hook scripts + per-client hook config \u5408\u5E76 (.claude/.codex/.cursor/hooks/*)\u3002",
1510
+ "cli.install.force-hooks-only.banner": "\u53EA\u5237\u65B0 fabric hooks",
1511
+ "cli.install.force-hooks-only.uninitialised.message": "fabric install --force-hooks-only: \u9879\u76EE\u672A\u521D\u59CB\u5316(\u627E\u4E0D\u5230 .fabric/agents.meta.json)\u3002",
1512
+ "cli.install.force-hooks-only.uninitialised.hint": "\u8BF7\u5148\u8FD0\u884C `fabric install`(\u4E0D\u5E26 --force-hooks-only)\u94FA\u8BBE\u57FA\u7840 scaffold;\u4E4B\u540E\u518D\u7528 --force-hooks-only \u505A\u540E\u7EED hook \u5237\u65B0\u3002",
1513
+ "cli.install.force-hooks-only.summary": "Hooks \u5237\u65B0\u5B8C\u6210 \u2014 \u5199\u5165: {written}, \u8DF3\u8FC7: {skipped}, \u9519\u8BEF: {errors}",
1414
1514
  "cli.install.mcp.install.global": "\u4F7F\u7528\u5168\u5C40\u5B89\u88C5\u7684 @fenglimg/fabric-server",
1415
1515
  "cli.install.mcp.install.local": "\u5C06 @fenglimg/fabric-server \u5B89\u88C5\u5230\u9879\u76EE devDependencies",
1416
1516
  "cli.install.mcp.local.installing": "\u6B63\u5728\u8FD0\u884C {manager} add -D @fenglimg/fabric-server...",
@@ -1468,6 +1568,10 @@ var zhCNMessages = {
1468
1568
  "cli.install.wizard.invalid-select": "\u65E0\u6548\u8F93\u5165\u3002\u53EF\u9009\u503C\uFF1A{options}\u3002",
1469
1569
  "cli.install.wizard.cancelled": "Fabric \u5B89\u88C5\u5DF2\u5728\u6267\u884C\u524D\u53D6\u6D88\u3002",
1470
1570
  "cli.install.capabilities.title": "\u5BA2\u6237\u7AEF\u80FD\u529B\u6458\u8981",
1571
+ // v2.0.0-rc.37 NEW-22: post-install 重启提示。MCP server 在 client 启动
1572
+ // 时 spawn, 已运行的 Claude Code / Cursor / Codex session 不会自动加载
1573
+ // 新 mcp config — 必须重启才能拿到 Fabric tools。
1574
+ "cli.install.restart-banner": "\u91CD\u542F\u63D0\u793A: \u5DF2\u8FD0\u884C\u7684 Claude Code / Cursor / Codex CLI session \u9700\u91CD\u542F\u624D\u80FD\u52A0\u8F7D\u65B0 MCP server \u914D\u7F6E;\u65B0\u4F1A\u8BDD\u4F1A\u81EA\u52A8\u4F7F\u7528 Fabric tools\u3002",
1471
1575
  "cli.install.capabilities.none": "\u6CA1\u6709\u68C0\u6D4B\u5230\u53EF\u7528\u4E8E bootstrap \u6216 MCP \u540E\u7EED\u63A5\u529B\u7684\u53D7\u652F\u6301\u5BA2\u6237\u7AEF\u3002",
1472
1576
  "cli.install.capabilities.header.client": "\u5BA2\u6237\u7AEF",
1473
1577
  "cli.install.capabilities.header.bootstrap": "Bootstrap",
@@ -1578,17 +1682,10 @@ var zhCNMessages = {
1578
1682
  "cli.scan.recommendation.contributing": "L0\uFF1A\u6DFB\u52A0 CONTRIBUTING.md\uFF0C\u6216\u5728 bootstrap \u4E2D\u7559\u4E0B\u8D21\u732E\u6D41\u7A0B\u7684 TODO \u8BF4\u660E\u3002",
1579
1683
  "cli.scan.recommendation.unknown-framework": "L1\uFF1A\u5F53\u524D\u672A\u68C0\u6D4B\u5230\u6846\u67B6\u6807\u8BB0\uFF0C\u9700\u8981\u624B\u52A8\u8865\u5145\u6280\u672F\u6808\u8BF4\u660E\u3002",
1580
1684
  "cli.scan.recommendation.framework-dirs": "L1\uFF1A\u68C0\u67E5 {framework} \u76EE\u5F55\uFF0C\u540E\u7EED\u4E3A\u5176\u8865\u5145\u5BF9\u5E94\u4F5C\u7528\u57DF\u7684 Fabric \u89C4\u5219\u6587\u4EF6\u3002",
1581
- "cli.serve.description": "\u542F\u52A8\u672C\u5730 Fabric MCP HTTP \u670D\u52A1\u3002\n\n\u793A\u4F8B\uFF1A\n fabric serve \u7ED1\u5B9A 127.0.0.1:7373\uFF08\u9ED8\u8BA4\uFF09\n fabric serve --port 8787 \u4F7F\u7528\u81EA\u5B9A\u4E49\u7AEF\u53E3\n FABRIC_AUTH_TOKEN=<token> fabric serve --host 0.0.0.0 \u7ED1\u5B9A\u975E loopback \u5E76\u542F\u7528 Bearer \u9274\u6743",
1582
- "cli.serve.args.port.description": "\u76D1\u542C\u7AEF\u53E3\uFF0C\u9ED8\u8BA4 7373\u3002",
1583
- "cli.serve.args.host.description": "\u76D1\u542C\u4E3B\u673A\uFF0C\u9ED8\u8BA4 127.0.0.1\u3002\u7ED1\u5B9A\u975E loopback \u4E3B\u673A\uFF08\u5982 0.0.0.0\uFF09\u5FC5\u987B\u8BBE\u7F6E FABRIC_AUTH_TOKEN \u542F\u7528 Bearer \u9274\u6743\uFF0C\u5426\u5219\u5C06\u81EA\u52A8\u56DE\u9000\u5230 127.0.0.1\u3002",
1584
- "cli.serve.args.target.description": "\u76EE\u6807\u9879\u76EE\u8DEF\u5F84\u3002\u9ED8\u8BA4\u4F9D\u6B21\u4F7F\u7528 --target\u3001EXTERNAL_FIXTURE_PATH\u3001\u5F53\u524D\u76EE\u5F55\u3002",
1585
- "cli.serve.args.debug.description": "\u5C06\u76EE\u6807\u89E3\u6790\u7EC6\u8282\u8F93\u51FA\u5230 stderr\u3002",
1586
- "cli.serve.args.allow-loopback-no-auth.description": "\u663E\u5F0F\u5141\u8BB8\u5728 loopback \u4E0A\u4EE5\u65E0\u9274\u6743\u65B9\u5F0F\u8FD0\u884C\uFF08\u9ED8\u8BA4 default-deny\uFF09\u3002\u4EC5\u5728\u53EF\u4FE1\u5355\u7528\u6237\u673A\u5668\u4E0A\u4F7F\u7528\u2014\u2014\u5426\u5219\u4EFB\u4F55\u672C\u673A\u8FDB\u7A0B\u90FD\u80FD\u8BFB\u53D6\u4F60\u7684\u77E5\u8BC6\u5E93\u8D26\u672C\u3002",
1587
- "cli.serve.ready.title": "Fabric \u4EEA\u8868\u76D8",
1588
- "cli.serve.lock-held.action-hint": "\u53E6\u4E00\u4E2A `fabric serve` \u8FDB\u7A0B (PID {pid}) \u6B63\u5360\u7528\u5DE5\u4F5C\u533A\u9501\u3002\u8BF7\u5148\u505C\u6B62\u5B83 (\u5728\u8BE5\u7EC8\u7AEF\u6309 Ctrl-C \u6216\u8FD0\u884C `kill {pid}`) \u518D\u6267\u884C\u6B64\u547D\u4EE4\u3002",
1589
- "cli.serve.warning.host-fallback": "--host {host} \u9700\u8981\u8BBE\u7F6E FABRIC_AUTH_TOKEN \u624D\u80FD\u5BF9\u5916\u66B4\u9732\uFF1B\u5DF2\u56DE\u9000\u5230 127.0.0.1\u3002\u5982\u9700\u7ED1\u5B9A {host}\uFF0C\u8BF7\u8FD0\u884C\uFF1AFABRIC_AUTH_TOKEN=<token> fabric serve --host {host}",
1590
- "cli.serve.warning.loopback-deny-default": "\u672A\u8BBE\u7F6E FABRIC_AUTH_TOKEN\uFF1A/api /events /mcp \u9ED8\u8BA4\u8FD4\u56DE 401\uFF08\u5426\u5219\u4EFB\u4F55\u672C\u673A\u8FDB\u7A0B\u90FD\u80FD\u8BFB\u53D6 .fabric/agents.meta.json + forensic.json + events.jsonl\uFF09\u3002\u8BF7\u8BBE\u7F6E FABRIC_AUTH_TOKEN=<secret>\uFF0C\u6216\u4F20\u5165 --allow-loopback-no-auth \u663E\u5F0F\u653E\u884C\u3002",
1591
- "cli.serve.error.port-in-use": "\u7AEF\u53E3 {port} \u5DF2\u88AB\u5360\u7528\uFF0C\u53EF\u5C1D\u8BD5 --port {nextPort}",
1685
+ // v2.0.0-rc.37 Wave A2 Part 2: cli.serve.* + FABRIC_AUTH_TOKEN keys removed
1686
+ // alongside `fabric serve` quarantine to packages/server-http-experimental/
1687
+ // per [[fabric-serve-quarantine-not-delete]]. Restore from git history when
1688
+ // the web UI surface is re-enabled.
1592
1689
  // v2.0.0-rc.29 TASK-008 (BUG-L2): onboard-coverage 国际化键。
1593
1690
  "cli.onboard-coverage.description": "\u6C47\u603B\u5F53\u524D\u5DE5\u4F5C\u533A\u7684 S5 onboard-slot \u8986\u76D6\u5EA6\u3002fabric-archive Skill \u9996\u8DD1\u9636\u6BB5\u7528\u5B83\u5224\u65AD\u54EA\u4E9B\u9879\u76EE\u8BED\u8C03\u69FD\u4F4D\u5C1A\u672A\u88AB\u8BA4\u9886\u3002",
1594
1691
  "cli.onboard-coverage.args.json.description": "\u8F93\u51FA\u673A\u5668\u53EF\u8BFB\u7684 JSON \u5230 stdout\uFF08\u66FF\u4EE3\u4EBA\u7C7B\u53EF\u8BFB\u7684\u8868\u683C\uFF09\u3002",
@@ -7,7 +7,7 @@ import {
7
7
  normalizeLocale,
8
8
  resolveFabricLocale,
9
9
  zhCNMessages
10
- } from "../chunk-P4RNLXTM.js";
10
+ } from "../chunk-ZSRVKMYT.js";
11
11
  export {
12
12
  PROTECTED_TOKENS,
13
13
  createTranslator,
@@ -182,6 +182,7 @@ declare const fabricConfigSchema: z.ZodObject<{
182
182
  fabric_event_retention_days: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<7>, z.ZodLiteral<30>, z.ZodLiteral<90>]>>;
183
183
  onboard_slots_opted_out: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
184
184
  hint_broad_top_k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
185
+ hint_dismiss_signals: z.ZodOptional<z.ZodArray<z.ZodEnum<["archive", "review", "import", "maintenance"]>, "many">>;
185
186
  hint_narrow_top_k: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
186
187
  hint_narrow_dedup_window_turns: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
187
188
  hint_broad_cooldown_hours: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
@@ -237,6 +238,7 @@ declare const fabricConfigSchema: z.ZodObject<{
237
238
  hardBytes?: number | undefined;
238
239
  } | undefined;
239
240
  fabric_event_retention_days?: 7 | 30 | 90 | undefined;
241
+ hint_dismiss_signals?: ("archive" | "review" | "import" | "maintenance")[] | undefined;
240
242
  orphan_demote_stable_days?: number | undefined;
241
243
  orphan_demote_endorsed_days?: number | undefined;
242
244
  orphan_demote_draft_days?: number | undefined;
@@ -280,6 +282,7 @@ declare const fabricConfigSchema: z.ZodObject<{
280
282
  fabric_event_retention_days?: 7 | 30 | 90 | undefined;
281
283
  onboard_slots_opted_out?: string[] | undefined;
282
284
  hint_broad_top_k?: number | undefined;
285
+ hint_dismiss_signals?: ("archive" | "review" | "import" | "maintenance")[] | undefined;
283
286
  hint_narrow_top_k?: number | undefined;
284
287
  hint_narrow_dedup_window_turns?: number | undefined;
285
288
  hint_broad_cooldown_hours?: number | undefined;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { A as AgentsMetaNode, a as AgentsIdentitySource, b as AgentsLayer, c as AgentsTopologyType, H as HumanLockEntry, f as fabricConfigSchema, d as AgentsMeta, L as LedgerEntry } from './index-BjssYQb3.js';
2
- export { e as AgentsActivationTier, g as AgentsMetaCountersEnvelope, h as AgentsMetaKnowledgeTypeCounters, i as AgentsMetaNodeActivation, j as AiLedgerEntry, k as AuditMode, C as ClientPaths, D as DefaultLayerFilter, F as FabricConfig, l as FabricLanguage, m as HumanLedgerEntry, M as McpPayloadLimits, R as RuleDescription, n as RuleDescriptionIndexItem, o as auditModeSchema, p as clientPathsSchema, q as defaultLayerFilterSchema, r as fabricLanguageSchema, s as mcpPayloadLimitsSchema, t as selectionTokenTtlMsSchema } from './index-BjssYQb3.js';
1
+ import { A as AgentsMetaNode, a as AgentsIdentitySource, b as AgentsLayer, c as AgentsTopologyType, H as HumanLockEntry, f as fabricConfigSchema, d as AgentsMeta, L as LedgerEntry } from './index-BkXfeNyz.js';
2
+ export { e as AgentsActivationTier, g as AgentsMetaCountersEnvelope, h as AgentsMetaKnowledgeTypeCounters, i as AgentsMetaNodeActivation, j as AiLedgerEntry, k as AuditMode, C as ClientPaths, D as DefaultLayerFilter, F as FabricConfig, l as FabricLanguage, m as HumanLedgerEntry, M as McpPayloadLimits, R as RuleDescription, n as RuleDescriptionIndexItem, o as auditModeSchema, p as clientPathsSchema, q as defaultLayerFilterSchema, r as fabricLanguageSchema, s as mcpPayloadLimitsSchema, t as selectionTokenTtlMsSchema } from './index-BkXfeNyz.js';
3
3
  export { Locale, Messages, PROTECTED_TOKENS, ProtectedToken, TranslationKey, Translator, createTranslator, defaultMessages, detectNodeLocale, enMessages, normalizeLocale, resolveFabricLocale, zhCNMessages } from './i18n/index.js';
4
4
  import { z } from 'zod';
5
5
  import { Layer, KnowledgeType, StableId } from './schemas/api-contracts.js';
6
- export { CiteContractMetrics, CiteCoverageReport, CiteLayerTypeBreakdown, FabExtractKnowledgeInput, FabExtractKnowledgeInputSchema, FabExtractKnowledgeInputShape, FabExtractKnowledgeOutput, FabExtractKnowledgeOutputSchema, FabReviewInput, FabReviewInputSchema, FabReviewInputShape, FabReviewOutput, FabReviewOutputSchema, FabReviewOutputShape, KNOWLEDGE_TYPE_CODES, KnowledgeEntryFrontmatter, KnowledgeEntryFrontmatterSchema, KnowledgeTypeCode, KnowledgeTypeSchema, LayerSchema, Maturity, MaturitySchema, PROPOSED_REASON_DESCRIPTIONS, ProposedReason, ProposedReasonSchema, StableIdSchema, annotateIntentRequestSchema, citeContractMetricsSchema, citeCoverageReportSchema, citeLayerTypeBreakdownSchema, fabExtractKnowledgeAnnotations, fabReviewAnnotations, formatKnowledgeId, historyStateQuerySchema, humanLockApproveRequestSchema, humanLockFileParamsSchema, knowledgeSectionsAnnotations, knowledgeSectionsInputSchema, knowledgeSectionsOutputSchema, ledgerQuerySchema, ledgerSourceSchema, parseKnowledgeId, planContextAnnotations, planContextHintNarrowEntrySchema, planContextHintOutputSchema, planContextInputSchema, planContextOutputSchema, structuredWarningSchema } from './schemas/api-contracts.js';
6
+ export { ArchiveScanInput, ArchiveScanOutput, CiteContractMetrics, CiteCoverageReport, CiteLayerTypeBreakdown, FabExtractKnowledgeInput, FabExtractKnowledgeInputSchema, FabExtractKnowledgeInputShape, FabExtractKnowledgeOutput, FabExtractKnowledgeOutputSchema, FabReviewInput, FabReviewInputSchema, FabReviewInputShape, FabReviewOutput, FabReviewOutputSchema, FabReviewOutputShape, KNOWLEDGE_TYPE_CODES, KnowledgeEntryFrontmatter, KnowledgeEntryFrontmatterSchema, KnowledgeTypeCode, KnowledgeTypeSchema, LayerSchema, Maturity, MaturitySchema, PROPOSED_REASON_DESCRIPTIONS, ProposedReason, ProposedReasonSchema, StableIdSchema, annotateIntentRequestSchema, archiveScanAnnotations, archiveScanInputSchema, archiveScanOutputSchema, citeContractMetricsSchema, citeCoverageReportSchema, citeLayerTypeBreakdownSchema, fabExtractKnowledgeAnnotations, fabReviewAnnotations, formatKnowledgeId, historyStateQuerySchema, humanLockApproveRequestSchema, humanLockFileParamsSchema, knowledgeSectionsAnnotations, knowledgeSectionsInputSchema, knowledgeSectionsOutputSchema, ledgerQuerySchema, ledgerSourceSchema, parseKnowledgeId, planContextAnnotations, planContextHintNarrowEntrySchema, planContextHintOutputSchema, planContextInputSchema, planContextOutputSchema, recallAnnotations, recallInputSchema, recallOutputSchema, structuredWarningSchema } from './schemas/api-contracts.js';
7
7
  export { BOOTSTRAP_CANONICAL, BOOTSTRAP_MARKER_BEGIN, BOOTSTRAP_MARKER_END, BOOTSTRAP_REGEX, LEGACY_KB_MARKER_BEGIN, LEGACY_KB_MARKER_END, LEGACY_KB_REGEX } from './templates/bootstrap-canonical.js';
8
8
 
9
9
  declare const ONBOARD_SLOT_NAMES: readonly ["tech-stack-decision", "architecture-pattern", "code-style-tone", "build-system-idiom", "domain-vocabulary"];
@@ -5668,6 +5668,7 @@ declare const knowledgeLayerChangedEventSchema: z.ZodObject<{
5668
5668
  reason: z.ZodOptional<z.ZodString>;
5669
5669
  from_layer: z.ZodEnum<["team", "personal"]>;
5670
5670
  to_layer: z.ZodEnum<["team", "personal"]>;
5671
+ previous_stable_id: z.ZodOptional<z.ZodString>;
5671
5672
  kind: z.ZodLiteral<"fabric-event">;
5672
5673
  id: z.ZodString;
5673
5674
  ts: z.ZodNumber;
@@ -5687,6 +5688,7 @@ declare const knowledgeLayerChangedEventSchema: z.ZodObject<{
5687
5688
  correlation_id?: string | undefined;
5688
5689
  session_id?: string | undefined;
5689
5690
  reason?: string | undefined;
5691
+ previous_stable_id?: string | undefined;
5690
5692
  }, {
5691
5693
  id: string;
5692
5694
  ts: number;
@@ -5700,6 +5702,44 @@ declare const knowledgeLayerChangedEventSchema: z.ZodObject<{
5700
5702
  correlation_id?: string | undefined;
5701
5703
  session_id?: string | undefined;
5702
5704
  reason?: string | undefined;
5705
+ previous_stable_id?: string | undefined;
5706
+ }>;
5707
+ declare const knowledgeIdRedirectEventSchema: z.ZodObject<{
5708
+ event_type: z.ZodLiteral<"knowledge_id_redirect">;
5709
+ timestamp: z.ZodString;
5710
+ previous_stable_id: z.ZodString;
5711
+ new_stable_id: z.ZodString;
5712
+ reason: z.ZodOptional<z.ZodString>;
5713
+ kind: z.ZodLiteral<"fabric-event">;
5714
+ id: z.ZodString;
5715
+ ts: z.ZodNumber;
5716
+ schema_version: z.ZodLiteral<1>;
5717
+ correlation_id: z.ZodOptional<z.ZodString>;
5718
+ session_id: z.ZodOptional<z.ZodString>;
5719
+ }, "strip", z.ZodTypeAny, {
5720
+ id: string;
5721
+ new_stable_id: string;
5722
+ ts: number;
5723
+ schema_version: 1;
5724
+ kind: "fabric-event";
5725
+ event_type: "knowledge_id_redirect";
5726
+ timestamp: string;
5727
+ previous_stable_id: string;
5728
+ correlation_id?: string | undefined;
5729
+ session_id?: string | undefined;
5730
+ reason?: string | undefined;
5731
+ }, {
5732
+ id: string;
5733
+ new_stable_id: string;
5734
+ ts: number;
5735
+ schema_version: 1;
5736
+ kind: "fabric-event";
5737
+ event_type: "knowledge_id_redirect";
5738
+ timestamp: string;
5739
+ previous_stable_id: string;
5740
+ correlation_id?: string | undefined;
5741
+ session_id?: string | undefined;
5742
+ reason?: string | undefined;
5703
5743
  }>;
5704
5744
  declare const knowledgeSlugRenamedEventSchema: z.ZodObject<{
5705
5745
  event_type: z.ZodLiteral<"knowledge_slug_renamed">;
@@ -6464,24 +6504,24 @@ declare const sessionArchiveAttemptedEventSchema: z.ZodObject<{
6464
6504
  session_id: z.ZodOptional<z.ZodString>;
6465
6505
  }, "strip", z.ZodTypeAny, {
6466
6506
  id: string;
6507
+ covered_through_ts: number;
6467
6508
  ts: number;
6468
6509
  schema_version: 1;
6469
6510
  kind: "fabric-event";
6470
6511
  event_type: "session_archive_attempted";
6471
- outcome: "proposed" | "viability_failed" | "user_dismissed" | "skipped_no_signal";
6472
- covered_through_ts: number;
6512
+ outcome: "user_dismissed" | "proposed" | "viability_failed" | "skipped_no_signal";
6473
6513
  candidates_proposed: number;
6474
6514
  knowledge_proposed_ids: string[];
6475
6515
  correlation_id?: string | undefined;
6476
6516
  session_id?: string | undefined;
6477
6517
  }, {
6478
6518
  id: string;
6519
+ covered_through_ts: number;
6479
6520
  ts: number;
6480
6521
  schema_version: 1;
6481
6522
  kind: "fabric-event";
6482
6523
  event_type: "session_archive_attempted";
6483
- outcome: "proposed" | "viability_failed" | "user_dismissed" | "skipped_no_signal";
6484
- covered_through_ts: number;
6524
+ outcome: "user_dismissed" | "proposed" | "viability_failed" | "skipped_no_signal";
6485
6525
  correlation_id?: string | undefined;
6486
6526
  session_id?: string | undefined;
6487
6527
  candidates_proposed?: number | undefined;
@@ -7290,6 +7330,7 @@ declare const eventLedgerEventSchema: z.ZodDiscriminatedUnion<"event_type", [z.Z
7290
7330
  reason: z.ZodOptional<z.ZodString>;
7291
7331
  from_layer: z.ZodEnum<["team", "personal"]>;
7292
7332
  to_layer: z.ZodEnum<["team", "personal"]>;
7333
+ previous_stable_id: z.ZodOptional<z.ZodString>;
7293
7334
  kind: z.ZodLiteral<"fabric-event">;
7294
7335
  id: z.ZodString;
7295
7336
  ts: z.ZodNumber;
@@ -7309,6 +7350,7 @@ declare const eventLedgerEventSchema: z.ZodDiscriminatedUnion<"event_type", [z.Z
7309
7350
  correlation_id?: string | undefined;
7310
7351
  session_id?: string | undefined;
7311
7352
  reason?: string | undefined;
7353
+ previous_stable_id?: string | undefined;
7312
7354
  }, {
7313
7355
  id: string;
7314
7356
  ts: number;
@@ -7322,6 +7364,43 @@ declare const eventLedgerEventSchema: z.ZodDiscriminatedUnion<"event_type", [z.Z
7322
7364
  correlation_id?: string | undefined;
7323
7365
  session_id?: string | undefined;
7324
7366
  reason?: string | undefined;
7367
+ previous_stable_id?: string | undefined;
7368
+ }>, z.ZodObject<{
7369
+ event_type: z.ZodLiteral<"knowledge_id_redirect">;
7370
+ timestamp: z.ZodString;
7371
+ previous_stable_id: z.ZodString;
7372
+ new_stable_id: z.ZodString;
7373
+ reason: z.ZodOptional<z.ZodString>;
7374
+ kind: z.ZodLiteral<"fabric-event">;
7375
+ id: z.ZodString;
7376
+ ts: z.ZodNumber;
7377
+ schema_version: z.ZodLiteral<1>;
7378
+ correlation_id: z.ZodOptional<z.ZodString>;
7379
+ session_id: z.ZodOptional<z.ZodString>;
7380
+ }, "strip", z.ZodTypeAny, {
7381
+ id: string;
7382
+ new_stable_id: string;
7383
+ ts: number;
7384
+ schema_version: 1;
7385
+ kind: "fabric-event";
7386
+ event_type: "knowledge_id_redirect";
7387
+ timestamp: string;
7388
+ previous_stable_id: string;
7389
+ correlation_id?: string | undefined;
7390
+ session_id?: string | undefined;
7391
+ reason?: string | undefined;
7392
+ }, {
7393
+ id: string;
7394
+ new_stable_id: string;
7395
+ ts: number;
7396
+ schema_version: 1;
7397
+ kind: "fabric-event";
7398
+ event_type: "knowledge_id_redirect";
7399
+ timestamp: string;
7400
+ previous_stable_id: string;
7401
+ correlation_id?: string | undefined;
7402
+ session_id?: string | undefined;
7403
+ reason?: string | undefined;
7325
7404
  }>, z.ZodObject<{
7326
7405
  event_type: z.ZodLiteral<"knowledge_slug_renamed">;
7327
7406
  stable_id: z.ZodOptional<z.ZodString>;
@@ -8065,24 +8144,24 @@ declare const eventLedgerEventSchema: z.ZodDiscriminatedUnion<"event_type", [z.Z
8065
8144
  session_id: z.ZodOptional<z.ZodString>;
8066
8145
  }, "strip", z.ZodTypeAny, {
8067
8146
  id: string;
8147
+ covered_through_ts: number;
8068
8148
  ts: number;
8069
8149
  schema_version: 1;
8070
8150
  kind: "fabric-event";
8071
8151
  event_type: "session_archive_attempted";
8072
- outcome: "proposed" | "viability_failed" | "user_dismissed" | "skipped_no_signal";
8073
- covered_through_ts: number;
8152
+ outcome: "user_dismissed" | "proposed" | "viability_failed" | "skipped_no_signal";
8074
8153
  candidates_proposed: number;
8075
8154
  knowledge_proposed_ids: string[];
8076
8155
  correlation_id?: string | undefined;
8077
8156
  session_id?: string | undefined;
8078
8157
  }, {
8079
8158
  id: string;
8159
+ covered_through_ts: number;
8080
8160
  ts: number;
8081
8161
  schema_version: 1;
8082
8162
  kind: "fabric-event";
8083
8163
  event_type: "session_archive_attempted";
8084
- outcome: "proposed" | "viability_failed" | "user_dismissed" | "skipped_no_signal";
8085
- covered_through_ts: number;
8164
+ outcome: "user_dismissed" | "proposed" | "viability_failed" | "skipped_no_signal";
8086
8165
  correlation_id?: string | undefined;
8087
8166
  session_id?: string | undefined;
8088
8167
  candidates_proposed?: number | undefined;
@@ -8110,6 +8189,7 @@ type KnowledgePromoteStartedEvent = z.infer<typeof knowledgePromoteStartedEventS
8110
8189
  type KnowledgePromotedEvent = z.infer<typeof knowledgePromotedEventSchema>;
8111
8190
  type KnowledgePromoteFailedEvent = z.infer<typeof knowledgePromoteFailedEventSchema>;
8112
8191
  type KnowledgeLayerChangedEvent = z.infer<typeof knowledgeLayerChangedEventSchema>;
8192
+ type KnowledgeIdRedirectEvent = z.infer<typeof knowledgeIdRedirectEventSchema>;
8113
8193
  type KnowledgeSlugRenamedEvent = z.infer<typeof knowledgeSlugRenamedEventSchema>;
8114
8194
  type KnowledgeDemotedEvent = z.infer<typeof knowledgeDemotedEventSchema>;
8115
8195
  type KnowledgeArchivedEvent = z.infer<typeof knowledgeArchivedEventSchema>;
@@ -8131,7 +8211,7 @@ type EventsRotatedEvent = z.infer<typeof eventsRotatedEventSchema>;
8131
8211
  type ServeLockClearedEvent = z.infer<typeof serveLockClearedEventSchema>;
8132
8212
  type KnowledgeEnrichedEvent = z.infer<typeof knowledgeEnrichedEventSchema>;
8133
8213
  type SessionArchiveAttemptedEvent = z.infer<typeof sessionArchiveAttemptedEventSchema>;
8134
- type EventLedgerEvent = KnowledgeContextPlannedEvent | KnowledgeSelectionEvent | KnowledgeSectionsFetchedEvent | EditIntentCheckedEvent | KnowledgeDriftDetectedEvent | McpEventLedgerEvent | ReapplyCompletedEvent | InstallDiffAppliedEvent | EventLedgerTruncatedEvent | McpConfigMigratedEvent | BootstrapMarkerMigratedEvent | MetaReconciledOnStartupEvent | MetaReconciledEvent | ClaudeSkillPathMigratedEvent | ClaudeHookPathMigratedEvent | CodexSkillPathMigratedEvent | InitScanCompletedEvent | KnowledgeProposedEvent | KnowledgePromoteStartedEvent | KnowledgePromotedEvent | KnowledgePromoteFailedEvent | KnowledgeLayerChangedEvent | KnowledgeSlugRenamedEvent | KnowledgeDemotedEvent | KnowledgeArchivedEvent | KnowledgeArchiveAttemptedEvent | KnowledgeUnarchivedEvent | KnowledgeDeferredEvent | KnowledgeRejectedEvent | KnowledgeConsumedEvent | KnowledgeScopeDegradedEvent | PendingAutoArchivedEvent | KnowledgePathDangledEvent | DoctorRunEvent | RelevanceMigrationRunEvent | AssistantTurnObservedEvent | CitePolicyActivatedEvent | CiteContractPolicyActivatedEvent | KnowledgeMetaAutoHealedEvent | EventsRotatedEvent | ServeLockClearedEvent | KnowledgeEnrichedEvent | SessionArchiveAttemptedEvent;
8214
+ type EventLedgerEvent = KnowledgeContextPlannedEvent | KnowledgeSelectionEvent | KnowledgeSectionsFetchedEvent | EditIntentCheckedEvent | KnowledgeDriftDetectedEvent | McpEventLedgerEvent | ReapplyCompletedEvent | InstallDiffAppliedEvent | EventLedgerTruncatedEvent | McpConfigMigratedEvent | BootstrapMarkerMigratedEvent | MetaReconciledOnStartupEvent | MetaReconciledEvent | ClaudeSkillPathMigratedEvent | ClaudeHookPathMigratedEvent | CodexSkillPathMigratedEvent | InitScanCompletedEvent | KnowledgeProposedEvent | KnowledgePromoteStartedEvent | KnowledgePromotedEvent | KnowledgePromoteFailedEvent | KnowledgeLayerChangedEvent | KnowledgeIdRedirectEvent | KnowledgeSlugRenamedEvent | KnowledgeDemotedEvent | KnowledgeArchivedEvent | KnowledgeArchiveAttemptedEvent | KnowledgeUnarchivedEvent | KnowledgeDeferredEvent | KnowledgeRejectedEvent | KnowledgeConsumedEvent | KnowledgeScopeDegradedEvent | PendingAutoArchivedEvent | KnowledgePathDangledEvent | DoctorRunEvent | RelevanceMigrationRunEvent | AssistantTurnObservedEvent | CitePolicyActivatedEvent | CiteContractPolicyActivatedEvent | KnowledgeMetaAutoHealedEvent | EventsRotatedEvent | ServeLockClearedEvent | KnowledgeEnrichedEvent | SessionArchiveAttemptedEvent;
8135
8215
  type EventLedgerEventType = EventLedgerEvent["event_type"];
8136
8216
  type EventLedgerEventInputFor<T extends EventLedgerEvent> = T extends EventLedgerEvent ? Omit<T, "kind" | "id" | "ts" | "schema_version" | "correlation_id" | "session_id"> & Partial<Pick<T, "id" | "ts" | "correlation_id" | "session_id">> : never;
8137
8217
  type EventLedgerEventInput = EventLedgerEventInputFor<EventLedgerEvent>;
@@ -8166,4 +8246,4 @@ interface ParseCiteLineResult {
8166
8246
  */
8167
8247
  declare function parseCiteLine(raw: string): ParseCiteLineResult;
8168
8248
 
8169
- export { AGENTS_META_IDENTITY_SOURCES, AGENTS_META_LAYERS, AGENTS_META_TOPOLOGY_TYPES, AgentsIdentitySource, AgentsLayer, AgentsMeta, type AgentsMetaCounters, AgentsMetaCountersSchema, AgentsMetaNode, AgentsTopologyType, type AssistantTurnObservedEvent, type BootstrapMarkerMigratedEvent, type CandidateFileEntry, type CandidateFileFamily, type CiteCommitment, type CiteCommitmentOperator, type CiteCommitmentOperatorKind, type CiteContractPolicyActivatedEvent, type CitePolicyActivatedEvent, type CiteTag, type ClaudeHookPathMigratedEvent, type ClaudeSkillPathMigratedEvent, type CodexSkillPathMigratedEvent, type DoctorRunEvent, type DriftDetectedEvent, type EditIntentCheckedEvent, type EventLedgerEvent, type EventLedgerEventInput, type EventLedgerEventType, type EventLedgerTruncatedEvent, type EventsRotatedEvent, type FabricConfigSchemaShape, type FabricEvent, type ForensicAssertion, type ForensicAssertionConfidence, type ForensicAssertionCoverage, type ForensicAssertionType, type ForensicCodeSample, type ForensicEntryPoint, type ForensicEvidenceAnchor, type ForensicFramework, type ForensicReadme, type ForensicReport, type ForensicSamplingBudget, type ForensicTopology, HumanLockEntry, type HumanLockFile, type InitContext, type InitContextDomainGroup, type InitContextFramework, type InitContextInterviewTrailEntry, type InitContextInvariant, type InitContextInvariantConfidenceSnapshot, type InitContextSourceEvidence, type InitScanCompletedEvent, type InstallDiffAppliedEvent, KNOWLEDGE_TEST_INDEX_SCHEMA_VERSION, type KnowledgeArchiveAttemptedEvent, type KnowledgeArchivedEvent, type KnowledgeConsumedEvent, type KnowledgeContextPlannedEvent, type KnowledgeDeferredEvent, type KnowledgeDemotedEvent, type KnowledgeDriftDetectedEvent, type KnowledgeEnrichedEvent, type KnowledgeLayerChangedEvent, type KnowledgeMetaAutoHealedEvent, type KnowledgePathDangledEvent, type KnowledgePromoteFailedEvent, type KnowledgePromoteStartedEvent, type KnowledgePromotedEvent, type KnowledgeProposedEvent, type KnowledgeRejectedEvent, type KnowledgeScopeDegradedEvent, type KnowledgeSectionsFetchedEvent, type KnowledgeSelectionEvent, type KnowledgeSlugRenamedEvent, type KnowledgeTestIndex, type KnowledgeTestLink, type KnowledgeTestOrphanAnnotation, KnowledgeType, type KnowledgeUnarchivedEvent, Layer, type LedgerAppendedEvent, LedgerEntry, type LockApprovedEvent, type LockDriftEvent, type McpConfigMigratedEvent, type McpEventLedgerEvent, type MetaReconciledEvent, type MetaReconciledOnStartupEvent, type MetaUpdatedEvent, ONBOARD_SLOT_NAMES, ONBOARD_SLOT_TOTAL, type OnboardSlot, type PanelFieldGroup, type PanelFieldMeta, type ParseCiteLineResult, type PendingAutoArchivedEvent, type ReapplyCompletedEvent, type RelevanceMigrationRunEvent, type ServeLockClearedEvent, type SessionArchiveAttemptedEvent, StableId, type ValidateResult, agentsIdentitySourceSchema, agentsLayerSchema, agentsMetaNodeSchema, agentsMetaSchema, agentsTopologyTypeSchema, aiLedgerEntrySchema, allocateKnowledgeId, assistantTurnObservedEventSchema, bootstrapMarkerMigratedEventSchema, candidateFileEntrySchema, citeContractPolicyActivatedEventSchema, citePolicyActivatedEventSchema, claudeHookPathMigratedEventSchema, claudeSkillPathMigratedEventSchema, codexSkillPathMigratedEventSchema, defaultAgentsMetaCounters, deriveAgentsMetaIdentitySource, deriveAgentsMetaLayer, deriveAgentsMetaStableId, deriveAgentsMetaTopologyType, doctorRunEventSchema, driftDetectedEventSchema, editIntentCheckedEventSchema, eventLedgerEventSchema, eventLedgerTruncatedEventSchema, eventsRotatedEventSchema, fabricConfigSchema, fabricEventSchema, forensicAssertionCoverageSchema, forensicAssertionSchema, forensicCodeSampleSchema, forensicEntryPointSchema, forensicEvidenceAnchorSchema, forensicFrameworkSchema, forensicReadmeSchema, forensicReportSchema, forensicSamplingBudgetSchema, forensicTopologySchema, getPanelFieldByKey, getPanelFields, humanLedgerEntrySchema, humanLockEntrySchema, humanLockFileSchema, initContextDomainGroupSchema, initContextFrameworkSchema, initContextInterviewTrailEntrySchema, initContextInvariantConfidenceSnapshotSchema, initContextInvariantSchema, initContextSchema, initContextSourceEvidenceSchema, initScanCompletedEventSchema, installDiffAppliedEventSchema, isKnowledgeStableId, knowledgeArchiveAttemptedEventSchema, knowledgeArchivedEventSchema, knowledgeConsumedEventSchema, knowledgeContextPlannedEventSchema, knowledgeDeferredEventSchema, knowledgeDemotedEventSchema, knowledgeDriftDetectedEventSchema, knowledgeEnrichedEventSchema, knowledgeLayerChangedEventSchema, knowledgeMetaAutoHealedEventSchema, knowledgePathDangledEventSchema, knowledgePromoteFailedEventSchema, knowledgePromoteStartedEventSchema, knowledgePromotedEventSchema, knowledgeProposedEventSchema, knowledgeRejectedEventSchema, knowledgeScopeDegradedEventSchema, knowledgeSectionsFetchedEventSchema, knowledgeSelectionEventSchema, knowledgeSlugRenamedEventSchema, knowledgeTestIndexSchema, knowledgeTestLinkSchema, knowledgeTestOrphanAnnotationSchema, knowledgeUnarchivedEventSchema, ledgerAppendedEventSchema, ledgerEntrySchema, lockApprovedEventSchema, lockDriftEventSchema, mcpConfigMigratedEventSchema, mcpEventLedgerEventSchema, metaReconciledEventSchema, metaReconciledOnStartupEventSchema, metaUpdatedEventSchema, onboardSlotSchema, parseCiteLine, pendingAutoArchivedEventSchema, reapplyCompletedEventSchema, relevanceMigrationRunEventSchema, ruleDescriptionIndexItemSchema, ruleDescriptionSchema, serveLockClearedEventSchema, sessionArchiveAttemptedEventSchema, withDerivedAgentsMetaNodeDefaults };
8249
+ export { AGENTS_META_IDENTITY_SOURCES, AGENTS_META_LAYERS, AGENTS_META_TOPOLOGY_TYPES, AgentsIdentitySource, AgentsLayer, AgentsMeta, type AgentsMetaCounters, AgentsMetaCountersSchema, AgentsMetaNode, AgentsTopologyType, type AssistantTurnObservedEvent, type BootstrapMarkerMigratedEvent, type CandidateFileEntry, type CandidateFileFamily, type CiteCommitment, type CiteCommitmentOperator, type CiteCommitmentOperatorKind, type CiteContractPolicyActivatedEvent, type CitePolicyActivatedEvent, type CiteTag, type ClaudeHookPathMigratedEvent, type ClaudeSkillPathMigratedEvent, type CodexSkillPathMigratedEvent, type DoctorRunEvent, type DriftDetectedEvent, type EditIntentCheckedEvent, type EventLedgerEvent, type EventLedgerEventInput, type EventLedgerEventType, type EventLedgerTruncatedEvent, type EventsRotatedEvent, type FabricConfigSchemaShape, type FabricEvent, type ForensicAssertion, type ForensicAssertionConfidence, type ForensicAssertionCoverage, type ForensicAssertionType, type ForensicCodeSample, type ForensicEntryPoint, type ForensicEvidenceAnchor, type ForensicFramework, type ForensicReadme, type ForensicReport, type ForensicSamplingBudget, type ForensicTopology, HumanLockEntry, type HumanLockFile, type InitContext, type InitContextDomainGroup, type InitContextFramework, type InitContextInterviewTrailEntry, type InitContextInvariant, type InitContextInvariantConfidenceSnapshot, type InitContextSourceEvidence, type InitScanCompletedEvent, type InstallDiffAppliedEvent, KNOWLEDGE_TEST_INDEX_SCHEMA_VERSION, type KnowledgeArchiveAttemptedEvent, type KnowledgeArchivedEvent, type KnowledgeConsumedEvent, type KnowledgeContextPlannedEvent, type KnowledgeDeferredEvent, type KnowledgeDemotedEvent, type KnowledgeDriftDetectedEvent, type KnowledgeEnrichedEvent, type KnowledgeIdRedirectEvent, type KnowledgeLayerChangedEvent, type KnowledgeMetaAutoHealedEvent, type KnowledgePathDangledEvent, type KnowledgePromoteFailedEvent, type KnowledgePromoteStartedEvent, type KnowledgePromotedEvent, type KnowledgeProposedEvent, type KnowledgeRejectedEvent, type KnowledgeScopeDegradedEvent, type KnowledgeSectionsFetchedEvent, type KnowledgeSelectionEvent, type KnowledgeSlugRenamedEvent, type KnowledgeTestIndex, type KnowledgeTestLink, type KnowledgeTestOrphanAnnotation, KnowledgeType, type KnowledgeUnarchivedEvent, Layer, type LedgerAppendedEvent, LedgerEntry, type LockApprovedEvent, type LockDriftEvent, type McpConfigMigratedEvent, type McpEventLedgerEvent, type MetaReconciledEvent, type MetaReconciledOnStartupEvent, type MetaUpdatedEvent, ONBOARD_SLOT_NAMES, ONBOARD_SLOT_TOTAL, type OnboardSlot, type PanelFieldGroup, type PanelFieldMeta, type ParseCiteLineResult, type PendingAutoArchivedEvent, type ReapplyCompletedEvent, type RelevanceMigrationRunEvent, type ServeLockClearedEvent, type SessionArchiveAttemptedEvent, StableId, type ValidateResult, agentsIdentitySourceSchema, agentsLayerSchema, agentsMetaNodeSchema, agentsMetaSchema, agentsTopologyTypeSchema, aiLedgerEntrySchema, allocateKnowledgeId, assistantTurnObservedEventSchema, bootstrapMarkerMigratedEventSchema, candidateFileEntrySchema, citeContractPolicyActivatedEventSchema, citePolicyActivatedEventSchema, claudeHookPathMigratedEventSchema, claudeSkillPathMigratedEventSchema, codexSkillPathMigratedEventSchema, defaultAgentsMetaCounters, deriveAgentsMetaIdentitySource, deriveAgentsMetaLayer, deriveAgentsMetaStableId, deriveAgentsMetaTopologyType, doctorRunEventSchema, driftDetectedEventSchema, editIntentCheckedEventSchema, eventLedgerEventSchema, eventLedgerTruncatedEventSchema, eventsRotatedEventSchema, fabricConfigSchema, fabricEventSchema, forensicAssertionCoverageSchema, forensicAssertionSchema, forensicCodeSampleSchema, forensicEntryPointSchema, forensicEvidenceAnchorSchema, forensicFrameworkSchema, forensicReadmeSchema, forensicReportSchema, forensicSamplingBudgetSchema, forensicTopologySchema, getPanelFieldByKey, getPanelFields, humanLedgerEntrySchema, humanLockEntrySchema, humanLockFileSchema, initContextDomainGroupSchema, initContextFrameworkSchema, initContextInterviewTrailEntrySchema, initContextInvariantConfidenceSnapshotSchema, initContextInvariantSchema, initContextSchema, initContextSourceEvidenceSchema, initScanCompletedEventSchema, installDiffAppliedEventSchema, isKnowledgeStableId, knowledgeArchiveAttemptedEventSchema, knowledgeArchivedEventSchema, knowledgeConsumedEventSchema, knowledgeContextPlannedEventSchema, knowledgeDeferredEventSchema, knowledgeDemotedEventSchema, knowledgeDriftDetectedEventSchema, knowledgeEnrichedEventSchema, knowledgeIdRedirectEventSchema, knowledgeLayerChangedEventSchema, knowledgeMetaAutoHealedEventSchema, knowledgePathDangledEventSchema, knowledgePromoteFailedEventSchema, knowledgePromoteStartedEventSchema, knowledgePromotedEventSchema, knowledgeProposedEventSchema, knowledgeRejectedEventSchema, knowledgeScopeDegradedEventSchema, knowledgeSectionsFetchedEventSchema, knowledgeSelectionEventSchema, knowledgeSlugRenamedEventSchema, knowledgeTestIndexSchema, knowledgeTestLinkSchema, knowledgeTestOrphanAnnotationSchema, knowledgeUnarchivedEventSchema, ledgerAppendedEventSchema, ledgerEntrySchema, lockApprovedEventSchema, lockDriftEventSchema, mcpConfigMigratedEventSchema, mcpEventLedgerEventSchema, metaReconciledEventSchema, metaReconciledOnStartupEventSchema, metaUpdatedEventSchema, onboardSlotSchema, parseCiteLine, pendingAutoArchivedEventSchema, reapplyCompletedEventSchema, relevanceMigrationRunEventSchema, ruleDescriptionIndexItemSchema, ruleDescriptionSchema, serveLockClearedEventSchema, sessionArchiveAttemptedEventSchema, withDerivedAgentsMetaNodeDefaults };