0xray 4.0.38 → 4.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.grok-plugin/plugin.json +1 -1
- package/.xray/features.json +1 -1
- package/AGENTS-consumer.md +1 -1
- package/AGENTS.md +1 -1
- package/README.md +2 -2
- package/SKILLS.md +1 -1
- package/dist/AGENTS.md +1 -1
- package/dist/CHANGELOG.md +25 -0
- package/dist/README.md +2 -2
- package/dist/SKILLS.md +1 -1
- package/dist/integrations/hooks/goggles-planes.json +1 -1
- package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
- package/docs-site/docs/plates/activity-log.md +1 -1
- package/docs-site/docs/plates/cursor-compact.md +1 -1
- package/docs-site/docs/plates/grok-compact.md +1 -1
- package/docs-site/docs/plates/grokbot.md +1 -1
- package/docs-site/docs/plates/house.md +1 -1
- package/docs-site/docs/plates/index.md +1 -1
- package/docs-site/docs/plates/inference-files.md +1 -1
- package/docs-site/docs/plates/kept-line.md +1 -1
- package/docs-site/docs/plates/lens-gate.md +1 -1
- package/docs-site/docs/plates/lens-page.md +1 -1
- package/docs-site/docs/plates/live-mesh.md +41 -0
- package/docs-site/docs/plates/notes-page.md +1 -1
- package/docs-site/docs/plates/package-face.md +1 -1
- package/docs-site/docs/plates/payload-heat.md +1 -1
- package/docs-site/docs/plates/pickup-stamp.md +1 -1
- package/docs-site/docs/plates/pre-tool.md +1 -1
- package/docs-site/docs/plates/record-map.md +1 -1
- package/docs-site/docs/plates/reflection-page.md +1 -1
- package/docs-site/docs/plates/review.md +1 -1
- package/docs-site/docs/plates/session-capture.md +1 -1
- package/docs-site/docs/plates/site-manual.md +1 -1
- package/docs-site/docs/plates/stamp-plate.md +1 -1
- package/docs-site/docs/plates/station-card.md +1 -1
- package/docs-site/docs/plates/station-heat.md +1 -1
- package/docs-site/docs/plates/suit-organs.md +1 -1
- package/docs-site/docs/plates/suit-settings.md +1 -1
- package/docs-site/docs/plates/suit-wear.md +1 -1
- package/docs-site/docs/plates/trail-state.md +1 -1
- package/docs-site/docs/plates/work-fresh.md +1 -1
- package/docs-site/docs/plates/write-home.md +1 -1
- package/llms.txt +1 -1
- package/package.json +2 -1
- package/scripts/foundry/plant/skills/mill/SKILL.md +1 -1
- package/scripts/node/consumer-install-smoke.mjs +3 -3
- package/scripts/node/playwright-smoke-server.cjs +27 -0
- package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
- package/vendor/@0xray/repertoire/README.md +1 -1
- package/vendor/@0xray/repertoire/dist/RepertoireService.js +1 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js +4 -1
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts +5 -0
- package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js +16 -6
- package/vendor/@0xray/repertoire/dist/paths.js +1 -2
- package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts +16 -6
- package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js +19 -2
- package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js +34 -2
- package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts +3 -0
- package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js +25 -1
- package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts +37 -2
- package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js +176 -19
- package/vendor/@0xray/repertoire/dist/types.d.ts +6 -0
- package/vendor/@0xray/repertoire/package.json +2 -2
- package/vendor/@0xray/repertoire/scripts/verify-grok-suit.mjs +9 -6
- package/vendor/@0xray/repertoire/scripts/verify-synthesis-dogfood.mjs +109 -5
- package/xray/features.json +1 -1
- package/.opencode/agents/api-design.yml +0 -31
- package/.opencode/agents/architect.yml +0 -15
- package/.opencode/agents/architecture-patterns.yml +0 -14
- package/.opencode/agents/auto-format.yml +0 -14
- package/.opencode/agents/backend-engineer.yml +0 -12
- package/.opencode/agents/boot-orchestrator.yml +0 -14
- package/.opencode/agents/bug-triage-specialist.yml +0 -15
- package/.opencode/agents/code-analyzer.yml +0 -12
- package/.opencode/agents/code-reviewer.yml +0 -14
- package/.opencode/agents/content-creator.yml +0 -12
- package/.opencode/agents/database-engineer.yml +0 -12
- package/.opencode/agents/devops-engineer.yml +0 -12
- package/.opencode/agents/framework-compliance-audit.yml +0 -14
- package/.opencode/agents/frontend-engineer.yml +0 -12
- package/.opencode/agents/frontend-ui-ux-engineer.yml +0 -12
- package/.opencode/agents/git-workflow.yml +0 -15
- package/.opencode/agents/growth-strategist.yml +0 -12
- package/.opencode/agents/hermes-agent.yml +0 -12
- package/.opencode/agents/inference-improve.yml +0 -12
- package/.opencode/agents/lint.yml +0 -14
- package/.opencode/agents/log-monitor.yml +0 -12
- package/.opencode/agents/mobile-developer.yml +0 -12
- package/.opencode/agents/model-health-check.yml +0 -12
- package/.opencode/agents/multimodal-looker.yml +0 -12
- package/.opencode/agents/performance-analysis.yml +0 -12
- package/.opencode/agents/performance-engineer.yml +0 -12
- package/.opencode/agents/performance-optimization.yml +0 -12
- package/.opencode/agents/processor-pipeline.yml +0 -14
- package/.opencode/agents/project-analysis.yml +0 -12
- package/.opencode/agents/refactorer.yml +0 -12
- package/.opencode/agents/researcher.yml +0 -12
- package/.opencode/agents/security-auditor.yml +0 -12
- package/.opencode/agents/security-scan.yml +0 -12
- package/.opencode/agents/seo-consultant.yml +0 -12
- package/.opencode/agents/session-management.yml +0 -12
- package/.opencode/agents/state-manager.yml +0 -12
- package/.opencode/agents/storyteller.yml +0 -12
- package/.opencode/agents/strategist.yml +0 -12
- package/.opencode/agents/tech-writer.yml +0 -12
- package/.opencode/agents/testing-best-practices.yml +0 -12
- package/.opencode/agents/testing-lead.yml +0 -12
- package/.opencode/agents/ui-ux-design.yml +0 -12
- package/.opencode/codex.codex +0 -8
- package/.opencode/commands/auto-format.md +0 -99
- package/.opencode/commands/auto-summary-capture.md +0 -90
- package/.opencode/commands/dependency-audit.md +0 -184
- package/.opencode/commands/enforcer-daily-scan.md +0 -137
- package/.opencode/commands/framework-compliance-audit.md +0 -205
- package/.opencode/commands/interactive-validator.md +0 -75
- package/.opencode/commands/job-summary-logger.md +0 -68
- package/.opencode/commands/lint.md +0 -11
- package/.opencode/commands/mode-switch.md +0 -95
- package/.opencode/commands/model-health-check.md +0 -186
- package/.opencode/commands/performance-analysis.md +0 -144
- package/.opencode/commands/pre-commit-introspection.md +0 -185
- package/.opencode/commands/pre-commit-introspection.sh +0 -133
- package/.opencode/commands/security-scan.md +0 -157
- package/.opencode/commands/sisyphus-validation.md +0 -128
- package/.opencode/commands/summary-logger.md +0 -83
- package/.opencode/enforcer-config.json +0 -282
- package/.opencode/workflows/post-deployment-audit.yml +0 -123
|
@@ -58,15 +58,119 @@ async function main() {
|
|
|
58
58
|
else fail('provider.buildSynthesisContext', 'null');
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
if (typeof provider.refreshMetaInference
|
|
61
|
+
if (typeof provider.refreshMetaInference !== 'function') {
|
|
62
|
+
fail('provider.refreshMetaInference missing');
|
|
63
|
+
} else {
|
|
62
64
|
try {
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
+
const refresh = await provider.refreshMetaInference();
|
|
66
|
+
if (refresh && typeof refresh.refreshed === 'boolean' && typeof refresh.reason === 'string') {
|
|
67
|
+
pass('provider.refreshMetaInference', `${refresh.refreshed} ${refresh.reason}`);
|
|
68
|
+
} else {
|
|
69
|
+
fail('provider.refreshMetaInference', JSON.stringify(refresh));
|
|
70
|
+
}
|
|
65
71
|
} catch (e) {
|
|
66
72
|
fail('provider.refreshMetaInference', e.message);
|
|
67
73
|
}
|
|
68
|
-
}
|
|
69
|
-
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Reaches synthesis output with a stubbed model, or fails.
|
|
77
|
+
const synthTmp = mkdtempSync(join(tmpdir(), 'repertoire-synth-output-'));
|
|
78
|
+
try {
|
|
79
|
+
const logDir = join(synthTmp, 'logs');
|
|
80
|
+
mkdirSync(logDir, { recursive: true });
|
|
81
|
+
const synthSessionId = 'dogfood-synth-1';
|
|
82
|
+
writeFileSync(
|
|
83
|
+
join(logDir, 'entries.jsonl'),
|
|
84
|
+
`${JSON.stringify({
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
source: 'groover',
|
|
87
|
+
session_id: synthSessionId,
|
|
88
|
+
inference: 'stubbed synthesis must land in the report',
|
|
89
|
+
post_title: 'dogfood',
|
|
90
|
+
})}\n`,
|
|
91
|
+
);
|
|
92
|
+
const statePath = join(synthTmp, 'inference-state.json');
|
|
93
|
+
const reportPath = join(synthTmp, 'synthesis.md');
|
|
94
|
+
const { MetaInferenceEngine } = await import(
|
|
95
|
+
join(root, 'dist/synthesis/meta-inference-engine.js')
|
|
96
|
+
);
|
|
97
|
+
const engine = new MetaInferenceEngine({
|
|
98
|
+
logDir,
|
|
99
|
+
statePath,
|
|
100
|
+
reportPath,
|
|
101
|
+
hermesCommand: () => 'STUBBED SYNTHESIS OUTPUT',
|
|
102
|
+
});
|
|
103
|
+
const report = await engine.run();
|
|
104
|
+
const written = existsSync(reportPath) ? readFileSync(reportPath, 'utf8') : '';
|
|
105
|
+
const state = existsSync(statePath)
|
|
106
|
+
? JSON.parse(readFileSync(statePath, 'utf8'))
|
|
107
|
+
: { processedSessionIds: [] };
|
|
108
|
+
const processed = Array.isArray(state.processedSessionIds) &&
|
|
109
|
+
state.processedSessionIds.includes(synthSessionId);
|
|
110
|
+
if (
|
|
111
|
+
report &&
|
|
112
|
+
typeof report.finalReport === 'string' &&
|
|
113
|
+
report.finalReport.includes('STUBBED SYNTHESIS OUTPUT') &&
|
|
114
|
+
written.includes('STUBBED SYNTHESIS OUTPUT') &&
|
|
115
|
+
!written.includes('UNREVIEWED') &&
|
|
116
|
+
processed
|
|
117
|
+
) {
|
|
118
|
+
pass('synthesis output with stubbed model', 'report written and entry processed');
|
|
119
|
+
} else {
|
|
120
|
+
fail(
|
|
121
|
+
'synthesis output with stubbed model',
|
|
122
|
+
`report=${Boolean(report)} bytes=${written.length} processed=${JSON.stringify(state.processedSessionIds)}`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
} catch (e) {
|
|
126
|
+
fail('synthesis output with stubbed model', e.message);
|
|
127
|
+
} finally {
|
|
128
|
+
rmSync(synthTmp, { recursive: true, force: true });
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const failTmp = mkdtempSync(join(tmpdir(), 'repertoire-synth-fail-'));
|
|
132
|
+
try {
|
|
133
|
+
const failLogDir = join(failTmp, 'logs');
|
|
134
|
+
mkdirSync(failLogDir, { recursive: true });
|
|
135
|
+
const failSessionId = 'dogfood-synth-fail';
|
|
136
|
+
writeFileSync(
|
|
137
|
+
join(failLogDir, 'entries.jsonl'),
|
|
138
|
+
`${JSON.stringify({
|
|
139
|
+
timestamp: new Date().toISOString(),
|
|
140
|
+
source: 'groover',
|
|
141
|
+
session_id: failSessionId,
|
|
142
|
+
inference: 'a failed model must not consume this entry',
|
|
143
|
+
post_title: 'dogfood-fail',
|
|
144
|
+
})}\n`,
|
|
145
|
+
);
|
|
146
|
+
const failStatePath = join(failTmp, 'inference-state.json');
|
|
147
|
+
const failProvider = createMemoryRoutingProvider({
|
|
148
|
+
projectRoot: failTmp,
|
|
149
|
+
logDir: failLogDir,
|
|
150
|
+
statePath: failStatePath,
|
|
151
|
+
feedbackDir: join(failTmp, 'feedback'),
|
|
152
|
+
hermesCommand: () => {
|
|
153
|
+
throw new Error('dogfood model down');
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const failed = await failProvider.refreshMetaInference();
|
|
157
|
+
const failState = existsSync(failStatePath)
|
|
158
|
+
? JSON.parse(readFileSync(failStatePath, 'utf8'))
|
|
159
|
+
: { processedSessionIds: [], lastRun: null };
|
|
160
|
+
const stillOpen = !Array.isArray(failState.processedSessionIds)
|
|
161
|
+
|| !failState.processedSessionIds.includes(failSessionId);
|
|
162
|
+
if (failed && failed.refreshed === false && failed.reason === 'model_call_failed' && stillOpen) {
|
|
163
|
+
pass('provider.refreshMetaInference failing model', `${failed.refreshed} ${failed.reason}`);
|
|
164
|
+
} else {
|
|
165
|
+
fail(
|
|
166
|
+
'provider.refreshMetaInference failing model',
|
|
167
|
+
JSON.stringify({ failed, processed: failState.processedSessionIds }),
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
} catch (e) {
|
|
171
|
+
fail('provider.refreshMetaInference failing model', e.message);
|
|
172
|
+
} finally {
|
|
173
|
+
rmSync(failTmp, { recursive: true, force: true });
|
|
70
174
|
}
|
|
71
175
|
|
|
72
176
|
if (typeof provider.ingestFeedback === 'function') {
|
package/xray/features.json
CHANGED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
name: api-design
|
|
2
|
-
skill: api-design
|
|
3
|
-
description: "RESTful API design and validation specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
# CODEX COMPLIANCE
|
|
8
|
-
# - Term 12: No Code Without Tests - all API endpoints require test coverage
|
|
9
|
-
# - Term 17: Type Safety Required - use TypeScript interfaces for all data contracts
|
|
10
|
-
|
|
11
|
-
# Core Capabilities
|
|
12
|
-
capabilities:
|
|
13
|
-
- rest_api_design
|
|
14
|
-
- graphql_api_design
|
|
15
|
-
- api_validation
|
|
16
|
-
- openapi_spec_generation
|
|
17
|
-
- api_documentation
|
|
18
|
-
|
|
19
|
-
# State Management
|
|
20
|
-
state_management:
|
|
21
|
-
enabled: true
|
|
22
|
-
namespaces:
|
|
23
|
-
- api_specs
|
|
24
|
-
- endpoint_contracts
|
|
25
|
-
- validation_rules
|
|
26
|
-
|
|
27
|
-
# Quality Requirements
|
|
28
|
-
quality:
|
|
29
|
-
test_coverage: required
|
|
30
|
-
type_safety: strict
|
|
31
|
-
documentation: required
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
name: architect
|
|
2
|
-
skill: architect-tools
|
|
3
|
-
description: "System design and technical architecture tools specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- system_design
|
|
9
|
-
- architecture_analysis
|
|
10
|
-
- technical_documentation
|
|
11
|
-
- pattern_selection
|
|
12
|
-
|
|
13
|
-
quality:
|
|
14
|
-
test_coverage: recommended
|
|
15
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: architecture-patterns
|
|
2
|
-
skill: architecture-patterns
|
|
3
|
-
description: "Software architecture patterns and best practices specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- pattern_analysis
|
|
9
|
-
- architecture_review
|
|
10
|
-
- design_evaluation
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: recommended
|
|
14
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: auto-format
|
|
2
|
-
skill: auto-format
|
|
3
|
-
description: "Automated code formatting and style consistency specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- code_formatting
|
|
9
|
-
- style_enforcement
|
|
10
|
-
- lint_integration
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: recommended
|
|
14
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: boot-orchestrator
|
|
2
|
-
skill: boot-orchestrator
|
|
3
|
-
description: "Framework initialization and boot orchestration specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- framework_boot
|
|
9
|
-
- processor_initialization
|
|
10
|
-
- system_startup
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: required
|
|
14
|
-
type_safety: strict
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
name: bug-triage-specialist
|
|
2
|
-
skill: bug-triage
|
|
3
|
-
description: "Bug triage, debugging analysis, and issue prioritization specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- bug_analysis
|
|
9
|
-
- debugging
|
|
10
|
-
- issue_prioritization
|
|
11
|
-
- root_cause_analysis
|
|
12
|
-
|
|
13
|
-
quality:
|
|
14
|
-
test_coverage: required
|
|
15
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: code-reviewer
|
|
2
|
-
skill: code-review
|
|
3
|
-
description: "Comprehensive code quality assessment and improvement suggestions specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- code_review
|
|
9
|
-
- quality_assessment
|
|
10
|
-
- improvement_suggestions
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: required
|
|
14
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: framework-compliance-audit
|
|
2
|
-
skill: framework-compliance-audit
|
|
3
|
-
description: "Framework compliance auditing and validation specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- compliance_audit
|
|
9
|
-
- validation
|
|
10
|
-
- standards_enforcement
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: required
|
|
14
|
-
type_safety: strict
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
name: frontend-ui-ux-engineer
|
|
2
|
-
skill: frontend-ui-ux-engineer
|
|
3
|
-
description: "frontend ui ux engineer specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- domain_specialization
|
|
9
|
-
|
|
10
|
-
quality:
|
|
11
|
-
test_coverage: recommended
|
|
12
|
-
type_safety: strict
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
name: git-workflow
|
|
2
|
-
skill: git-workflow
|
|
3
|
-
description: "Git workflow management and collaboration specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- git_operations
|
|
9
|
-
- branch_management
|
|
10
|
-
- merge_conflicts
|
|
11
|
-
- workflow_automation
|
|
12
|
-
|
|
13
|
-
quality:
|
|
14
|
-
test_coverage: recommended
|
|
15
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: lint
|
|
2
|
-
skill: lint
|
|
3
|
-
description: "Code linting and static analysis specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- linting
|
|
9
|
-
- static_analysis
|
|
10
|
-
- code_quality
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: recommended
|
|
14
|
-
type_safety: strict
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
name: performance-optimization
|
|
2
|
-
skill: performance-optimization
|
|
3
|
-
description: "performance optimization specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- domain_specialization
|
|
9
|
-
|
|
10
|
-
quality:
|
|
11
|
-
test_coverage: recommended
|
|
12
|
-
type_safety: strict
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
name: processor-pipeline
|
|
2
|
-
skill: processor-pipeline
|
|
3
|
-
description: "Data processing pipeline management specialist"
|
|
4
|
-
version: "1.0.0"
|
|
5
|
-
mode: subagent
|
|
6
|
-
|
|
7
|
-
capabilities:
|
|
8
|
-
- pipeline_management
|
|
9
|
-
- data_processing
|
|
10
|
-
- workflow_orchestration
|
|
11
|
-
|
|
12
|
-
quality:
|
|
13
|
-
test_coverage: required
|
|
14
|
-
type_safety: strict
|