@fenglimg/fabric-shared 2.0.0-rc.23 → 2.0.0-rc.26

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.
@@ -84,7 +84,9 @@ var planContextInputSchema = z2.object({
84
84
  detected_entities: z2.record(z2.array(z2.string())).optional().describe("Optional path-keyed detected entities for the requirement profile"),
85
85
  client_hash: z2.string().optional().describe("Revision hash from a prior fab_plan_context response; enables stale detection"),
86
86
  correlation_id: z2.string().optional().describe("Optional caller-provided correlation id for Event Ledger records"),
87
- session_id: z2.string().optional().describe("Optional caller-provided session id for Event Ledger records"),
87
+ session_id: z2.string().optional().describe(
88
+ "Recommended: pass the current client session id (Claude Code: $session_id; Codex: corresponding identifier) \u2014 enables cross-session debt tracking in fab doctor and accurate archive-hint cross-session count. Falls back gracefully if omitted."
89
+ ),
88
90
  // v2.0-rc.5 A3 (TASK-007): `include_deprecated` removed — it was a no-op
89
91
  // placeholder (MaturitySchema has no `deprecated` value). When the maturity
90
92
  // enum widens we re-introduce the flag as part of that protocol bump.
@@ -526,6 +528,57 @@ var fabReviewAnnotations = {
526
528
  openWorldHint: false,
527
529
  title: "Review pending knowledge entries"
528
530
  };
531
+ var citeContractMetricsSchema = z2.object({
532
+ decisions_cited: z2.number().int().nonnegative(),
533
+ pitfalls_cited: z2.number().int().nonnegative(),
534
+ contract_with: z2.number().int().nonnegative(),
535
+ contract_missing: z2.number().int().nonnegative(),
536
+ hard_violated: z2.number().int().nonnegative(),
537
+ cite_id_unresolved: z2.number().int().nonnegative(),
538
+ skip_count: z2.record(z2.string(), z2.number().int().nonnegative())
539
+ });
540
+ var citeLayerTypeBreakdownSchema = z2.object({
541
+ team: z2.record(z2.string(), z2.number().int().nonnegative()),
542
+ personal: z2.record(z2.string(), z2.number().int().nonnegative())
543
+ });
544
+ var citeCoverageReportSchema = z2.object({
545
+ status: z2.enum(["ok", "skipped"]),
546
+ marker_ts: z2.number().int().nonnegative(),
547
+ marker_emitted_now: z2.boolean(),
548
+ since_ts: z2.number().int().nonnegative(),
549
+ client_filter: z2.enum(["cc", "codex", "cursor", "all"]),
550
+ // v2.0.0-rc.24 TASK-08: layer filter discriminator. Optional so pre-TASK-10
551
+ // CLI callers (which never set the flag) still parse. Defaults to "all" at
552
+ // the service layer.
553
+ layer_filter: z2.enum(["team", "personal", "all"]).optional(),
554
+ metrics: z2.object({
555
+ edits_touched: z2.number().int().nonnegative(),
556
+ qualifying_cites: z2.number().int().nonnegative(),
557
+ recalled_unverified: z2.number().int().nonnegative(),
558
+ expected_but_missed: z2.number().int().nonnegative(),
559
+ total_turns: z2.number().int().nonnegative()
560
+ }),
561
+ per_client: z2.record(
562
+ z2.string(),
563
+ z2.object({
564
+ edits_touched: z2.number().int().nonnegative().optional(),
565
+ qualifying_cites: z2.number().int().nonnegative().optional(),
566
+ recalled_unverified: z2.number().int().nonnegative().optional(),
567
+ expected_but_missed: z2.number().int().nonnegative().optional(),
568
+ total_turns: z2.number().int().nonnegative().optional()
569
+ })
570
+ ).optional(),
571
+ dismissed_reason_histogram: z2.record(z2.string(), z2.number().int().nonnegative()).optional(),
572
+ none_reason_histogram: z2.record(z2.string(), z2.number().int().nonnegative()).optional(),
573
+ // v2.0.0-rc.24 TASK-08: contract-policy audit metrics. Status discriminates
574
+ // populated vs degraded modes. contract_metrics + per_layer_type are emitted
575
+ // (zeroed) in degraded modes so the renderer iterates one stable shape.
576
+ contract_metrics_status: z2.enum(["ok", "skipped:bootstrap_drift", "awaiting_marker"]).optional(),
577
+ contract_metrics: citeContractMetricsSchema.optional(),
578
+ per_layer_type: citeLayerTypeBreakdownSchema.optional(),
579
+ contract_marker_ts: z2.number().int().nonnegative().optional(),
580
+ generated_at: z2.string()
581
+ });
529
582
  var ledgerSourceSchema = z2.enum(["ai", "human"]);
530
583
  var timestampFilterSchema = z2.preprocess((value) => {
531
584
  if (value === void 0 || value === null || value === "") {
@@ -654,6 +707,9 @@ export {
654
707
  FabReviewOutputSchema,
655
708
  FabReviewOutputShape,
656
709
  fabReviewAnnotations,
710
+ citeContractMetricsSchema,
711
+ citeLayerTypeBreakdownSchema,
712
+ citeCoverageReportSchema,
657
713
  ledgerSourceSchema,
658
714
  ledgerQuerySchema,
659
715
  historyStateQuerySchema,
@@ -14,15 +14,45 @@ var BOOTSTRAP_CANONICAL = `# Fabric Bootstrap
14
14
  - **\`.fabric/agents.meta.json\` \u4E25\u7981\u624B\u52A8\u7F16\u8F91**;engine \u4F1A\u81EA\u52A8\u540C\u6B65\u6D3E\u751F\u72B6\u6001,\u663E\u5F0F reconcile \u8DD1 \`fab doctor --fix\`\u3002
15
15
 
16
16
  ## \u77E5\u8BC6\u5E93(KB)
17
- - **Discovery**:SessionStart hook \u5217 broad-scoped \u6761\u76EE;edit \u6587\u4EF6\u65F6 PreToolUse hook \u53EF\u80FD\u89E6\u53D1 narrow hint\u3002
17
+ - **Discovery**:SessionStart hook \u5217 broad-scoped \u6761\u76EE(\u542B personal layer \`KP-*\` \u6761\u76EE,\u5F15\u7528\u65B9\u5F0F\u76F8\u540C);edit \u6587\u4EF6\u65F6 PreToolUse hook \u53EF\u80FD\u89E6\u53D1 narrow hint\u3002
18
18
  - **Usage**:\u4E24\u6B65\u5F0F\u2014\u2014\`fab_plan_context(paths=[...])\` \u8FD4\u56DE \`selection_token\` + \u5019\u9009 entries,\u518D \`fab_get_knowledge_sections({ selection_token, ai_selected_stable_ids: [<id>...] })\` \u62C9\u5168\u6587;\`selection_token\` \u5FC5\u987B\u6765\u81EA\u6700\u8FD1\u4E00\u6B21 \`fab_plan_context\`,\u4E0D\u53EF\u51ED\u7A7A\u7F16\u9020\u3002
19
+ - **session_id**: \u8C03\u7528 \`fab_plan_context\` \u65F6, \u52A1\u5FC5\u628A\u5F53\u524D client session id \u4F5C\u4E3A \`session_id\` \u53C2\u6570\u4F20\u5165(Claude Code \u7684 session id \u5728 stdin payload \u4E2D, Codex \u7684\u5BF9\u5E94 identifier \u540C\u7406)\u3002\u8FD9\u80FD\u8BA9 \`fab doctor --archive-history\` \u4E0E archive-hint hook \u51C6\u786E\u8BC6\u522B\u8DE8\u4F1A\u8BDD debt \u72B6\u6001\u3002
19
20
  - **Write flows**:\`fabric-archive\` / \`fabric-review\` / \`fabric-import\` \u4E09\u4E2A Skills\u3002
20
21
  - **Language**:\u6E32\u67D3\u6309 \`.fabric/fabric-config.json\` \u7684 \`fabric_language\` \u5B57\u6BB5\u3002
21
22
 
23
+ ## Self-archive policy
24
+
25
+ - **\u89E6\u53D1**: \u672C\u4F1A\u8BDD\u51FA\u73B0\u4EE5\u4E0B\u4EFB\u4E00\u4FE1\u53F7, \u5728\u8BE5 turn \u56DE\u590D\u672B\u5C3E\u81EA\u4E3B\u8C03\u7528 \`fabric-archive\` skill (E3-strong mode):
26
+ 1. **Normative \u8BED\u8A00** \u2014 \u7528\u6237\u6D88\u606F\u51FA\u73B0 \`\u4EE5\u540E\` / \`always\` / \`never\` / \`from now on\` / \`\u4E0B\u6B21\u6CE8\u610F\` / \`\u8BB0\u4E00\u4E0B\` / \`\u6C38\u8FDC\u4E0D\u8981\`
27
+ 2. **Wrong-turn-and-revert** \u2014 AI \u5C1D\u8BD5 path X, \u53CD\u601D\u540E\u6539\u8D70 path Y (\u5C24\u5176\u5F53 path X \u662F\u975E\u663E\u7136\u8E29\u5751)
28
+ 3. **Decision confirmation** \u2014 \u7528\u6237\u5728 \u22652 \u5019\u9009\u4E2D\u6743\u8861\u540E\u7ED9\u51FA rationale \u9501\u5B9A\u65B9\u5411
29
+ 4. **Explicit dismissal with reason** \u2014 \u7528\u6237\u62D2\u4E86\u67D0\u5EFA\u8BAE**\u5E76**\u8BF4\u4E86\u539F\u56E0
30
+
31
+ - **Anti-trigger** (\u660E\u786E\u4E0D\u89E6\u53D1):
32
+ - \u7528\u6237\u7EAF\u8BE2\u95EE (\u65E0 normative \u8868\u8FBE)
33
+ - \u7B80\u5355 refactor / typo fix
34
+ - AI \u81EA\u5DF1\u4EA7\u751F\u7684'\u6D1E\u5BDF' (\u5FC5\u987B\u7531\u7528\u6237\u6D88\u606F\u4E2D\u4FE1\u53F7\u89E6\u53D1)
35
+
36
+ - **Anti-loop \u4E09\u6761\u9632\u62A4**:
37
+ - \u540C turn \u6700\u591A\u81EA\u8C03 1 \u6B21
38
+ - \u540C session \u540C outcome \u4E0D\u91CD\u590D (\u82E5 user_dismissed, \u672C\u4F1A\u8BDD\u4E0D\u518D\u81EA\u8C03\u76F8\u540C\u4E3B\u9898)
39
+ - Phase 0.5 viability gate \u515C\u5E95 (skill \u5185\u90E8\u4ECD\u8DD1 gate, AI \u5224\u9519\u4E0D\u4F1A\u4E71\u5199 pending)
40
+
41
+ - **\u5448\u73B0\u6A21\u677F** (turn \u672B\u5C3E\u63D2\u5165, \u4E24\u884C: \u5148 marker \u884C\u4F9B Phase 0.4 \u68C0\u6D4B, \u518D user-facing \u63D0\u793A):
42
+ \`\`\`
43
+ self-archive policy triggered by signal: <Normative|Wrong-turn-and-revert|Decision confirmation|Explicit dismissal>
44
+ \u987A\u624B\u5F52\u6863: \u6CE8\u610F\u5230\u4F60\u8BF4 \`<\u89E6\u53D1\u77ED\u8BED>\`, \u5DF2\u8C03\u7528 fabric-archive \u6293 N \u6761\u5019\u9009 \u2192 .fabric/knowledge/pending/...
45
+ \u82E5\u4E0D\u8BE5\u8BB0, \u7B54 '\u64A4\u9500' \u6211\u4F1A\u8C03 fab_review reject\u3002
46
+ \`\`\`
47
+ \u7B2C\u4E00\u884C\u662F Phase 0.4 Trigger Gate \u7528\u6765\u8BC6\u522B E3 \u5165\u53E3\u7684 structured marker (verbatim \u5B57\u7B26\u4E32 \`self-archive policy triggered by signal\`, \u540E\u63A5\u5192\u53F7 + \u89E6\u53D1\u4FE1\u53F7\u540D)\u3002\u7B2C\u4E8C\u884C\u8D77\u662F\u7ED9\u7528\u6237\u770B\u7684\u4E2D\u6587\u63D0\u793A\u3002\u4E24\u884C\u90FD\u5FC5\u987B\u51FA\u73B0; \u7F3A marker \u884C Phase 0.4 \u65E0\u6CD5\u8DEF\u7531\u5230 E3_ai_self_trigger\u3002
48
+
22
49
  ## Cite policy
23
50
 
24
51
  - **\u89E6\u53D1**: \u505A edit / decide / propose plan \u4E4B\u524D,**\u56DE\u590D\u9996\u884C**\u5FC5\u987B\u5199 \`KB: <id> (<\u22648\u5B57 \u7528\u6CD5>) [planned|recalled|chained-from <id>|dismissed:<reason>]\` \u6216 \`KB: none [<reason>]\`\u3002
25
52
  - **\`[recalled]\` \u9A8C\u8BC1**: \u5FC5\u987B\u7D27\u8DDF\u4E24\u6B65\u8C03\u7528\u2014\u2014\u5148 \`fab_plan_context(paths=[...])\` \u62FF \`selection_token\`,\u518D \`fab_get_knowledge_sections({ selection_token, ai_selected_stable_ids: [<id>] })\`,\u9632\u6B62\u7F16\u9020 id\u3002
53
+ - **contract \u8BED\u6CD5**: decisions/pitfalls \u7C7B\u5F15\u7528\u5FC5\u987B\u5728\u5C3E\u6BB5\u52A0 contract: \`\u2192 <operator> [<operator> ...]\`,operator \u2208 {\`edit:<glob>\` \`!edit:<glob>\` \`require:<symbol>\` \`forbid:<symbol>\` \`skip:<reason>\`}\u3002\u4F8B:\`KB: K-001 (auth) [planned] \u2192 edit:src/auth/**/*.ts !edit:src/legacy/**\`\u3002
54
+ - **skip reason \u8BCD\u5178**: \`sequencing | conditional | semantic | aesthetic | architectural | other:<text>\`\u3002
55
+ - **type \u8DEF\u7531**: models \u7C7B\u5F15\u7528\u4E3A reference cite,\u4E0D\u9700\u8981 contract;guidelines/processes \u7C7B\u6682\u4E0D\u5F3A\u5236,\u63A8\u540E LLM-judge\u3002
26
56
  - **\u7528\u6237\u53E3\u5934\u63D0\u89C4\u5219\u6CA1\u7ED9 id**: \u5148\u8C03 \`fab_extract_knowledge\` \u6216 \`search_context\` \u53CD\u67E5\u3002
27
57
  - **dismissed reason**: \u679A\u4E3E \`scope-mismatch | outdated | not-applicable | other:<text>\`\u3002
28
58
  - **\`KB: none\` sentinel**: \u679A\u4E3E\u4E24\u79CD\u5408\u89C4\u7406\u7531\u2014\u2014\`[no-relevant]\` \u5DF2\u8C03 \`fab_plan_context\`(\u6216 hook \u8F93\u51FA\u53EF\u89C1)\u4F46\u65E0\u53EF\u7528\u6761\u76EE;\`[not-applicable]\` \u5F53\u524D\u52A8\u4F5C\u4E0D\u5728 cite \u8303\u56F4(\u7EAF\u63A2\u7D22 / Bash \u53EA\u8BFB / \u7528\u6237\u95EE\u7B54)\u3002\u88F8 \`KB: none\`(\u65E0\u540E\u7F00)\u4ECD\u7136 valid,\u5F52\u7C7B\u4E3A \`[unspecified]\`(legacy \u517C\u5BB9,\u9F13\u52B1\u540E\u7EED\u8865\u6CE8)\u3002