@exellix/ai-tasks 9.1.0 → 10.0.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/CHANGELOG.md +34 -4
- package/README.md +2 -2
- package/RUNTASK_REQUEST.md +32 -17
- package/dist/builders/task-request-builder.d.ts.map +1 -1
- package/dist/builders/task-request-builder.js +2 -1
- package/dist/builders/task-request-builder.js.map +1 -1
- package/dist/compile/compileTaskConfiguration.d.ts.map +1 -1
- package/dist/compile/compileTaskConfiguration.js +3 -0
- package/dist/compile/compileTaskConfiguration.js.map +1 -1
- package/dist/core/task-sdk.d.ts.map +1 -1
- package/dist/core/task-sdk.js +148 -180
- package/dist/core/task-sdk.js.map +1 -1
- package/dist/errors/runTaskExecutionError.d.ts.map +1 -1
- package/dist/errors/runTaskExecutionError.js +0 -2
- package/dist/errors/runTaskExecutionError.js.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +1 -1
- package/dist/invocation/types.d.ts +1 -1
- package/dist/narrix/applyWebScopeToRequest.d.ts +9 -0
- package/dist/narrix/applyWebScopeToRequest.d.ts.map +1 -0
- package/dist/narrix/applyWebScopeToRequest.js +156 -0
- package/dist/narrix/applyWebScopeToRequest.js.map +1 -0
- package/dist/narrix/narrixUnitExecution.d.ts.map +1 -1
- package/dist/narrix/narrixUnitExecution.js +8 -3
- package/dist/narrix/narrixUnitExecution.js.map +1 -1
- package/dist/node-execution/buildRequestFromNodePlan.d.ts +6 -0
- package/dist/node-execution/buildRequestFromNodePlan.d.ts.map +1 -1
- package/dist/node-execution/buildRequestFromNodePlan.js +4 -16
- package/dist/node-execution/buildRequestFromNodePlan.js.map +1 -1
- package/dist/node-execution/compileProfessionalAnswerRequest.d.ts +2 -0
- package/dist/node-execution/compileProfessionalAnswerRequest.d.ts.map +1 -0
- package/dist/node-execution/compileProfessionalAnswerRequest.js +4 -0
- package/dist/node-execution/compileProfessionalAnswerRequest.js.map +1 -0
- package/dist/node-execution/createNodeExecutionHost.d.ts.map +1 -1
- package/dist/node-execution/createNodeExecutionHost.js +97 -26
- package/dist/node-execution/createNodeExecutionHost.js.map +1 -1
- package/dist/node-execution/dispatchExecutionUnit.d.ts.map +1 -1
- package/dist/node-execution/dispatchExecutionUnit.js +4 -2
- package/dist/node-execution/dispatchExecutionUnit.js.map +1 -1
- package/dist/node-execution/orchestration/runPostOrchestration.d.ts +11 -0
- package/dist/node-execution/orchestration/runPostOrchestration.d.ts.map +1 -0
- package/dist/node-execution/orchestration/runPostOrchestration.js +123 -0
- package/dist/node-execution/orchestration/runPostOrchestration.js.map +1 -0
- package/dist/node-execution/orchestration/runPreOrchestration.d.ts +3 -0
- package/dist/node-execution/orchestration/runPreOrchestration.d.ts.map +1 -0
- package/dist/node-execution/orchestration/runPreOrchestration.js +110 -0
- package/dist/node-execution/orchestration/runPreOrchestration.js.map +1 -0
- package/dist/node-execution/orchestration/shardContext.d.ts +12 -0
- package/dist/node-execution/orchestration/shardContext.d.ts.map +1 -0
- package/dist/node-execution/orchestration/shardContext.js +71 -0
- package/dist/node-execution/orchestration/shardContext.js.map +1 -0
- package/dist/node-execution/orchestration/types.d.ts +21 -0
- package/dist/node-execution/orchestration/types.d.ts.map +1 -0
- package/dist/node-execution/orchestration/types.js +2 -0
- package/dist/node-execution/orchestration/types.js.map +1 -0
- package/dist/node-execution/rejectForbiddenWireFields.d.ts +2 -0
- package/dist/node-execution/rejectForbiddenWireFields.d.ts.map +1 -1
- package/dist/node-execution/rejectForbiddenWireFields.js +42 -7
- package/dist/node-execution/rejectForbiddenWireFields.js.map +1 -1
- package/dist/observability/classifyRunTaskFailure.d.ts.map +1 -1
- package/dist/observability/classifyRunTaskFailure.js +4 -3
- package/dist/observability/classifyRunTaskFailure.js.map +1 -1
- package/dist/observability/logRunTaskFailure.d.ts.map +1 -1
- package/dist/observability/logRunTaskFailure.js +0 -2
- package/dist/observability/logRunTaskFailure.js.map +1 -1
- package/dist/post-steps/audit/auditChecklistFuncxEnvelope.d.ts +19 -3
- package/dist/post-steps/audit/auditChecklistFuncxEnvelope.d.ts.map +1 -1
- package/dist/post-steps/audit/auditChecklistFuncxEnvelope.js +7 -1
- package/dist/post-steps/audit/auditChecklistFuncxEnvelope.js.map +1 -1
- package/dist/post-steps/audit/loadAuditTemplates.d.ts +2 -55
- package/dist/post-steps/audit/loadAuditTemplates.d.ts.map +1 -1
- package/dist/post-steps/audit/loadAuditTemplates.js +3 -38
- package/dist/post-steps/audit/loadAuditTemplates.js.map +1 -1
- package/dist/post-steps/audit/parseAuditFuncxOutput.d.ts +8 -0
- package/dist/post-steps/audit/parseAuditFuncxOutput.d.ts.map +1 -0
- package/dist/post-steps/audit/parseAuditFuncxOutput.js +62 -0
- package/dist/post-steps/audit/parseAuditFuncxOutput.js.map +1 -0
- package/dist/post-steps/audit/parseAuditOutput.d.ts +2 -0
- package/dist/post-steps/audit/parseAuditOutput.d.ts.map +1 -1
- package/dist/post-steps/audit/parseAuditOutput.js +56 -0
- package/dist/post-steps/audit/parseAuditOutput.js.map +1 -1
- package/dist/post-steps/audit/runAudit.d.ts.map +1 -1
- package/dist/post-steps/audit/runAudit.js +53 -113
- package/dist/post-steps/audit/runAudit.js.map +1 -1
- package/dist/post-steps/audit/runAuditFuncxCall.d.ts +18 -0
- package/dist/post-steps/audit/runAuditFuncxCall.d.ts.map +1 -0
- package/dist/post-steps/audit/runAuditFuncxCall.js +59 -0
- package/dist/post-steps/audit/runAuditFuncxCall.js.map +1 -0
- package/dist/synthesis/resolveSourceMaterial.d.ts.map +1 -1
- package/dist/synthesis/resolveSourceMaterial.js +14 -0
- package/dist/synthesis/resolveSourceMaterial.js.map +1 -1
- package/dist/synthesis/runStructuredSynthesisRobust.d.ts.map +1 -1
- package/dist/synthesis/runStructuredSynthesisRobust.js +24 -4
- package/dist/synthesis/runStructuredSynthesisRobust.js.map +1 -1
- package/dist/task-strategies/buildTaskStrategyCatalogDescriptor.d.ts +3 -0
- package/dist/task-strategies/buildTaskStrategyCatalogDescriptor.d.ts.map +1 -1
- package/dist/task-strategies/buildTaskStrategyCatalogDescriptor.js +28 -4
- package/dist/task-strategies/buildTaskStrategyCatalogDescriptor.js.map +1 -1
- package/dist/task-strategies/canonicalInputExecutionStrategies.d.ts +4 -4
- package/dist/task-strategies/canonicalInputExecutionStrategies.d.ts.map +1 -1
- package/dist/task-strategies/canonicalInputExecutionStrategies.js +2 -1
- package/dist/task-strategies/canonicalInputExecutionStrategies.js.map +1 -1
- package/dist/task-strategies/canonicalOrchestrationStrategies.d.ts +42 -0
- package/dist/task-strategies/canonicalOrchestrationStrategies.d.ts.map +1 -0
- package/dist/task-strategies/canonicalOrchestrationStrategies.js +47 -0
- package/dist/task-strategies/canonicalOrchestrationStrategies.js.map +1 -0
- package/dist/task-strategies/canonicalTaskStrategies.d.ts +2 -1
- package/dist/task-strategies/canonicalTaskStrategies.d.ts.map +1 -1
- package/dist/task-strategies/canonicalTaskStrategies.js +2 -1
- package/dist/task-strategies/canonicalTaskStrategies.js.map +1 -1
- package/dist/task-strategies/constants.d.ts +9 -1
- package/dist/task-strategies/constants.d.ts.map +1 -1
- package/dist/task-strategies/constants.js +9 -1
- package/dist/task-strategies/constants.js.map +1 -1
- package/dist/task-strategies/index.d.ts +5 -3
- package/dist/task-strategies/index.d.ts.map +1 -1
- package/dist/task-strategies/index.js +4 -3
- package/dist/task-strategies/index.js.map +1 -1
- package/dist/task-strategies/listAiTaskStrategies.d.ts +10 -1
- package/dist/task-strategies/listAiTaskStrategies.d.ts.map +1 -1
- package/dist/task-strategies/listAiTaskStrategies.js +17 -2
- package/dist/task-strategies/listAiTaskStrategies.js.map +1 -1
- package/dist/types/task-types.d.ts +4 -11
- package/dist/types/task-types.d.ts.map +1 -1
- package/dist/utils/bridgeRunSkillGatewayMemory.d.ts.map +1 -1
- package/dist/utils/bridgeRunSkillGatewayMemory.js +1 -0
- package/dist/utils/bridgeRunSkillGatewayMemory.js.map +1 -1
- package/dist/utils/executionMemoryInputRecord.d.ts +12 -0
- package/dist/utils/executionMemoryInputRecord.d.ts.map +1 -0
- package/dist/utils/executionMemoryInputRecord.js +28 -0
- package/dist/utils/executionMemoryInputRecord.js.map +1 -0
- package/dist/utils/resolveAiProfileModel.d.ts +1 -1
- package/dist/utils/resolveAiProfileModel.d.ts.map +1 -1
- package/dist/utils/resolveRunTaskModelReferences.d.ts.map +1 -1
- package/dist/utils/resolveRunTaskModelReferences.js +0 -32
- package/dist/utils/resolveRunTaskModelReferences.js.map +1 -1
- package/dist/utils/runTaskRequestShape.d.ts.map +1 -1
- package/dist/utils/runTaskRequestShape.js +4 -26
- package/dist/utils/runTaskRequestShape.js.map +1 -1
- package/dist/utils/skillTemplateVariables.d.ts +3 -2
- package/dist/utils/skillTemplateVariables.d.ts.map +1 -1
- package/dist/utils/skillTemplateVariables.js +3 -2
- package/dist/utils/skillTemplateVariables.js.map +1 -1
- package/dist/validation/validateProfessionalAnswerContract.d.ts +8 -0
- package/dist/validation/validateProfessionalAnswerContract.d.ts.map +1 -0
- package/dist/validation/validateProfessionalAnswerContract.js +45 -0
- package/dist/validation/validateProfessionalAnswerContract.js.map +1 -0
- package/dist/validation/validateRunTaskConfig.d.ts.map +1 -1
- package/dist/validation/validateRunTaskConfig.js +3 -66
- package/dist/validation/validateRunTaskConfig.js.map +1 -1
- package/documenations/record-and-template-variables.md +21 -13
- package/documenations/run-task-execution-flow.md +1 -1
- package/documenations/skill-orchestration-strategy-cr-fr.md +147 -0
- package/documenations/upstream-feature-requests/README.md +9 -5
- package/documenations/upstream-feature-requests/ai-skills-orchestrator-invoke-contract-5.9.md +1 -1
- package/documenations/upstream-feature-requests/funcx-4.9.13-open-items.md +62 -0
- package/documenations/upstream-feature-requests/funcx-gap-analysis-cr-fr.md +401 -0
- package/documenations/upstream-feature-requests/funcx-pre-post-sidekick-actions.md +1 -0
- package/documenations/upstream-feature-requests/graph-engine-runtask-contract-alignment-investigation.md +370 -0
- package/documenations/upstream-feature-requests/xynthesis-ai-profiles-2.1-import-break.md +2 -2
- package/documenations/upstream-feature-requests/xynthesis-openrouter-wire-model-double-prefix-bug.md +1 -1
- package/documenations/upstream-feature-requests/xynthesis-orchestrator-invoke-contract-4.2.md +1 -1
- package/package.json +10 -9
- package/.docs/DOWNSTREAM_ENV.md +0 -42
- package/.docs/FEEDBACK_TO_CLIENT_DOWNSTREAM_FIXES.md +0 -64
- package/.docs/INTERMEDIATE_STEPS.md +0 -82
- package/.docs/activity-structure.md +0 -31
- package/.docs/ai-task-ai-scoping-spec.md +0 -338
- package/.docs/ai-tasks-model-profile-aliases-7x.md +0 -96
- package/.docs/blockers-and-issues.md +0 -346
- package/.docs/building-runTask-sdk.md +0 -659
- package/.docs/building-skill-execution-orchestrator.md +0 -968
- package/.docs/code-used-before/run-task.txt +0 -39
- package/.docs/code-used-before/task-executor.ts.old +0 -57
- package/.docs/code-used-before/test-run-task.ts.old +0 -42
- package/.docs/code-used-before/types.txt +0 -23
- package/.docs/env-ready-policy.md +0 -40
- package/.docs/flow-io/flow-README.md +0 -76
- package/.docs/flow-io/narrix.md +0 -124
- package/.docs/flow-io/web-scoping.md +0 -135
- package/.docs/flow-io/xynthesis-post.md +0 -154
- package/.docs/flow-io/xynthesis-pre.md +0 -181
- package/.docs/gap-analysis.md +0 -201
- package/.docs/integration-facts-ai-tasks.md +0 -109
- package/.docs/investigation/ai-skills.md +0 -170
- package/.docs/investigation/external-packages-assignments.md +0 -66
- package/.docs/investigation/integration-summary.md +0 -20
- package/.docs/investigation/narrix-catalox.md +0 -29
- package/.docs/investigation/workplan-close-graph-engine-gaps.md +0 -101
- package/.docs/logging-stack.md +0 -30
- package/.docs/memory-narrix-adapter-developer-guide.md +0 -402
- package/.docs/memory-narrix-adapter-requirements.md +0 -112
- package/.docs/narrix-context-consumption-gap.md +0 -184
- package/.docs/narrix-context-downstream-report.md +0 -30
- package/.docs/narrix-ingest-and-packs-library-spec.md +0 -240
- package/.docs/narrix-record-input-current-design.md +0 -48
- package/.docs/pacakge.md +0 -48
- package/.docs/possible-components/README.md +0 -11
- package/.docs/possible-components/integration/README.md +0 -10
- package/.docs/possible-components/integration/gaps-when-merging.md +0 -16
- package/.docs/possible-components/integration/platform.md +0 -54
- package/.docs/possible-components/integration/reintegrate-into-ai-tasks.md +0 -26
- package/.docs/possible-components/integration/roadmap-and-checklists.md +0 -54
- package/.docs/possible-components/post-component/README.md +0 -18
- package/.docs/possible-components/post-component/builder-guide.md +0 -175
- package/.docs/possible-components/post-component/gaps-and-artifacts.md +0 -52
- package/.docs/possible-components/post-component/handler-audit.md +0 -47
- package/.docs/possible-components/post-component/handler-polish.md +0 -41
- package/.docs/possible-components/post-component/unified-protocol.md +0 -59
- package/.docs/possible-components/pre-component/README.md +0 -22
- package/.docs/possible-components/pre-component/builder-guide.md +0 -127
- package/.docs/possible-components/pre-component/gaps-and-artifacts.md +0 -35
- package/.docs/possible-components/pre-component/handler-ai-scoping.md +0 -45
- package/.docs/possible-components/pre-component/handler-narrix-preprocessor.md +0 -49
- package/.docs/possible-components/pre-component/handler-narrix-system2.md +0 -35
- package/.docs/possible-components/pre-component/handler-synthesized-context.md +0 -65
- package/.docs/possible-components/pre-component/handler-web-scope.md +0 -29
- package/.docs/possible-components/pre-component/unified-protocol.md +0 -89
- package/.docs/prefer-openrouter-routing-policy.md +0 -114
- package/.docs/questions-for-ai-skills.md +0 -123
- package/.docs/realtime-narrixing-gap-analysis.md +0 -40
- package/.docs/realtime-narrixing.md +0 -433
- package/.docs/run-context-object.md +0 -32
- package/.docs/session-id-usage.md +0 -26
- package/.docs/skill-library-spec.md +0 -249
- package/.docs/synthesized-context-strategy-spec.md +0 -906
- package/.docs/upstream-issue/2026-03-21_woroces-ai-tasks_ISSUE-006_web-scope-question-from-cni-entity.md +0 -46
- package/.docs/web-scopper-embed.md +0 -93
- package/.docs/xynthesis-wiring-and-io.md +0 -12
- package/documenations/activix-feature-request-identity.md +0 -123
- package/documenations/bug-report-xynthesis-and-synthesis-call.md +0 -217
- package/documenations/feature-request-ai-skills-raw-template-access.md +0 -82
- package/documenations/feature-request-athenix-core-directive.md +0 -145
- package/documenations/feature-request-athenix-token-extraction.md +0 -124
- package/documenations/funcx-upstream-github-issues-draft.md +0 -153
- package/documenations/identity-metadata-contract.md +0 -165
- package/documenations/run-task-single-run-checklist.md +0 -109
- package/documenations/sessions/2026-06-08-subnets-model-resolution/CR-1-no-concrete-wire-in-graph-plans.md +0 -93
- package/documenations/sessions/2026-06-08-subnets-model-resolution/CR-2-skillModel-profile-only-at-storage.md +0 -88
- package/documenations/sessions/2026-06-08-subnets-model-resolution/CR-3-reject-concrete-models-in-catalog-rows.md +0 -76
- package/documenations/sessions/2026-06-08-subnets-model-resolution/FR-1-suggested-profile-in-catalogs.md +0 -96
- package/documenations/sessions/2026-06-08-subnets-model-resolution/FR-2-graph-engine-failure-phase-attribution.md +0 -92
- package/documenations/sessions/2026-06-08-subnets-model-resolution/INVESTIGATION-original-bug.md +0 -182
- package/documenations/sessions/2026-06-08-subnets-model-resolution/PROBLEM.md +0 -236
- package/documenations/sessions/2026-06-08-subnets-model-resolution/README.md +0 -11
- package/documenations/sessions/2026-06-08-subnets-model-resolution/funcx-test-resolveModel.cheapDefaultWireSlug.test.ts +0 -117
- package/documenations/upstream-feature-requests/ai-tasks-wrap-up-after-upstream.md +0 -129
- package/documenations/upstream-feedback-request-shape-clarification.md +0 -101
- package/documenations/web-context-precedence.md +0 -33
- package/documenations/xynthesis-activix-telemetry.md +0 -28
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# Checklist: `@exellix/ai-tasks` — single `runTask` validation
|
|
2
|
-
|
|
3
|
-
**Scope:** One task node, end-to-end: validate a single `runTask` execution with structured synthesis and MAIN consumption.
|
|
4
|
-
|
|
5
|
-
**Package context:** PRE steps can include `synthesized-context`; MAIN runs after PRE. Observability is attached on the response as `metadata` (and `meta` alias), including flags such as `synthesizedContextPresent`, `mainContextSource`, and `detectedTemplateCores`.
|
|
6
|
-
|
|
7
|
-
## Design stance: no backward compatibility
|
|
8
|
-
|
|
9
|
-
**Backward compatibility with legacy context assembly is not a goal for this stack.** The checklist assumes structured synthesis and MAIN consumption of `executionMemory.synthesizedContext` as the normal, required path.
|
|
10
|
-
|
|
11
|
-
Today **only one package upstream** still relies on legacy behavior; that integration is expected to be corrected there using this document as the contract for what “good” looks like. Do not preserve or design around legacy paths for other callers—there are none.
|
|
12
|
-
|
|
13
|
-
Legacy signals in code or metadata (for example `mainContextSource === "legacy"`, primary `webContextMarkdown`, raw Narrix-as-context) are **diagnostics only** (misconfiguration or upstream not yet aligned with this checklist). They are **not** pass criteria and **not** a surface we commit to keeping stable.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 1. Template core detection
|
|
18
|
-
|
|
19
|
-
| # | Check | How to validate | Pass |
|
|
20
|
-
|---|--------|-----------------|------|
|
|
21
|
-
| 1.1 | Resolved template is the real source of task semantics | Trace which template/skill resolved for the run; confirm it matches the intended task definition (not a stale or default template). | |
|
|
22
|
-
| 1.2 | Core tokens come from the **template**, not from free-form request input | Inspect core discovery path: cores should be derived from rendered template content (e.g. `discoverTemplateCores`), not from arbitrary client fields unless explicitly documented. | |
|
|
23
|
-
| 1.3 | Detected core set is visible in logs, traces, or debug output | Confirm `detectedTemplateCores` (or equivalent) appears in tracing/phase metadata or debug logs for the PRE step. | |
|
|
24
|
-
| 1.4 | Behavior when **no** core tokens are found | Run a template with no detectable cores; document expected behavior (empty `templateCores`, synthesis contract, warnings). No silent mis-assumption that cores exist. | |
|
|
25
|
-
| 1.5 | **Multiple** cores preserved | Template with several cores → artifact / observability lists all distinct cores, order stable or documented. | |
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## 2. Structured synthesis execution
|
|
30
|
-
|
|
31
|
-
| # | Check | How to validate | Pass |
|
|
32
|
-
|---|--------|-----------------|------|
|
|
33
|
-
| 2.1 | PRE synthesized-context **actually runs** | Trace `phase: pipeline_pre`, `preStepType: synthesized-context` (or equivalent) completes without skip. | |
|
|
34
|
-
| 2.2 | Synthesis runs **before** MAIN | Ordering: PRE steps complete, `executionMemory` updated, then MAIN step executes. | |
|
|
35
|
-
| 2.3 | Synthesis input includes | Verify synthesizer payload / source material includes: **resolved question**; **detected template core set**; **raw/enriched local context**; **raw/enriched supporting context** (per `contextSourcePolicy` / `synthesisInputStrategy`). | |
|
|
36
|
-
| 2.4 | Synthesis goes through **ai-gateway** | Network/trace shows gateway route for the synthesis model call, not a bypass. | |
|
|
37
|
-
| 2.5 | Effective mode is **structured**, not fallback markdown assembly | `synthesisMode` / `synthesisOutputFormat` resolves to structured path; response parses as structured payload (e.g. validated JSON contract), not only legacy section markdown. | |
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## 3. Synthesized artifact creation
|
|
42
|
-
|
|
43
|
-
| # | Check | How to validate | Pass |
|
|
44
|
-
|---|--------|-----------------|------|
|
|
45
|
-
| 3.1 | `executionMemory.synthesizedContext` is produced | Inspect `request`/`result` execution memory after PRE. | |
|
|
46
|
-
| 3.2 | Exists **after PRE** and **before MAIN** | Breakpoint or ordered logs: artifact present when MAIN starts. | |
|
|
47
|
-
| 3.3 | Shape is **structured** (not “only markdown”) | Artifact has structured fields (e.g. validated `payload`, `templateCores`), not solely a prose blob. | |
|
|
48
|
-
| 3.4 | Meaningful **synthesized** local/supporting outputs | Content is distilled/structured per contract, not a verbatim dump of raw Narrix/web/memory. | |
|
|
49
|
-
| 3.5 | **Canonical** key; no duplicate competing keys | Single authoritative `synthesizedContext` on `executionMemory`; no shadow copies under undocumented alternate paths. | |
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## 4. MAIN input path
|
|
54
|
-
|
|
55
|
-
| # | Check | How to validate | Pass |
|
|
56
|
-
|---|--------|-----------------|------|
|
|
57
|
-
| 4.1 | MAIN consumes `executionMemory.synthesizedContext` | Code path / logs: MAIN context build reads the artifact. | |
|
|
58
|
-
| 4.2 | MAIN does **not** primarily rely on legacy assembled context | When structured path is active, dominance is not `webContextMarkdown`, raw Narrix markdown, or raw dumps alone. | |
|
|
59
|
-
| 4.3 | Final prompt/messages to MAIN **reflect** synthesized payload | Diff or capture: sections/content align with structured synthesis output (e.g. built markdown from structured payload if that’s the bridge). | |
|
|
60
|
-
| 4.4 | No **silent** fallback to old prompt construction | For runs that should pass this checklist, `mainContextSource === "legacy"` means the integration is wrong—fix upstream (request shape, pipeline, flags), not paper over it. Silent degradation without observable flags is unacceptable. | |
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## 5. Local-first behavior
|
|
65
|
-
|
|
66
|
-
| # | Check | How to validate | Pass |
|
|
67
|
-
|---|--------|-----------------|------|
|
|
68
|
-
| 5.1 | Synthesized output **prioritizes** task/local/runtime facts over supporting web | Ordering and emphasis in structured local vs supporting sides; policy matches product intent. | |
|
|
69
|
-
| 5.2 | Final answer **reflects** runtime-grounded facts first | Answer cites or follows execution/task memory before generic web summaries when both exist. | |
|
|
70
|
-
| 5.3 | Not generic “public summary” when local should dominate | Deliberate fixture: strong local signal + web noise → answer anchored locally. | |
|
|
71
|
-
| 5.4 | Supporting context stays **supportive** | Web/supporting material does not override or swamp local conclusions. | |
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## 6. Reporting and observability
|
|
76
|
-
|
|
77
|
-
| # | Check | How to validate | Pass |
|
|
78
|
-
|---|--------|-----------------|------|
|
|
79
|
-
| 6.1 | Reports show whether **synthesis ran** | e.g. `synthesisEnabled`, pipeline/effective pipeline, or PRE phase completion in report payload. | |
|
|
80
|
-
| 6.2 | Reports expose **detected template cores** | e.g. `detectedTemplateCores` in `metadata` / report mirror. | |
|
|
81
|
-
| 6.3 | Reports show **`synthesizedContext` created** | e.g. `synthesizedContextPresent`. | |
|
|
82
|
-
| 6.4 | Reports show **MAIN used synthesized input** | e.g. `mainContextSource === "synthesizedContext"` (and related flags if any). | |
|
|
83
|
-
| 6.5 | If missing in reports, classify **reporting gap vs runtime failure** | Compare raw trace/logs to report: runtime correct but UI/report omits field → omission only; no artifact in memory but report says OK → failure. | |
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## 7. Pass criteria (single `runTask`)
|
|
88
|
-
|
|
89
|
-
A single run **passes** only if **all** are true:
|
|
90
|
-
|
|
91
|
-
1. **PRE synthesis ran** — synthesized-context PRE completed as intended.
|
|
92
|
-
2. **Template cores were detected** — non-empty when the template defines detectable cores; empty case matches documented behavior for that template.
|
|
93
|
-
3. **`executionMemory.synthesizedContext` exists** — structured artifact present before MAIN.
|
|
94
|
-
4. **MAIN used synthesized payload** — `mainContextSource` (or equivalent) indicates synthesized path, not unintended legacy.
|
|
95
|
-
5. **Observability shows that clearly** — synthesis, cores, artifact presence, and MAIN source are visible in metadata/traces/reports.
|
|
96
|
-
6. **Final output is task-grounded and local-first** — answer quality matches sections 4–5 for the fixture used.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## Quick reference (response `metadata`)
|
|
101
|
-
|
|
102
|
-
When validating, confirm at least:
|
|
103
|
-
|
|
104
|
-
- `detectedTemplateCores`
|
|
105
|
-
- `synthesizedContextPresent`
|
|
106
|
-
- `mainContextSource` (`"synthesizedContext"` vs `"legacy"`)
|
|
107
|
-
- `synthesisEnabled` / `effectiveExecutionPipeline` as appropriate for your environment
|
|
108
|
-
|
|
109
|
-
Treat `"legacy"` `mainContextSource` when a synthesized PRE ran and an artifact exists as a **red flag**: fix the caller (the remaining upstream package should converge on this checklist), not `ai-tasks`.
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# CR-1 — No concrete wire models in compiled graph plans
|
|
2
|
-
|
|
3
|
-
Status: **proposed**
|
|
4
|
-
Type: Change request
|
|
5
|
-
Owners: `@x12i/graphenix-plan-compiler`, `@exellix/graph-engine`, `@exellix/ai-tasks`
|
|
6
|
-
Filed: 2026-06-08
|
|
7
|
-
Session: [README](./README.md)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Summary
|
|
12
|
-
|
|
13
|
-
Compiled executable node plans must store **profile/choice selections only**. They must **not** freeze concrete OpenRouter or gateway wire slugs in `resolvedInvocationSnapshot.modelId` or `AiConcreteModelSelection`.
|
|
14
|
-
|
|
15
|
-
Concrete resolution happens **once at invoke time** inside ai-tasks / xynthesis / ai-skills — same boundary as xynthesis PRE/POST today.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Problem
|
|
20
|
-
|
|
21
|
-
`overlayUnitModelOnRequest` prefers a pre-resolved snapshot over the authored selection:
|
|
22
|
-
|
|
23
|
-
```typescript
|
|
24
|
-
// ai-tasks/src/node-execution/resolveUnitModelSelection.ts
|
|
25
|
-
if (snapshot && typeof snapshot.modelId === "string" && snapshot.modelId.trim()) {
|
|
26
|
-
wireValue = snapshot.modelId; // e.g. "google/gemini-2.5-flash-lite"
|
|
27
|
-
} else if (selection) {
|
|
28
|
-
wireValue = selectionToWireValue(selection); // e.g. "cheap/default"
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
When the compiler writes `resolvedInvocationSnapshot.modelId: "google/gemini-2.5-flash-lite"`:
|
|
33
|
-
|
|
34
|
-
- Authoring shows `cheap/default` (correct).
|
|
35
|
-
- Runtime overlay injects a **concrete slug** into `preActionModel` / `postActionModel` / `skillModel`.
|
|
36
|
-
- Operators cannot tell whether failure is alias resolution or catalog lookup.
|
|
37
|
-
- Catalog drift (retired slugs) breaks frozen plans even when profiles are still valid.
|
|
38
|
-
|
|
39
|
-
This session's error slug may appear in the plan **even when input was `cheap/default`**.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
## Requirements
|
|
44
|
-
|
|
45
|
-
### CR-1.1 — Compiler output
|
|
46
|
-
|
|
47
|
-
- `executionUnits[].modelSelection` MUST be one of:
|
|
48
|
-
- `{ kind: "profileChoice", key: "cheap/default" }`
|
|
49
|
-
- `{ kind: "profile", profile: "cheap", choice: "default" }`
|
|
50
|
-
- MUST NOT emit `{ kind: "concrete", ... }` / `AiConcreteModelSelection` in new plans (version gate).
|
|
51
|
-
- MUST NOT emit `resolvedInvocationSnapshot.modelId` as a concrete provider/OpenRouter slug.
|
|
52
|
-
|
|
53
|
-
### CR-1.2 — Optional compile-time preview (read-only)
|
|
54
|
-
|
|
55
|
-
If compile needs a preview for UI, use a separate non-authoritative field, e.g.:
|
|
56
|
-
|
|
57
|
-
```json
|
|
58
|
-
"invocationPreview": {
|
|
59
|
-
"profileChoiceKey": "cheap/default",
|
|
60
|
-
"resolvedWireModelId": "google/gemini-2.5-flash-lite",
|
|
61
|
-
"phase": "preAction",
|
|
62
|
-
"resolverVersion": "ai-tasks/9.0.3"
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Preview MUST NOT be consumed by `overlayUnitModelOnRequest`.
|
|
67
|
-
|
|
68
|
-
### CR-1.3 — ai-tasks runtime
|
|
69
|
-
|
|
70
|
-
- `overlayUnitModelOnRequest`: ignore `resolvedInvocationSnapshot.modelId` when it looks like a concrete wire id (`isConcreteModelId`).
|
|
71
|
-
- Prefer `modelSelection` profile/choice keys only.
|
|
72
|
-
- Reject plans that only have concrete snapshot and no profile selection (validation error with path to unit).
|
|
73
|
-
|
|
74
|
-
### CR-1.4 — Migration
|
|
75
|
-
|
|
76
|
-
- Graphenix plan version bump (e.g. v2.2) documenting the rule.
|
|
77
|
-
- One release: warn on concrete snapshot; next release: reject.
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Acceptance criteria
|
|
82
|
-
|
|
83
|
-
- [ ] Compiled plan for subnet PRE unit contains `modelSelection: { kind: "profileChoice", key: "cheap/default" }` and no concrete `modelId` in authoritative fields.
|
|
84
|
-
- [ ] `overlayUnitModelOnRequest` passes `cheap/default` to `runTask`, not `google/gemini-2.5-flash-lite`.
|
|
85
|
-
- [ ] `resolveInvocationPlan` at compile preview may still show resolved wire for UI — not stored on executable plan.
|
|
86
|
-
- [ ] Existing graphs with concrete snapshots: migration script or re-compile from authoring.
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## Out of scope
|
|
91
|
-
|
|
92
|
-
- Changing ai-profiles registry contents.
|
|
93
|
-
- Banning concrete ids on ephemeral `RunTaskRequest.modelConfig` from direct API callers (see CR-2 for `skillModel` storage policy).
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# CR-2 — `skillModel` profile/choice only at storage (align with PRE/POST)
|
|
2
|
-
|
|
3
|
-
Status: **proposed**
|
|
4
|
-
Type: Change request
|
|
5
|
-
Owners: `@exellix/ai-tasks`, `@exellix/graph-engine`, `@x12i/graphenix-authoring-format`
|
|
6
|
-
Filed: 2026-06-08
|
|
7
|
-
Session: [README](./README.md)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Summary
|
|
12
|
-
|
|
13
|
-
Today:
|
|
14
|
-
|
|
15
|
-
| Slot | Storage rule |
|
|
16
|
-
|------|----------------|
|
|
17
|
-
| `preActionModel` | profile/choice only ✓ |
|
|
18
|
-
| `postActionModel` | profile/choice only ✓ |
|
|
19
|
-
| `skillModel` | profile/choice **or** concrete wire id ✗ |
|
|
20
|
-
|
|
21
|
-
There is no catalog field called "main model" (skill catalog stores no model — verified). The issue is **runtime/graph storage**: allowing **concrete** `skillModel` in graph JSON, fixtures, and plans freezes vendor slugs in orchestration data, separate from Catalox skill rows.
|
|
22
|
-
|
|
23
|
-
**Change:** `skillModel` and MAIN `llmCall.model` MUST be profile/choice keys at storage and in graph plans. Concrete wire ids are produced only at invoke resolution (ai-tasks → ai-skills), identical to how xynthesis resolves PRE/POST.
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Problem
|
|
28
|
-
|
|
29
|
-
- `BREAKING-CHANGES.md` (8.4+) still documents concrete ids on `skillModel` as accepted.
|
|
30
|
-
- Fixtures use concrete MAIN models, e.g. `skillModel: "openrouter/x-ai/grok-4.1-fast"`.
|
|
31
|
-
- Operators conflate "MAIN model" with a durable catalog property; it is only the **`skillModel` runtime slot** for the `mainSkill` execution unit.
|
|
32
|
-
|
|
33
|
-
Desired model:
|
|
34
|
-
|
|
35
|
-
- **Suggested profile** on skill catalog row (FR-1) → default hint for graph authoring.
|
|
36
|
-
- **Per-node override** → `skillModel: "pro/default"` in plan.
|
|
37
|
-
- **Invoke** → ai-tasks resolves to gateway wire id once before `runSkill`.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Requirements
|
|
42
|
-
|
|
43
|
-
### CR-2.1 — Validation
|
|
44
|
-
|
|
45
|
-
- `validateRunTaskModelReferences` / `resolveRunTaskModelReferences`: reject concrete ids on `skillModel` and MAIN `llmCall.model` with `XYNTHESIS_CONCRETE_MODEL_REJECTED` equivalent: `SKILL_MODEL_CONCRETE_REJECTED`.
|
|
46
|
-
- Message: use profile/choice (e.g. `pro/default`, `cyber/default`).
|
|
47
|
-
|
|
48
|
-
### CR-2.2 — Resolution unchanged at invoke
|
|
49
|
-
|
|
50
|
-
- `prepareMainSkillModelConfigForInvoke` continues to resolve profile → gateway wire (`openrouter/...`) immediately before ai-skills.
|
|
51
|
-
- No behavior change for correctly authored graphs.
|
|
52
|
-
|
|
53
|
-
### CR-2.3 — Graph authoring
|
|
54
|
-
|
|
55
|
-
- Node model picker for MAIN unit: profile/choice only (same UX as PRE/POST).
|
|
56
|
-
- Remove concrete model picker from persisted graph JSON.
|
|
57
|
-
|
|
58
|
-
### CR-2.4 — Docs and fixtures
|
|
59
|
-
|
|
60
|
-
- Update `ai-tasks/README.md`, `BREAKING-CHANGES.md`, test fixtures to profile-only `skillModel`.
|
|
61
|
-
- Remove "concrete ids on MAIN only" exception language.
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Acceptance criteria
|
|
66
|
-
|
|
67
|
-
- [ ] `skillModel: "openrouter/x-ai/grok-4.1-fast"` fails validation at `runTask` entry.
|
|
68
|
-
- [ ] `skillModel: "pro/default"` resolves and invokes successfully.
|
|
69
|
-
- [ ] `professional-answer` Catalox row still has **no** model field (only optional `suggestedProfile` per FR-1).
|
|
70
|
-
- [ ] Graph-engine passes profile keys on `mainSkill` units.
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Migration
|
|
75
|
-
|
|
76
|
-
| From | To |
|
|
77
|
-
|------|-----|
|
|
78
|
-
| `skillModel: "anthropic/claude-sonnet-4"` | `skillModel: "pro/default"` (or appropriate profile) |
|
|
79
|
-
| `skillModel: "openrouter/x-ai/grok-4.1-fast"` | `skillModel: "cyber/default"` or explicit profile choice |
|
|
80
|
-
|
|
81
|
-
Provide `resolveInvocationPlan` mapping table in migration notes for common concrete → profile mappings.
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Non-goals
|
|
86
|
-
|
|
87
|
-
- Removing invoke-time resolution to concrete ids (still required for ai-gateway).
|
|
88
|
-
- Changing Optimixer catalog fields on skill rows.
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
# CR-3 — Reject concrete model ids in skill / funcx / xynthesis catalog rows
|
|
2
|
-
|
|
3
|
-
Status: **proposed (guardrail)** — verified compliant today
|
|
4
|
-
Type: Change request
|
|
5
|
-
Owners: `@exellix/ai-skills`, `@x12i/funcx`, `@exellix/xynthesis`
|
|
6
|
-
Filed: 2026-06-08
|
|
7
|
-
Session: [README](./README.md)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Summary
|
|
12
|
-
|
|
13
|
-
**Verified 2026-06-08:** skill / funcx **content** catalogs do **not** store models today. This CR is a **preventive guardrail** (provision lint + schema), not remediation of a current data bug.
|
|
14
|
-
|
|
15
|
-
Do not confuse with:
|
|
16
|
-
|
|
17
|
-
- **Runtime** `modelConfig` / graph `modelSelection` (orchestrator data — see CR-1, CR-2).
|
|
18
|
-
- **`@x12i/ai-tools` models catalog** (npm package used by funcx for slug validation — unrelated to Catalox skill rows).
|
|
19
|
-
|
|
20
|
-
Catalog rows (Catalox `ai-skills`, funcx function defaults, xynthesis sidekick seeds) must **never** store a concrete LLM wire model as the authoritative model for a skill or action.
|
|
21
|
-
|
|
22
|
-
Allowed:
|
|
23
|
-
|
|
24
|
-
- `suggestedProfile` / `modelPick` as **`profile/choice`** (e.g. `pro/default`, `balanced/default`).
|
|
25
|
-
- Optimixer sizing fields (output intent, reasoning effort catalog default, task type).
|
|
26
|
-
|
|
27
|
-
Forbidden:
|
|
28
|
-
|
|
29
|
-
- `model`, `modelId`, `mainModel`, `defaultModel` with values like `google/gemini-2.5-flash-lite`, `gpt-4o-mini`, `openrouter/...`.
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Current state (mono-repo audit 2026-06-08)
|
|
34
|
-
|
|
35
|
-
| Catalog | Concrete model stored? | Profile suggestion? |
|
|
36
|
-
|---------|------------------------|---------------------|
|
|
37
|
-
| `ai-skills` Catalox (`AI_SKILLS_CATALOG_ITEMS`) | **No** ✓ | **No** (gap → FR-1) |
|
|
38
|
-
| `xynthesis` `model-routing.json` | **No** ✓ (output sizing only) | N/A |
|
|
39
|
-
| `xynthesis` Catalox seed (`modelPick`) | **No** ✓ | `balanced/default`, etc. |
|
|
40
|
-
| funcx built-in / content catalog | Audit consumer + funcx repo | TBD |
|
|
41
|
-
|
|
42
|
-
`professional-answer` row contains only Optimixer metadata — **compliant** with CR-3.
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## Requirements
|
|
47
|
-
|
|
48
|
-
### CR-3.1 — Schema validation at provision time
|
|
49
|
-
|
|
50
|
-
- ai-skills `provision-ai-skills-catalog`: reject rows with `model`, `mainModel`, `defaultModel`, or concrete-pattern `modelId`.
|
|
51
|
-
- xynthesis seed validators: allow only `modelPick` matching `profile/choice` regex.
|
|
52
|
-
- funcx catalog linter: same rule for function `defaults.model`.
|
|
53
|
-
|
|
54
|
-
### CR-3.2 — Runtime must not read catalog model for invoke
|
|
55
|
-
|
|
56
|
-
- ai-skills `runSkill` model comes **only** from `RunSkillRequest.modelConfig.model` (set by orchestrator).
|
|
57
|
-
- funcx `run()` / sidekick: model from request or `modelPick` profile resolved at invoke — never a frozen slug from catalog body.
|
|
58
|
-
|
|
59
|
-
### CR-3.3 — Naming ban
|
|
60
|
-
|
|
61
|
-
- Disallow field names `mainModel`, `defaultModel`, `skillModel` on catalog `data` objects (reserved for runtime request shape).
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Acceptance criteria
|
|
66
|
-
|
|
67
|
-
- [ ] Provision script fails if a skill row includes `model: "google/..."`.
|
|
68
|
-
- [ ] `professional-answer` provision unchanged (Optimixer-only).
|
|
69
|
-
- [ ] Documentation lists allowed catalog model fields: `suggestedProfile` only (see FR-1).
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Related
|
|
74
|
-
|
|
75
|
-
- FR-1 adds the **positive** allowed field.
|
|
76
|
-
- CR-2 ensures graph/runtime `skillModel` is also profile-only at storage.
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
# FR-1 — Suggested profile on skill and funcx catalog rows
|
|
2
|
-
|
|
3
|
-
Status: **proposed**
|
|
4
|
-
Type: Feature request
|
|
5
|
-
Owners: `@exellix/ai-skills`, `@x12i/funcx`, `@exellix/xynthesis`
|
|
6
|
-
Filed: 2026-06-08
|
|
7
|
-
Session: [README](./README.md)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Summary
|
|
12
|
-
|
|
13
|
-
Add an optional **`suggestedProfile`** (or reuse xynthesis **`modelPick`**) on catalog rows: a single **`profile/choice`** string that recommends which ai-profiles tier fits this skill or sidekick action.
|
|
14
|
-
|
|
15
|
-
This is a **hint for authoring and studio UIs** — not an invoke-time default that bypasses the orchestrator.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Motivation
|
|
20
|
-
|
|
21
|
-
- Operators want "what model tier fits `professional-answer`?" without storing concrete slugs.
|
|
22
|
-
- Graph nodes should start from `suggestedProfile` when the author does not override `skillModel`.
|
|
23
|
-
- Aligns with CR-3 (no concrete models in catalog) while supporting discoverability.
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Proposed shape
|
|
28
|
-
|
|
29
|
-
### ai-skills Catalox row
|
|
30
|
-
|
|
31
|
-
```json
|
|
32
|
-
{
|
|
33
|
-
"skillKey": "professional-answer",
|
|
34
|
-
"suggestedProfile": "pro/default",
|
|
35
|
-
"optimixerReasoningEffort": "low",
|
|
36
|
-
"optimixerOutputIntent": { "mode": "relative", "expectedVisibleTokens": 1200 }
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### xynthesis sidekick seed (already similar)
|
|
41
|
-
|
|
42
|
-
```json
|
|
43
|
-
{
|
|
44
|
-
"defaults": {
|
|
45
|
-
"modelPick": "balanced/default",
|
|
46
|
-
"outputMode": "structured"
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Standardize naming in docs: **`suggestedProfile`** for skills, **`modelPick`** for xynthesis actions (alias in UI).
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
## Behavior
|
|
56
|
-
|
|
57
|
-
| Layer | Behavior |
|
|
58
|
-
|-------|----------|
|
|
59
|
-
| **Catalog** | Store `suggestedProfile` only; validate `profile/choice` via `@x12i/ai-profiles`. |
|
|
60
|
-
| **Studio / graph authoring** | New node MAIN unit pre-fills `modelSelection` from skill's `suggestedProfile`. |
|
|
61
|
-
| **runTask / runSkill** | Orchestrator MUST still send `modelConfig.skillModel` (or plan unit selection). Catalog hint is **not** a silent default at invoke. |
|
|
62
|
-
| **diagnoseSkillInCatalog** | Return `suggestedProfile` in diagnostic payload for tooling. |
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## API sketch (ai-skills)
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
type AiSkillsCatalogItemSpec = {
|
|
70
|
-
skillKey: string;
|
|
71
|
-
// ...
|
|
72
|
-
suggestedProfile?: string; // e.g. "pro/default"
|
|
73
|
-
};
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Export helper:
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
function assertSuggestedProfile(value: string): void;
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Acceptance criteria
|
|
85
|
-
|
|
86
|
-
- [ ] `professional-answer` can ship with `suggestedProfile: "pro/default"` (product choice).
|
|
87
|
-
- [ ] Provision rejects invalid profile keys and concrete slugs.
|
|
88
|
-
- [ ] Invoke without `skillModel` still fails fast (no hidden catalog default).
|
|
89
|
-
- [ ] Studio can list skills with suggested tier for graph palette.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Non-goals
|
|
94
|
-
|
|
95
|
-
- Auto-picking model at `runSkill` without orchestrator `modelConfig`.
|
|
96
|
-
- Storing multiple ranked profiles (future: `suggestedProfiles[]` if needed).
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# FR-2 — Graph-engine failure phase attribution (PRE vs MAIN vs POST)
|
|
2
|
-
|
|
3
|
-
Status: **proposed**
|
|
4
|
-
Type: Feature request
|
|
5
|
-
Owners: `@exellix/graph-engine`
|
|
6
|
-
Filed: 2026-06-08
|
|
7
|
-
Session: [README](./README.md)
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Summary
|
|
12
|
-
|
|
13
|
-
When `runTask` fails, graph-engine should surface **`phase`** and **`stage`** from `@exellix/ai-tasks` `RunTaskExecutionError` (or root cause), not only `skillKey`.
|
|
14
|
-
|
|
15
|
-
This session's confusion: error message referenced `skillKey=professional-answer` while the root cause was likely **PRE synthesis** (`cheap/default` → funcx catalog), not MAIN skill invoke.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Problem
|
|
20
|
-
|
|
21
|
-
Current wrapper shape (observed):
|
|
22
|
-
|
|
23
|
-
```text
|
|
24
|
-
runTask failed (skillKey=professional-answer nodeId=node:inbound-reachability graphId=graph:subnets-analysis): Unknown model "google/gemini-2.5-flash-lite" ...
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
ai-tasks native format includes phase when known:
|
|
28
|
-
|
|
29
|
-
```text
|
|
30
|
-
runTask failed (phase=pipeline_pre skillKey=...): ...
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Graph-engine omits `phase=`, so operators assume **MAIN / professional-answer model** is wrong.
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Requirements
|
|
38
|
-
|
|
39
|
-
### FR-2.1 — Error envelope
|
|
40
|
-
|
|
41
|
-
Node execution error SHOULD include:
|
|
42
|
-
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
"skillKey": "professional-answer",
|
|
46
|
-
"graphId": "graph:subnets-analysis",
|
|
47
|
-
"nodeId": "node:inbound-reachability",
|
|
48
|
-
"phase": "pipeline_pre",
|
|
49
|
-
"stage": "pre-synthesis",
|
|
50
|
-
"rootMessage": "Unknown model \"google/gemini-2.5-flash-lite\" ...",
|
|
51
|
-
"rootCode": "MISSING_ENV",
|
|
52
|
-
"modelConfig": {
|
|
53
|
-
"preActionModel": "cheap/default",
|
|
54
|
-
"skillModel": "pro/default",
|
|
55
|
-
"postActionModel": "cheap/default"
|
|
56
|
-
},
|
|
57
|
-
"failureClassification": { "role": "cause", "event": "provider_invoke" }
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### FR-2.2 — Propagation
|
|
62
|
-
|
|
63
|
-
- Parse `RunTaskExecutionError.details.phase` when present.
|
|
64
|
-
- Fall back to heuristic on `rootMessage` (funcx catalog → `pipeline_pre` or `pipeline_post`; gateway → `main_skill`).
|
|
65
|
-
|
|
66
|
-
### FR-2.3 — UI copy
|
|
67
|
-
|
|
68
|
-
- Display: **"PRE synthesis failed"** vs **"Skill invoke failed"** based on `phase`.
|
|
69
|
-
- Do not show "professional-answer model error" when `phase !== main_skill`.
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## Acceptance criteria
|
|
74
|
-
|
|
75
|
-
- [ ] PRE funcx catalog failure shows `phase: "pipeline_pre"` in graph-engine node error JSON.
|
|
76
|
-
- [ ] MAIN gateway failure shows `phase: "main_skill"`.
|
|
77
|
-
- [ ] Same `skillKey` on wrapper; phase disambiguates.
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## Reference (ai-tasks)
|
|
82
|
-
|
|
83
|
-
- `RunTaskFailurePhase`: `pipeline_pre`, `main_skill`, `pipeline_post`, `model-resolution`, …
|
|
84
|
-
- `formatRunTaskExecutionMessage` in `ai-tasks/src/errors/runTaskExecutionError.ts`
|
|
85
|
-
- `classifyRunTaskFailure` in `ai-tasks/src/observability/classifyRunTaskFailure.ts`
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Non-goals
|
|
90
|
-
|
|
91
|
-
- Changing ai-tasks error types (consume as-is).
|
|
92
|
-
- Resolving catalog issues (see [INVESTIGATION-original-bug.md](./INVESTIGATION-original-bug.md)).
|