@ornexus/neocortex 4.60.59 → 4.60.61
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/dist/sbom.cdx.json +241 -82
- package/install.ps1 +1 -1
- package/install.sh +1 -1
- package/package.json +6 -2
- package/packages/client/dist/cli.js +37 -4
- package/packages/client/dist/commands/architecture-answers.d.ts +26 -0
- package/packages/client/dist/commands/architecture-answers.js +7 -0
- package/packages/client/dist/commands/architecture-memory-terminal.d.ts +21 -0
- package/packages/client/dist/commands/architecture-memory-terminal.js +2 -0
- package/packages/client/dist/commands/architecture-root-binding.d.ts +2 -0
- package/packages/client/dist/commands/architecture-root-binding.js +1 -0
- package/packages/client/dist/commands/invoke.d.ts +43 -2
- package/packages/client/dist/commands/invoke.js +98 -70
- package/packages/client/dist/commands/legacy-story-branch.d.ts +10 -0
- package/packages/client/dist/commands/legacy-story-branch.js +1 -0
- package/packages/client/dist/commands/legacy-story-pr.d.ts +18 -0
- package/packages/client/dist/commands/legacy-story-pr.js +1 -0
- package/packages/client/dist/commands/planning-diagnosis.d.ts +4 -0
- package/packages/client/dist/commands/planning-diagnosis.js +1 -0
- package/packages/client/dist/commands/planning-generation.d.ts +2 -0
- package/packages/client/dist/commands/planning-generation.js +1 -0
- package/packages/client/dist/commands/planning-research.d.ts +3 -0
- package/packages/client/dist/commands/planning-research.js +1 -0
- package/packages/client/dist/commands/refresh-memory.d.ts +10 -0
- package/packages/client/dist/commands/refresh-memory.js +3 -1
- package/packages/client/dist/commands/story-checkpoint.d.ts +1 -1
- package/packages/client/dist/commands/story-checkpoint.js +1 -1
- package/packages/client/dist/config/profile-directory.d.ts +2 -0
- package/packages/client/dist/config/profile-directory.js +1 -0
- package/packages/client/dist/config/secure-config.js +5 -5
- package/packages/client/dist/continuity/runner-bootstrap-policy.d.ts +1 -1
- package/packages/client/dist/continuity/runner-bootstrap-policy.js +1 -1
- package/packages/client/dist/generated/command-registry.generated.d.ts +11 -11
- package/packages/client/dist/generated/command-registry.generated.js +1 -1
- package/packages/client/dist/generated/public-projections.generated.d.ts +20 -20
- package/packages/client/dist/generated/public-projections.generated.js +1 -1
- package/packages/client/dist/git/direct-yolo-checkpoint.d.ts +9 -0
- package/packages/client/dist/git/direct-yolo-checkpoint.js +4 -4
- package/packages/client/dist/git/git-lifecycle-step-ids.d.ts +5 -0
- package/packages/client/dist/git/git-lifecycle-step-ids.js +1 -1
- package/packages/client/dist/git/git-lifecycle-store.d.ts +16 -0
- package/packages/client/dist/git/git-lifecycle-store.js +9 -4
- package/packages/client/dist/git/legacy-story-branch-checkpoint.d.ts +38 -0
- package/packages/client/dist/git/legacy-story-branch-checkpoint.js +9 -0
- package/packages/client/dist/git/legacy-story-branch-setup.d.ts +56 -0
- package/packages/client/dist/git/legacy-story-branch-setup.js +4 -0
- package/packages/client/dist/git/legacy-story-pr.d.ts +514 -0
- package/packages/client/dist/git/legacy-story-pr.js +62 -0
- package/packages/client/dist/git/secure-filesystem-boundary.d.ts +2 -0
- package/packages/client/dist/git/secure-filesystem-boundary.js +34 -7
- package/packages/client/dist/machine/fingerprint.js +2 -2
- package/packages/client/dist/memory/project-memory-writer.js +17 -17
- package/packages/client/dist/memory/shared-project-memory-types.d.ts +23 -13
- package/packages/client/dist/memory/shared-project-memory-types.js +2 -2
- package/packages/client/dist/migrations/state-json.d.ts +23 -1
- package/packages/client/dist/migrations/state-json.js +4 -4
- package/packages/client/dist/private-execution/delivery.d.ts +131 -3
- package/packages/client/dist/private-execution/delivery.js +2 -2
- package/packages/client/dist/private-execution/isolated-admission.d.ts +28 -1
- package/packages/client/dist/private-execution/isolated-admission.js +11 -2
- package/packages/client/dist/private-execution/isolated-session.js +2 -2
- package/packages/client/dist/private-execution/isolated-workspace.d.ts +8 -0
- package/packages/client/dist/private-execution/isolated-workspace.js +1 -1
- package/packages/client/dist/private-execution/pact-consumer-runtime.d.ts +19 -0
- package/packages/client/dist/private-execution/pact-consumer-runtime.js +3 -0
- package/packages/client/dist/private-execution/pact-test-source.d.ts +9 -0
- package/packages/client/dist/private-execution/pact-test-source.js +1 -0
- package/packages/client/dist/private-execution/pact-toolchain.d.ts +37 -0
- package/packages/client/dist/private-execution/pact-toolchain.js +3 -0
- package/packages/client/dist/private-execution/pact-write-set.d.ts +24 -0
- package/packages/client/dist/private-execution/pact-write-set.js +1 -0
- package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.d.ts +38 -0
- package/packages/client/dist/private-execution/planning-diagnosis-checkpoint.js +5 -0
- package/packages/client/dist/private-execution/planning-generation-checkpoint.d.ts +34 -0
- package/packages/client/dist/private-execution/planning-generation-checkpoint.js +4 -0
- package/packages/client/dist/private-execution/planning-research-checkpoint.d.ts +38 -0
- package/packages/client/dist/private-execution/planning-research-checkpoint.js +4 -0
- package/packages/client/dist/private-execution/ux-source-validation.d.ts +2 -0
- package/packages/client/dist/private-execution/ux-source-validation.js +1 -0
- package/packages/client/dist/private-execution/ux-write-set.d.ts +30 -0
- package/packages/client/dist/private-execution/ux-write-set.js +2 -0
- package/packages/client/dist/resolvers/remote-resolver.d.ts +5 -22
- package/packages/client/dist/resolvers/remote-resolver.js +1 -1
- package/packages/client/dist/runner/project-identity.js +1 -1
- package/packages/client/dist/runner/scheduler.d.ts +20 -0
- package/packages/client/dist/runner/scheduler.js +7 -7
- package/packages/client/dist/state/project-state-snapshot.js +1 -1
- package/packages/client/dist/yolo/change-evidence-collector.d.ts +8 -0
- package/packages/client/dist/yolo/change-evidence-collector.js +1 -1
- package/packages/client/dist/yolo/spec-envelope-collector.d.ts +2 -0
- package/packages/client/dist/yolo/spec-envelope-collector.js +3 -3
- package/packages/client/dist/yoloop/invoke-hooks.js +7 -7
- package/packages/shared/dist/generated/command-registry.generated.js +12 -10
- package/packages/shared/dist/generated/invocation-schema.generated.js +14 -6
- package/packages/shared/dist/generated/public-projections.generated.js +18 -18
- package/packages/shared/dist/invocation/index.d.ts +1 -1
- package/packages/shared/dist/merge-readiness/c12-remote-observation.js +80 -0
- package/packages/shared/dist/planning/diagnosis-state.js +143 -0
- package/packages/shared/dist/yoloop/branch-unit.js +23 -1
- package/targets-stubs/antigravity/gemini.md +1 -1
- package/targets-stubs/antigravity/skill/SKILL.md +1 -1
- package/targets-stubs/claude-code/neocortex-root.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex-root.md +2 -2
- package/targets-stubs/claude-code/neocortex.agent.yaml +1 -1
- package/targets-stubs/claude-code/neocortex.md +2 -2
- package/targets-stubs/codex/AGENTS.md +1 -1
- package/targets-stubs/cursor/agent.md +2 -2
- package/targets-stubs/gemini-cli/agent.md +2 -2
- package/targets-stubs/opencode/neocortex-root.md +1 -1
- package/targets-stubs/vscode/neocortex.agent.md +2 -2
|
@@ -2,41 +2,41 @@
|
|
|
2
2
|
export { PUBLIC_PROJECTION_BUNDLE, PUBLIC_PROJECTION_GENERATION_ID, PUBLIC_PROJECTION_BUNDLE_HASH } from './public-projections.generated.js';
|
|
3
3
|
export const COMMAND_REGISTRY_SCHEMA_VERSION = 1;
|
|
4
4
|
export const COMMAND_REGISTRY_VERSION = "1.0.0";
|
|
5
|
-
export const COMMAND_REGISTRY_CHECKSUM = "
|
|
5
|
+
export const COMMAND_REGISTRY_CHECKSUM = "a631fa17a24972952ef0270880105bfc4d1a6be17e8622c5916265d945fcb69d";
|
|
6
6
|
export const COMMAND_REGISTRY_PROJECTION_MANIFEST = {
|
|
7
7
|
"schemaVersion": 1,
|
|
8
8
|
"registryVersion": "1.0.0",
|
|
9
|
-
"registryChecksum": "
|
|
9
|
+
"registryChecksum": "a631fa17a24972952ef0270880105bfc4d1a6be17e8622c5916265d945fcb69d",
|
|
10
10
|
"projections": [
|
|
11
11
|
{
|
|
12
12
|
"kind": "admin",
|
|
13
13
|
"entryCount": 62,
|
|
14
|
-
"sha256": "
|
|
14
|
+
"sha256": "e155547000e8f0607360144555b10cb90f222f37b010120eb2e97ac802ce821f"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"kind": "client",
|
|
18
18
|
"entryCount": 62,
|
|
19
|
-
"sha256": "
|
|
19
|
+
"sha256": "e155547000e8f0607360144555b10cb90f222f37b010120eb2e97ac802ce821f"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"kind": "docs",
|
|
23
23
|
"entryCount": 62,
|
|
24
|
-
"sha256": "
|
|
24
|
+
"sha256": "e155547000e8f0607360144555b10cb90f222f37b010120eb2e97ac802ce821f"
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"kind": "metrics",
|
|
28
28
|
"entryCount": 62,
|
|
29
|
-
"sha256": "
|
|
29
|
+
"sha256": "e155547000e8f0607360144555b10cb90f222f37b010120eb2e97ac802ce821f"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"kind": "server",
|
|
33
33
|
"entryCount": 67,
|
|
34
|
-
"sha256": "
|
|
34
|
+
"sha256": "ffd28ece4ed51da16af392cbd97cfe5580433f925f926dabe1d409387126f1ab"
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"kind": "shared",
|
|
38
38
|
"entryCount": 67,
|
|
39
|
-
"sha256": "
|
|
39
|
+
"sha256": "5c820b21ff7e1d72b867a7a6927d292b404479c1c311be26840d3672b0c056fb"
|
|
40
40
|
}
|
|
41
41
|
]
|
|
42
42
|
};
|
|
@@ -932,6 +932,7 @@ export const GENERATED_SHARED_COMMANDS = [
|
|
|
932
932
|
"pt-BR": "Commit e push"
|
|
933
933
|
},
|
|
934
934
|
"examples": [
|
|
935
|
+
"@neocortex *commit",
|
|
935
936
|
"@neocortex *commit @docs/stories/P126.01.story.md"
|
|
936
937
|
],
|
|
937
938
|
"id": "commit",
|
|
@@ -1444,7 +1445,8 @@ export const GENERATED_SHARED_COMMANDS = [
|
|
|
1444
1445
|
"pt-BR": "Gerar testes Pact (consumer + provider) de openapi.yaml"
|
|
1445
1446
|
},
|
|
1446
1447
|
"examples": [
|
|
1447
|
-
"@neocortex *generate-pacts"
|
|
1448
|
+
"@neocortex *generate-pacts",
|
|
1449
|
+
"@neocortex *generate-pacts P126"
|
|
1448
1450
|
],
|
|
1449
1451
|
"id": "generate-pacts",
|
|
1450
1452
|
"inputShape": "standalone",
|
|
@@ -3922,7 +3924,7 @@ export const GENERATED_SHARED_COMMANDS = [
|
|
|
3922
3924
|
"policy": {
|
|
3923
3925
|
"billingClass": "non-billable",
|
|
3924
3926
|
"idempotencyClass": "logical-supported",
|
|
3925
|
-
"minimumTier": "
|
|
3927
|
+
"minimumTier": "pro",
|
|
3926
3928
|
"mutationClass": "stateful",
|
|
3927
3929
|
"privilege": "authenticated",
|
|
3928
3930
|
"quotaClass": "none",
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
export const GENERATED_INVOCATION_SCHEMA_MANIFEST = {
|
|
3
3
|
"schemaVersion": "p205-invocation-schema-v1",
|
|
4
4
|
"registryVersion": "1.0.0",
|
|
5
|
-
"registryChecksum": "
|
|
6
|
-
"schemaChecksum": "
|
|
5
|
+
"registryChecksum": "a631fa17a24972952ef0270880105bfc4d1a6be17e8622c5916265d945fcb69d",
|
|
6
|
+
"schemaChecksum": "5c1a3ec92913a1e9c84b61de15ccfa72d223556db9d3d9e40504f28e86a09a0e",
|
|
7
7
|
"commandCount": 62,
|
|
8
8
|
"optionCount": 48,
|
|
9
|
-
"positionalCount":
|
|
9
|
+
"positionalCount": 44,
|
|
10
10
|
"operationCount": 35,
|
|
11
|
-
"projectionSha256": "
|
|
11
|
+
"projectionSha256": "15e972b62215710565cff40fbd552bcbb7ec6c48f224e57c6b963d0e5809d225",
|
|
12
12
|
"commands": [
|
|
13
13
|
{
|
|
14
14
|
"commandId": "arch-api-contracts",
|
|
@@ -391,7 +391,7 @@ export const GENERATED_INVOCATION_SCHEMA_MANIFEST = {
|
|
|
391
391
|
"id": "story",
|
|
392
392
|
"kind": "story-ref",
|
|
393
393
|
"order": 0,
|
|
394
|
-
"required":
|
|
394
|
+
"required": false
|
|
395
395
|
}
|
|
396
396
|
],
|
|
397
397
|
"terminator": true
|
|
@@ -585,7 +585,15 @@ export const GENERATED_INVOCATION_SCHEMA_MANIFEST = {
|
|
|
585
585
|
"operations": []
|
|
586
586
|
},
|
|
587
587
|
"options": [],
|
|
588
|
-
"positionals": [
|
|
588
|
+
"positionals": [
|
|
589
|
+
{
|
|
590
|
+
"cardinality": "one",
|
|
591
|
+
"id": "epic",
|
|
592
|
+
"kind": "epic-ref",
|
|
593
|
+
"order": 0,
|
|
594
|
+
"required": false
|
|
595
|
+
}
|
|
596
|
+
],
|
|
589
597
|
"terminator": true
|
|
590
598
|
},
|
|
591
599
|
{
|
|
@@ -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:
|
|
5
|
-
"sourceHash": "
|
|
6
|
-
"catalogHash": "
|
|
7
|
-
"publicProjectionHash": "
|
|
8
|
-
"stageProjectionHash": "
|
|
9
|
-
"compilationHash": "
|
|
4
|
+
"generationId": "sha256:80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929",
|
|
5
|
+
"sourceHash": "80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929",
|
|
6
|
+
"catalogHash": "82186cef7dbd3771284389571d313287322bfd0dd80b2142e3f7efec0a0c6bbc",
|
|
7
|
+
"publicProjectionHash": "45d4fe4407d45ba322d375a6f57e357afdb17fe115bcf016d49811ad1bb4415f",
|
|
8
|
+
"stageProjectionHash": "fe971b5270073ad859e4e0ba5ab7bec635d17925922d279ad1d087c606f90fbc",
|
|
9
|
+
"compilationHash": "1f1ec555fe6cb23e9a9d33fa678030c09889469efc4826f372cd32b4d1319dfe",
|
|
10
10
|
"registry": {
|
|
11
11
|
"version": "1.0.0",
|
|
12
|
-
"checksum": "
|
|
12
|
+
"checksum": "a631fa17a24972952ef0270880105bfc4d1a6be17e8622c5916265d945fcb69d"
|
|
13
13
|
},
|
|
14
14
|
"artifacts": [
|
|
15
15
|
{
|
|
16
16
|
"kind": "catalog",
|
|
17
17
|
"schemaVersion": "ExecutableGraphCatalogPublicProjection/1.0",
|
|
18
18
|
"relativePath": "catalog.json",
|
|
19
|
-
"sha256": "
|
|
19
|
+
"sha256": "e6a9ec0c1ecc84572c44fe752efbc46b330dc3569c0b5cb317b62c36737d0875",
|
|
20
20
|
"entryCount": 97,
|
|
21
|
-
"generationId": "sha256:
|
|
21
|
+
"generationId": "sha256:80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"kind": "commands",
|
|
25
25
|
"schemaVersion": "CommandRegistryPublicProjection/1.0",
|
|
26
26
|
"relativePath": "commands.json",
|
|
27
|
-
"sha256": "
|
|
27
|
+
"sha256": "c7041309517f9c76f4a7b325660a630325d036ad3d6d8a20d90d27889cff3018",
|
|
28
28
|
"entryCount": 62,
|
|
29
|
-
"generationId": "sha256:
|
|
29
|
+
"generationId": "sha256:80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"kind": "progress-view",
|
|
33
33
|
"schemaVersion": "ProgressViewContractProjection/1.0",
|
|
34
34
|
"relativePath": "progress-view.json",
|
|
35
|
-
"sha256": "
|
|
35
|
+
"sha256": "ebe398e5f1cdb408e9a4cde551ed1448df0a673fc0bba456b04d72ff96d4bbdb",
|
|
36
36
|
"entryCount": 1,
|
|
37
|
-
"generationId": "sha256:
|
|
37
|
+
"generationId": "sha256:80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
40
|
"kind": "stages",
|
|
41
41
|
"schemaVersion": "ExecutableGraphStageProjection/1.0",
|
|
42
42
|
"relativePath": "stages.json",
|
|
43
|
-
"sha256": "
|
|
43
|
+
"sha256": "7688c18fb51c1ae074620c550a22277cd990ac11ed702ebc1d863df319030909",
|
|
44
44
|
"entryCount": 85,
|
|
45
|
-
"generationId": "sha256:
|
|
45
|
+
"generationId": "sha256:80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929"
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
"kind": "surfaces",
|
|
49
49
|
"schemaVersion": "PublicProjectionSurfaces/1.0",
|
|
50
50
|
"relativePath": "surfaces.json",
|
|
51
|
-
"sha256": "
|
|
51
|
+
"sha256": "796bd7507fd99b99cc899cc7b693c27bf698e4dc98473ceca3bf8cd13ee322cf",
|
|
52
52
|
"entryCount": 6,
|
|
53
|
-
"generationId": "sha256:
|
|
53
|
+
"generationId": "sha256:80e56629e3fbf9cb6be8dd1ea937f231eb187c5a02442217e647910183d52929"
|
|
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": "
|
|
146
|
+
"bundleHash": "5371013ed9041484849f722a19f96b106874efc0112db9c459311ae497229f56"
|
|
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: "
|
|
125
|
+
export declare const INVOCATION_SCHEMA_CHECKSUM: "5c1a3ec92913a1e9c84b61de15ccfa72d223556db9d3d9e40504f28e86a09a0e";
|
|
126
126
|
export interface InvocationSchemaManifestV1 {
|
|
127
127
|
readonly schemaVersion: typeof INVOCATION_SCHEMA_VERSION;
|
|
128
128
|
readonly registryVersion: string;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
function record(value) {
|
|
3
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
4
|
+
? value : null;
|
|
5
|
+
}
|
|
6
|
+
function checkRunReason(check) {
|
|
7
|
+
if (check.status === 'QUEUED' || check.status === 'PENDING')
|
|
8
|
+
return 'remote_ci_queued_observed';
|
|
9
|
+
if (check.status === 'IN_PROGRESS' || check.status === 'WAITING')
|
|
10
|
+
return 'remote_ci_in_progress_observed';
|
|
11
|
+
if (check.status !== 'COMPLETED')
|
|
12
|
+
return null;
|
|
13
|
+
if (check.conclusion === 'SUCCESS')
|
|
14
|
+
return 'success';
|
|
15
|
+
if (check.conclusion === 'CANCELLED')
|
|
16
|
+
return 'remote_ci_cancelled_observed';
|
|
17
|
+
if (check.conclusion === 'TIMED_OUT')
|
|
18
|
+
return 'remote_ci_timeout_observed';
|
|
19
|
+
if (check.conclusion === 'STALE')
|
|
20
|
+
return 'remote_ci_stale_observed';
|
|
21
|
+
if (['FAILURE', 'ACTION_REQUIRED', 'NEUTRAL', 'SKIPPED', 'STARTUP_FAILURE'].includes(String(check.conclusion))) {
|
|
22
|
+
return 'remote_ci_failed_observed';
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function statusContextReason(check) {
|
|
27
|
+
if (check.state === 'SUCCESS')
|
|
28
|
+
return 'success';
|
|
29
|
+
if (check.state === 'EXPECTED')
|
|
30
|
+
return 'remote_ci_missing_observed';
|
|
31
|
+
if (check.state === 'PENDING')
|
|
32
|
+
return 'remote_ci_queued_observed';
|
|
33
|
+
if (check.state === 'FAILURE' || check.state === 'ERROR')
|
|
34
|
+
return 'remote_ci_failed_observed';
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
/** Summarize only known categorical fields; never return check names, URLs,
|
|
38
|
+
* descriptions, raw nodes or arbitrary provider strings. Missing/empty rollups
|
|
39
|
+
* are observations requiring debt, not green checks. */
|
|
40
|
+
export function summarizeC12RemoteRollup(value) {
|
|
41
|
+
const reasons = [];
|
|
42
|
+
const categorical = [];
|
|
43
|
+
if (value === undefined || value === null) {
|
|
44
|
+
reasons.push('remote_status_check_rollup_absent_observed');
|
|
45
|
+
categorical.push('rollup:absent');
|
|
46
|
+
}
|
|
47
|
+
else if (!Array.isArray(value) || value.length > 100) {
|
|
48
|
+
return { ok: false, reasonCode: 'legacy-c12-remote-observation-unclassified' };
|
|
49
|
+
}
|
|
50
|
+
else if (value.length === 0) {
|
|
51
|
+
reasons.push('remote_status_check_rollup_empty_observed');
|
|
52
|
+
categorical.push('rollup:empty');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
for (const raw of value) {
|
|
56
|
+
const check = record(raw);
|
|
57
|
+
if (!check)
|
|
58
|
+
return { ok: false, reasonCode: 'legacy-c12-remote-observation-unclassified' };
|
|
59
|
+
const reason = check.__typename === 'CheckRun' ? checkRunReason(check)
|
|
60
|
+
: check.__typename === 'StatusContext' ? statusContextReason(check) : null;
|
|
61
|
+
if (!reason)
|
|
62
|
+
return { ok: false, reasonCode: 'legacy-c12-remote-observation-unclassified' };
|
|
63
|
+
reasons.push(reason);
|
|
64
|
+
categorical.push(`${check.__typename}:${reason}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const reasonCodes = [...new Set(reasons.filter((item) => item !== 'success'))]
|
|
68
|
+
.sort();
|
|
69
|
+
const reasonCounts = reasonCodes.map((reasonCode) => Object.freeze({
|
|
70
|
+
reasonCode, count: reasons.filter((item) => item === reasonCode).length,
|
|
71
|
+
}));
|
|
72
|
+
const digest = createHash('sha256').update(JSON.stringify([
|
|
73
|
+
'legacy-c12-remote-observation-v1', categorical.sort(),
|
|
74
|
+
])).digest('hex');
|
|
75
|
+
return { ok: true, value: Object.freeze({ schemaVersion: 1,
|
|
76
|
+
kind: 'legacy-c12-remote-observation', source: 'github-pr-status-rollup',
|
|
77
|
+
checkCount: Array.isArray(value) ? value.length : 0,
|
|
78
|
+
reasonCodes: Object.freeze(reasonCodes), reasonCounts: Object.freeze(reasonCounts),
|
|
79
|
+
digest, publicSafe: true }) };
|
|
80
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Physical P01 state projection shared by the server policy and the client CAS.
|
|
3
|
+
* This is deliberately not an acceptance decision: callers must establish the
|
|
4
|
+
* durable claim, independently accepted checkpoint and exact source revision.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from 'node:crypto';
|
|
7
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
8
|
+
function record(value) {
|
|
9
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
const SCALARS = ['goal', 'problem', 'desiredOutcome', 'rawIntent'];
|
|
12
|
+
const LISTS = ['context', 'users', 'surfaces', 'constraints', 'assumptions', 'risks', 'nonGoals',
|
|
13
|
+
'validationExpectations', 'debtRefs', 'repositoryEvidencePaths', 'journeyIds', 'screenIds',
|
|
14
|
+
'storybookStoryIds', 'backendContractIds', 'featureBlockerIds', 'remediationRefs'];
|
|
15
|
+
const BOOLEANS = ['uiScope', 'remediationStory'];
|
|
16
|
+
const EXAMPLE_KEYS = ['id', 'title', 'actor', 'given', 'when', 'then', 'source',
|
|
17
|
+
'coveredRequirement', 'expectedValidation'];
|
|
18
|
+
const CONTRACT_KEYS = ['id', 'kind', 'description', 'path'];
|
|
19
|
+
const UNSAFE = /(?:[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}|https?:\/\/(?:localhost|127\.0\.0\.1|10\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|172\.(?:1[6-9]|2\d|3[0-1])\.\d+\.\d+|[^\s/]*internal[^\s/]*)\S*|sk-[A-Za-z0-9_-]{12,})/i;
|
|
20
|
+
const INLINE_SECRET = /(?:token|api[_-]?key|secret|password|credential|license[_-]?key)\s*[:=]\s*\S+/i;
|
|
21
|
+
const PRIVATE_CONTENT = /(?:customer\s+pii|private\s+prompt|system\s+prompt|developer\s+prompt|raw\s+vendor\s+corpus|begin\s+raw\s+logs?)/i;
|
|
22
|
+
function safeText(value, max = 512) {
|
|
23
|
+
if (typeof value !== 'string' || value.length > max
|
|
24
|
+
|| /[\x00-\x08\x0b\x0c\x0e-\x1f]/.test(value)
|
|
25
|
+
|| UNSAFE.test(value) || INLINE_SECRET.test(value) || PRIVATE_CONTENT.test(value)) {
|
|
26
|
+
throw new Error('planning-unsafe-text');
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function allowedKeys(value, allowed) {
|
|
31
|
+
if (Object.keys(value).some((key) => !allowed.includes(key)))
|
|
32
|
+
throw new Error('planning-unknown-field');
|
|
33
|
+
}
|
|
34
|
+
/** Stable revision input shared by the server and the physical root checkpoint. */
|
|
35
|
+
export function canonicalPlanningIntake(value) {
|
|
36
|
+
if (!record(value) || Buffer.byteLength(JSON.stringify(value)) > 16_384) {
|
|
37
|
+
throw new Error('planning-intake-shape');
|
|
38
|
+
}
|
|
39
|
+
allowedKeys(value, [...SCALARS, ...LISTS, ...BOOLEANS, 'examples', 'contracts']);
|
|
40
|
+
const result = {};
|
|
41
|
+
for (const key of SCALARS)
|
|
42
|
+
if (value[key] !== undefined)
|
|
43
|
+
result[key] = safeText(value[key]);
|
|
44
|
+
for (const key of LISTS)
|
|
45
|
+
if (value[key] !== undefined) {
|
|
46
|
+
const entries = value[key];
|
|
47
|
+
if (!Array.isArray(entries) || entries.length > 32)
|
|
48
|
+
throw new Error('planning-list-shape');
|
|
49
|
+
result[key] = entries.map((entry) => safeText(entry, 256));
|
|
50
|
+
}
|
|
51
|
+
for (const key of BOOLEANS)
|
|
52
|
+
if (value[key] !== undefined) {
|
|
53
|
+
if (typeof value[key] !== 'boolean')
|
|
54
|
+
throw new Error('planning-boolean-shape');
|
|
55
|
+
result[key] = value[key];
|
|
56
|
+
}
|
|
57
|
+
for (const [key, allowed] of [['examples', EXAMPLE_KEYS], ['contracts', CONTRACT_KEYS]]) {
|
|
58
|
+
if (value[key] === undefined)
|
|
59
|
+
continue;
|
|
60
|
+
const entries = value[key];
|
|
61
|
+
if (!Array.isArray(entries) || entries.length > 16)
|
|
62
|
+
throw new Error('planning-record-list-shape');
|
|
63
|
+
result[key] = entries.map((entry) => {
|
|
64
|
+
if (!record(entry))
|
|
65
|
+
throw new Error('planning-record-shape');
|
|
66
|
+
allowedKeys(entry, allowed);
|
|
67
|
+
const copy = {};
|
|
68
|
+
for (const field of allowed)
|
|
69
|
+
if (entry[field] !== undefined)
|
|
70
|
+
copy[field] = safeText(entry[field], 256);
|
|
71
|
+
return copy;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
export function planningIntakeRevision(value) {
|
|
77
|
+
return createHash('sha256').update(JSON.stringify(canonicalPlanningIntake(value))).digest('hex');
|
|
78
|
+
}
|
|
79
|
+
/** A consistency digest only. The caller must separately establish independent QA. */
|
|
80
|
+
export function createPlanningReceiptV1(input) {
|
|
81
|
+
const summary = input.artifactSummary;
|
|
82
|
+
if (!/^P[1-9][0-9]{0,11}$/.test(input.epicId)
|
|
83
|
+
|| !/^[a-f0-9]{64}$/.test(input.intakeRevision)
|
|
84
|
+
|| input.accepted !== true || !['diagnosis', 'research'].includes(input.kind)
|
|
85
|
+
|| typeof summary !== 'string' || !summary.trim() || summary.length > 1024
|
|
86
|
+
|| /[\x00-\x08\x0b\x0c\x0e-\x1f]/.test(summary)
|
|
87
|
+
|| /^\s*(?:docs\/|\.neocortex\/|https?:\/)/i.test(summary)
|
|
88
|
+
|| UNSAFE.test(summary) || INLINE_SECRET.test(summary) || PRIVATE_CONTENT.test(summary)
|
|
89
|
+
|| input.kind === 'diagnosis' && input.predecessorReceiptId !== undefined
|
|
90
|
+
|| input.kind === 'research' && !/^[a-f0-9]{64}$/.test(input.predecessorReceiptId ?? '')) {
|
|
91
|
+
throw new Error('planning-receipt-invalid');
|
|
92
|
+
}
|
|
93
|
+
const base = { schemaVersion: 1, kind: input.kind, epicId: input.epicId,
|
|
94
|
+
intakeRevision: input.intakeRevision, artifactSummary: summary,
|
|
95
|
+
artifactDigest: createHash('sha256').update(summary).digest('hex'),
|
|
96
|
+
...(input.predecessorReceiptId ? { predecessorReceiptId: input.predecessorReceiptId } : {}),
|
|
97
|
+
accepted: true };
|
|
98
|
+
return { ...base, receiptId: createHash('sha256').update(JSON.stringify(base)).digest('hex') };
|
|
99
|
+
}
|
|
100
|
+
export function projectDiagnosedEpicState(currentState, input) {
|
|
101
|
+
const checkpoint = input.checkpoint;
|
|
102
|
+
if (currentState.schema_version !== 1 || !record(currentState.epics) || !record(currentState.stories)
|
|
103
|
+
|| !/^P[1-9][0-9]{0,11}$/.test(input.epicId)
|
|
104
|
+
|| !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(input.claimId)
|
|
105
|
+
|| !record(checkpoint) || checkpoint.schemaVersion !== 1
|
|
106
|
+
|| checkpoint.epicId !== input.epicId || !record(checkpoint.intake)
|
|
107
|
+
|| typeof checkpoint.intake.goal !== 'string'
|
|
108
|
+
|| !checkpoint.intake.goal.trim() || checkpoint.intake.goal.length > 512
|
|
109
|
+
|| typeof checkpoint.intakeRevision !== 'string'
|
|
110
|
+
|| !/^[a-f0-9]{64}$/.test(checkpoint.intakeRevision)
|
|
111
|
+
|| !record(checkpoint.diagnosisReceipt)) {
|
|
112
|
+
throw new Error('planning-diagnosis-identity-invalid');
|
|
113
|
+
}
|
|
114
|
+
const ledger = currentState.epic_id_ledger === undefined
|
|
115
|
+
? { schema_version: 1, reserved_ids: [] }
|
|
116
|
+
: currentState.epic_id_ledger;
|
|
117
|
+
if (!record(ledger) || ledger.schema_version !== 1
|
|
118
|
+
|| !Array.isArray(ledger.reserved_ids) || ledger.reserved_ids.length > 4096
|
|
119
|
+
|| ledger.reserved_ids.some((id) => typeof id !== 'string' || !/^P[1-9][0-9]{0,11}$/.test(id))
|
|
120
|
+
|| new Set(ledger.reserved_ids).size !== ledger.reserved_ids.length) {
|
|
121
|
+
throw new Error('planning-diagnosis-ledger-invalid');
|
|
122
|
+
}
|
|
123
|
+
const epic = {
|
|
124
|
+
id: input.epicId, title: checkpoint.intake.goal, status: 'diagnosed',
|
|
125
|
+
source: 'create-epic', stories: [],
|
|
126
|
+
createEpicPlanningClaim: { schemaVersion: 1, claimId: input.claimId, epicId: input.epicId },
|
|
127
|
+
createEpicPlanning: checkpoint,
|
|
128
|
+
};
|
|
129
|
+
const epics = currentState.epics;
|
|
130
|
+
if (Object.hasOwn(epics, input.epicId)) {
|
|
131
|
+
if (isDeepStrictEqual(epics[input.epicId], epic) && ledger.reserved_ids.includes(input.epicId)) {
|
|
132
|
+
return currentState;
|
|
133
|
+
}
|
|
134
|
+
throw new Error('planning-diagnosis-epic-conflict');
|
|
135
|
+
}
|
|
136
|
+
if (ledger.reserved_ids.includes(input.epicId))
|
|
137
|
+
throw new Error('planning-diagnosis-ledger-conflict');
|
|
138
|
+
return {
|
|
139
|
+
...currentState,
|
|
140
|
+
epics: { ...epics, [input.epicId]: epic },
|
|
141
|
+
epic_id_ledger: { ...ledger, reserved_ids: [...ledger.reserved_ids, input.epicId] },
|
|
142
|
+
};
|
|
143
|
+
}
|
|
@@ -9,6 +9,13 @@ const LEGACY_INTEGRATION_STEPS = new Set([
|
|
|
9
9
|
'step-c-11-review-pr',
|
|
10
10
|
'step-c-12-merge-pr',
|
|
11
11
|
]);
|
|
12
|
+
/** Do not let a stale epic story list hide physical progress in the snapshot. */
|
|
13
|
+
export function resolveEpicStoryIds(epicId, listedStoryIds, snapshotStoryIds) {
|
|
14
|
+
return [...new Set([
|
|
15
|
+
...(listedStoryIds ?? []),
|
|
16
|
+
...snapshotStoryIds.filter((id) => id.startsWith(`${epicId}.`)),
|
|
17
|
+
])];
|
|
18
|
+
}
|
|
12
19
|
/** Resolve once from persisted state. Existing Git progress always wins. */
|
|
13
20
|
export function resolveBranchUnit(epic, stories) {
|
|
14
21
|
const legacyProgress = stories.some(hasLegacyStoryGitProgress);
|
|
@@ -64,7 +71,8 @@ export function reconcileStoryCheckpoint(current, requested) {
|
|
|
64
71
|
current.graphRevision === requested.graphRevision &&
|
|
65
72
|
current.claimRevision === requested.claimRevision &&
|
|
66
73
|
sameEvidenceReceipt(current.qaReceipt, requested.qaReceipt) &&
|
|
67
|
-
sameEvidenceReceipt(current.reviewReceipt, requested.reviewReceipt)
|
|
74
|
+
sameEvidenceReceipt(current.reviewReceipt, requested.reviewReceipt) &&
|
|
75
|
+
JSON.stringify(current.reviewReconciliation ?? null) === JSON.stringify(requested.reviewReconciliation ?? null))
|
|
68
76
|
return { kind: 'reused', checkpoint: current };
|
|
69
77
|
return { kind: 'blocked', reasonCode: 'checkpoint-idempotency-conflict' };
|
|
70
78
|
}
|
|
@@ -183,6 +191,7 @@ function validateCheckpointEvidence(checkpoint) {
|
|
|
183
191
|
else if (review.schemaVersion !== 1 || review.kind !== 'story_review_evidence'
|
|
184
192
|
|| review.producer !== 'root-commit-range-review' || review.verdict !== checkpoint.reviewVerdict
|
|
185
193
|
|| !evidenceBindingMatches(checkpoint, review) || !isHash(review.sourceEvidenceDigest)
|
|
194
|
+
|| (review.reviewArtifactDigest !== undefined && !isHash(review.reviewArtifactDigest))
|
|
186
195
|
|| !nonEmpty(review.receiptRef) || review.receiptRef !== `story-review:${review.sourceEvidenceDigest}`
|
|
187
196
|
|| !Number.isFinite(Date.parse(review.reviewedAt))) {
|
|
188
197
|
errors.push('checkpoint-review-evidence-invalid');
|
|
@@ -201,6 +210,19 @@ function validateCheckpointEvidence(checkpoint) {
|
|
|
201
210
|
if (Date.parse(review.reviewedAt) < Date.parse(qa.checkedAt))
|
|
202
211
|
errors.push('checkpoint-review-before-qa');
|
|
203
212
|
}
|
|
213
|
+
const reconciliation = checkpoint.reviewReconciliation;
|
|
214
|
+
if (reconciliation && (!qa || !review || reconciliation.schemaVersion !== 1
|
|
215
|
+
|| reconciliation.kind !== 'historical_review_reconciliation'
|
|
216
|
+
|| reconciliation.storyId !== checkpoint.storyId || reconciliation.epicId !== checkpoint.epicId
|
|
217
|
+
|| reconciliation.checkpointHeadSha !== checkpoint.headSha
|
|
218
|
+
|| !isSha(reconciliation.approvalCommitSha)
|
|
219
|
+
|| !isHash(reconciliation.approvalArtifactDigest) || !isHash(reconciliation.sourceEvidenceDigest)
|
|
220
|
+
|| reconciliation.qaReceiptRef !== qa.receiptRef || reconciliation.reviewReceiptRef !== review.receiptRef
|
|
221
|
+
|| reconciliation.receiptRef !== `story-review-reconciliation:${reconciliation.sourceEvidenceDigest}`
|
|
222
|
+
|| !checkpoint.receiptRefs.includes(reconciliation.receiptRef)
|
|
223
|
+
|| !Number.isFinite(Date.parse(reconciliation.reviewedAt)))) {
|
|
224
|
+
errors.push('checkpoint-review-reconciliation-invalid');
|
|
225
|
+
}
|
|
204
226
|
return errors;
|
|
205
227
|
}
|
|
206
228
|
function evidenceBindingMatches(checkpoint, evidence) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex-root
|
|
3
|
-
description: "🧠 Neocortex Root Agent v4.60.
|
|
3
|
+
description: "🧠 Neocortex Root Agent v4.60.61 | 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.
|
|
111
|
+
│ ### ######## v4.60.61 │
|
|
112
112
|
│ ######### ##### │
|
|
113
113
|
│ ## ############## Development Orchestrator │
|
|
114
114
|
│ ## ### ###### ## OrNexus Team │
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: neocortex
|
|
3
|
-
description: "🧠 Neocortex v4.60.
|
|
3
|
+
description: "🧠 Neocortex v4.60.61 | 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.
|
|
107
|
+
│ ### ######## v4.60.61 │
|
|
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.
|
|
31
|
+
# Neocortex v4.60.61 | 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.
|
|
3
|
+
description: "🧠 Neocortex v4.60.61 | 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.
|
|
67
|
+
│ ### ######## v4.60.61 │
|
|
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.
|
|
3
|
+
description: "🧠 Neocortex v4.60.61 | 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.
|
|
65
|
+
│ ### ######## v4.60.61 │
|
|
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.
|
|
61
|
+
│ ### ######## v4.60.61 │
|
|
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.
|
|
3
|
+
description: "Neocortex v4.60.61 | 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.
|
|
71
|
+
│ ### ######## v4.60.61 │
|
|
72
72
|
│ ######### ##### │
|
|
73
73
|
│ ## ############## Development Orchestrator │
|
|
74
74
|
│ ## ### ###### ## OrNexus Team │
|