@polderlabs/bizar-omp 0.6.7 → 0.7.0
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 +8 -8
- package/dist/cli/doctor.d.ts +4 -4
- package/dist/cli/update-ink.d.ts +2 -1
- package/dist/cli/update-ink.d.ts.map +1 -1
- package/dist/core/acceptance.d.ts.map +1 -1
- package/dist/core/acceptance.js +17 -3
- package/dist/core/acceptance.js.map +1 -1
- package/dist/core/recovery.d.ts.map +1 -1
- package/dist/core/recovery.js +52 -3
- package/dist/core/recovery.js.map +1 -1
- package/dist/core/redaction.d.ts +22 -0
- package/dist/core/redaction.d.ts.map +1 -0
- package/dist/core/redaction.js +103 -0
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/transitions.d.ts +3 -2
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/core/transitions.js +34 -8
- package/dist/core/transitions.js.map +1 -1
- package/dist/core/types.d.ts +33 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/extension.d.ts +14 -3
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +92 -36
- package/dist/extension.js.map +1 -1
- package/dist/omp/compatibility.d.ts +5 -5
- package/dist/omp/compatibility.d.ts.map +1 -1
- package/dist/omp/compatibility.js +2 -2
- package/dist/omp/compatibility.js.map +1 -1
- package/dist/omp/dispatch-admission.d.ts +4 -1
- package/dist/omp/dispatch-admission.d.ts.map +1 -1
- package/dist/omp/dispatch-admission.js +2 -2
- package/dist/omp/dispatch-admission.js.map +1 -1
- package/dist/omp/result-reconciliation.js +1 -1
- package/dist/omp/result-reconciliation.js.map +1 -1
- package/dist/omp/rpc.d.ts +4 -1
- package/dist/omp/rpc.d.ts.map +1 -1
- package/dist/services/candidate-verify.d.ts +34 -0
- package/dist/services/candidate-verify.d.ts.map +1 -0
- package/dist/services/candidate-verify.js +141 -0
- package/dist/services/candidate-verify.js.map +1 -0
- package/dist/storage/journal.d.ts.map +1 -1
- package/dist/storage/journal.js +6 -21
- package/dist/storage/journal.js.map +1 -1
- package/dist/storage/lease.d.ts +16 -0
- package/dist/storage/lease.d.ts.map +1 -0
- package/dist/storage/lease.js +236 -0
- package/dist/storage/lease.js.map +1 -0
- package/dist/storage/repository-identity.d.ts.map +1 -1
- package/dist/storage/repository-identity.js +1 -0
- package/dist/storage/repository-identity.js.map +1 -1
- package/dist/storage/resources.d.ts.map +1 -1
- package/dist/storage/resources.js +49 -22
- package/dist/storage/resources.js.map +1 -1
- package/dist/tools/integrate.d.ts.map +1 -1
- package/dist/tools/integrate.js +66 -23
- package/dist/tools/integrate.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +43 -32
- package/dist/tools/verify.js.map +1 -1
- package/dist/tools/workflow.d.ts +12 -2
- package/dist/tools/workflow.d.ts.map +1 -1
- package/dist/tools/workflow.js +54 -7
- package/dist/tools/workflow.js.map +1 -1
- package/docs/compatibility/baseline.json +9 -8
- package/docs/compatibility/supported-surfaces.json +2 -1
- package/docs/releases/0.6.8.md +11 -0
- package/docs/releases/native-stable.md +1 -1
- package/docs/releases/npm-publishing.md +1 -1
- package/docs/releases/support-matrix.md +1 -1
- package/package.json +2 -2
- package/schemas/evidence-record.schema.json +29 -3
- package/schemas/workflow-run.schema.json +10 -3
- package/skills/bizar-omp/SKILL.md +2 -1
- package/skills/omp-native-development/SKILL.md +1 -1
- package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
- package/skills/omp-native-development/references/source-manifest.json +3 -3
- package/optional/openkan/index.ts +0 -3
package/dist/tools/workflow.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readyWorkItems } from "../services/readiness.js";
|
|
2
|
+
import { acceptWorkItem, addWorkItem, completeRun, freezeObjective, transition } from "../core/transitions.js";
|
|
2
3
|
import { requireFreshEvidence } from "../core/evidence.js";
|
|
3
|
-
import { classifyRoute } from "../core/policies.js";
|
|
4
4
|
import { ContractError } from "../core/errors.js";
|
|
5
|
+
import { classifyRoute } from "../core/policies.js";
|
|
6
|
+
import { canonicalSpecHash } from "../core/acceptance.js";
|
|
5
7
|
import { assertOwner } from "../core/recovery.js";
|
|
6
8
|
import { startObjective } from "../omp/lifecycle.js";
|
|
7
9
|
import { workingTreeDigest } from "../storage/repository-identity.js";
|
|
@@ -26,6 +28,20 @@ export function runWorkflow(binding, action, params) {
|
|
|
26
28
|
binding.journal.append(result.event, `transition:${state.run.runId}:${state.run.revision}:${to}`, state.revision);
|
|
27
29
|
return result.run;
|
|
28
30
|
}
|
|
31
|
+
if (action === "amend-objective") {
|
|
32
|
+
const proposed = params.objective;
|
|
33
|
+
const objective = freezeObjective(proposed);
|
|
34
|
+
const reason = String(params.reason ?? "").trim();
|
|
35
|
+
const by = params.by === "check-spec" ? "check-spec" : "criterion";
|
|
36
|
+
if (!reason)
|
|
37
|
+
throw new ContractError("A reason is required to amend the objective");
|
|
38
|
+
if (!objective || !objective.objective.trim() || objective.acceptanceCriteria.length === 0)
|
|
39
|
+
throw new ContractError("A complete amended objective is required");
|
|
40
|
+
const existing = by === "check-spec" ? state.run.objective.checkSpecs?.map(spec => spec.id) ?? state.run.objective.verificationPlan : state.run.objective.criteria?.map(criterion => criterion.id) ?? [];
|
|
41
|
+
const amended = by === "check-spec" ? objective.checkSpecs?.map(spec => spec.id) ?? objective.verificationPlan : objective.criteria?.map(criterion => criterion.id) ?? [];
|
|
42
|
+
binding.journal.append({ type: "objective.amended", runId: state.run.runId, objective, by, added: amended.filter(id => !existing.includes(id)), removed: existing.filter(id => !amended.includes(id)), reason }, `objective-amended:${state.run.runId}:${state.run.revision}`, state.revision);
|
|
43
|
+
return binding.journal.snapshot().run;
|
|
44
|
+
}
|
|
29
45
|
if (action === "cancel") {
|
|
30
46
|
const reason = String(params.reason ?? "operator cancellation");
|
|
31
47
|
binding.journal.append({ type: "run.cancelled", runId: state.run.runId, reason }, `cancel:${state.run.runId}:${state.run.revision}`, state.revision);
|
|
@@ -42,11 +58,42 @@ export function runWorkflow(binding, action, params) {
|
|
|
42
58
|
const evidenceIds = params.evidenceIds;
|
|
43
59
|
if (!Array.isArray(evidenceIds))
|
|
44
60
|
throw new ContractError("Evidence IDs are required to accept work");
|
|
45
|
-
|
|
61
|
+
const targetDigest = workingTreeDigest(binding.cwd);
|
|
62
|
+
const item = state.run.workItems.find(candidate => candidate.id === workItemId);
|
|
63
|
+
if (!item)
|
|
64
|
+
throw new ContractError(`Unknown work item: ${workItemId}`);
|
|
65
|
+
if (item.lifecycle !== "settled")
|
|
66
|
+
throw new ContractError(`Work item must be settled before acceptance (current: ${item.lifecycle})`);
|
|
67
|
+
// R006: require candidate binding + CheckSpec contract enforcement.
|
|
68
|
+
const dispatches = state.dispatches.filter(intent => intent.workItemId === workItemId);
|
|
69
|
+
const dispatch = dispatches.filter(intent => intent.candidateId && intent.candidateTree).at(-1);
|
|
70
|
+
if (!dispatch)
|
|
71
|
+
throw new ContractError("Work item has no recorded dispatch");
|
|
72
|
+
if (dispatch.status !== "settled")
|
|
73
|
+
throw new ContractError(`Work item dispatch must be settled (current: ${dispatch.status})`);
|
|
74
|
+
if (!dispatch.candidateId || !dispatch.candidateTree)
|
|
75
|
+
throw new ContractError("Settled dispatch must reference a candidate");
|
|
76
|
+
requireFreshEvidence(state.evidence, evidenceIds, targetDigest, { candidateId: dispatch.candidateId, candidateTree: dispatch.candidateTree });
|
|
77
|
+
const acceptedRecords = state.evidence.filter(record => evidenceIds.includes(record.id));
|
|
78
|
+
const specsById = new Map((state.run.objective.checkSpecs ?? []).map(spec => [spec.id, spec]));
|
|
79
|
+
if (specsById.size > 0) {
|
|
80
|
+
for (const record of acceptedRecords) {
|
|
81
|
+
if (!record.checkSpecHash)
|
|
82
|
+
throw new ContractError(`Evidence ${record.id} lacks a checkSpecHash; cannot be accepted under CheckSpec contract`);
|
|
83
|
+
const spec = specsById.get(record.checkId);
|
|
84
|
+
if (!spec)
|
|
85
|
+
throw new ContractError(`Evidence checkId "${record.checkId}" is not admitted in the objective CheckSpec contract`);
|
|
86
|
+
if (canonicalSpecHash(spec) !== record.checkSpecHash)
|
|
87
|
+
throw new ContractError(`Evidence ${record.id} does not match the admitted CheckSpec for ${spec.id}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const checkSpecHashes = acceptedRecords.map(record => record.checkSpecHash ?? "");
|
|
46
91
|
const next = acceptWorkItem(state.run, workItemId);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
92
|
+
const accepted = next.workItems.find(candidate => candidate.id === workItemId);
|
|
93
|
+
const receipt = { workItemId, workRevision: item.revision, dispatchId: dispatch.id, candidateId: dispatch.candidateId, candidateTree: dispatch.candidateTree, evidenceIds: [...evidenceIds], checkSpecHashes, policyRevision: state.run.objective.policyRevision ?? "admission", targetDigest };
|
|
94
|
+
binding.journal.append({ type: "work-item.upserted", runId: next.runId, item: accepted }, `work-accepted:${next.runId}:${workItemId}:${accepted.revision}`, state.revision);
|
|
95
|
+
binding.journal.append({ type: "acceptance.recorded", runId: next.runId, receipt }, `acceptance:${next.runId}:${workItemId}:${accepted.revision}`, state.revision + 1);
|
|
96
|
+
return receipt;
|
|
50
97
|
}
|
|
51
98
|
if (action === "complete") {
|
|
52
99
|
if (state.integrations.some(attempt => attempt.outcome === "unknown-outcome") || state.dispatches.some(intent => !["settled", "rejected"].includes(intent.status)))
|
|
@@ -59,7 +106,7 @@ export function runWorkflow(binding, action, params) {
|
|
|
59
106
|
return result.run;
|
|
60
107
|
}
|
|
61
108
|
if (action === "next")
|
|
62
|
-
return state.run.workItems
|
|
109
|
+
return readyWorkItems(state.run.workItems)[0] ?? null;
|
|
63
110
|
throw new ContractError(`Unknown workflow action: ${action}`);
|
|
64
111
|
}
|
|
65
112
|
//# sourceMappingURL=workflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"researchDate": "2026-09-
|
|
3
|
+
"researchDate": "2026-09-22",
|
|
4
4
|
"bizarReference": {
|
|
5
5
|
"repository": "../BizarHarness",
|
|
6
6
|
"commit": "e13aa131bdcd368548118464f0da1bace302e64b",
|
|
@@ -8,17 +8,18 @@
|
|
|
8
8
|
},
|
|
9
9
|
"omp": {
|
|
10
10
|
"repository": "https://github.com/can1357/oh-my-pi",
|
|
11
|
-
"testedVersion": "18.2.
|
|
12
|
-
"testedCommit": "
|
|
11
|
+
"testedVersion": "18.2.8",
|
|
12
|
+
"testedCommit": "5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c",
|
|
13
13
|
"previouslyQualifiedVersions": [
|
|
14
14
|
"18.2.4",
|
|
15
15
|
"18.2.5",
|
|
16
|
-
"18.2.6"
|
|
16
|
+
"18.2.6",
|
|
17
|
+
"18.2.7"
|
|
17
18
|
],
|
|
18
19
|
"researchedMainCommit": "dbf3afad4894bde827d90f965e77b3fe1c5a95e5",
|
|
19
|
-
"releaseVersionSeenInResearch": "18.2.
|
|
20
|
-
"releaseCommitSeenInResearch": "
|
|
21
|
-
"qualification": "The npm package was tested at 18.2.
|
|
20
|
+
"releaseVersionSeenInResearch": "18.2.8",
|
|
21
|
+
"releaseCommitSeenInResearch": "5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c",
|
|
22
|
+
"qualification": "The npm package was tested at 18.2.8 with integrity sha512-I8JXVNLJb8PfGS6mRGSKNq73+EX+R/GoaRBoMj8HTtOiwF112QXH72UP2klTwoCiR2gTsACbAIWjD0JdrR3A3g==; 18.2.7 remains a separately qualified compatibility version. Package version alone does not prove source commit identity."
|
|
22
23
|
},
|
|
23
24
|
"bun": {
|
|
24
25
|
"minimum": "1.3.14",
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
},
|
|
27
28
|
"package": {
|
|
28
29
|
"name": "@polderlabs/bizar-omp",
|
|
29
|
-
"version": "0.6.
|
|
30
|
+
"version": "0.6.8",
|
|
30
31
|
"integrity": "computed by npm pack in CI",
|
|
31
32
|
"extensionEntry": "dist/extension.js"
|
|
32
33
|
}
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
"dry-run migration"
|
|
16
16
|
],
|
|
17
17
|
"qualified": [
|
|
18
|
-
"OMP 18.2.
|
|
18
|
+
"OMP 18.2.8 / release commit 5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c",
|
|
19
|
+
"OMP 18.2.7 compatibility regression",
|
|
19
20
|
"OMP 18.2.6 compatibility regression",
|
|
20
21
|
"OMP 18.2.5 compatibility regression",
|
|
21
22
|
"OMP 18.2.4 compatibility regression",
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# 0.6.8
|
|
2
|
+
|
|
3
|
+
## Highlights
|
|
4
|
+
|
|
5
|
+
- Qualifies the plugin against OMP 18.2.8 at release commit 5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c.
|
|
6
|
+
- Keeps OMP 18.2.7 as a separately tested compatibility version.
|
|
7
|
+
- Updates CI, release qualification, installation diagnostics, and the native-development skill fingerprint.
|
|
8
|
+
|
|
9
|
+
## Validation
|
|
10
|
+
|
|
11
|
+
This release was qualified through the local OMP harness (`npm run verify:omp`). When CI is available, the `omp-compatibility` workflow verifies the packed install path. Because this repository is private and CI may be billing-blocked at the org level, the operator override path is the documented fallback: bump the version in `package.json`, run `npm pack --ignore-scripts`, publish with `NPM_CONFIG_PROVENANCE=false npm publish --ignore-scripts`, then tag the merge SHA and create the GitHub release.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
# Native release policy
|
|
2
2
|
|
|
3
|
-
The package is releasable when typecheck, tests, packed-install qualification, and documentation checks pass against the supported OMP/Bun baseline. A GitHub release is created from an exact `v<version>` tag; npm publication uses trusted publishing. See npm-publishing.md for setup and 0.6.
|
|
3
|
+
The package is releasable when typecheck, tests, packed-install qualification, and documentation checks pass against the supported OMP/Bun baseline. A GitHub release is created from an exact `v<version>` tag; npm publication uses trusted publishing. See npm-publishing.md for setup and 0.6.8.md for the current release notes. A passing release gate does not imply every native provider or worker route has been tested.
|
|
@@ -7,7 +7,7 @@ Configure the package's npm **Trusted Publisher** as:
|
|
|
7
7
|
| Field | Value |
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| Provider | GitHub Actions |
|
|
10
|
-
| Organization or user | `
|
|
10
|
+
| Organization or user | `PolderLabs` |
|
|
11
11
|
| Repository | `BizarHarness-OMP` |
|
|
12
12
|
| Workflow filename | `release.yml` |
|
|
13
13
|
| Environment | Leave blank |
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
| --- | --- |
|
|
5
5
|
| Node | 22.x and 24.x in CI |
|
|
6
6
|
| Bun | 1.3.14 compatibility job |
|
|
7
|
-
| OMP | 18.2.
|
|
7
|
+
| OMP | 18.2.8 at release commit `5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c`; 18.2.7 remains regression-qualified |
|
|
8
8
|
| Install | `npx --yes @polderlabs/bizar-omp setup` is the supported full install; `omp plugin install <package-spec>` is extension-only and `omp plugin link <checkout>` is for development |
|
|
9
9
|
| Security | Trusted in-process extension; native task isolation required for managed editing |
|
|
10
10
|
| Workflow state | Journal v2 validation, candidate-bound acceptance, bounded inspection/projection, and offline evidence bundles are locally qualified; v1 state remains legacy input |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polderlabs/bizar-omp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Native oh-my-pi engineering workflow extension with typed evidence and serialized integration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
},
|
|
51
51
|
"repository": {
|
|
52
52
|
"type": "git",
|
|
53
|
-
"url": "https://github.com/
|
|
53
|
+
"url": "https://github.com/PolderLabs/BizarHarness-OMP.git"
|
|
54
54
|
},
|
|
55
55
|
"license": "MIT",
|
|
56
56
|
"publishConfig": {
|
|
@@ -1,16 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://github.com/
|
|
3
|
+
"$id": "https://github.com/PolderLabs/BizarHarness-OMP/schemas/evidence-record.schema.json",
|
|
4
4
|
"title": "Bizar OMP evidence record",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": ["id", "runId", "type", "checkId", "result", "targetDigest", "stale", "provenance"],
|
|
6
|
+
"required": ["id", "runId", "type", "checkId", "result", "targetDigest", "recordedAt", "stale", "checkSpecHash", "evaluatorHash", "provenance"],
|
|
7
7
|
"properties": {
|
|
8
8
|
"id": { "type": "string" },
|
|
9
9
|
"runId": { "type": "string" },
|
|
10
10
|
"type": { "enum": ["test", "lint", "typecheck", "review", "research", "worker", "git", "manual"] },
|
|
11
|
+
"checkId": { "type": "string" },
|
|
11
12
|
"result": { "enum": ["passed", "failed", "blocked", "cancelled", "unknown"] },
|
|
13
|
+
"command": { "type": "array", "items": { "type": "string" } },
|
|
14
|
+
"cwd": { "type": "string" },
|
|
15
|
+
"exitCode": { "type": "integer" },
|
|
12
16
|
"targetDigest": { "type": "string", "minLength": 1 },
|
|
13
|
-
"
|
|
17
|
+
"inputDigests": { "type": "object", "additionalProperties": { "type": "string" } },
|
|
18
|
+
"stdout": { "type": "string" },
|
|
19
|
+
"stderr": { "type": "string" },
|
|
20
|
+
"artifactHashes": { "type": "array", "items": { "type": "string" } },
|
|
21
|
+
"checkSpecHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
22
|
+
"evaluatorHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
23
|
+
"attemptGeneration": { "type": "integer", "minimum": 1 },
|
|
24
|
+
"candidateId": { "type": "string" },
|
|
25
|
+
"candidateTree": { "type": "string" },
|
|
26
|
+
"recordedAt": { "type": "string", "format": "date-time" },
|
|
27
|
+
"stale": { "type": "boolean" },
|
|
28
|
+
"provenance": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"required": ["producer", "source", "observedAt"],
|
|
31
|
+
"properties": {
|
|
32
|
+
"producer": { "type": "string" },
|
|
33
|
+
"source": { "type": "string" },
|
|
34
|
+
"observedAt": { "type": "string", "format": "date-time" },
|
|
35
|
+
"buildId": { "type": "string" },
|
|
36
|
+
"runId": { "type": "string" },
|
|
37
|
+
"reviewRevision": { "type": "integer" }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
14
40
|
},
|
|
15
41
|
"additionalProperties": true
|
|
16
42
|
}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://github.com/
|
|
3
|
+
"$id": "https://github.com/PolderLabs/BizarHarness-OMP/schemas/workflow-run.schema.json",
|
|
4
4
|
"title": "Bizar OMP workflow run",
|
|
5
5
|
"type": "object",
|
|
6
|
-
"required": ["schemaVersion", "runId", "projectId", "objectiveHash", "revision", "phase"],
|
|
6
|
+
"required": ["schemaVersion", "runId", "projectId", "objectiveHash", "revision", "phase", "nativeSessionId"],
|
|
7
7
|
"properties": {
|
|
8
8
|
"schemaVersion": { "const": 1 },
|
|
9
9
|
"runId": { "type": "string", "pattern": "^run_" },
|
|
10
10
|
"projectId": { "type": "string", "minLength": 1 },
|
|
11
11
|
"objectiveHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
12
12
|
"revision": { "type": "integer", "minimum": 0 },
|
|
13
|
-
"phase": { "enum": ["created", "orienting", "researching", "planning", "ready", "executing", "integrating", "verifying", "reviewing", "complete", "blocked", "failed", "cancelled"] }
|
|
13
|
+
"phase": { "enum": ["created", "orienting", "researching", "planning", "ready", "executing", "integrating", "verifying", "reviewing", "complete", "blocked", "failed", "cancelled"] },
|
|
14
|
+
"nativeSessionId": { "type": "string" },
|
|
15
|
+
"owner": { "type": "string" },
|
|
16
|
+
"candidateId": { "type": "string" },
|
|
17
|
+
"candidateTree": { "type": "string" },
|
|
18
|
+
"criteria": { "type": "array", "items": { "type": "object" } },
|
|
19
|
+
"reviewSpec": { "type": "object" },
|
|
20
|
+
"checkSpecs": { "type": "array", "items": { "type": "object" } }
|
|
14
21
|
},
|
|
15
22
|
"additionalProperties": true
|
|
16
23
|
}
|
|
@@ -17,7 +17,8 @@ Use the native Bizar tools for the typed lifecycle:
|
|
|
17
17
|
|
|
18
18
|
- `bizar_workflow` starts, inspects, transitions, and completes a workflow only when required checks and accepted work are satisfied.
|
|
19
19
|
- `bizar_verify` runs a host-observed check and records its result against the current target.
|
|
20
|
-
- `bizar_evidence`
|
|
20
|
+
- `bizar_evidence` queries recorded evidence and freshness; unobserved or stale evidence never counts as passing. Evidence is recorded only through `bizar_verify`, `bizar_candidate_verify`, reviews, and journaled integration events.
|
|
21
|
+
- `bizar_candidate_verify` materializes an exact candidate patch in a disposable workspace, runs a frozen CheckSpec there, and records candidate-bound evidence.
|
|
21
22
|
- `bizar_integrate` admits scoped changes through Bizar's serialized integration path.
|
|
22
23
|
|
|
23
24
|
An accepted task, a planned change, or a successful tool call is not completion. Completion requires fresh evidence for the current tree, no unresolved work or integrations, and explicit workflow completion.
|
|
@@ -9,7 +9,7 @@ Treat this skill as a source-grounded engineering procedure, not an assertion of
|
|
|
9
9
|
|
|
10
10
|
## Establish the target before implementing
|
|
11
11
|
|
|
12
|
-
Read [accuracy-and-versioning.md](references/accuracy-and-versioning.md) first. The current qualification target is `can1357/oh-my-pi` v18.2.
|
|
12
|
+
Read [accuracy-and-versioning.md](references/accuracy-and-versioning.md) first. The current qualification target is `can1357/oh-my-pi` v18.2.8 at commit `5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c`; OMP 18.2.6, 18.2.5, and 18.2.4 remain separately tested compatibility versions. The bundled research corpus remains pinned to main commit `dbf3afad4894bde827d90f965e77b3fe1c5a95e5`, dated 2026-09-17, and must not be presented as the current release source.
|
|
13
13
|
|
|
14
14
|
Record the developer's actual OMP package version, lockfile/integrity, source commit when available, Bun version, execution mode, profile, cwd, and relevant settings. Never print secrets. Verify the exact exports and behavior of that target, rather than assuming these snapshots apply unchanged. A missing environment or unrun test means UNKNOWN or NOT RUN, never PASS.
|
|
15
15
|
|
|
@@ -18,7 +18,7 @@ Separate five kinds of statement: DOCUMENTED, SOURCE-OBSERVED, TESTED, PROPOSED
|
|
|
18
18
|
|
|
19
19
|
## Target fingerprint
|
|
20
20
|
|
|
21
|
-
Current qualification target: `v18.2.
|
|
21
|
+
Current qualification target: `v18.2.8@5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c`, npm integrity `sha512-I8JXVNLJb8PfGS6mRGSKNq73+EX+R/GoaRBoMj8HTtOiwF112QXH72UP2klTwoCiR2gTsACbAIWjD0JdrR3A3g==`.
|
|
22
22
|
Previous compatibility targets: `v18.2.6@78b753124d11f8dd3ae73e2524125890ff7c977e`, `v18.2.5@37273117021129e96bd05d8277b140ec3fd61990` and `v18.2.4@1c0303b1f2ec515cbf4b44a9a49d68a029531aac`.
|
|
23
23
|
Research source: `can1357/oh-my-pi@dbf3afad4894bde827d90f965e77b3fe1c5a95e5`; it remains a source/documentation corpus pin, not a claim about the current package release. Compare artifacts/commits, not just a semver string.
|
|
24
24
|
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"reference_date": "2026-09-17",
|
|
6
6
|
"docs_tree_sha": "c0055f49ceb172ff6da9490cf74773e9b187966b",
|
|
7
7
|
"current_qualification": {
|
|
8
|
-
"tag": "v18.2.
|
|
9
|
-
"commit": "
|
|
10
|
-
"npm_integrity": "sha512-
|
|
8
|
+
"tag": "v18.2.8",
|
|
9
|
+
"commit": "5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c",
|
|
10
|
+
"npm_integrity": "sha512-I8JXVNLJb8PfGS6mRGSKNq73+EX+R/GoaRBoMj8HTtOiwF112QXH72UP2klTwoCiR2gTsACbAIWjD0JdrR3A3g==",
|
|
11
11
|
"qualification": "Runtime-qualified by the Bizar packed-install contract; the bundled docs/source inventory remains pinned to the research commit below."
|
|
12
12
|
},
|
|
13
13
|
"comparison_release": {
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
2
|
-
export function openkanCommand(args: string[]) { if (args.some(arg => arg.startsWith("--" ) && arg.includes("storage"))) throw new Error("OpenKan storage internals are not a supported adapter surface"); return ["ok", ...args]; }
|
|
3
|
-
export async function runOpenKan(args: string[], cwd: string): Promise<{ code: number; stdout: string; stderr: string }> { const argv = openkanCommand(args); return new Promise(resolve => { const child = spawn(argv[0], argv.slice(1), { cwd, stdio: ["ignore", "pipe", "pipe"] }); let stdout = ""; let stderr = ""; child.stdout.on("data", data => { stdout += data; }); child.stderr.on("data", data => { stderr += data; }); child.on("close", code => resolve({ code: code ?? 1, stdout, stderr })); }); }
|