onto-mcp 0.3.2 → 0.4.1
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/.onto/processes/reconstruct/actionable-ontology-seed-recomposition-design.md +447 -0
- package/.onto/processes/reconstruct/foundry-style-ontology-seed-contract.md +934 -0
- package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +303 -725
- package/.onto/processes/reconstruct/reconstruct-contract-registry.yaml +1645 -0
- package/.onto/processes/reconstruct/reconstruct-execution-ux-contract.md +26 -22
- package/.onto/processes/reconstruct/source-profile-contract.md +49 -23
- package/.onto/processes/reconstruct/source-profiles/code.md +6 -3
- package/.onto/processes/reconstruct/source-profiles/database.md +5 -2
- package/.onto/processes/reconstruct/source-profiles/document.md +5 -2
- package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +5 -4
- package/.onto/processes/review/review-execution-ux-contract.md +40 -0
- package/.onto/processes/shared/pipeline-execution-ledger-contract.md +26 -10
- package/.onto/processes/shared/target-material-kind-contract.md +29 -16
- package/AGENTS.md +6 -4
- package/README.md +149 -76
- package/dist/cli.js +8 -8
- package/dist/core-api/reconstruct-api.js +117 -31
- package/dist/core-api/review-api.js +47 -0
- package/dist/core-runtime/cli/codex-review-unit-executor.js +39 -2
- package/dist/core-runtime/cli/complete-review-session.js +2 -2
- package/dist/core-runtime/cli/mock-review-unit-executor.js +1 -1
- package/dist/core-runtime/cli/review-invoke.js +9 -9
- package/dist/core-runtime/cli/run-review-prompt-execution.js +39 -5
- package/dist/core-runtime/cli/spawn-watcher.js +266 -47
- package/dist/core-runtime/cli/start-review-session.js +3 -3
- package/dist/core-runtime/llm/llm-caller.js +11 -0
- package/dist/core-runtime/llm/llm-tool-loop.js +2 -0
- package/dist/core-runtime/observability/runtime-stream-observation.js +118 -0
- package/dist/core-runtime/onboard/cli-host.js +174 -0
- package/dist/core-runtime/onboard/host-target.js +22 -0
- package/dist/core-runtime/onboard/json-config-host.js +122 -0
- package/dist/core-runtime/onboard/path-scan.js +26 -0
- package/dist/core-runtime/onboard/prompt.js +51 -0
- package/dist/core-runtime/onboard/register.js +214 -0
- package/dist/core-runtime/onboard/types.js +27 -0
- package/dist/core-runtime/reconstruct/actionable-seed-validation.js +1777 -0
- package/dist/core-runtime/reconstruct/artifact-types.js +10 -4
- package/dist/core-runtime/reconstruct/contract-registry.js +623 -0
- package/dist/core-runtime/reconstruct/domain-id.js +10 -0
- package/dist/core-runtime/reconstruct/governing-snapshot.js +716 -0
- package/dist/core-runtime/reconstruct/material-profile-validation.js +191 -0
- package/dist/core-runtime/reconstruct/materialize-preparation.js +49 -11
- package/dist/core-runtime/reconstruct/pipeline-execution-ledger.js +269 -79
- package/dist/core-runtime/reconstruct/post-seed-validation.js +1194 -51
- package/dist/core-runtime/reconstruct/record.js +104 -20
- package/dist/core-runtime/reconstruct/run.js +2107 -413
- package/dist/core-runtime/reconstruct/seed-claim-projections.js +268 -0
- package/dist/core-runtime/reconstruct/source-profiles.js +93 -4
- package/dist/core-runtime/reconstruct/terminal-validation.js +807 -0
- package/dist/core-runtime/review/review-invocation-runner.js +4 -4
- package/dist/mcp/server.js +110 -38
- package/dist/mcp/tool-schemas.js +20 -6
- package/package.json +8 -17
- package/scripts/onto-review-watch.sh +486 -0
- package/scripts/onto-runtime-watch.sh +122 -0
- package/scripts/postinstall-hint.js +22 -0
- package/.onto/processes/reconstruct/top-level-concept-discovery-contract.md +0 -387
- package/dist/core-runtime/cli/bootstrap-review-binding.js +0 -186
- package/dist/core-runtime/cli/codex-nested-dispatch.test.js +0 -390
- package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +0 -335
- package/dist/core-runtime/cli/coordinator-helpers.js +0 -583
- package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +0 -167
- package/dist/core-runtime/cli/coordinator-state-machine.js +0 -794
- package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +0 -615
- package/dist/core-runtime/cli/e2e-start-review-session.test.js +0 -312
- package/dist/core-runtime/cli/health.js +0 -44
- package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +0 -567
- package/dist/core-runtime/cli/materialize-review-execution-preparation.js +0 -104
- package/dist/core-runtime/cli/migrate-session-roots.js +0 -118
- package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +0 -106
- package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +0 -268
- package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +0 -136
- package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +0 -201
- package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +0 -192
- package/dist/core-runtime/cli/session-root-guard.js +0 -168
- package/dist/core-runtime/cli/spawn-watcher.test.js +0 -457
- package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +0 -79
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +0 -412
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +0 -351
- package/dist/core-runtime/cli/topology-executor-mapping.js +0 -139
- package/dist/core-runtime/cli/topology-executor-mapping.test.js +0 -173
- package/dist/core-runtime/cli/write-review-interpretation.js +0 -81
- package/dist/core-runtime/config/onto-config-cli.js +0 -278
- package/dist/core-runtime/config/onto-config-key-path.js +0 -288
- package/dist/core-runtime/config/onto-config-key-path.test.js +0 -195
- package/dist/core-runtime/config/onto-config-preview.js +0 -108
- package/dist/core-runtime/config/onto-config-preview.test.js +0 -132
- package/dist/core-runtime/discovery/config-chain.js +0 -118
- package/dist/core-runtime/discovery/config-chain.test.js +0 -103
- package/dist/core-runtime/discovery/config-profile.js +0 -199
- package/dist/core-runtime/discovery/config-profile.test.js +0 -233
- package/dist/core-runtime/discovery/host-detection.test.js +0 -186
- package/dist/core-runtime/discovery/installation-paths.test.js +0 -65
- package/dist/core-runtime/discovery/lens-registry.test.js +0 -81
- package/dist/core-runtime/discovery/path-normalization.test.js +0 -22
- package/dist/core-runtime/discovery/plugin-path.js +0 -72
- package/dist/core-runtime/discovery/plugin-path.test.js +0 -95
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +0 -344
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +0 -915
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +0 -564
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +0 -708
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +0 -165
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +0 -227
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +0 -59
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +0 -205
- package/dist/core-runtime/evolve/adapters/methodology/adapter.js +0 -16
- package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +0 -9
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +0 -298
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +0 -70
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +0 -46
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +0 -73
- package/dist/core-runtime/evolve/adapters/registry.js +0 -47
- package/dist/core-runtime/evolve/adapters/registry.test.js +0 -67
- package/dist/core-runtime/evolve/cli.js +0 -256
- package/dist/core-runtime/evolve/commands/align.js +0 -194
- package/dist/core-runtime/evolve/commands/align.test.js +0 -82
- package/dist/core-runtime/evolve/commands/apply.js +0 -161
- package/dist/core-runtime/evolve/commands/apply.test.js +0 -138
- package/dist/core-runtime/evolve/commands/close.js +0 -39
- package/dist/core-runtime/evolve/commands/close.test.js +0 -99
- package/dist/core-runtime/evolve/commands/defer.js +0 -40
- package/dist/core-runtime/evolve/commands/defer.test.js +0 -134
- package/dist/core-runtime/evolve/commands/draft.js +0 -323
- package/dist/core-runtime/evolve/commands/draft.test.js +0 -178
- package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +0 -208
- package/dist/core-runtime/evolve/commands/error-messages.js +0 -125
- package/dist/core-runtime/evolve/commands/error-messages.test.js +0 -167
- package/dist/core-runtime/evolve/commands/propose-align.js +0 -222
- package/dist/core-runtime/evolve/commands/propose-align.test.js +0 -136
- package/dist/core-runtime/evolve/commands/reconstruct.js +0 -330
- package/dist/core-runtime/evolve/commands/reconstruct.test.js +0 -278
- package/dist/core-runtime/evolve/commands/shared.js +0 -22
- package/dist/core-runtime/evolve/commands/stale-check.js +0 -103
- package/dist/core-runtime/evolve/commands/stale-check.test.js +0 -84
- package/dist/core-runtime/evolve/commands/start.js +0 -887
- package/dist/core-runtime/evolve/commands/start.test.js +0 -396
- package/dist/core-runtime/evolve/config/project-config.js +0 -99
- package/dist/core-runtime/evolve/config/project-config.test.js +0 -170
- package/dist/core-runtime/evolve/renderers/align-packet.js +0 -280
- package/dist/core-runtime/evolve/renderers/align-packet.test.js +0 -332
- package/dist/core-runtime/evolve/renderers/draft-packet.js +0 -303
- package/dist/core-runtime/evolve/renderers/draft-packet.test.js +0 -377
- package/dist/core-runtime/evolve/renderers/format.js +0 -5
- package/dist/core-runtime/evolve/renderers/scope-md.js +0 -237
- package/dist/core-runtime/evolve/renderers/scope-md.test.js +0 -306
- package/dist/core-runtime/govern/cli.js +0 -369
- package/dist/core-runtime/govern/cli.test.js +0 -314
- package/dist/core-runtime/govern/drift-engine.js +0 -103
- package/dist/core-runtime/govern/drift-engine.test.js +0 -319
- package/dist/core-runtime/govern/promote-principle.js +0 -206
- package/dist/core-runtime/govern/promote-principle.test.js +0 -368
- package/dist/core-runtime/govern/queue.js +0 -81
- package/dist/core-runtime/govern/types.js +0 -16
- package/dist/core-runtime/install/cli.js +0 -530
- package/dist/core-runtime/install/detect.js +0 -128
- package/dist/core-runtime/install/detect.test.js +0 -155
- package/dist/core-runtime/install/gitignore-update.js +0 -74
- package/dist/core-runtime/install/gitignore-update.test.js +0 -64
- package/dist/core-runtime/install/install-integration.test.js +0 -373
- package/dist/core-runtime/install/prompts.js +0 -389
- package/dist/core-runtime/install/prompts.test.js +0 -293
- package/dist/core-runtime/install/types.js +0 -26
- package/dist/core-runtime/install/validation.js +0 -295
- package/dist/core-runtime/install/validation.test.js +0 -313
- package/dist/core-runtime/install/writer.js +0 -254
- package/dist/core-runtime/install/writer.test.js +0 -218
- package/dist/core-runtime/learning/extractor.js +0 -461
- package/dist/core-runtime/learning/feedback.js +0 -179
- package/dist/core-runtime/learning/health-report.js +0 -165
- package/dist/core-runtime/learning/health-report.test.js +0 -169
- package/dist/core-runtime/learning/loader.js +0 -388
- package/dist/core-runtime/learning/loader.test.js +0 -102
- package/dist/core-runtime/learning/promote/apply-state.js +0 -240
- package/dist/core-runtime/learning/promote/audit-obligation.js +0 -195
- package/dist/core-runtime/learning/promote/collector.js +0 -432
- package/dist/core-runtime/learning/promote/degraded-state.js +0 -125
- package/dist/core-runtime/learning/promote/domain-doc-proposer.js +0 -166
- package/dist/core-runtime/learning/promote/e2e-promote.test.js +0 -6385
- package/dist/core-runtime/learning/promote/health-snapshot.js +0 -150
- package/dist/core-runtime/learning/promote/insight-reclassifier.js +0 -544
- package/dist/core-runtime/learning/promote/judgment-auditor.js +0 -517
- package/dist/core-runtime/learning/promote/panel-reviewer.js +0 -1158
- package/dist/core-runtime/learning/promote/promote-executor.js +0 -1675
- package/dist/core-runtime/learning/promote/promoter.js +0 -307
- package/dist/core-runtime/learning/promote/retirement.js +0 -122
- package/dist/core-runtime/learning/promote/types.js +0 -23
- package/dist/core-runtime/learning/prompt-sections.js +0 -51
- package/dist/core-runtime/learning/shared/artifact-registry-init.js +0 -45
- package/dist/core-runtime/learning/shared/artifact-registry.js +0 -254
- package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +0 -73
- package/dist/core-runtime/learning/shared/audit-state.js +0 -99
- package/dist/core-runtime/learning/shared/duplicate-check.js +0 -28
- package/dist/core-runtime/learning/shared/llm-caller.js +0 -831
- package/dist/core-runtime/learning/shared/llm-caller.test.js +0 -601
- package/dist/core-runtime/learning/shared/llm-tool-loop.js +0 -393
- package/dist/core-runtime/learning/shared/mode.js +0 -25
- package/dist/core-runtime/learning/shared/paths.js +0 -84
- package/dist/core-runtime/learning/shared/paths.test.js +0 -79
- package/dist/core-runtime/learning/shared/patterns.js +0 -37
- package/dist/core-runtime/learning/shared/recoverability.js +0 -355
- package/dist/core-runtime/learning/shared/recovery-context.js +0 -374
- package/dist/core-runtime/learning/shared/scope.js +0 -1
- package/dist/core-runtime/learning/shared/semantic-classifier.js +0 -94
- package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +0 -42
- package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +0 -37
- package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +0 -39
- package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +0 -41
- package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +0 -38
- package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +0 -43
- package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +0 -113
- package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +0 -36
- package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +0 -48
- package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +0 -43
- package/dist/core-runtime/learning/shared/specs/spec-helpers.js +0 -64
- package/dist/core-runtime/learning/usage-tracker.js +0 -190
- package/dist/core-runtime/learning/usage-tracker.test.js +0 -176
- package/dist/core-runtime/onboard/detect-review-axes.js +0 -122
- package/dist/core-runtime/onboard/detect-review-axes.test.js +0 -127
- package/dist/core-runtime/onboard/write-review-block.js +0 -188
- package/dist/core-runtime/onboard/write-review-block.test.js +0 -240
- package/dist/core-runtime/readers/brownfield-builder.js +0 -150
- package/dist/core-runtime/readers/brownfield-builder.test.js +0 -136
- package/dist/core-runtime/readers/code-chunk-collector.js +0 -53
- package/dist/core-runtime/readers/code-chunk-collector.test.js +0 -136
- package/dist/core-runtime/readers/file-utils.js +0 -240
- package/dist/core-runtime/readers/file-utils.test.js +0 -146
- package/dist/core-runtime/readers/lexicon-citation-check.js +0 -93
- package/dist/core-runtime/readers/lexicon-citation-check.test.js +0 -77
- package/dist/core-runtime/readers/mcp-figma.js +0 -30
- package/dist/core-runtime/readers/mcp-figma.test.js +0 -82
- package/dist/core-runtime/readers/mcp-generic.js +0 -31
- package/dist/core-runtime/readers/mcp-generic.test.js +0 -76
- package/dist/core-runtime/readers/ontology-index.js +0 -148
- package/dist/core-runtime/readers/ontology-index.test.js +0 -245
- package/dist/core-runtime/readers/ontology-query.js +0 -168
- package/dist/core-runtime/readers/ontology-query.test.js +0 -311
- package/dist/core-runtime/readers/ontology-resolve.js +0 -48
- package/dist/core-runtime/readers/ontology-resolve.test.js +0 -48
- package/dist/core-runtime/readers/patterns/index.js +0 -7
- package/dist/core-runtime/readers/review-log.js +0 -213
- package/dist/core-runtime/readers/review-log.test.js +0 -313
- package/dist/core-runtime/readers/scan-local.js +0 -102
- package/dist/core-runtime/readers/scan-local.test.js +0 -102
- package/dist/core-runtime/readers/scan-tarball.js +0 -121
- package/dist/core-runtime/readers/scan-tarball.test.js +0 -283
- package/dist/core-runtime/readers/scan-vault.js +0 -34
- package/dist/core-runtime/readers/scan-vault.test.js +0 -81
- package/dist/core-runtime/readers/types.js +0 -42
- package/dist/core-runtime/readers/types.test.js +0 -94
- package/dist/core-runtime/readers/viewpoint-collectors.js +0 -229
- package/dist/core-runtime/reconstruct/seed-candidate-validation.js +0 -385
- package/dist/core-runtime/review/citation-audit.test.js +0 -165
- package/dist/core-runtime/review/execution-plan-resolver.js +0 -247
- package/dist/core-runtime/review/execution-plan-resolver.test.js +0 -243
- package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +0 -246
- package/dist/core-runtime/review/execution-topology-resolver.js +0 -401
- package/dist/core-runtime/review/execution-topology-resolver.test.js +0 -315
- package/dist/core-runtime/review/inline-context-embedder.test.js +0 -154
- package/dist/core-runtime/review/legacy-mode-policy.js +0 -88
- package/dist/core-runtime/review/materializers-effort-persist.test.js +0 -79
- package/dist/core-runtime/review/ontology-path-classifier.js +0 -179
- package/dist/core-runtime/review/ontology-path-classifier.test.js +0 -216
- package/dist/core-runtime/review/packet-boundary-policy.test.js +0 -107
- package/dist/core-runtime/review/participating-lens-paths.test.js +0 -73
- package/dist/core-runtime/review/review-config-legacy-translate.js +0 -244
- package/dist/core-runtime/review/review-config-legacy-translate.test.js +0 -161
- package/dist/core-runtime/review/review-config-validator.js +0 -289
- package/dist/core-runtime/review/review-config-validator.test.js +0 -236
- package/dist/core-runtime/review/shape-pipeline-audit.test.js +0 -311
- package/dist/core-runtime/review/shape-to-topology-id.js +0 -117
- package/dist/core-runtime/review/shape-to-topology-id.test.js +0 -132
- package/dist/core-runtime/review/topology-shape-derivation.js +0 -155
- package/dist/core-runtime/review/topology-shape-derivation.test.js +0 -195
- package/dist/core-runtime/scope-runtime/constants.js +0 -12
- package/dist/core-runtime/scope-runtime/constraint-pool.js +0 -166
- package/dist/core-runtime/scope-runtime/constraint-pool.test.js +0 -674
- package/dist/core-runtime/scope-runtime/domain-validation-log.js +0 -135
- package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +0 -156
- package/dist/core-runtime/scope-runtime/eval-persistence.js +0 -65
- package/dist/core-runtime/scope-runtime/eval-persistence.test.js +0 -84
- package/dist/core-runtime/scope-runtime/event-pipeline.js +0 -64
- package/dist/core-runtime/scope-runtime/event-pipeline.test.js +0 -450
- package/dist/core-runtime/scope-runtime/event-store.js +0 -39
- package/dist/core-runtime/scope-runtime/event-store.test.js +0 -95
- package/dist/core-runtime/scope-runtime/gate-guard.js +0 -348
- package/dist/core-runtime/scope-runtime/gate-guard.test.js +0 -1047
- package/dist/core-runtime/scope-runtime/hash.js +0 -4
- package/dist/core-runtime/scope-runtime/hash.test.js +0 -33
- package/dist/core-runtime/scope-runtime/id.js +0 -4
- package/dist/core-runtime/scope-runtime/id.test.js +0 -17
- package/dist/core-runtime/scope-runtime/reducer.js +0 -297
- package/dist/core-runtime/scope-runtime/reducer.test.js +0 -759
- package/dist/core-runtime/scope-runtime/scope-manager.js +0 -161
- package/dist/core-runtime/scope-runtime/state-machine.js +0 -309
- package/dist/core-runtime/scope-runtime/state-machine.test.js +0 -704
- package/dist/core-runtime/scope-runtime/types.js +0 -116
- package/dist/core-runtime/scope-runtime/types.test.js +0 -69
- package/dist/core-runtime/translate/render-for-user.js +0 -169
- package/dist/core-runtime/translate/render-for-user.test.js +0 -122
- package/dist/providers/capability-contract.js +0 -1
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 6관점별 코드 청크 수집 함수.
|
|
3
|
-
*
|
|
4
|
-
* 각 함수는 ScanResult + OntologyQueryResult의 구조 정보에서
|
|
5
|
-
* 관점별로 관련 코드를 필터링한다. 결정론적이다.
|
|
6
|
-
*/
|
|
7
|
-
// ─── Semantics ───
|
|
8
|
-
export function collectSemantics(resolved, max) {
|
|
9
|
-
const chunks = [];
|
|
10
|
-
for (const loc of resolved) {
|
|
11
|
-
if (loc.resolution_method === "unresolved")
|
|
12
|
-
continue;
|
|
13
|
-
for (const filePath of loc.resolved_files) {
|
|
14
|
-
chunks.push({
|
|
15
|
-
file_path: filePath,
|
|
16
|
-
viewpoint: "semantics",
|
|
17
|
-
context: `온톨로지 매칭: ${loc.reference}`,
|
|
18
|
-
});
|
|
19
|
-
if (chunks.length >= max)
|
|
20
|
-
return chunks;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return chunks;
|
|
24
|
-
}
|
|
25
|
-
// ─── Dependency ───
|
|
26
|
-
export function collectDependency(resolved, depGraph, max) {
|
|
27
|
-
const resolvedPaths = new Set();
|
|
28
|
-
for (const loc of resolved) {
|
|
29
|
-
for (const fp of loc.resolved_files)
|
|
30
|
-
resolvedPaths.add(fp);
|
|
31
|
-
}
|
|
32
|
-
const chunks = [];
|
|
33
|
-
// 1-hop: resolved 파일을 import하는 파일 (caller)
|
|
34
|
-
for (const edge of depGraph) {
|
|
35
|
-
if (resolvedPaths.has(edge.to)) {
|
|
36
|
-
chunks.push({
|
|
37
|
-
file_path: edge.from,
|
|
38
|
-
viewpoint: "dependency",
|
|
39
|
-
context: `${edge.to}를 import하는 파일 (caller, hop 1)`,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
if (chunks.length >= max)
|
|
43
|
-
return chunks;
|
|
44
|
-
}
|
|
45
|
-
// 1-hop: resolved 파일이 import하는 파일 (callee)
|
|
46
|
-
for (const edge of depGraph) {
|
|
47
|
-
if (resolvedPaths.has(edge.from) && !resolvedPaths.has(edge.to)) {
|
|
48
|
-
chunks.push({
|
|
49
|
-
file_path: edge.to,
|
|
50
|
-
viewpoint: "dependency",
|
|
51
|
-
context: `${edge.from}이 import하는 파일 (callee, hop 1)`,
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
if (chunks.length >= max)
|
|
55
|
-
return chunks;
|
|
56
|
-
}
|
|
57
|
-
return chunks;
|
|
58
|
-
}
|
|
59
|
-
// ─── Logic ───
|
|
60
|
-
export function collectLogic(ontologyResult, resolved, max) {
|
|
61
|
-
const chunks = [];
|
|
62
|
-
// guard_note/preconditions가 있는 action의 source_code 파일
|
|
63
|
-
for (const action of ontologyResult.related_actions) {
|
|
64
|
-
if (!action.guard_note && (!action.preconditions || action.preconditions.length === 0))
|
|
65
|
-
continue;
|
|
66
|
-
const parts = [];
|
|
67
|
-
if (action.guard_note)
|
|
68
|
-
parts.push(`guard: ${action.guard_note}`);
|
|
69
|
-
if (action.preconditions && action.preconditions.length > 0) {
|
|
70
|
-
parts.push(`preconditions: ${action.preconditions.map((p) => p.check).join(", ")}`);
|
|
71
|
-
}
|
|
72
|
-
// action의 source_code에서 파일 경로를 resolved에서 찾기
|
|
73
|
-
const matchedFiles = resolved
|
|
74
|
-
.filter((r) => r.resolution_method === "filename" && r.reference === action.source_code)
|
|
75
|
-
.flatMap((r) => r.resolved_files);
|
|
76
|
-
for (const fp of matchedFiles.length > 0 ? matchedFiles : []) {
|
|
77
|
-
chunks.push({
|
|
78
|
-
file_path: fp,
|
|
79
|
-
viewpoint: "logic",
|
|
80
|
-
context: `⚠️ 비즈니스 규칙: ${action.display_name} (${action.id}). ${parts.join("; ")}`,
|
|
81
|
-
});
|
|
82
|
-
if (chunks.length >= max)
|
|
83
|
-
return chunks;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
// value_filters로 찾을 수 있는 코드 (값 수준 매핑 단서)
|
|
87
|
-
for (const vf of ontologyResult.value_filters) {
|
|
88
|
-
chunks.push({
|
|
89
|
-
viewpoint: "logic",
|
|
90
|
-
context: `⚠️ 값 수준 매핑: ${vf.entity}는 ${vf.column}='${vf.value}'로 식별됨. 이 값을 사용하는 코드를 확인하세요.`,
|
|
91
|
-
search_hint: `grep:${vf.value}`,
|
|
92
|
-
});
|
|
93
|
-
if (chunks.length >= max)
|
|
94
|
-
return chunks;
|
|
95
|
-
}
|
|
96
|
-
// resolved 파일 중 validation/guard 패턴이 있을 수 있는 파일
|
|
97
|
-
for (const loc of resolved) {
|
|
98
|
-
for (const fp of loc.resolved_files) {
|
|
99
|
-
if (fp.toLowerCase().includes("gateway") || fp.toLowerCase().includes("validator") || fp.toLowerCase().includes("guard")) {
|
|
100
|
-
chunks.push({
|
|
101
|
-
file_path: fp,
|
|
102
|
-
viewpoint: "logic",
|
|
103
|
-
context: `⚠️ 검증/게이트웨이 코드: ${loc.reference}. 비즈니스 규칙 조건이 포함될 가능성이 높습니다.`,
|
|
104
|
-
});
|
|
105
|
-
if (chunks.length >= max)
|
|
106
|
-
return chunks;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return chunks;
|
|
111
|
-
}
|
|
112
|
-
// ─── Structure ───
|
|
113
|
-
export function collectStructure(resolved, files, schemas, configs, max) {
|
|
114
|
-
const chunks = [];
|
|
115
|
-
const resolvedNames = new Set();
|
|
116
|
-
for (const loc of resolved) {
|
|
117
|
-
const className = loc.reference.match(/^([A-Z][A-Za-z0-9]+)/)?.[1];
|
|
118
|
-
if (className)
|
|
119
|
-
resolvedNames.add(className.toLowerCase());
|
|
120
|
-
}
|
|
121
|
-
// 테스트 파일
|
|
122
|
-
for (const f of files) {
|
|
123
|
-
if (f.category !== "test")
|
|
124
|
-
continue;
|
|
125
|
-
const pathLower = f.path.toLowerCase();
|
|
126
|
-
if ([...resolvedNames].some((name) => pathLower.includes(name))) {
|
|
127
|
-
chunks.push({
|
|
128
|
-
file_path: f.path,
|
|
129
|
-
viewpoint: "structure",
|
|
130
|
-
context: `테스트 파일: 기대 동작이 명시되어 있을 수 있습니다`,
|
|
131
|
-
});
|
|
132
|
-
if (chunks.length >= max)
|
|
133
|
-
return chunks;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
// 스키마 파일
|
|
137
|
-
for (const f of files) {
|
|
138
|
-
if (f.category !== "schema")
|
|
139
|
-
continue;
|
|
140
|
-
chunks.push({
|
|
141
|
-
file_path: f.path,
|
|
142
|
-
viewpoint: "structure",
|
|
143
|
-
context: `스키마 파일: DB 구조와 제약조건 확인`,
|
|
144
|
-
});
|
|
145
|
-
if (chunks.length >= max)
|
|
146
|
-
return chunks;
|
|
147
|
-
}
|
|
148
|
-
// 설정/환경변수 파일
|
|
149
|
-
for (const config of configs) {
|
|
150
|
-
chunks.push({
|
|
151
|
-
file_path: config.file,
|
|
152
|
-
viewpoint: "structure",
|
|
153
|
-
context: `설정: ${config.key} (환경변수/설정 파일)`,
|
|
154
|
-
});
|
|
155
|
-
if (chunks.length >= max)
|
|
156
|
-
return chunks;
|
|
157
|
-
}
|
|
158
|
-
return chunks;
|
|
159
|
-
}
|
|
160
|
-
// ─── Pragmatics ───
|
|
161
|
-
export function collectPragmatics(matchedEntities, apiPatterns, resolved, max) {
|
|
162
|
-
const chunks = [];
|
|
163
|
-
const resolvedPaths = new Set();
|
|
164
|
-
for (const loc of resolved) {
|
|
165
|
-
for (const fp of loc.resolved_files)
|
|
166
|
-
resolvedPaths.add(fp);
|
|
167
|
-
}
|
|
168
|
-
// resolved 파일에 위치한 API 엔드포인트
|
|
169
|
-
for (const api of apiPatterns) {
|
|
170
|
-
if (resolvedPaths.has(api.file) || [...resolvedPaths].some((p) => api.file.includes(p.split("/").pop().replace(/\.\w+$/, "")))) {
|
|
171
|
-
chunks.push({
|
|
172
|
-
file_path: api.file,
|
|
173
|
-
viewpoint: "pragmatics",
|
|
174
|
-
context: `${api.method} ${api.path} — 사용자 접점 API 엔드포인트 (${api.line}행)`,
|
|
175
|
-
});
|
|
176
|
-
if (chunks.length >= max)
|
|
177
|
-
return chunks;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// entity 이름이 경로에 포함된 API
|
|
181
|
-
const entityLower = matchedEntities.map((e) => e.toLowerCase());
|
|
182
|
-
for (const api of apiPatterns) {
|
|
183
|
-
if (entityLower.some((e) => api.path.toLowerCase().includes(e))) {
|
|
184
|
-
if (!chunks.some((c) => c.file_path === api.file && c.context.includes(api.path))) {
|
|
185
|
-
chunks.push({
|
|
186
|
-
file_path: api.file,
|
|
187
|
-
viewpoint: "pragmatics",
|
|
188
|
-
context: `${api.method} ${api.path} — 엔티티명이 경로에 포함된 API`,
|
|
189
|
-
});
|
|
190
|
-
if (chunks.length >= max)
|
|
191
|
-
return chunks;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return chunks;
|
|
196
|
-
}
|
|
197
|
-
// ─── Evolution ───
|
|
198
|
-
export function collectEvolution(resolved, files, schemas, max) {
|
|
199
|
-
const chunks = [];
|
|
200
|
-
// DB 접두사 세대 혼재 탐지
|
|
201
|
-
const legacyTables = schemas.filter((s) => s.table.startsWith("GT_") || s.table.startsWith("gt_"));
|
|
202
|
-
const newTables = schemas.filter((s) => s.table.startsWith("le_") || s.table.startsWith("LE_"));
|
|
203
|
-
if (legacyTables.length > 0 && newTables.length > 0) {
|
|
204
|
-
for (const lt of legacyTables.slice(0, 3)) {
|
|
205
|
-
chunks.push({
|
|
206
|
-
file_path: lt.file,
|
|
207
|
-
viewpoint: "evolution",
|
|
208
|
-
context: `세대 혼재: ${lt.table} (GT_ 레거시 접두사). 신규 le_ 테이블과 공존`,
|
|
209
|
-
});
|
|
210
|
-
if (chunks.length >= max)
|
|
211
|
-
return chunks;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// resolved 파일 중 v2/Impl 등 버전 패턴
|
|
215
|
-
for (const loc of resolved) {
|
|
216
|
-
for (const fp of loc.resolved_files) {
|
|
217
|
-
if (/[Vv]2|[Vv]3|Impl2|Legacy|Deprecated/i.test(fp)) {
|
|
218
|
-
chunks.push({
|
|
219
|
-
file_path: fp,
|
|
220
|
-
viewpoint: "evolution",
|
|
221
|
-
context: `버전 패턴: ${fp.split("/").pop()} — 이전 버전과의 호환성 확인 필요`,
|
|
222
|
-
});
|
|
223
|
-
if (chunks.length >= max)
|
|
224
|
-
return chunks;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
return chunks;
|
|
229
|
-
}
|
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs/promises";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
|
|
4
|
-
import { isTargetMaterialKind, } from "../target-material-kind.js";
|
|
5
|
-
function isoNow() {
|
|
6
|
-
return new Date().toISOString();
|
|
7
|
-
}
|
|
8
|
-
function normalizeRef(ref) {
|
|
9
|
-
return path.resolve(ref);
|
|
10
|
-
}
|
|
11
|
-
function isRecord(value) {
|
|
12
|
-
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
13
|
-
}
|
|
14
|
-
function violation(args) {
|
|
15
|
-
return {
|
|
16
|
-
code: args.code,
|
|
17
|
-
message: args.message,
|
|
18
|
-
claim_id: args.claimId ?? null,
|
|
19
|
-
observation_id: args.observationId ?? null,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function malformedShape(message) {
|
|
23
|
-
return violation({
|
|
24
|
-
code: "schema_shape_invalid",
|
|
25
|
-
message,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
function readEvidenceRef(value, claimId) {
|
|
29
|
-
const violations = [];
|
|
30
|
-
if (!isRecord(value)) {
|
|
31
|
-
return {
|
|
32
|
-
evidenceRef: null,
|
|
33
|
-
violations: [
|
|
34
|
-
violation({
|
|
35
|
-
code: "evidence_ref_shape_invalid",
|
|
36
|
-
message: "evidence_ref must be an object",
|
|
37
|
-
claimId,
|
|
38
|
-
}),
|
|
39
|
-
],
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
const observationId = value.observation_id;
|
|
43
|
-
const targetMaterialKind = value.target_material_kind;
|
|
44
|
-
const sourceRef = value.source_ref;
|
|
45
|
-
const location = value.location;
|
|
46
|
-
if (typeof observationId !== "string" || observationId.trim().length === 0) {
|
|
47
|
-
violations.push(violation({
|
|
48
|
-
code: "evidence_ref_shape_invalid",
|
|
49
|
-
message: "evidence_ref.observation_id is required",
|
|
50
|
-
claimId,
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
if (typeof targetMaterialKind !== "string" ||
|
|
54
|
-
!isTargetMaterialKind(targetMaterialKind)) {
|
|
55
|
-
violations.push(violation({
|
|
56
|
-
code: "evidence_ref_shape_invalid",
|
|
57
|
-
message: "evidence_ref.target_material_kind must be a known target_material_kind",
|
|
58
|
-
claimId,
|
|
59
|
-
observationId: typeof observationId === "string" ? observationId : null,
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
if (typeof sourceRef !== "string" || sourceRef.trim().length === 0) {
|
|
63
|
-
violations.push(violation({
|
|
64
|
-
code: "evidence_ref_shape_invalid",
|
|
65
|
-
message: "evidence_ref.source_ref is required",
|
|
66
|
-
claimId,
|
|
67
|
-
observationId: typeof observationId === "string" ? observationId : null,
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
if (typeof location !== "string" || location.trim().length === 0) {
|
|
71
|
-
violations.push(violation({
|
|
72
|
-
code: "evidence_ref_shape_invalid",
|
|
73
|
-
message: "evidence_ref.location is required",
|
|
74
|
-
claimId,
|
|
75
|
-
observationId: typeof observationId === "string" ? observationId : null,
|
|
76
|
-
}));
|
|
77
|
-
}
|
|
78
|
-
if (violations.length > 0) {
|
|
79
|
-
return {
|
|
80
|
-
evidenceRef: null,
|
|
81
|
-
violations,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
evidenceRef: {
|
|
86
|
-
observation_id: observationId,
|
|
87
|
-
target_material_kind: targetMaterialKind,
|
|
88
|
-
source_ref: sourceRef,
|
|
89
|
-
location: location,
|
|
90
|
-
},
|
|
91
|
-
violations,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
function isGenericClaimName(name, groupName) {
|
|
95
|
-
const normalized = name.trim().toLowerCase().replace(/[_\s-]+/g, "_");
|
|
96
|
-
const singularGroup = groupName.endsWith("ies")
|
|
97
|
-
? groupName.slice(0, -3) + "y"
|
|
98
|
-
: groupName.endsWith("s")
|
|
99
|
-
? groupName.slice(0, -1)
|
|
100
|
-
: groupName;
|
|
101
|
-
const normalizedGroup = singularGroup.toLowerCase().replace(/[_\s-]+/g, "_");
|
|
102
|
-
return new RegExp(`^${normalizedGroup}_?\\d+$`).test(normalized);
|
|
103
|
-
}
|
|
104
|
-
function readClaim(value, groupName) {
|
|
105
|
-
const violations = [];
|
|
106
|
-
if (!isRecord(value)) {
|
|
107
|
-
return {
|
|
108
|
-
claim: null,
|
|
109
|
-
violations: [malformedShape(`${groupName} claim must be an object`)],
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
const rawClaimId = value.claim_id;
|
|
113
|
-
const claimId = typeof rawClaimId === "string" && rawClaimId.trim().length > 0
|
|
114
|
-
? rawClaimId
|
|
115
|
-
: null;
|
|
116
|
-
if (!claimId) {
|
|
117
|
-
violations.push(violation({
|
|
118
|
-
code: "claim_id_missing",
|
|
119
|
-
message: `${groupName} claim_id is required`,
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
const rawName = value.name;
|
|
123
|
-
const name = typeof rawName === "string" && rawName.trim().length > 0
|
|
124
|
-
? rawName.trim()
|
|
125
|
-
: null;
|
|
126
|
-
if (!name) {
|
|
127
|
-
violations.push(violation({
|
|
128
|
-
code: "claim_name_missing",
|
|
129
|
-
message: `${groupName} name is required`,
|
|
130
|
-
claimId,
|
|
131
|
-
}));
|
|
132
|
-
}
|
|
133
|
-
else if (isGenericClaimName(name, groupName)) {
|
|
134
|
-
violations.push(violation({
|
|
135
|
-
code: "claim_name_generic",
|
|
136
|
-
message: `${groupName} name must be a meaningful user-facing label, not a numbered placeholder`,
|
|
137
|
-
claimId,
|
|
138
|
-
}));
|
|
139
|
-
}
|
|
140
|
-
const rawStatement = value.statement;
|
|
141
|
-
const statement = typeof rawStatement === "string" ? rawStatement : "";
|
|
142
|
-
const rawEvidenceRefs = value.evidence_refs;
|
|
143
|
-
const evidenceRefs = [];
|
|
144
|
-
if (Array.isArray(rawEvidenceRefs)) {
|
|
145
|
-
for (const evidenceRefValue of rawEvidenceRefs) {
|
|
146
|
-
const parsed = readEvidenceRef(evidenceRefValue, claimId);
|
|
147
|
-
violations.push(...parsed.violations);
|
|
148
|
-
if (parsed.evidenceRef) {
|
|
149
|
-
evidenceRefs.push(parsed.evidenceRef);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return {
|
|
154
|
-
claim: {
|
|
155
|
-
claim_id: claimId ?? `${groupName}:missing-claim-id`,
|
|
156
|
-
name: name ?? "",
|
|
157
|
-
statement,
|
|
158
|
-
evidence_refs: evidenceRefs,
|
|
159
|
-
},
|
|
160
|
-
violations,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
function collectClaims(seedCandidate) {
|
|
164
|
-
const claims = [];
|
|
165
|
-
const violations = [];
|
|
166
|
-
const raw = seedCandidate;
|
|
167
|
-
if (!isRecord(raw)) {
|
|
168
|
-
return {
|
|
169
|
-
claims,
|
|
170
|
-
violations: [malformedShape("SeedCandidateDirective must be an object")],
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
const purpose = readClaim(raw.purpose, "purpose");
|
|
174
|
-
violations.push(...purpose.violations);
|
|
175
|
-
if (purpose.claim)
|
|
176
|
-
claims.push(purpose.claim);
|
|
177
|
-
const arrayGroups = [
|
|
178
|
-
"non_goals",
|
|
179
|
-
"entities",
|
|
180
|
-
"relations",
|
|
181
|
-
"actions",
|
|
182
|
-
"properties",
|
|
183
|
-
"rules",
|
|
184
|
-
];
|
|
185
|
-
for (const groupName of arrayGroups) {
|
|
186
|
-
const value = raw[groupName];
|
|
187
|
-
if (!Array.isArray(value)) {
|
|
188
|
-
violations.push(malformedShape(`${groupName} must be an array`));
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
for (const claimValue of value) {
|
|
192
|
-
const parsed = readClaim(claimValue, groupName);
|
|
193
|
-
violations.push(...parsed.violations);
|
|
194
|
-
if (parsed.claim)
|
|
195
|
-
claims.push(parsed.claim);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return { claims, violations };
|
|
199
|
-
}
|
|
200
|
-
function validateEvidenceRef(args) {
|
|
201
|
-
const violations = [];
|
|
202
|
-
const { claim, evidenceRef, observation, selectedObservationIds } = args;
|
|
203
|
-
if (!observation) {
|
|
204
|
-
violations.push(violation({
|
|
205
|
-
code: "unknown_observation_ref",
|
|
206
|
-
message: `evidence observation does not exist: ${evidenceRef.observation_id}`,
|
|
207
|
-
claimId: claim.claim_id,
|
|
208
|
-
observationId: evidenceRef.observation_id,
|
|
209
|
-
}));
|
|
210
|
-
return violations;
|
|
211
|
-
}
|
|
212
|
-
if (selectedObservationIds &&
|
|
213
|
-
!selectedObservationIds.has(evidenceRef.observation_id)) {
|
|
214
|
-
violations.push(violation({
|
|
215
|
-
code: "unselected_observation_ref",
|
|
216
|
-
message: `evidence observation was not selected by SourceObservationDirective: ${evidenceRef.observation_id}`,
|
|
217
|
-
claimId: claim.claim_id,
|
|
218
|
-
observationId: evidenceRef.observation_id,
|
|
219
|
-
}));
|
|
220
|
-
}
|
|
221
|
-
if (evidenceRef.target_material_kind !== observation.target_material_kind) {
|
|
222
|
-
violations.push(violation({
|
|
223
|
-
code: "material_kind_mismatch",
|
|
224
|
-
message: `evidence material kind ${evidenceRef.target_material_kind} does not match observation material kind ${observation.target_material_kind}`,
|
|
225
|
-
claimId: claim.claim_id,
|
|
226
|
-
observationId: evidenceRef.observation_id,
|
|
227
|
-
}));
|
|
228
|
-
}
|
|
229
|
-
if (normalizeRef(evidenceRef.source_ref) !== normalizeRef(observation.source_ref)) {
|
|
230
|
-
violations.push(violation({
|
|
231
|
-
code: "source_ref_mismatch",
|
|
232
|
-
message: "evidence source_ref does not match observation source_ref",
|
|
233
|
-
claimId: claim.claim_id,
|
|
234
|
-
observationId: evidenceRef.observation_id,
|
|
235
|
-
}));
|
|
236
|
-
}
|
|
237
|
-
if (evidenceRef.location !== observation.location) {
|
|
238
|
-
violations.push(violation({
|
|
239
|
-
code: "location_mismatch",
|
|
240
|
-
message: "evidence location does not match observation location",
|
|
241
|
-
claimId: claim.claim_id,
|
|
242
|
-
observationId: evidenceRef.observation_id,
|
|
243
|
-
}));
|
|
244
|
-
}
|
|
245
|
-
return violations;
|
|
246
|
-
}
|
|
247
|
-
export function validateSeedCandidate(params) {
|
|
248
|
-
const violations = [];
|
|
249
|
-
const { seedCandidate, sourceObservations, sourceObservationDirective, sourceObservationDirectiveValidation, } = params;
|
|
250
|
-
const seedCandidateSessionId = typeof seedCandidate.session_id === "string"
|
|
251
|
-
? seedCandidate.session_id
|
|
252
|
-
: "";
|
|
253
|
-
if (seedCandidateSessionId.length === 0) {
|
|
254
|
-
violations.push(malformedShape("SeedCandidateDirective.session_id is required"));
|
|
255
|
-
}
|
|
256
|
-
if (seedCandidateSessionId !== sourceObservations.session_id) {
|
|
257
|
-
violations.push(violation({
|
|
258
|
-
code: "session_id_mismatch",
|
|
259
|
-
message: `seed candidate session_id ${seedCandidateSessionId} does not match source observations session_id ${sourceObservations.session_id}`,
|
|
260
|
-
}));
|
|
261
|
-
}
|
|
262
|
-
if (sourceObservationDirective &&
|
|
263
|
-
seedCandidateSessionId !== sourceObservationDirective.session_id) {
|
|
264
|
-
violations.push(violation({
|
|
265
|
-
code: "session_id_mismatch",
|
|
266
|
-
message: `seed candidate session_id ${seedCandidateSessionId} does not match source observation directive session_id ${sourceObservationDirective.session_id}`,
|
|
267
|
-
}));
|
|
268
|
-
}
|
|
269
|
-
if (sourceObservationDirectiveValidation &&
|
|
270
|
-
seedCandidateSessionId !== sourceObservationDirectiveValidation.session_id) {
|
|
271
|
-
violations.push(violation({
|
|
272
|
-
code: "session_id_mismatch",
|
|
273
|
-
message: `seed candidate session_id ${seedCandidateSessionId} does not match source observation directive validation session_id ${sourceObservationDirectiveValidation.session_id}`,
|
|
274
|
-
}));
|
|
275
|
-
}
|
|
276
|
-
if (sourceObservationDirectiveValidation &&
|
|
277
|
-
sourceObservationDirectiveValidation.validation_status !== "valid") {
|
|
278
|
-
violations.push(violation({
|
|
279
|
-
code: "prior_observation_directive_invalid",
|
|
280
|
-
message: "SourceObservationDirective validation must be valid before SeedCandidate validation",
|
|
281
|
-
}));
|
|
282
|
-
}
|
|
283
|
-
const observationsById = new Map(sourceObservations.observations.map((observation) => [
|
|
284
|
-
observation.observation_id,
|
|
285
|
-
observation,
|
|
286
|
-
]));
|
|
287
|
-
let selectedObservationIds = null;
|
|
288
|
-
if (sourceObservationDirective) {
|
|
289
|
-
const selectedObservations = sourceObservationDirective.selected_observations;
|
|
290
|
-
if (!Array.isArray(selectedObservations)) {
|
|
291
|
-
violations.push(malformedShape("SourceObservationDirective.selected_observations must be an array when supplied"));
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
selectedObservationIds = new Set(selectedObservations
|
|
295
|
-
.filter((selection) => isRecord(selection) && typeof selection.observation_id === "string")
|
|
296
|
-
.map((selection) => selection.observation_id));
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
const seenClaimIds = new Set();
|
|
300
|
-
const collectedClaims = collectClaims(seedCandidate);
|
|
301
|
-
violations.push(...collectedClaims.violations);
|
|
302
|
-
const claims = collectedClaims.claims;
|
|
303
|
-
let evidenceRefCount = 0;
|
|
304
|
-
for (const claim of claims) {
|
|
305
|
-
if (seenClaimIds.has(claim.claim_id)) {
|
|
306
|
-
violations.push(violation({
|
|
307
|
-
code: "duplicate_claim_id",
|
|
308
|
-
message: `duplicate semantic claim id: ${claim.claim_id}`,
|
|
309
|
-
claimId: claim.claim_id,
|
|
310
|
-
}));
|
|
311
|
-
}
|
|
312
|
-
seenClaimIds.add(claim.claim_id);
|
|
313
|
-
if (claim.statement.trim().length === 0) {
|
|
314
|
-
violations.push(violation({
|
|
315
|
-
code: "claim_statement_missing",
|
|
316
|
-
message: "claim statement is required",
|
|
317
|
-
claimId: claim.claim_id,
|
|
318
|
-
}));
|
|
319
|
-
}
|
|
320
|
-
if (claim.evidence_refs.length === 0) {
|
|
321
|
-
violations.push(violation({
|
|
322
|
-
code: "claim_evidence_missing",
|
|
323
|
-
message: "every semantic claim must cite at least one evidence ref",
|
|
324
|
-
claimId: claim.claim_id,
|
|
325
|
-
}));
|
|
326
|
-
continue;
|
|
327
|
-
}
|
|
328
|
-
for (const evidenceRef of claim.evidence_refs) {
|
|
329
|
-
evidenceRefCount += 1;
|
|
330
|
-
violations.push(...validateEvidenceRef({
|
|
331
|
-
claim,
|
|
332
|
-
evidenceRef,
|
|
333
|
-
observation: observationsById.get(evidenceRef.observation_id),
|
|
334
|
-
selectedObservationIds,
|
|
335
|
-
}));
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
return {
|
|
339
|
-
schema_version: "1",
|
|
340
|
-
session_id: seedCandidateSessionId,
|
|
341
|
-
created_at: isoNow(),
|
|
342
|
-
seed_candidate_ref: params.seedCandidateRef ?? null,
|
|
343
|
-
source_observations_ref: params.sourceObservationsRef ?? null,
|
|
344
|
-
source_observation_directive_ref: params.sourceObservationDirectiveRef ?? null,
|
|
345
|
-
source_observation_directive_validation_ref: params.sourceObservationDirectiveValidationRef ?? null,
|
|
346
|
-
validation_status: violations.length === 0 ? "valid" : "invalid",
|
|
347
|
-
semantic_claim_count: claims.length,
|
|
348
|
-
evidence_ref_count: evidenceRefCount,
|
|
349
|
-
validation_results: violations.length === 0
|
|
350
|
-
? ["seed_candidate_evidence_valid"]
|
|
351
|
-
: ["seed_candidate_evidence_invalid"],
|
|
352
|
-
violations,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
export async function writeSeedCandidateValidationArtifact(args) {
|
|
356
|
-
const [seedCandidateText, sourceObservationsText] = await Promise.all([
|
|
357
|
-
fs.readFile(args.seedCandidatePath, "utf8"),
|
|
358
|
-
fs.readFile(args.sourceObservationsPath, "utf8"),
|
|
359
|
-
]);
|
|
360
|
-
const seedCandidate = parseYaml(seedCandidateText);
|
|
361
|
-
const sourceObservations = parseYaml(sourceObservationsText);
|
|
362
|
-
const sourceObservationDirective = args.sourceObservationDirectivePath
|
|
363
|
-
? parseYaml(await fs.readFile(args.sourceObservationDirectivePath, "utf8"))
|
|
364
|
-
: null;
|
|
365
|
-
const sourceObservationDirectiveValidation = args.sourceObservationDirectiveValidationPath
|
|
366
|
-
? parseYaml(await fs.readFile(args.sourceObservationDirectiveValidationPath, "utf8"))
|
|
367
|
-
: null;
|
|
368
|
-
const validation = validateSeedCandidate({
|
|
369
|
-
seedCandidate,
|
|
370
|
-
sourceObservations,
|
|
371
|
-
sourceObservationDirective,
|
|
372
|
-
sourceObservationDirectiveValidation,
|
|
373
|
-
seedCandidateRef: path.resolve(args.seedCandidatePath),
|
|
374
|
-
sourceObservationsRef: path.resolve(args.sourceObservationsPath),
|
|
375
|
-
sourceObservationDirectiveRef: args.sourceObservationDirectivePath
|
|
376
|
-
? path.resolve(args.sourceObservationDirectivePath)
|
|
377
|
-
: null,
|
|
378
|
-
sourceObservationDirectiveValidationRef: args.sourceObservationDirectiveValidationPath
|
|
379
|
-
? path.resolve(args.sourceObservationDirectiveValidationPath)
|
|
380
|
-
: null,
|
|
381
|
-
});
|
|
382
|
-
await fs.mkdir(path.dirname(args.outputPath), { recursive: true });
|
|
383
|
-
await fs.writeFile(args.outputPath, stringifyYaml(validation), "utf8");
|
|
384
|
-
return validation;
|
|
385
|
-
}
|