@ornexus/neocortex 4.60.54 → 4.60.56

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 (53) hide show
  1. package/dist/sbom.cdx.json +23 -23
  2. package/install.ps1 +1 -1
  3. package/install.sh +1 -1
  4. package/package.json +5 -2
  5. package/packages/client/dist/cli.js +0 -0
  6. package/packages/client/dist/commands/invoke.d.ts +32 -0
  7. package/packages/client/dist/commands/invoke.js +69 -60
  8. package/packages/client/dist/generated/command-registry.generated.d.ts +2 -2
  9. package/packages/client/dist/generated/command-registry.generated.js +1 -1
  10. package/packages/client/dist/generated/public-projections.generated.d.ts +20 -20
  11. package/packages/client/dist/generated/public-projections.generated.js +1 -1
  12. package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +6 -0
  13. package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
  14. package/packages/client/dist/private-execution/clean-baseline.d.ts +12 -0
  15. package/packages/client/dist/private-execution/clean-baseline.js +2 -0
  16. package/packages/client/dist/private-execution/codex-executor.d.ts +65 -0
  17. package/packages/client/dist/private-execution/codex-executor.js +2 -0
  18. package/packages/client/dist/private-execution/delivery.d.ts +74 -0
  19. package/packages/client/dist/private-execution/delivery.js +3 -0
  20. package/packages/client/dist/private-execution/isolated-admission.d.ts +13 -0
  21. package/packages/client/dist/private-execution/isolated-admission.js +2 -0
  22. package/packages/client/dist/private-execution/isolated-session.d.ts +41 -0
  23. package/packages/client/dist/private-execution/isolated-session.js +2 -0
  24. package/packages/client/dist/private-execution/isolated-workspace.d.ts +13 -0
  25. package/packages/client/dist/private-execution/isolated-workspace.js +1 -0
  26. package/packages/client/dist/private-execution/root-checkpoint.d.ts +15 -0
  27. package/packages/client/dist/private-execution/root-checkpoint.js +1 -0
  28. package/packages/client/dist/resolvers/remote-resolver.js +1 -1
  29. package/packages/client/dist/runner-cli.js +0 -0
  30. package/packages/client/dist/yolo/change-evidence-collector.d.ts +6 -0
  31. package/packages/client/dist/yolo/change-evidence-collector.js +1 -0
  32. package/packages/client/dist/yolo/spec-envelope-collector.d.ts +11 -0
  33. package/packages/client/dist/yolo/spec-envelope-collector.js +5 -0
  34. package/packages/client/dist/yoloop/yoloop-client-state-store.d.ts +1 -1
  35. package/packages/client/dist/yoloop/yoloop-client-state-store.js +1 -1
  36. package/packages/shared/dist/frontmatter-context-contract.js +326 -0
  37. package/packages/shared/dist/generated/command-registry.generated.js +2 -2
  38. package/packages/shared/dist/generated/invocation-schema.generated.js +16 -4
  39. package/packages/shared/dist/generated/public-projections.generated.js +18 -18
  40. package/packages/shared/dist/invocation/index.d.ts +1 -1
  41. package/packages/shared/dist/yolo/change-evidence.js +44 -0
  42. package/packages/shared/dist/yolo/spec-envelope.js +161 -0
  43. package/targets-stubs/antigravity/gemini.md +1 -1
  44. package/targets-stubs/antigravity/skill/SKILL.md +1 -1
  45. package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
  46. package/targets-stubs/claude-code/neocortex-root.md +2 -2
  47. package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
  48. package/targets-stubs/claude-code/neocortex.md +2 -2
  49. package/targets-stubs/codex/AGENTS.md +1 -1
  50. package/targets-stubs/cursor/agent.md +2 -2
  51. package/targets-stubs/gemini-cli/agent.md +2 -2
  52. package/targets-stubs/opencode/neocortex-root.md +1 -1
  53. package/targets-stubs/vscode/neocortex.agent.md +2 -2
@@ -1,56 +1,56 @@
1
1
  /** Generated by scripts/generate-public-catalog-projections.mjs. Do not edit. */
2
2
  export const PUBLIC_PROJECTION_BUNDLE = {
3
3
  "schemaVersion": "PublicProjectionBundle/1.0",
4
- "generationId": "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d",
5
- "sourceHash": "e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d",
6
- "catalogHash": "ef01b19a69035c03fc0ab72347bb2eb69f9cd5b88290e7e8e6d697a60462ebbb",
7
- "publicProjectionHash": "fa59fd5ab25b6f6155eabb0f06aad0d08583700e6594c9fb68f0878d6578bb0e",
8
- "stageProjectionHash": "4f57af9f2c74c36148a4a0aa5415c7cc3cac9ee435c0578a2fc6eb385dbb468b",
9
- "compilationHash": "41157e76e50487bb23ff21f41216c7250934bff8273267443c9b3d145c398267",
4
+ "generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148",
5
+ "sourceHash": "034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148",
6
+ "catalogHash": "175a7b58faea15f1b7b889ab40b21dbfe3bd000166450299dd0de2038dc01336",
7
+ "publicProjectionHash": "dc902d3a9d0736fdc9adc6067545d0e33fd07769b75eae851c2dd4e02a080c45",
8
+ "stageProjectionHash": "56e20ca8c56823d6212314f49d01d609f8a7348d4e1f199dfc6c4d2ee3b3456f",
9
+ "compilationHash": "adfebaa27af805a0b025e41bd82031b0c67b8fddb55abb737c63112ca2b8c971",
10
10
  "registry": {
11
11
  "version": "1.0.0",
12
- "checksum": "b9a97bc12316a913b72a27e1d4c18e749737da40003bd73f60350b07408bd5c7"
12
+ "checksum": "2dd14afa94738949eb19750f69590b6ddb0592cfb302ae1fe26073a88d408184"
13
13
  },
14
14
  "artifacts": [
15
15
  {
16
16
  "kind": "catalog",
17
17
  "schemaVersion": "ExecutableGraphCatalogPublicProjection/1.0",
18
18
  "relativePath": "catalog.json",
19
- "sha256": "8c3b5e31e03c2cbe80112c01a0dd243c07451c03a3102029b7df7f67f152e57a",
19
+ "sha256": "5793df981fd005dda55c6b1e678fd7157968513f56fa91b9c362463f5f45c46c",
20
20
  "entryCount": 97,
21
- "generationId": "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"
21
+ "generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
22
22
  },
23
23
  {
24
24
  "kind": "commands",
25
25
  "schemaVersion": "CommandRegistryPublicProjection/1.0",
26
26
  "relativePath": "commands.json",
27
- "sha256": "122143b8cc2447a17eebe3aaa6aba8bf906433895f16037b1b99ee931c617b61",
27
+ "sha256": "54439f9472c1f85963ff81ac3e35a470dd7009ff9d442f5a75d6d32638638dfa",
28
28
  "entryCount": 62,
29
- "generationId": "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"
29
+ "generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
30
30
  },
31
31
  {
32
32
  "kind": "progress-view",
33
33
  "schemaVersion": "ProgressViewContractProjection/1.0",
34
34
  "relativePath": "progress-view.json",
35
- "sha256": "90cbd37693bcf0a9b6dd7e89201fd4b487be9254c1bcfe1f84a36fff510f5a7d",
35
+ "sha256": "172031c0f4f82148dde09a744688c49e4b3c4fc13153b52859b8a8c723224c02",
36
36
  "entryCount": 1,
37
- "generationId": "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"
37
+ "generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
38
38
  },
39
39
  {
40
40
  "kind": "stages",
41
41
  "schemaVersion": "ExecutableGraphStageProjection/1.0",
42
42
  "relativePath": "stages.json",
43
- "sha256": "724a2e51c3666410b0f8b5b15a27bb9f53f5e280f3d362d77e98de0d316a9182",
43
+ "sha256": "1711273d5edbf26bf032e87587a5067796a3d7f82bf5b029b5d901a679e952bc",
44
44
  "entryCount": 85,
45
- "generationId": "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"
45
+ "generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
46
46
  },
47
47
  {
48
48
  "kind": "surfaces",
49
49
  "schemaVersion": "PublicProjectionSurfaces/1.0",
50
50
  "relativePath": "surfaces.json",
51
- "sha256": "119607b7fe50d1564bebce0571bfa981a91ede109bc3f1f0e02e71b3e106e10a",
51
+ "sha256": "087252259cf5609f1181031e9280772376cd56fab3244aa78952d98c7249a2f4",
52
52
  "entryCount": 6,
53
- "generationId": "sha256:e406000429f98d60eca32f429327208c7e49618a08ca100bb02896cc424c955d"
53
+ "generationId": "sha256:034eda819703dbfb0dc09ad714b17e2058e1f7befae474d5d581360496e20148"
54
54
  }
55
55
  ],
56
56
  "compatibility": {
@@ -143,7 +143,7 @@ export const PUBLIC_PROJECTION_BUNDLE = {
143
143
  }
144
144
  ],
145
145
  "publicSafe": true,
146
- "bundleHash": "acd1a64265cccf291d3d26a4fb49620828e3c53bcf0451db5d8c5a8ddf320ea0"
146
+ "bundleHash": "c7358d9ac8976b71c9cfa9a6da929eb0435814c67465b93c7ee42dcb34e9b0f5"
147
147
  };
148
148
  export const PUBLIC_PROJECTION_GENERATION_ID = PUBLIC_PROJECTION_BUNDLE.generationId;
149
149
  export const PUBLIC_PROJECTION_BUNDLE_HASH = PUBLIC_PROJECTION_BUNDLE.bundleHash;
@@ -122,7 +122,7 @@ export interface InvocationCommandSchemaV1 {
122
122
  readonly positionals: readonly InvocationPositionalSchemaV1[];
123
123
  readonly terminator: true;
124
124
  }
125
- export declare const INVOCATION_SCHEMA_CHECKSUM: "15e75fe8a4d8251414b661821c52eb0a9e92a3b7bca0f0d05fcb1827c4e24ce2";
125
+ export declare const INVOCATION_SCHEMA_CHECKSUM: "65ce7e99e9cf5511a9ab02838b31acf6f86752267df453041b26e05ad9feffbc";
126
126
  export interface InvocationSchemaManifestV1 {
127
127
  readonly schemaVersion: typeof INVOCATION_SCHEMA_VERSION;
128
128
  readonly registryVersion: string;
@@ -0,0 +1,44 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { posix } from 'node:path';
3
+ const SHA = /^[a-f0-9]{40}(?:[a-f0-9]{24})?$/;
4
+ const PATH = /^[A-Za-z0-9_.-][A-Za-z0-9_./ -]{0,239}$/;
5
+ const UNSAFE = /(^|\/)(?:\.env(?:\.|$)|secrets?|credentials?|private-prompts?|customer-data)(?:\/|$)|(?:token|password|license[_-]?key|secret)[=:]/i;
6
+ function digest(paths) {
7
+ return createHash('sha256').update(JSON.stringify(paths)).digest('hex');
8
+ }
9
+ function fail() { throw new Error('yolo-change-evidence-unsafe'); }
10
+ function validPath(path) {
11
+ return typeof path === 'string' && PATH.test(path) && !path.includes('\\')
12
+ && !path.split('/').includes('..') && posix.normalize(path) === path && !UNSAFE.test(path);
13
+ }
14
+ export function createYoloChangeEvidenceV1(input) {
15
+ if (!SHA.test(input.baseSha) || !SHA.test(input.headSha) || !Array.isArray(input.changedPaths))
16
+ fail();
17
+ const paths = [...new Set(input.changedPaths)].sort();
18
+ if (paths.length > 256 || paths.some((path) => !validPath(path)))
19
+ fail();
20
+ return {
21
+ schemaVersion: 1,
22
+ source: 'git-diff-base-and-worktree',
23
+ baseSha: input.baseSha,
24
+ headSha: input.headSha,
25
+ changedPaths: paths,
26
+ pathsSha256: digest(paths),
27
+ };
28
+ }
29
+ export function assertYoloChangeEvidenceV1(value, expectedHeadSha) {
30
+ if (!value || typeof value !== 'object' || Array.isArray(value))
31
+ fail();
32
+ const record = value;
33
+ const keys = Object.keys(record).sort();
34
+ const expected = ['schemaVersion', 'source', 'baseSha', 'headSha', 'changedPaths', 'pathsSha256'].sort();
35
+ if (keys.length !== expected.length || keys.some((key, index) => key !== expected[index])
36
+ || record.schemaVersion !== 1 || record.source !== 'git-diff-base-and-worktree'
37
+ || typeof record.baseSha !== 'string' || !SHA.test(record.baseSha)
38
+ || record.headSha !== expectedHeadSha || typeof record.headSha !== 'string' || !SHA.test(record.headSha)
39
+ || !Array.isArray(record.changedPaths) || record.changedPaths.length > 256
40
+ || record.changedPaths.some((path) => !validPath(path))
41
+ || JSON.stringify([...new Set(record.changedPaths)].sort()) !== JSON.stringify(record.changedPaths)
42
+ || record.pathsSha256 !== digest(record.changedPaths))
43
+ fail();
44
+ }
@@ -0,0 +1,161 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { posix } from 'node:path';
3
+ import { inspectFrontmatterContext } from '../frontmatter-context-contract.js';
4
+ export const YOLO_SPEC_ARTIFACT_LIMIT_BYTES = 64 * 1024;
5
+ export const YOLO_SPEC_TOTAL_LIMIT_BYTES = 128 * 1024;
6
+ export const YOLO_SPEC_MAX_ARTIFACTS = 12;
7
+ export const YOLO_SPEC_MAX_AGE_MS = 120_000;
8
+ export const YOLO_SPEC_FUTURE_SKEW_MS = 30_000;
9
+ const HASH = /^[a-f0-9]{64}$/;
10
+ const HEAD = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/;
11
+ const STORY_ID = /^[A-Za-z0-9]+(?:\.[A-Za-z0-9]+)+$/;
12
+ const EPIC_ID = /^[A-Za-z0-9]+$/;
13
+ const KINDS = ['story', 'epic', 'spec', 'contract', 'adr', 'nfr', 'example', 'bdd', 'traceability', 'template'];
14
+ const ALLOWED_PATH = /^(?:docs\/(?:stories|epics|specs|architecture|examples)\/|core\/templates\/specs\/)[A-Za-z0-9_./-]+$/;
15
+ const PROHIBITED_CONTENT = /(?:-----BEGIN [A-Z ]*PRIVATE KEY-----|\b(?:bearer|token|password|secret|api[_-]?key)\s*[:=]\s*\S+|\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b|\b(?:sk-|ghp_|github_pat_|npm_)[A-Za-z0-9_-]{12,}\b|(?:^|[\s"'(])\/(?:home|media|root|etc|var|Users)\/)/im;
16
+ function deny(code) {
17
+ throw new Error(code);
18
+ }
19
+ function isRecord(value) {
20
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
21
+ }
22
+ function hasExactKeys(value, keys) {
23
+ const actual = Object.keys(value).sort();
24
+ const expected = [...keys].sort();
25
+ return actual.length === expected.length && actual.every((key, index) => key === expected[index]);
26
+ }
27
+ function sha256(value) {
28
+ return createHash('sha256').update(value, 'utf8').digest('hex');
29
+ }
30
+ function validPath(value) {
31
+ return typeof value === 'string'
32
+ && value.length > 0 && value.length <= 240
33
+ && ALLOWED_PATH.test(value)
34
+ && !value.includes('\\') && !value.split('/').includes('..')
35
+ && posix.normalize(value) === value;
36
+ }
37
+ function normalizeContent(content) {
38
+ if (content.includes('\0') || /\r(?!\n)/.test(content))
39
+ deny('yolo-spec-envelope-unsafe');
40
+ const normalized = content.replaceAll('\r\n', '\n');
41
+ if (PROHIBITED_CONTENT.test(normalized))
42
+ deny('yolo-spec-envelope-unsafe');
43
+ return normalized;
44
+ }
45
+ function artifactManifestSha256(artifacts) {
46
+ return sha256(JSON.stringify(artifacts.map(({ kind, path, byteLength, sha256: digest }) => [kind, path, byteLength, digest])));
47
+ }
48
+ function unsignedEnvelopeSha256(value) {
49
+ return sha256(JSON.stringify(value));
50
+ }
51
+ function checkArtifact(value) {
52
+ if (!isRecord(value) || !hasExactKeys(value, ['kind', 'path', 'content', 'byteLength', 'sha256'])
53
+ || !KINDS.includes(String(value.kind)) || !validPath(value.path))
54
+ deny('yolo-spec-envelope-path-out-of-scope');
55
+ if (typeof value.content !== 'string' || !Number.isSafeInteger(value.byteLength) || !HASH.test(String(value.sha256))) {
56
+ deny('yolo-spec-envelope-unsafe');
57
+ }
58
+ const content = normalizeContent(value.content);
59
+ const bytes = Buffer.byteLength(content, 'utf8');
60
+ if (bytes > YOLO_SPEC_ARTIFACT_LIMIT_BYTES)
61
+ deny('yolo-spec-envelope-too-large');
62
+ if (content !== value.content || bytes !== value.byteLength || sha256(content) !== value.sha256) {
63
+ deny('yolo-spec-envelope-digest-mismatch');
64
+ }
65
+ }
66
+ export function createYoloSpecEnvelopeV1(input) {
67
+ if (!Array.isArray(input.artifacts) || input.artifacts.length > YOLO_SPEC_MAX_ARTIFACTS)
68
+ deny('yolo-spec-envelope-too-large');
69
+ const artifacts = input.artifacts.map((artifact) => {
70
+ if (!isRecord(artifact) || !KINDS.includes(String(artifact.kind)) || !validPath(artifact.path)
71
+ || typeof artifact.content !== 'string')
72
+ deny('yolo-spec-envelope-path-out-of-scope');
73
+ const content = normalizeContent(artifact.content);
74
+ return {
75
+ kind: artifact.kind,
76
+ path: artifact.path,
77
+ content,
78
+ byteLength: Buffer.byteLength(content, 'utf8'),
79
+ sha256: sha256(content),
80
+ };
81
+ }).sort((left, right) => left.kind.localeCompare(right.kind) || left.path.localeCompare(right.path));
82
+ const unsigned = {
83
+ schemaVersion: 1,
84
+ storyId: input.storyId,
85
+ epicId: input.epicId,
86
+ targetPath: input.targetPath,
87
+ inputSha256: input.inputSha256,
88
+ sourceRevision: { headSha: input.headSha, manifestSha256: artifactManifestSha256(artifacts) },
89
+ collectedAt: input.collectedAt,
90
+ artifacts,
91
+ };
92
+ const envelope = { ...unsigned, envelopeSha256: unsignedEnvelopeSha256(unsigned) };
93
+ assertYoloSpecEnvelopeV1(envelope, {
94
+ storyId: input.storyId, epicId: input.epicId, targetPath: input.targetPath,
95
+ inputSha256: input.inputSha256, nowMs: Date.parse(input.collectedAt),
96
+ });
97
+ return envelope;
98
+ }
99
+ export function assertYoloSpecEnvelopeV1(value, context) {
100
+ if (!isRecord(value) || !hasExactKeys(value, ['schemaVersion', 'storyId', 'epicId', 'targetPath', 'inputSha256', 'sourceRevision', 'collectedAt', 'artifacts', 'envelopeSha256'])
101
+ || value.schemaVersion !== 1 || typeof value.storyId !== 'string' || !STORY_ID.test(value.storyId)
102
+ || typeof value.epicId !== 'string' || !EPIC_ID.test(value.epicId)
103
+ || !validPath(value.targetPath) || !HASH.test(String(value.inputSha256))
104
+ || !HASH.test(String(value.envelopeSha256)))
105
+ deny('yolo-spec-envelope-unsafe');
106
+ if (value.storyId !== context.storyId || value.epicId !== context.epicId
107
+ || value.targetPath !== context.targetPath || value.inputSha256 !== context.inputSha256
108
+ || value.targetPath !== `docs/stories/${value.storyId}.story.md`)
109
+ deny('yolo-spec-envelope-target-mismatch');
110
+ const source = value.sourceRevision;
111
+ if (!isRecord(source) || !hasExactKeys(source, ['headSha', 'manifestSha256'])
112
+ || !HEAD.test(String(source.headSha)) || !HASH.test(String(source.manifestSha256)))
113
+ deny('yolo-spec-envelope-unsafe');
114
+ if (typeof value.collectedAt !== 'string' || !/^\d{4}-\d{2}-\d{2}T.*Z$/.test(value.collectedAt))
115
+ deny('yolo-spec-envelope-stale');
116
+ const collectedMs = Date.parse(value.collectedAt);
117
+ const nowMs = context.nowMs ?? Date.now();
118
+ if (!Number.isFinite(collectedMs) || !Number.isFinite(nowMs)
119
+ || nowMs - collectedMs > YOLO_SPEC_MAX_AGE_MS || collectedMs - nowMs > YOLO_SPEC_FUTURE_SKEW_MS)
120
+ deny('yolo-spec-envelope-stale');
121
+ if (!Array.isArray(value.artifacts) || value.artifacts.length < 1 || value.artifacts.length > YOLO_SPEC_MAX_ARTIFACTS)
122
+ deny('yolo-spec-envelope-too-large');
123
+ const artifacts = value.artifacts;
124
+ for (const artifact of artifacts)
125
+ checkArtifact(artifact);
126
+ const typedArtifacts = artifacts;
127
+ if (typedArtifacts.reduce((sum, artifact) => sum + artifact.byteLength, 0) > YOLO_SPEC_TOTAL_LIMIT_BYTES)
128
+ deny('yolo-spec-envelope-too-large');
129
+ const keys = typedArtifacts.map((artifact) => `${artifact.kind}:${artifact.path}`);
130
+ if (new Set(keys).size !== keys.length || keys.some((key, index) => index > 0 && key < keys[index - 1]))
131
+ deny('yolo-spec-envelope-unsafe');
132
+ if (typedArtifacts.filter((artifact) => artifact.kind === 'story' && artifact.path === value.targetPath).length !== 1
133
+ || typedArtifacts.filter((artifact) => artifact.kind === 'epic' && artifact.path === `docs/epics/epic-${value.epicId}.md`).length !== 1
134
+ || typedArtifacts.some((artifact) => artifact.kind === 'story' && artifact.path !== value.targetPath)
135
+ || typedArtifacts.some((artifact) => artifact.kind === 'epic' && artifact.path !== `docs/epics/epic-${value.epicId}.md`)) {
136
+ deny('yolo-spec-envelope-target-mismatch');
137
+ }
138
+ const story = typedArtifacts.find((artifact) => artifact.kind === 'story');
139
+ const epic = typedArtifacts.find((artifact) => artifact.kind === 'epic');
140
+ const storyContext = inspectFrontmatterContext(story.content, { context: 'story-target', explicitlySelected: true });
141
+ const epicContext = inspectFrontmatterContext(epic.content, { context: 'epic-target', explicitlySelected: true });
142
+ if (storyContext.status !== 'valid' || storyContext.metadata.id !== value.storyId
143
+ || storyContext.metadata.epic_id !== value.epicId
144
+ || epicContext.status !== 'valid' || epicContext.metadata.id !== value.epicId) {
145
+ deny('yolo-spec-envelope-target-mismatch');
146
+ }
147
+ if (artifactManifestSha256(typedArtifacts) !== source.manifestSha256)
148
+ deny('yolo-spec-envelope-digest-mismatch');
149
+ const unsigned = {
150
+ schemaVersion: value.schemaVersion,
151
+ storyId: value.storyId,
152
+ epicId: value.epicId,
153
+ targetPath: value.targetPath,
154
+ inputSha256: value.inputSha256,
155
+ sourceRevision: value.sourceRevision,
156
+ collectedAt: value.collectedAt,
157
+ artifacts: value.artifacts,
158
+ };
159
+ if (unsignedEnvelopeSha256(unsigned) !== value.envelopeSha256)
160
+ deny('yolo-spec-envelope-digest-mismatch');
161
+ }
@@ -1,4 +1,4 @@
1
- # 🧠 Neocortex v4.60.54 | OrNexus Team
1
+ # 🧠 Neocortex v4.60.56 | OrNexus Team
2
2
 
3
3
  This project uses Neocortex, a Development Orchestrator.
4
4
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.54 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.56 | OrNexus Team"
4
4
  ---
5
5
 
6
6
  <!--
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex Root Agent'
5
5
  title: 'Development Orchestrator (Root)'
6
6
  icon: '>'
7
- version: '4.60.54'
7
+ version: '4.60.56'
8
8
  architecture: 'thin-client'
9
9
  module: stand-alone
10
10
  hasSidecar: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex-root
3
- description: "🧠 Neocortex Root Agent v4.60.54 | OrNexus Team"
3
+ description: "🧠 Neocortex Root Agent v4.60.56 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  tools:
@@ -108,7 +108,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
108
108
  ┌────────────────────────────────────────────────────────────┐
109
109
  │ │
110
110
  │ ####### N E O C O R T E X │
111
- │ ### ######## v4.60.54 │
111
+ │ ### ######## v4.60.56 │
112
112
  │ ######### ##### │
113
113
  │ ## ############## Development Orchestrator │
114
114
  │ ## ### ###### ## OrNexus Team │
@@ -4,7 +4,7 @@ agent:
4
4
  name: 'Neocortex'
5
5
  title: 'Development Orchestrator'
6
6
  icon: '>'
7
- version: '4.60.54'
7
+ version: '4.60.56'
8
8
  architecture: 'thin-client'
9
9
  module: stand-alone
10
10
  hasSidecar: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.54 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.56 | OrNexus Team"
4
4
  model: opus
5
5
  color: blue
6
6
  permissionMode: bypassPermissions
@@ -104,7 +104,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
104
104
  ┌────────────────────────────────────────────────────────────┐
105
105
  │ │
106
106
  │ ####### N E O C O R T E X │
107
- │ ### ######## v4.60.54 │
107
+ │ ### ######## v4.60.56 │
108
108
  │ ######### ##### │
109
109
  │ ## ############## Development Orchestrator │
110
110
  │ ## ### ###### ## OrNexus Team │
@@ -28,7 +28,7 @@ Codex built-in commands or actions.
28
28
 
29
29
  <!-- END: Plugin Conflict Prevention -->
30
30
 
31
- # Neocortex v4.60.54 | OrNexus Team
31
+ # Neocortex v4.60.56 | OrNexus Team
32
32
 
33
33
  You are a Development Orchestrator. All orchestration logic is delivered by the remote Neocortex server.
34
34
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex
3
- description: "🧠 Neocortex v4.60.54 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.56 | OrNexus Team"
4
4
  model: inherit
5
5
  readonly: false
6
6
  is_background: false
@@ -64,7 +64,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
64
64
  ┌────────────────────────────────────────────────────────────┐
65
65
  │ │
66
66
  │ ####### N E O C O R T E X │
67
- │ ### ######## v4.60.54 │
67
+ │ ### ######## v4.60.56 │
68
68
  │ ######### ##### │
69
69
  │ ## ############## Development Orchestrator │
70
70
  │ ## ### ###### ## OrNexus Team │
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: neocortex-root
3
- description: "🧠 Neocortex v4.60.54 | OrNexus Team"
3
+ description: "🧠 Neocortex v4.60.56 | OrNexus Team"
4
4
  kind: local
5
5
  tools:
6
6
  # File operations (Gemini CLI built-ins)
@@ -62,7 +62,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
62
62
  ┌────────────────────────────────────────────────────────────┐
63
63
  │ │
64
64
  │ ####### N E O C O R T E X │
65
- │ ### ######## v4.60.54 │
65
+ │ ### ######## v4.60.56 │
66
66
  │ ######### ##### │
67
67
  │ ## ############## Development Orchestrator │
68
68
  │ ## ### ###### ## OrNexus Team │
@@ -58,7 +58,7 @@ explicit server opt-in rather than a local assumption.
58
58
  ┌────────────────────────────────────────────────────────────┐
59
59
  │ │
60
60
  │ ####### N E O C O R T E X │
61
- │ ### ######## v4.60.54 │
61
+ │ ### ######## v4.60.56 │
62
62
  │ ######### ##### │
63
63
  │ ## ############## Development Orchestrator │
64
64
  │ ## ### ###### ## OrNexus Team │
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: "neocortex"
3
- description: "Neocortex v4.60.54 | OrNexus Team"
3
+ description: "Neocortex v4.60.56 | OrNexus Team"
4
4
  tools:
5
5
  # Read / Edit (built-in tool sets)
6
6
  - read
@@ -68,7 +68,7 @@ SEMPRE que este agente for invocado, imprima o banner abaixo como PRIMEIRO outpu
68
68
  ┌────────────────────────────────────────────────────────────┐
69
69
  │ │
70
70
  │ ####### N E O C O R T E X │
71
- │ ### ######## v4.60.54 │
71
+ │ ### ######## v4.60.56 │
72
72
  │ ######### ##### │
73
73
  │ ## ############## Development Orchestrator │
74
74
  │ ## ### ###### ## OrNexus Team │