persona-harness 0.8.38 → 0.8.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -148,6 +148,47 @@ local configuration and Team Profile state, including the bundled OpenCode 1.x
148
148
  adapter. It cannot prove that a particular OpenCode session has loaded the
149
149
  project plugin.
150
150
 
151
+ ### Context Lifecycle
152
+
153
+ Context configuration lives only in `.persona/harness.jsonc`. Inspect the
154
+ current local state before changing it:
155
+
156
+ ```bash
157
+ npx ph context status
158
+ ```
159
+
160
+ For a safe project with no existing harness configuration, create the minimal
161
+ opt-in configuration explicitly:
162
+
163
+ ```bash
164
+ npx ph context init --enable
165
+ ```
166
+
167
+ The command does not overwrite an existing `.persona/harness.jsonc`. For an
168
+ existing harness configuration, review and preserve the file, then manually
169
+ merge only this top-level `context` object using its existing JSONC style:
170
+
171
+ ```jsonc
172
+ {
173
+ "context": {
174
+ "enabled": true,
175
+ "mode": "targeted",
176
+ "maxCapsules": 8,
177
+ "maxChars": 1600
178
+ }
179
+ }
180
+ ```
181
+
182
+ To disable Context while keeping its bounded settings for a later opt-in, set
183
+ `context.enabled` to `false`. A missing `context` object is also disabled by
184
+ default. Remove only the `context` object when it is no longer wanted; do not
185
+ delete a shared `.persona/harness.jsonc` that contains other Persona Harness
186
+ configuration. To roll back a tracked change, review local edits and restore
187
+ the previous tracked configuration through your normal version-control flow.
188
+
189
+ These lifecycle actions do not enable `features.runtimeInjection`, and they do
190
+ not create workflow, evidence, or authority state or use network or GitHub.
191
+
151
192
  With Context enabled, the OpenCode adapter accepts only a safe observed
152
193
  project-relative target from a read or edit tool. It resolves the local
153
194
  envelope, rejects invalid/unsafe/budget-exceeding input without delivery, and
@@ -3,6 +3,7 @@ import { resolveContainedPath } from "../io/bounded-path-walker.js";
3
3
  import { extractTargetFile, isInstalledPersonaHarnessPackageFile } from "../io/tool-target.js";
4
4
  import { ContextDeliveryStore } from "./context-delivery-store.js";
5
5
  const CONTEXT_DELIVERY_MARKER = "[Persona Harness Context]";
6
+ const CONTEXT_DELIVERY_PART_ID = "persona-harness-context";
6
7
  export function createOpenCodeContextHooks(options) {
7
8
  const store = options.store ?? new ContextDeliveryStore();
8
9
  return {
@@ -61,13 +62,8 @@ function injectContextBlock(output, sessionID, block) {
61
62
  const message = output.messages[index];
62
63
  if (message?.info.role !== "user" || message.info.sessionID !== sessionID)
63
64
  continue;
64
- const textPart = message.parts.find(isTextPart);
65
- if (textPart !== undefined) {
66
- textPart.text = `${block}\n\n---\n\n${textPart.text}`;
67
- return true;
68
- }
69
65
  message.parts.unshift({
70
- id: "persona-harness-context",
66
+ id: CONTEXT_DELIVERY_PART_ID,
71
67
  messageID: message.info.id,
72
68
  sessionID,
73
69
  synthetic: true,
@@ -99,7 +95,4 @@ function asRecord(value) {
99
95
  function isRecord(value) {
100
96
  return typeof value === "object" && value !== null && !Array.isArray(value);
101
97
  }
102
- function isTextPart(part) {
103
- return part.type === "text" && typeof part.text === "string";
104
- }
105
98
  //# sourceMappingURL=opencode-context-hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-context-hooks.js","sourceRoot":"","sources":["../../src/context-delivery/opencode-context-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-context-hooks.js","sourceRoot":"","sources":["../../src/context-delivery/opencode-context-hooks.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,10 @@ export type ProductDeepInterviewResult = {
52
52
  readonly kind: "recommendation";
53
53
  readonly topic: ProductInterviewTopic;
54
54
  readonly block: string;
55
+ } | {
56
+ readonly kind: "clarification-required";
57
+ readonly topic: ProductInterviewTopic;
58
+ readonly block: string;
55
59
  } | {
56
60
  readonly kind: "approval-required";
57
61
  readonly block: string;
@@ -67,6 +71,7 @@ export declare function isProductDeepInterviewStart(message: string): boolean;
67
71
  export declare class ProductDeepInterviewTracker {
68
72
  private readonly options;
69
73
  private readonly sessions;
74
+ private readonly suppressedSessions;
70
75
  constructor(options?: ProductDeepInterviewOptions);
71
76
  hasActiveSession(sessionId: string): boolean;
72
77
  route(sessionId: string, message: string): ProductDeepInterviewResult | undefined;
@@ -1,4 +1,5 @@
1
1
  import { createOpenCodeSkillRoute } from "./opencode-skill-adapter.js";
2
+ import { isExplicitProductInterviewRequest, isProductInterviewApproval, isProductInterviewClarification, isProductInterviewStop, } from "./product-interview-control.js";
2
3
  const TOPICS = [
3
4
  {
4
5
  id: "target-user",
@@ -50,10 +51,9 @@ const TOPICS = [
50
51
  },
51
52
  ];
52
53
  const START_PATTERN = /(만들래|만들고\s*싶|기획해|구상해|서비스\s*만들|웹\s*서비스|기존\s*(?:서비스|제품|앱|흐름).*(?:개선|변경)|product\s+idea|want\s+to\s+(?:build|create|make|explore)|(?:build|create|make)\s+(?:an?|the)\s+(?:app|service|product)|new\s+(?:app|service|product)|(?:app|service|product)\s+idea|(?:improve|change)\s+(?:an?\s+)?existing(?:\s+\w+){0,2}\s+(?:app|service|product|flow))/iu;
53
- const APPROVAL_PATTERN = /^(?:승인|진행하자|시작하자|approve|proceed|go\s+ahead)$/iu;
54
- const STOP_PATTERN = /^(?:stop|pause|그만|중단)$/iu;
55
54
  const DEFER_PATTERN = /^(?:defer|skip|later|보류|넘겨)$/iu;
56
55
  const RECOMMEND_PATTERN = /^(?:recommend|recommendation|추천)$/iu;
56
+ const STOPPED_BLOCK = "[Persona Harness Product Interview]\nProduct discovery is paused.\nNo project, workflow, issue, agent, or file state was changed.";
57
57
  export function isProductDeepInterviewStart(message) {
58
58
  return START_PATTERN.test(message.trim());
59
59
  }
@@ -120,6 +120,25 @@ function renderRecommendation(session) {
120
120
  ].join("\n"),
121
121
  };
122
122
  }
123
+ function renderClarificationRequired(session) {
124
+ const topic = topicAt(session.topicIndex);
125
+ if (topic === undefined) {
126
+ return renderApprovalRequired(session);
127
+ }
128
+ return {
129
+ kind: "clarification-required",
130
+ topic: topic.id,
131
+ block: [
132
+ "[Persona Harness Product Interview]",
133
+ `Current topic: ${topic.id}`,
134
+ "The user's latest message is a clarification request, not a product decision.",
135
+ "Explain only the current question in plain language, then wait for the user's reply.",
136
+ "Do not record an answer, advance to another topic, or ask a neighbouring question.",
137
+ `Question to explain: ${topic.question}`,
138
+ "No project, workflow, issue, agent, or file state was changed.",
139
+ ].join("\n"),
140
+ };
141
+ }
123
142
  function briefAnswer(session, topic) {
124
143
  return session.answers.get(topic) ?? "deferred";
125
144
  }
@@ -146,6 +165,7 @@ function startSession(mode) {
146
165
  export class ProductDeepInterviewTracker {
147
166
  options;
148
167
  sessions = new Map();
168
+ suppressedSessions = new Set();
149
169
  constructor(options = {}) {
150
170
  this.options = options;
151
171
  }
@@ -159,28 +179,33 @@ export class ProductDeepInterviewTracker {
159
179
  }
160
180
  const current = this.sessions.get(sessionId);
161
181
  if (current === undefined) {
182
+ if (this.suppressedSessions.has(sessionId)) {
183
+ if (!isExplicitProductInterviewRequest(normalized)) {
184
+ return undefined;
185
+ }
186
+ this.suppressedSessions.delete(sessionId);
187
+ }
162
188
  if (!isProductDeepInterviewStart(normalized)) {
163
- return undefined;
189
+ if (!isExplicitProductInterviewRequest(normalized)) {
190
+ return undefined;
191
+ }
164
192
  }
165
193
  const started = startSession(this.options.mode ?? "new-product");
166
194
  this.sessions.set(sessionId, started);
167
195
  return renderQuestion(started);
168
196
  }
169
- if (STOP_PATTERN.test(normalized)) {
197
+ if (isProductInterviewStop(normalized)) {
170
198
  this.sessions.delete(sessionId);
171
- return {
172
- kind: "stopped",
173
- block: [
174
- "[Persona Harness Product Interview]",
175
- "Product discovery is paused.",
176
- "No project, workflow, issue, agent, or file state was changed.",
177
- ].join("\n"),
178
- };
199
+ this.suppressedSessions.add(sessionId);
200
+ return { kind: "stopped", block: STOPPED_BLOCK };
179
201
  }
180
202
  if (RECOMMEND_PATTERN.test(normalized)) {
181
203
  return renderRecommendation(current);
182
204
  }
183
- if (APPROVAL_PATTERN.test(normalized)) {
205
+ if (isProductInterviewClarification(normalized)) {
206
+ return renderClarificationRequired(current);
207
+ }
208
+ if (isProductInterviewApproval(normalized)) {
184
209
  if (current.topicIndex < TOPICS.length) {
185
210
  return renderQuestion(current, true);
186
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"product-deep-interview.js","sourceRoot":"","sources":["../../src/runtime/product-deep-interview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-deep-interview.js","sourceRoot":"","sources":["../../src/runtime/product-deep-interview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function isProductInterviewApproval(message: string): boolean;
2
+ export declare function isProductInterviewClarification(message: string): boolean;
3
+ export declare function isExplicitProductInterviewRequest(message: string): boolean;
4
+ export declare function isProductInterviewStop(message: string): boolean;
@@ -0,0 +1,57 @@
1
+ import { isProductDiscoverySuppressed, parseExplicitPersonaSkillCommand, } from "./persona-shared-skill-activation.js";
2
+ const APPROVAL_PATTERN = /^(?:승인|진행하자|시작하자|approve|proceed|go\s+ahead)$/iu;
3
+ const STOP_PATTERN = /^(?:stop|pause|그만|중단)$/iu;
4
+ const NATURAL_STOP_PATTERN = /(?:(?:do\s+not|don't|stop|skip)\s+(?:the\s+)?(?:product\s+)?(?:discovery|interview|questions?)|(?:(?:product\s+)?(?:discovery|interview|questions?))\s+(?:is\s+)?(?:not\s+(?:needed|now)|stop|skip)|(?:제품|프로덕트)?\s*(?:탐색|인터뷰|질문)\s*(?:를|을|은|는)?\s*(?:하지\s*마(?:요|세요)?|말아(?:줘|주세요)?|그만(?:해|하자|해줘|해주세요)?|중단(?:해|하자|해줘|해주세요)?|필요\s*없(?:어|어요|습니다)?))/iu;
5
+ const NON_PRODUCT_TASK_SWITCH_PATTERN = /(?:feedback[-\s]?dogfooding|dogfooding|workflow\s+finish(?:\s+implement)?|source-read-runtime-unavailable|history\s+archive|(?:피드백|이슈)\s*(?:로|을|를|에)?\s*(?:기록|남기|등록|정리)|(?:워크플로|workflow)\s*(?:finish|진단|오류)|(?:구현|리뷰)\s*보고서)/iu;
6
+ const CLARIFICATION_PATTERN = /(?:무슨\s*말|뭔\s*말|이해(?:가)?\s*안|모르겠|설명(?:해|해줘|해주세요|좀)|쉽게\s*(?:말|설명)|what\s+(?:does|do)\b.*\bmean|(?:i\s+)?(?:do\s+not|don't)\s+understand|(?:can|could)\s+you\s+explain|please\s+explain)/iu;
7
+ function isEditDistanceAtMostOne(value, expected) {
8
+ if (value === expected) {
9
+ return true;
10
+ }
11
+ if (Math.abs(value.length - expected.length) > 1) {
12
+ return false;
13
+ }
14
+ let valueIndex = 0;
15
+ let expectedIndex = 0;
16
+ let edits = 0;
17
+ while (valueIndex < value.length && expectedIndex < expected.length) {
18
+ if (value[valueIndex] === expected[expectedIndex]) {
19
+ valueIndex += 1;
20
+ expectedIndex += 1;
21
+ continue;
22
+ }
23
+ edits += 1;
24
+ if (edits > 1) {
25
+ return false;
26
+ }
27
+ if (value.length > expected.length) {
28
+ valueIndex += 1;
29
+ continue;
30
+ }
31
+ if (value.length < expected.length) {
32
+ expectedIndex += 1;
33
+ continue;
34
+ }
35
+ valueIndex += 1;
36
+ expectedIndex += 1;
37
+ }
38
+ return edits + (value.length - valueIndex) + (expected.length - expectedIndex) <= 1;
39
+ }
40
+ export function isProductInterviewApproval(message) {
41
+ return APPROVAL_PATTERN.test(message)
42
+ || (/^[a-z]+$/iu.test(message) && isEditDistanceAtMostOne(message.toLowerCase(), "approve"));
43
+ }
44
+ export function isProductInterviewClarification(message) {
45
+ return CLARIFICATION_PATTERN.test(message);
46
+ }
47
+ export function isExplicitProductInterviewRequest(message) {
48
+ const command = parseExplicitPersonaSkillCommand(message);
49
+ return command.kind === "valid" && command.skillId === "deep-interview";
50
+ }
51
+ export function isProductInterviewStop(message) {
52
+ return STOP_PATTERN.test(message)
53
+ || NATURAL_STOP_PATTERN.test(message)
54
+ || isProductDiscoverySuppressed(message)
55
+ || NON_PRODUCT_TASK_SWITCH_PATTERN.test(message);
56
+ }
57
+ //# sourceMappingURL=product-interview-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-interview-control.js","sourceRoot":"","sources":["../../src/runtime/product-interview-control.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,sCAAsC,CAAA;AAE7C,MAAM,gBAAgB,GAAG,iDAAiD,CAAA;AAC1E,MAAM,YAAY,GAAG,0BAA0B,CAAA;AAC/C,MAAM,oBAAoB,GAAG,mVAAmV,CAAA;AAChX,MAAM,+BAA+B,GAAG,iOAAiO,CAAA;AACzQ,MAAM,qBAAqB,GAAG,0LAA0L,CAAA;AAExN,SAAS,uBAAuB,CAAC,KAAa,EAAE,QAAgB;IAC9D,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,aAAa,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpE,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,UAAU,IAAI,CAAC,CAAA;YACf,aAAa,IAAI,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,KAAK,IAAI,CAAC,CAAA;QACV,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,UAAU,IAAI,CAAC,CAAA;YACf,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,aAAa,IAAI,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,UAAU,IAAI,CAAC,CAAA;QACf,aAAa,IAAI,CAAC,CAAA;IACpB,CAAC;IAED,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAAe;IACxD,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;WAChC,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,uBAAuB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC,CAAA;AAChG,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,OAAe;IAC7D,OAAO,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,OAAe;IAC/D,MAAM,OAAO,GAAG,gCAAgC,CAAC,OAAO,CAAC,CAAA;IACzD,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,gBAAgB,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;WAC5B,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;WAClC,4BAA4B,CAAC,OAAO,CAAC;WACrC,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACpD,CAAC"}
@@ -6,8 +6,11 @@ Last reconciled: 2026-08-30
6
6
  P0 integration release: `a82b85ddef7e9fd9518348bff16deb38f53b4676`
7
7
  P0 integration package: [`persona-harness@0.8.37`](https://www.npmjs.com/package/persona-harness/v/0.8.37)
8
8
  P0 integration lineage: [#442](https://github.com/jyt6640/persona-harness/issues/442) delivered through [#443](https://github.com/jyt6640/persona-harness/pull/443)
9
- Current program-status publication: [`persona-harness@0.8.38`](https://www.npmjs.com/package/persona-harness/v/0.8.38)
9
+ Prior program-status publication: [`persona-harness@0.8.38`](https://www.npmjs.com/package/persona-harness/v/0.8.38)
10
10
  Program-status publication lineage: [#444](https://github.com/jyt6640/persona-harness/issues/444) reconciled through [#445](https://github.com/jyt6640/persona-harness/pull/445) and published by [#446](https://github.com/jyt6640/persona-harness/issues/446)
11
+ Current structural-observability release: [`persona-harness@0.8.39`](https://www.npmjs.com/package/persona-harness/v/0.8.39)
12
+ Structural-observability lineage: [#449](https://github.com/jyt6640/persona-harness/issues/449) delivered through [#450](https://github.com/jyt6640/persona-harness/pull/450) on `ec3680bcceccf582521952dc77bf3cc9fb7cd874`
13
+ Current lifecycle documentation merge: [#451](https://github.com/jyt6640/persona-harness/issues/451) delivered through [#452](https://github.com/jyt6640/persona-harness/pull/452) on `881be07b3e3baa443a66126ca94008499082b732`
11
14
  P0 implementation release baseline: `9b80a45070be10659150095cf701a6f375bc6600`
12
15
  P0 implementation package: [`persona-harness@0.8.33`](https://www.npmjs.com/package/persona-harness/v/0.8.33)
13
16
  P0 implementation lineage: [#414](https://github.com/jyt6640/persona-harness/issues/414) delivered through [#437](https://github.com/jyt6640/persona-harness/pull/437)
@@ -22,7 +25,7 @@ Current compatibility package: [`persona-harness@0.8.36`](https://www.npmjs.com/
22
25
  Current compatibility lineage: [#412](https://github.com/jyt6640/persona-harness/issues/412) delivered through [#441](https://github.com/jyt6640/persona-harness/pull/441)
23
26
  Historical pre-integration audit source: `f677a635040ad55d8b7d25abab280c5703a153ea`
24
27
  Program issue: [#389](https://github.com/jyt6640/persona-harness/issues/389)
25
- Remaining bounded work: hosted residual [#410](https://github.com/jyt6640/persona-harness/issues/410) and the not-started independent-value protocol from [#429](https://github.com/jyt6640/persona-harness/issues/429). The deterministic local P0 boundaries integrated by #443 are closed.
28
+ Remaining bounded work: the terminal, non-retryable hosted-observation record in [#410](https://github.com/jyt6640/persona-harness/issues/410) and the not-started independent-value protocol from [#429](https://github.com/jyt6640/persona-harness/issues/429), whose real preregistered participant route is [#317](https://github.com/jyt6640/persona-harness/issues/317). [#449](https://github.com/jyt6640/persona-harness/issues/449) is a delivered metadata-only structural observer boundary; it does not replay #410, begin a host action, or establish product value. The deterministic local P0 boundaries integrated by #443 are closed.
26
29
 
27
30
  ## Purpose
28
31
 
@@ -167,12 +170,22 @@ evidence rather than a description of current protected main.
167
170
  released as `persona-harness@0.8.37` from
168
171
  `a82b85ddef7e9fd9518348bff16deb38f53b4676`.
169
172
  - **Product verdict: `INCONCLUSIVE`.** The release and local deterministic
170
- evidence do not show a real OpenCode session receiving Context or an
171
- independent user receiving value. The #429 status intentionally has no
172
- observations.
173
- - **Next allowed step:** only #410's own named Delivery Control start predicate
174
- can authorize one bounded real OpenCode observation. It is not an automatic
175
- release follow-up, and it cannot be replaced with a synthetic or retry run.
173
+ evidence do not establish Context delivery or independent user value. #410
174
+ ran its one authorized real OpenCode session, but its privacy-preserving
175
+ observation could not classify delivery; the #429 status intentionally has
176
+ no independent-user observations. The real preregistered independent
177
+ participant boundary remains #317.
178
+ - **Hosted-observation verdict: `hosted-unavailable`.** The #410 one-shot
179
+ completed its safe read and same-session checks, then retained only a
180
+ sanitized OpenCode export. OpenCode `v1.17.16` redacts every text part in
181
+ `export --sanitize`, so the absence of a Context marker in that export does
182
+ not prove that the transform did not inject one. The run is terminal and
183
+ cannot be retried as a debugger.
184
+ - **Next allowed step:** no Context host action starts automatically. #449 is
185
+ delivered as a metadata-only structural observer boundary in `v0.8.39`, but
186
+ any future observation still needs its own explicit Delivery Control
187
+ predicate and a semantically new consumer/session. It cannot reuse or replay
188
+ #410.
176
189
 
177
190
  ## Current Delivery Order
178
191
 
@@ -197,11 +210,23 @@ evidence rather than a description of current protected main.
197
210
  as stable `v0.8.37` on
198
211
  `a82b85ddef7e9fd9518348bff16deb38f53b4676`. The release does not create
199
212
  host-delivery or product-value evidence.
200
- 7. **Remaining independent evidence:** #410 owns the sole real OpenCode-host
201
- observation route and still requires its own named Delivery Control start
202
- predicate. #429 owns the preregistered external-validation schema; its
203
- current empty status remains `INCONCLUSIVE` until a future independent
204
- observation meets the fixed protocol.
213
+ 7. **Metadata-only structural-observability release:** #449 delivered through
214
+ #450 as stable `v0.8.39` on
215
+ `ec3680bcceccf582521952dc77bf3cc9fb7cd874`. It makes a separate synthetic
216
+ Context input part observable in sanitized OpenCode exports, but it does
217
+ not run a host observation or establish Context delivery or product value.
218
+ 8. **Explicit lifecycle documentation:** #451 delivered through #452 on
219
+ `881be07b3e3baa443a66126ca94008499082b732`. The guide documents inspection,
220
+ fresh-safe enablement, manual merge for an existing configuration,
221
+ disablement, Context-only removal, and VCS rollback without changing CLI or
222
+ runtime behavior.
223
+ 9. **Remaining independent evidence:** #410's named predicate ran once on a
224
+ released `0.8.33` consumer and reached terminal `hosted-unavailable`.
225
+ Because the retained OpenCode `v1.17.16` `export --sanitize` result redacts
226
+ every text part, its marker count is not a delivery verdict; #410 cannot be
227
+ retried. #429 owns the preregistered external-validation schema; its current
228
+ empty status remains `INCONCLUSIVE` until real preregistered participants
229
+ begin the separate #317 protocol.
205
230
 
206
231
  Only one public command, schema, resolver, adapter, CI, script, or documentation
207
232
  boundary is changed per child issue. A child issue closes only when its stated
@@ -283,7 +308,7 @@ was not modified.
283
308
  | P0 implementation release lineage | #414 delivered stable `v0.8.33` through #437. Its immutable tag, GitHub Release, npm `latest`, canonical tar, and provenance bind to `9b80a45070be10659150095cf701a6f375bc6600`. | Historical P0 implementation release evidence does not prove live host delivery. |
284
309
  | Deterministic comparison release lineage | #411 delivered stable `v0.8.34` through #439. Its immutable tag, GitHub Release, npm `latest`, canonical tar, and provenance bind to `19c397e4fed5b1cce7d024fbcc51350e9676105f`. | It records only deterministic technical results; host/model/operational values remain unavailable and product verdicts remain `INCONCLUSIVE`. |
285
310
  | Current P0 integration release | #442 delivered stable `v0.8.37` through #443. Its immutable tag, GitHub Release, npm `latest`, canonical tar, and provenance bind to `a82b85ddef7e9fd9518348bff16deb38f53b4676`. | It closes the deterministic local P0 boundaries, not #410's real host observation or external product-value evidence. |
286
- | Hosted Context delivery | The current program-status publication `0.8.38` retains the merged #403 adapter boundary, but no package/release record substitutes for the #410 start predicate. | #410 still needs its own named Delivery Control start predicate and one bounded real OpenCode observation. |
311
+ | Hosted Context delivery | #410's named predicate was satisfied for a registry-installed `0.8.33` consumer bound to `9b80a45070be10659150095cf701a6f375bc6600`; one real OpenCode `v1.17.16` session completed its safe sequence. The retained `export --sanitize` redacts all text parts, so its zero marker count cannot establish delivery absence. | The one-shot is terminal `hosted-unavailable` and non-retryable. No Context delivery or product-value claim is supported; any future observation needs a separately authorized, metadata-only host-observer contract. |
287
312
  | Other follow-ups | #421 is delivered as stable `v0.8.35` through #440; #412 is delivered as stable `v0.8.36` through #441; the #429 protocol is released through #443 with zero observations. | None of these facts manufacture host or user-value evidence. |
288
313
 
289
314
  Product-value verdict remains **INCONCLUSIVE**. Local composition, package,
@@ -326,9 +351,9 @@ expand the released Context delivery scope or change its default-off boundary.
326
351
 
327
352
  No deterministic local Context P0 candidate remains open after #443. Do not
328
353
  reopen the completed #390–#403 integration, #414 release, or #442 integration
329
- paths. Delivery Control must record #410's own named hosted start predicate
330
- before one real OpenCode `experimental.chat.messages.transform` observation can
331
- begin. The #429 protocol remains `INCONCLUSIVE` with zero observations; do not
332
- infer host delivery or product value from local composition tests, catalog
354
+ paths. #410's one real OpenCode observation is terminal and cannot be retried;
355
+ its sanitized-export result is insufficient to attribute Context delivery or
356
+ absence. The #429 protocol remains `INCONCLUSIVE` with zero observations; do
357
+ not infer host delivery or product value from local composition tests, catalog
333
358
  registration, release provenance, an empty external-validation status, or
334
359
  historical evidence.
@@ -74,6 +74,21 @@ recommendation plus its tradeoff. A user may answer, request a recommendation,
74
74
  defer, or stop. After the facts are complete, it renders a brief and requires
75
75
  an explicit `approve` before technical intake.
76
76
 
77
+ While an interview is active, a natural-language request not to interview, a
78
+ whole-task discovery defer, or a workflow feedback/dogfooding task switch ends
79
+ that interview before the message can become an answer. The session remains
80
+ suppressed until the user explicitly sends `/persona deep-interview`; another
81
+ ambiguous product request does not restart it. A bare `defer` remains a
82
+ per-topic answer. A clarification request holds the current topic and asks the
83
+ host to explain only that question in plain language. At the final approval
84
+ boundary only, an English token within one edit of `approve` is accepted once;
85
+ it cannot advance an unresolved topic.
86
+
87
+ The compact `[Persona Harness Skill Route]` marker is emitted only when
88
+ `deep-interview` is actually selected. A stop or clarification carries the
89
+ `[Persona Harness Product Interview]` control marker but is not a new skill
90
+ activation or a claim that the complete skill body ran.
91
+
77
92
  Before that approval, the route creates no plan, ticket, workflow state,
78
93
  branch, issue, file, or agent. For a brownfield change, read the relevant
79
94
  existing code first and ask only product intent the code cannot establish.
@@ -25,7 +25,7 @@
25
25
  "package": {
26
26
  "channel": "unpublished",
27
27
  "scope": "source-candidate",
28
- "version": "0.8.38"
28
+ "version": "0.8.40"
29
29
  },
30
30
  "currentSourceCandidate": {
31
31
  "registryInstall": "requires-authorized-release-before-registry-install",
@@ -0,0 +1,32 @@
1
+ # v0.8.39 Release Notes
2
+
3
+ ## Metadata-Only Context Delivery Signal
4
+
5
+ This release makes an explicit Context delivery structurally observable in a
6
+ sanitized OpenCode session export without exposing Context or user text. When
7
+ an enabled, safe Context delivery is selected, Persona Harness now prepends a
8
+ separate synthetic text part with the stable identifier
9
+ `persona-harness-context`; it leaves the original user text part unchanged.
10
+
11
+ OpenCode's sanitized export redacts text content while retaining structural
12
+ part fields. The resulting bounded signal is limited to the synthetic part's
13
+ identifier, type, and synthetic flag.
14
+
15
+ ## Safety And Scope Boundaries
16
+
17
+ - Context remains explicit opt-in and default-off.
18
+ - Disabled, unsafe, malformed, budget-blocked, duplicate-suppressed, and
19
+ cleared-session paths remain absent or fail closed.
20
+ - The Context adapter still does not invoke workflow, shell/process, network,
21
+ GitHub, evidence, authority, credential, or external-observation behavior.
22
+ - This release does not replay issue #410, retain transcript content, create
23
+ user evidence, or claim Context delivery, token savings, or product value.
24
+ - A future real-host observation remains separately governed and needs a new
25
+ Delivery Control predicate and a semantically new consumer/session.
26
+
27
+ ## Verification
28
+
29
+ The release path verifies the isolated Context adapter, the separate synthetic
30
+ part and unchanged original text structure, type safety, documentation and
31
+ release-policy checks, a fresh isolated tarball installation, protected CI,
32
+ canonical package identity, and registry provenance.
@@ -0,0 +1,38 @@
1
+ # v0.8.40 Release Notes
2
+
3
+ ## Deep Interview Controls That Respect The Current Task
4
+
5
+ This release makes the product deep-interview route less disruptive when a
6
+ developer is already doing bounded work or gives direct feedback.
7
+
8
+ - Direct feedback, diagnostics, report requests, explicit commands, and
9
+ bounded implementation requests stay outside product-discovery capture.
10
+ - A natural-language stop, whole-task defer, or feedback/dogfooding task
11
+ switch ends an active interview and suppresses automatic follow-up prompts.
12
+ - Only an explicit `/persona deep-interview` request starts a new interview
13
+ after that suppression.
14
+ - An explanation request holds the current unresolved question instead of
15
+ treating it as an answer or advancing to a neighbouring topic.
16
+ - A one-character English typo of `approve` is accepted only at the terminal
17
+ approval boundary; earlier answers remain non-terminal.
18
+ - The shared-skill and router documentation distinguishes a visible interview
19
+ control marker from an actual shared-skill activation.
20
+
21
+ ## Safety And Scope Boundaries
22
+
23
+ - Context remains explicit opt-in and default-off; this release does not alter
24
+ the runtime injection default.
25
+ - The interaction controls do not infer workflow, shell/process execution,
26
+ network, GitHub, evidence, authority, credential, external-observation, or
27
+ issue-creation actions.
28
+ - This release does not claim a real host-session result, independent user
29
+ result, token saving, or product efficacy.
30
+ - Historical releases remain immutable and cannot supply current package or
31
+ host-observation evidence.
32
+
33
+ ## Verification
34
+
35
+ The release path verifies the focused deep-interview tracker and hook
36
+ regressions, type safety, documentation and release-policy checks, a fresh
37
+ isolated tarball installation, protected CI, canonical package identity, and
38
+ registry provenance.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "persona-harness",
3
- "version": "0.8.38",
3
+ "version": "0.8.40",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "packageManager": "npm@10.8.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@persona-harness/shared-skills",
3
- "version": "0.8.38",
3
+ "version": "0.8.40",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "description": "Persona-owned portable skill procedures and optional overlays",