briefops 2.0.0 → 2.1.1

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +40 -1
  3. package/dist/cli.js +4 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/doctor.js +27 -0
  6. package/dist/commands/doctor.js.map +1 -1
  7. package/dist/commands/harness.d.ts +2 -0
  8. package/dist/commands/harness.js +56 -0
  9. package/dist/commands/harness.js.map +1 -0
  10. package/dist/commands/memory.js +20 -3
  11. package/dist/commands/memory.js.map +1 -1
  12. package/dist/commands/obs.d.ts +2 -0
  13. package/dist/commands/obs.js +51 -0
  14. package/dist/commands/obs.js.map +1 -0
  15. package/dist/core/codexPlugin.js +40 -0
  16. package/dist/core/codexPlugin.js.map +1 -1
  17. package/dist/core/harness.d.ts +27 -0
  18. package/dist/core/harness.js +342 -0
  19. package/dist/core/harness.js.map +1 -0
  20. package/dist/core/lock.d.ts +1 -0
  21. package/dist/core/lock.js +18 -4
  22. package/dist/core/lock.js.map +1 -1
  23. package/dist/core/memory.d.ts +4 -1
  24. package/dist/core/memory.js +54 -2
  25. package/dist/core/memory.js.map +1 -1
  26. package/dist/core/memoryHygiene.d.ts +11 -0
  27. package/dist/core/memoryHygiene.js +93 -0
  28. package/dist/core/memoryHygiene.js.map +1 -1
  29. package/dist/core/memoryProposal.js +21 -8
  30. package/dist/core/memoryProposal.js.map +1 -1
  31. package/dist/core/observability.d.ts +36 -0
  32. package/dist/core/observability.js +70 -0
  33. package/dist/core/observability.js.map +1 -0
  34. package/dist/core/securityDoctor.js +3 -5
  35. package/dist/core/securityDoctor.js.map +1 -1
  36. package/dist/core/strictDoctor.d.ts +22 -0
  37. package/dist/core/strictDoctor.js +95 -0
  38. package/dist/core/strictDoctor.js.map +1 -0
  39. package/dist/schemas/memory.d.ts +100 -0
  40. package/dist/schemas/memory.js +9 -1
  41. package/dist/schemas/memory.js.map +1 -1
  42. package/dist/schemas/memoryProposal.d.ts +115 -0
  43. package/dist/schemas/memoryProposal.js +2 -1
  44. package/dist/schemas/memoryProposal.js.map +1 -1
  45. package/dist/version.d.ts +1 -1
  46. package/dist/version.js +1 -1
  47. package/docs/compatibility.md +7 -3
  48. package/docs/file-format.md +3 -1
  49. package/docs/impact-report.md +140 -0
  50. package/docs/integrations/harnesses.md +9 -0
  51. package/docs/master-harness.md +610 -0
  52. package/docs/privacy-model.md +2 -0
  53. package/docs/quickstart.md +17 -0
  54. package/docs/release-checklist.md +16 -2
  55. package/docs/roadmap.md +12 -5
  56. package/docs/token-budget.md +8 -0
  57. package/package.json +2 -2
  58. package/plugins/briefops-codex/.codex-plugin/plugin.json +2 -1
  59. package/plugins/briefops-codex/README.md +2 -0
  60. package/plugins/briefops-codex/skills/briefops-route-task/SKILL.md +33 -0
@@ -2,6 +2,25 @@ import { z } from "zod";
2
2
  export declare const memoryItemTypes: readonly ["fact", "decision", "lesson", "incident", "deprecated"];
3
3
  export declare const memoryStatuses: readonly ["active", "stale", "deprecated", "superseded", "archived"];
4
4
  export declare const memoryVisibilities: readonly ["private", "shared", "public"];
5
+ export declare const memoryEvidenceSchema: z.ZodObject<{
6
+ path: z.ZodString;
7
+ start_line: z.ZodOptional<z.ZodNumber>;
8
+ end_line: z.ZodOptional<z.ZodNumber>;
9
+ sha256: z.ZodOptional<z.ZodString>;
10
+ note: z.ZodOptional<z.ZodString>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ path: string;
13
+ start_line?: number | undefined;
14
+ end_line?: number | undefined;
15
+ sha256?: string | undefined;
16
+ note?: string | undefined;
17
+ }, {
18
+ path: string;
19
+ start_line?: number | undefined;
20
+ end_line?: number | undefined;
21
+ sha256?: string | undefined;
22
+ note?: string | undefined;
23
+ }>;
5
24
  export declare const memoryItemSchema: z.ZodObject<{
6
25
  id: z.ZodString;
7
26
  type: z.ZodEnum<["fact", "decision", "lesson", "incident", "deprecated"]>;
@@ -14,6 +33,25 @@ export declare const memoryItemSchema: z.ZodObject<{
14
33
  tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
15
34
  visibility: z.ZodDefault<z.ZodEnum<["private", "shared", "public"]>>;
16
35
  exportable: z.ZodDefault<z.ZodBoolean>;
36
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
37
+ path: z.ZodString;
38
+ start_line: z.ZodOptional<z.ZodNumber>;
39
+ end_line: z.ZodOptional<z.ZodNumber>;
40
+ sha256: z.ZodOptional<z.ZodString>;
41
+ note: z.ZodOptional<z.ZodString>;
42
+ }, "strip", z.ZodTypeAny, {
43
+ path: string;
44
+ start_line?: number | undefined;
45
+ end_line?: number | undefined;
46
+ sha256?: string | undefined;
47
+ note?: string | undefined;
48
+ }, {
49
+ path: string;
50
+ start_line?: number | undefined;
51
+ end_line?: number | undefined;
52
+ sha256?: string | undefined;
53
+ note?: string | undefined;
54
+ }>, "many">>;
17
55
  }, "strip", z.ZodTypeAny, {
18
56
  id: string;
19
57
  created_at: string;
@@ -24,6 +62,13 @@ export declare const memoryItemSchema: z.ZodObject<{
24
62
  tags: string[];
25
63
  visibility: "private" | "shared" | "public";
26
64
  exportable: boolean;
65
+ evidence: {
66
+ path: string;
67
+ start_line?: number | undefined;
68
+ end_line?: number | undefined;
69
+ sha256?: string | undefined;
70
+ note?: string | undefined;
71
+ }[];
27
72
  project?: string | undefined;
28
73
  skill?: string | undefined;
29
74
  }, {
@@ -38,6 +83,13 @@ export declare const memoryItemSchema: z.ZodObject<{
38
83
  tags?: string[] | undefined;
39
84
  visibility?: "private" | "shared" | "public" | undefined;
40
85
  exportable?: boolean | undefined;
86
+ evidence?: {
87
+ path: string;
88
+ start_line?: number | undefined;
89
+ end_line?: number | undefined;
90
+ sha256?: string | undefined;
91
+ note?: string | undefined;
92
+ }[] | undefined;
41
93
  }>;
42
94
  export declare const memoryFileSchema: z.ZodObject<{
43
95
  items: z.ZodDefault<z.ZodArray<z.ZodObject<{
@@ -52,6 +104,25 @@ export declare const memoryFileSchema: z.ZodObject<{
52
104
  tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
53
105
  visibility: z.ZodDefault<z.ZodEnum<["private", "shared", "public"]>>;
54
106
  exportable: z.ZodDefault<z.ZodBoolean>;
107
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
108
+ path: z.ZodString;
109
+ start_line: z.ZodOptional<z.ZodNumber>;
110
+ end_line: z.ZodOptional<z.ZodNumber>;
111
+ sha256: z.ZodOptional<z.ZodString>;
112
+ note: z.ZodOptional<z.ZodString>;
113
+ }, "strip", z.ZodTypeAny, {
114
+ path: string;
115
+ start_line?: number | undefined;
116
+ end_line?: number | undefined;
117
+ sha256?: string | undefined;
118
+ note?: string | undefined;
119
+ }, {
120
+ path: string;
121
+ start_line?: number | undefined;
122
+ end_line?: number | undefined;
123
+ sha256?: string | undefined;
124
+ note?: string | undefined;
125
+ }>, "many">>;
55
126
  }, "strip", z.ZodTypeAny, {
56
127
  id: string;
57
128
  created_at: string;
@@ -62,6 +133,13 @@ export declare const memoryFileSchema: z.ZodObject<{
62
133
  tags: string[];
63
134
  visibility: "private" | "shared" | "public";
64
135
  exportable: boolean;
136
+ evidence: {
137
+ path: string;
138
+ start_line?: number | undefined;
139
+ end_line?: number | undefined;
140
+ sha256?: string | undefined;
141
+ note?: string | undefined;
142
+ }[];
65
143
  project?: string | undefined;
66
144
  skill?: string | undefined;
67
145
  }, {
@@ -76,6 +154,13 @@ export declare const memoryFileSchema: z.ZodObject<{
76
154
  tags?: string[] | undefined;
77
155
  visibility?: "private" | "shared" | "public" | undefined;
78
156
  exportable?: boolean | undefined;
157
+ evidence?: {
158
+ path: string;
159
+ start_line?: number | undefined;
160
+ end_line?: number | undefined;
161
+ sha256?: string | undefined;
162
+ note?: string | undefined;
163
+ }[] | undefined;
79
164
  }>, "many">>;
80
165
  }, "strip", z.ZodTypeAny, {
81
166
  items: {
@@ -88,6 +173,13 @@ export declare const memoryFileSchema: z.ZodObject<{
88
173
  tags: string[];
89
174
  visibility: "private" | "shared" | "public";
90
175
  exportable: boolean;
176
+ evidence: {
177
+ path: string;
178
+ start_line?: number | undefined;
179
+ end_line?: number | undefined;
180
+ sha256?: string | undefined;
181
+ note?: string | undefined;
182
+ }[];
91
183
  project?: string | undefined;
92
184
  skill?: string | undefined;
93
185
  }[];
@@ -104,9 +196,17 @@ export declare const memoryFileSchema: z.ZodObject<{
104
196
  tags?: string[] | undefined;
105
197
  visibility?: "private" | "shared" | "public" | undefined;
106
198
  exportable?: boolean | undefined;
199
+ evidence?: {
200
+ path: string;
201
+ start_line?: number | undefined;
202
+ end_line?: number | undefined;
203
+ sha256?: string | undefined;
204
+ note?: string | undefined;
205
+ }[] | undefined;
107
206
  }[] | undefined;
108
207
  }>;
109
208
  export type MemoryItem = z.infer<typeof memoryItemSchema>;
209
+ export type MemoryEvidence = z.infer<typeof memoryEvidenceSchema>;
110
210
  export type MemoryStatus = (typeof memoryStatuses)[number];
111
211
  export type MemoryVisibility = (typeof memoryVisibilities)[number];
112
212
  export type MemoryFile = z.infer<typeof memoryFileSchema>;
@@ -2,6 +2,13 @@ import { z } from "zod";
2
2
  export const memoryItemTypes = ["fact", "decision", "lesson", "incident", "deprecated"];
3
3
  export const memoryStatuses = ["active", "stale", "deprecated", "superseded", "archived"];
4
4
  export const memoryVisibilities = ["private", "shared", "public"];
5
+ export const memoryEvidenceSchema = z.object({
6
+ path: z.string().min(1),
7
+ start_line: z.number().int().positive().optional(),
8
+ end_line: z.number().int().positive().optional(),
9
+ sha256: z.string().min(6).optional(),
10
+ note: z.string().optional()
11
+ });
5
12
  export const memoryItemSchema = z.object({
6
13
  id: z.string().min(1),
7
14
  type: z.enum(memoryItemTypes),
@@ -13,7 +20,8 @@ export const memoryItemSchema = z.object({
13
20
  created_at: z.string().datetime(),
14
21
  tags: z.array(z.string()).default([]),
15
22
  visibility: z.enum(memoryVisibilities).default("private"),
16
- exportable: z.boolean().default(false)
23
+ exportable: z.boolean().default(false),
24
+ evidence: z.array(memoryEvidenceSchema).default([])
17
25
  });
18
26
  export const memoryFileSchema = z.object({
19
27
  items: z.array(memoryItemSchema).default([])
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/schemas/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAU,CAAC;AACjG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AACnG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAE3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACzD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC,CAAC"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/schemas/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAU,CAAC;AACjG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAU,CAAC;AACnG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAE3E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACzD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC,CAAC"}
@@ -9,6 +9,25 @@ export declare const memoryProposalEntrySchema: z.ZodEffects<z.ZodObject<{
9
9
  tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
10
10
  visibility: z.ZodDefault<z.ZodEnum<["private", "shared", "public"]>>;
11
11
  exportable: z.ZodDefault<z.ZodBoolean>;
12
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
13
+ path: z.ZodString;
14
+ start_line: z.ZodOptional<z.ZodNumber>;
15
+ end_line: z.ZodOptional<z.ZodNumber>;
16
+ sha256: z.ZodOptional<z.ZodString>;
17
+ note: z.ZodOptional<z.ZodString>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ path: string;
20
+ start_line?: number | undefined;
21
+ end_line?: number | undefined;
22
+ sha256?: string | undefined;
23
+ note?: string | undefined;
24
+ }, {
25
+ path: string;
26
+ start_line?: number | undefined;
27
+ end_line?: number | undefined;
28
+ sha256?: string | undefined;
29
+ note?: string | undefined;
30
+ }>, "many">>;
12
31
  rationale: z.ZodDefault<z.ZodString>;
13
32
  }, "strip", z.ZodTypeAny, {
14
33
  type: "deprecated" | "fact" | "decision" | "lesson" | "incident";
@@ -17,6 +36,13 @@ export declare const memoryProposalEntrySchema: z.ZodEffects<z.ZodObject<{
17
36
  tags: string[];
18
37
  visibility: "private" | "shared" | "public";
19
38
  exportable: boolean;
39
+ evidence: {
40
+ path: string;
41
+ start_line?: number | undefined;
42
+ end_line?: number | undefined;
43
+ sha256?: string | undefined;
44
+ note?: string | undefined;
45
+ }[];
20
46
  rationale: string;
21
47
  source?: string | undefined;
22
48
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
@@ -28,6 +54,13 @@ export declare const memoryProposalEntrySchema: z.ZodEffects<z.ZodObject<{
28
54
  tags?: string[] | undefined;
29
55
  visibility?: "private" | "shared" | "public" | undefined;
30
56
  exportable?: boolean | undefined;
57
+ evidence?: {
58
+ path: string;
59
+ start_line?: number | undefined;
60
+ end_line?: number | undefined;
61
+ sha256?: string | undefined;
62
+ note?: string | undefined;
63
+ }[] | undefined;
31
64
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
32
65
  rationale?: string | undefined;
33
66
  }>, {
@@ -38,6 +71,13 @@ export declare const memoryProposalEntrySchema: z.ZodEffects<z.ZodObject<{
38
71
  tags: string[];
39
72
  visibility: "private" | "shared" | "public";
40
73
  exportable: boolean;
74
+ evidence: {
75
+ path: string;
76
+ start_line?: number | undefined;
77
+ end_line?: number | undefined;
78
+ sha256?: string | undefined;
79
+ note?: string | undefined;
80
+ }[];
41
81
  rationale: string;
42
82
  source?: string | undefined;
43
83
  }, {
@@ -48,6 +88,13 @@ export declare const memoryProposalEntrySchema: z.ZodEffects<z.ZodObject<{
48
88
  tags?: string[] | undefined;
49
89
  visibility?: "private" | "shared" | "public" | undefined;
50
90
  exportable?: boolean | undefined;
91
+ evidence?: {
92
+ path: string;
93
+ start_line?: number | undefined;
94
+ end_line?: number | undefined;
95
+ sha256?: string | undefined;
96
+ note?: string | undefined;
97
+ }[] | undefined;
51
98
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
52
99
  rationale?: string | undefined;
53
100
  }>;
@@ -68,6 +115,25 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
68
115
  tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
69
116
  visibility: z.ZodDefault<z.ZodEnum<["private", "shared", "public"]>>;
70
117
  exportable: z.ZodDefault<z.ZodBoolean>;
118
+ evidence: z.ZodDefault<z.ZodArray<z.ZodObject<{
119
+ path: z.ZodString;
120
+ start_line: z.ZodOptional<z.ZodNumber>;
121
+ end_line: z.ZodOptional<z.ZodNumber>;
122
+ sha256: z.ZodOptional<z.ZodString>;
123
+ note: z.ZodOptional<z.ZodString>;
124
+ }, "strip", z.ZodTypeAny, {
125
+ path: string;
126
+ start_line?: number | undefined;
127
+ end_line?: number | undefined;
128
+ sha256?: string | undefined;
129
+ note?: string | undefined;
130
+ }, {
131
+ path: string;
132
+ start_line?: number | undefined;
133
+ end_line?: number | undefined;
134
+ sha256?: string | undefined;
135
+ note?: string | undefined;
136
+ }>, "many">>;
71
137
  rationale: z.ZodDefault<z.ZodString>;
72
138
  }, "strip", z.ZodTypeAny, {
73
139
  type: "deprecated" | "fact" | "decision" | "lesson" | "incident";
@@ -76,6 +142,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
76
142
  tags: string[];
77
143
  visibility: "private" | "shared" | "public";
78
144
  exportable: boolean;
145
+ evidence: {
146
+ path: string;
147
+ start_line?: number | undefined;
148
+ end_line?: number | undefined;
149
+ sha256?: string | undefined;
150
+ note?: string | undefined;
151
+ }[];
79
152
  rationale: string;
80
153
  source?: string | undefined;
81
154
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
@@ -87,6 +160,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
87
160
  tags?: string[] | undefined;
88
161
  visibility?: "private" | "shared" | "public" | undefined;
89
162
  exportable?: boolean | undefined;
163
+ evidence?: {
164
+ path: string;
165
+ start_line?: number | undefined;
166
+ end_line?: number | undefined;
167
+ sha256?: string | undefined;
168
+ note?: string | undefined;
169
+ }[] | undefined;
90
170
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
91
171
  rationale?: string | undefined;
92
172
  }>, {
@@ -97,6 +177,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
97
177
  tags: string[];
98
178
  visibility: "private" | "shared" | "public";
99
179
  exportable: boolean;
180
+ evidence: {
181
+ path: string;
182
+ start_line?: number | undefined;
183
+ end_line?: number | undefined;
184
+ sha256?: string | undefined;
185
+ note?: string | undefined;
186
+ }[];
100
187
  rationale: string;
101
188
  source?: string | undefined;
102
189
  }, {
@@ -107,6 +194,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
107
194
  tags?: string[] | undefined;
108
195
  visibility?: "private" | "shared" | "public" | undefined;
109
196
  exportable?: boolean | undefined;
197
+ evidence?: {
198
+ path: string;
199
+ start_line?: number | undefined;
200
+ end_line?: number | undefined;
201
+ sha256?: string | undefined;
202
+ note?: string | undefined;
203
+ }[] | undefined;
110
204
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
111
205
  rationale?: string | undefined;
112
206
  }>, "many">>;
@@ -124,6 +218,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
124
218
  tags: string[];
125
219
  visibility: "private" | "shared" | "public";
126
220
  exportable: boolean;
221
+ evidence: {
222
+ path: string;
223
+ start_line?: number | undefined;
224
+ end_line?: number | undefined;
225
+ sha256?: string | undefined;
226
+ note?: string | undefined;
227
+ }[];
127
228
  rationale: string;
128
229
  source?: string | undefined;
129
230
  }[];
@@ -149,6 +250,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
149
250
  tags?: string[] | undefined;
150
251
  visibility?: "private" | "shared" | "public" | undefined;
151
252
  exportable?: boolean | undefined;
253
+ evidence?: {
254
+ path: string;
255
+ start_line?: number | undefined;
256
+ end_line?: number | undefined;
257
+ sha256?: string | undefined;
258
+ note?: string | undefined;
259
+ }[] | undefined;
152
260
  category?: "facts" | "decisions" | "lessons" | "incidents" | "deprecated" | undefined;
153
261
  rationale?: string | undefined;
154
262
  }[] | undefined;
@@ -166,6 +274,13 @@ export declare const memoryProposalSchema: z.ZodEffects<z.ZodObject<{
166
274
  tags: string[];
167
275
  visibility: "private" | "shared" | "public";
168
276
  exportable: boolean;
277
+ evidence: {
278
+ path: string;
279
+ start_line?: number | undefined;
280
+ end_line?: number | undefined;
281
+ sha256?: string | undefined;
282
+ note?: string | undefined;
283
+ }[];
169
284
  rationale: string;
170
285
  source?: string | undefined;
171
286
  }[];
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { memoryCategories } from "../core/paths.js";
3
- import { memoryItemTypes, memoryStatuses, memoryVisibilities } from "./memory.js";
3
+ import { memoryEvidenceSchema, memoryItemTypes, memoryStatuses, memoryVisibilities } from "./memory.js";
4
4
  export const memoryProposalStatuses = ["proposed", "applied", "rejected"];
5
5
  export const memoryProposalEntrySchema = z.object({
6
6
  category: z.enum(memoryCategories).optional(),
@@ -11,6 +11,7 @@ export const memoryProposalEntrySchema = z.object({
11
11
  tags: z.array(z.string()).default([]),
12
12
  visibility: z.enum(memoryVisibilities).default("private"),
13
13
  exportable: z.boolean().default(false),
14
+ evidence: z.array(memoryEvidenceSchema).default([]),
14
15
  rationale: z.string().default("")
15
16
  }).transform((entry) => ({
16
17
  ...entry,
@@ -1 +1 @@
1
- {"version":3,"file":"memoryProposal.js","sourceRoot":"","sources":["../../src/schemas/memoryProposal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAElF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAEnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;IAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACzD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAClC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvB,GAAG,KAAK;IACR,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAK;QAC3B,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,WAAW;QACrB,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,WAAW;QACrB,UAAU,EAAE,YAAY;KACf,CAAC,KAAK,CAAC,IAAI,CAAC;CACxB,CAAC,CAAC,CAAC;AAEJ,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;IACzD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,EAAE,uBAAuB,CAAC,CAAC"}
1
+ {"version":3,"file":"memoryProposal.js","sourceRoot":"","sources":["../../src/schemas/memoryProposal.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const briefopsVersion = "2.0.0";
1
+ export declare const briefopsVersion = "2.1.1";
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Keep this version in sync with package.json.
2
- export const briefopsVersion = "2.0.0";
2
+ export const briefopsVersion = "2.1.1";
3
3
  //# sourceMappingURL=version.js.map
@@ -1,8 +1,8 @@
1
- # BriefOps 2.0 Compatibility Policy
1
+ # BriefOps 2.1.1 Compatibility Policy
2
2
 
3
3
  BriefOps follows semantic versioning for the public CLI and local file formats.
4
4
 
5
- ## Stable In 2.0
5
+ ## Stable In 2.1.x
6
6
 
7
7
  - Public commands documented in `README.md`.
8
8
  - `.briefops/` source file formats documented in `docs/file-format.md`.
@@ -10,6 +10,10 @@ BriefOps follows semantic versioning for the public CLI and local file formats.
10
10
  - Directory-local memory promotion from `finish`, plus reviewable memory proposal and skill patch flows.
11
11
  - Workspace lock behavior for local write operations.
12
12
  - Harness router export targets: `agents-md`, `claude-md`, `cursor-rules`, and `all`.
13
+ - Master Harness routing commands: `briefops harness route` and `briefops harness matrix`.
14
+ - Read-only continuity observability through `briefops obs continuity`.
15
+ - Strict local release-readiness aggregation through `briefops doctor --strict`.
16
+ - Optional memory evidence anchors with safe defaults for older memory files.
13
17
 
14
18
  ## Compatible Changes
15
19
 
@@ -35,7 +39,7 @@ Breaking changes require a new major version. Examples:
35
39
 
36
40
  New 1.0 workspaces write `version: 1.0.0` in `.briefops/config.yaml`.
37
41
 
38
- BriefOps 2.0 keeps the workspace schema at `1.0.0` and can read legacy `0.x` workspace configs on a best-effort compatibility basis. Future unsupported workspace schema major versions fail with an explicit upgrade error instead of silently reading incompatible data.
42
+ BriefOps 2.1.1 keeps the workspace schema at `1.0.0` and can read legacy `0.x` workspace configs on a best-effort compatibility basis. Future unsupported workspace schema major versions fail with an explicit upgrade error instead of silently reading incompatible data.
39
43
 
40
44
  ## Migration Policy
41
45
 
@@ -32,7 +32,8 @@ BriefOps stores all user data under `.briefops/`. Version 1.0 treats these files
32
32
 
33
33
  - `.briefops/memory/<category>.yaml`
34
34
  - Shape: `items: MemoryItem[]`.
35
- - Stable item fields: `id`, `type`, `status`, `project`, `skill`, `content`, `source`, `created_at`, `tags`, `visibility`, `exportable`.
35
+ - Stable item fields: `id`, `type`, `status`, `project`, `skill`, `content`, `source`, `created_at`, `tags`, `visibility`, `exportable`, `evidence`.
36
+ - `evidence` is an optional array of path anchors with stable fields: `path`, `start_line`, `end_line`, `sha256`, `note`.
36
37
  - Supported statuses: `active`, `stale`, `deprecated`, `superseded`, `archived`.
37
38
  - Supported visibility values: `private`, `shared`, `public`.
38
39
 
@@ -46,6 +47,7 @@ BriefOps stores all user data under `.briefops/`. Version 1.0 treats these files
46
47
  - Stable fields: `id`, `created_at`, `from_log`, `status`, `project`, `skill`, `worker`, `items`, `applied_at`, `rejected_at`.
47
48
  - Legacy `proposals` arrays remain readable and are normalized to `items`.
48
49
  - Proposal entries use memory item fields plus `category` and `rationale`.
50
+ - Proposal entries may carry `evidence` anchors copied from changed-file paths in the source work log.
49
51
 
50
52
  - `.briefops/patches/*.patch.yaml`
51
53
  - Stable fields: `id`, `created_at`, `skill`, `from_log`, `status`, `target_section`, `lessons`, `additions`, `applied_at`, `rejected_at`.
@@ -0,0 +1,140 @@
1
+ # BriefOps Impact Report v0
2
+
3
+ Use this template to record whether BriefOps impact is measured, estimated, or
4
+ unmeasured for one project task or reporting period. Keep the field names stable.
5
+
6
+ ## Report Values
7
+
8
+ project:
9
+ task_or_period:
10
+ briefops_adoption_point:
11
+ token_usage_status: unmeasured
12
+ input_tokens:
13
+ output_tokens:
14
+ total_tokens:
15
+ context_baseline:
16
+ context_used:
17
+ context_reduction_estimate:
18
+ artifact_coverage:
19
+ handoff_status:
20
+ validation_status:
21
+ conclusion: unmeasured
22
+
23
+ ## Field Definitions
24
+
25
+ `project`: Project, repository, workspace, or product area being reported.
26
+
27
+ `task_or_period`: The task, milestone, sprint, date range, or release covered by
28
+ this report. Use one report per task or period.
29
+
30
+ `briefops_adoption_point`: Where BriefOps entered the workflow, such as before
31
+ planning, before implementation, during handoff, or after validation.
32
+
33
+ `token_usage_status`: Evidence level for token usage values. Allowed values:
34
+ `measured`, `estimated`, `unmeasured`.
35
+
36
+ `input_tokens`: Input token count for the covered task or period. Leave blank or
37
+ write `unmeasured` when no credible value exists.
38
+
39
+ `output_tokens`: Output token count for the covered task or period. Leave blank
40
+ or write `unmeasured` when no credible value exists.
41
+
42
+ `total_tokens`: Input plus output tokens for the covered task or period. Leave
43
+ blank or write `unmeasured` when no credible value exists.
44
+
45
+ `context_baseline`: The size of the context that would otherwise have been used,
46
+ limited to the whole repo, whole document set, full history dump, or other
47
+ bounded source context. Include the unit used.
48
+
49
+ `context_used`: The size of the actual BriefOps brief, spec, context pack, or
50
+ other bounded context supplied to the agent. Use the same unit as
51
+ `context_baseline`.
52
+
53
+ `context_reduction_estimate`: Estimated context reduction, calculated only from
54
+ `context_baseline` and `context_used`.
55
+
56
+ `artifact_coverage`: Existence-only coverage for these eight artifacts:
57
+ `brief`, `spec`, `plan`, `tasks`, `validation`, `review`, `handoff`,
58
+ `decision-log`. Record as `<present_count>/8` plus present and missing names.
59
+
60
+ `handoff_status`: Handoff readiness for the covered task or period. Suggested
61
+ values: `complete`, `partial`, `absent`, `not_applicable`.
62
+
63
+ `validation_status`: Validation evidence for the covered task or period.
64
+ Suggested values: `validated`, `partial`, `unvalidated`, `blocked`,
65
+ `not_applicable`.
66
+
67
+ `conclusion`: Overall evidence conclusion. Allowed values only: `proven`,
68
+ `partially supported`, `unmeasured`, `not supported`.
69
+
70
+ ## Measurement Rules
71
+
72
+ ### Token Usage And Token Savings
73
+
74
+ - Mark `token_usage_status` as `measured` only when actual token usage logs exist
75
+ for the covered task or period.
76
+ - Mark `token_usage_status` as `estimated` only when token counts are derived
77
+ from a deterministic approximation, such as a tokenizer or transcript count.
78
+ - Mark `token_usage_status` as `unmeasured` when neither actual logs nor a
79
+ deterministic approximation are available.
80
+ - If actual token usage logs do not exist, token savings must be reported as
81
+ `unmeasured`.
82
+ - Do not use `context_reduction_estimate` as evidence of token savings.
83
+ - Do not combine input, output, and total tokens from different tasks, agents, or
84
+ reporting periods.
85
+
86
+ ### Context Management
87
+
88
+ - Treat context management as separate from token savings.
89
+ - Estimate context reduction only by comparing `context_baseline` with
90
+ `context_used`.
91
+ - Use the same unit for `context_baseline` and `context_used`, preferably tokens.
92
+ Bytes, lines, files, or pages are acceptable only when both values use the same
93
+ unit.
94
+ - Calculate:
95
+ `(context_baseline - context_used) / context_baseline`.
96
+ - Mark `context_reduction_estimate` as `unmeasured` when either side of the
97
+ comparison is unavailable or uses incompatible units.
98
+ - A context reduction estimate supports a context management claim only. It does
99
+ not prove token savings or quality improvement.
100
+
101
+ ### Artifact Coverage
102
+
103
+ - Calculate `artifact_coverage` only from whether each named artifact exists.
104
+ - Do not score artifact quality, length, freshness, or correctness in
105
+ `artifact_coverage`.
106
+ - Count an artifact as present only when it is discoverable in the project files
107
+ or attached work record for the covered task or period.
108
+ - If an artifact has multiple files, count the artifact type once.
109
+
110
+ ### Conclusion
111
+
112
+ - Use `proven` only when the claimed impact is backed by direct measured
113
+ evidence. Token savings can be `proven` only with actual token usage logs.
114
+ - Use `partially supported` when measured evidence is incomplete, but deterministic
115
+ context comparison, artifact coverage, handoff status, or validation status
116
+ supports a narrower BriefOps benefit.
117
+ - Use `unmeasured` when the report records adoption but lacks enough evidence to
118
+ support or reject impact.
119
+ - Use `not supported` when the available evidence contradicts the claimed impact
120
+ or shows no meaningful BriefOps effect.
121
+ - If token savings are unmeasured but context management is estimated, the
122
+ conclusion must not imply proven token savings.
123
+
124
+ ## 30-Minute Fill Procedure
125
+
126
+ 1. Identify the project and covered task or period.
127
+ 2. Check whether actual token usage logs exist.
128
+ 3. Fill token fields as measured, estimated, or unmeasured.
129
+ 4. Compare only the bounded baseline context with the actual BriefOps context
130
+ used.
131
+ 5. Count the eight artifact types by existence only.
132
+ 6. Record handoff and validation status from available work records.
133
+ 7. Choose exactly one allowed conclusion without merging token savings and
134
+ context management evidence.
135
+
136
+ ## Non-Goals
137
+
138
+ This template does not define automatic collection, JSON schema, dashboards,
139
+ cross-project comparison, migration guidance, sample reports, scoring, or a full
140
+ Spec Kit workflow.
@@ -44,6 +44,15 @@ briefops export all
44
44
 
45
45
  These files should stay compact. They teach harnesses how to call BriefOps and do not copy private memory, raw logs, handoffs, or worker summaries.
46
46
 
47
+ For local readiness and context compression checks:
48
+
49
+ ```bash
50
+ briefops doctor --strict --json
51
+ briefops obs continuity --worker <worker> --task "<task>" --json
52
+ ```
53
+
54
+ These commands are core CLI checks. They do not install MCP servers or hooks.
55
+
47
56
  ## LazyCodex / OmO
48
57
 
49
58
  Use LazyCodex or OmO for orchestration, hooks, LSP/MCP, and autonomous execution. Use BriefOps for durable local continuity.