onto-mcp 0.3.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/.onto/authority/core-lens-registry.yaml +134 -0
- package/.onto/authority/core-lexicon.yaml +1562 -0
- package/.onto/authority/diagnostic-codes.yaml +94 -0
- package/.onto/domains/accounting/competency_qs.md +384 -0
- package/.onto/domains/accounting/concepts.md +186 -0
- package/.onto/domains/accounting/conciseness_rules.md +160 -0
- package/.onto/domains/accounting/dependency_rules.md +239 -0
- package/.onto/domains/accounting/domain_scope.md +213 -0
- package/.onto/domains/accounting/extension_cases.md +416 -0
- package/.onto/domains/accounting/logic_rules.md +226 -0
- package/.onto/domains/accounting/structure_spec.md +298 -0
- package/.onto/domains/accounting-kr/competency_qs.md +562 -0
- package/.onto/domains/accounting-kr/concepts.md +187 -0
- package/.onto/domains/accounting-kr/conciseness_rules.md +125 -0
- package/.onto/domains/accounting-kr/dependency_rules.md +93 -0
- package/.onto/domains/accounting-kr/domain_scope.md +140 -0
- package/.onto/domains/accounting-kr/extension_cases.md +343 -0
- package/.onto/domains/accounting-kr/logic_rules.md +160 -0
- package/.onto/domains/accounting-kr/structure_spec.md +85 -0
- package/.onto/domains/business/competency_qs.md +263 -0
- package/.onto/domains/business/concepts.md +200 -0
- package/.onto/domains/business/conciseness_rules.md +135 -0
- package/.onto/domains/business/dependency_rules.md +113 -0
- package/.onto/domains/business/domain_scope.md +240 -0
- package/.onto/domains/business/extension_cases.md +249 -0
- package/.onto/domains/business/logic_rules.md +134 -0
- package/.onto/domains/business/structure_spec.md +114 -0
- package/.onto/domains/finance/competency_qs.md +362 -0
- package/.onto/domains/finance/concepts.md +194 -0
- package/.onto/domains/finance/conciseness_rules.md +155 -0
- package/.onto/domains/finance/dependency_rules.md +171 -0
- package/.onto/domains/finance/domain_scope.md +215 -0
- package/.onto/domains/finance/extension_cases.md +350 -0
- package/.onto/domains/finance/logic_rules.md +191 -0
- package/.onto/domains/finance/structure_spec.md +182 -0
- package/.onto/domains/llm-native-development/competency_qs.md +430 -0
- package/.onto/domains/llm-native-development/concepts.md +242 -0
- package/.onto/domains/llm-native-development/conciseness_rules.md +163 -0
- package/.onto/domains/llm-native-development/dependency_rules.md +216 -0
- package/.onto/domains/llm-native-development/domain_scope.md +197 -0
- package/.onto/domains/llm-native-development/extension_cases.md +474 -0
- package/.onto/domains/llm-native-development/logic_rules.md +123 -0
- package/.onto/domains/llm-native-development/prompt_interface.md +49 -0
- package/.onto/domains/llm-native-development/structure_spec.md +245 -0
- package/.onto/domains/market-intelligence/competency_qs.md +274 -0
- package/.onto/domains/market-intelligence/concepts.md +233 -0
- package/.onto/domains/market-intelligence/conciseness_rules.md +165 -0
- package/.onto/domains/market-intelligence/dependency_rules.md +197 -0
- package/.onto/domains/market-intelligence/domain_scope.md +231 -0
- package/.onto/domains/market-intelligence/extension_cases.md +425 -0
- package/.onto/domains/market-intelligence/logic_rules.md +247 -0
- package/.onto/domains/market-intelligence/structure_spec.md +209 -0
- package/.onto/domains/ontology/competency_qs.md +394 -0
- package/.onto/domains/ontology/concepts.md +172 -0
- package/.onto/domains/ontology/conciseness_rules.md +134 -0
- package/.onto/domains/ontology/dependency_rules.md +125 -0
- package/.onto/domains/ontology/domain_scope.md +114 -0
- package/.onto/domains/ontology/extension_cases.md +501 -0
- package/.onto/domains/ontology/logic_rules.md +114 -0
- package/.onto/domains/ontology/problem_framing_profile.md +67 -0
- package/.onto/domains/ontology/structure_spec.md +115 -0
- package/.onto/domains/palantir-foundry/RESEARCH_NOTES.md +911 -0
- package/.onto/domains/palantir-foundry/competency_qs.md +191 -0
- package/.onto/domains/palantir-foundry/competitive_comparison.md +329 -0
- package/.onto/domains/palantir-foundry/concepts.md +197 -0
- package/.onto/domains/palantir-foundry/conciseness_rules.md +245 -0
- package/.onto/domains/palantir-foundry/dependency_rules.md +135 -0
- package/.onto/domains/palantir-foundry/domain_scope.md +395 -0
- package/.onto/domains/palantir-foundry/extension_cases.md +210 -0
- package/.onto/domains/palantir-foundry/logic_rules.md +172 -0
- package/.onto/domains/palantir-foundry/structure_spec.md +291 -0
- package/.onto/domains/software-engineering/competency_qs.md +538 -0
- package/.onto/domains/software-engineering/concepts.md +238 -0
- package/.onto/domains/software-engineering/conciseness_rules.md +167 -0
- package/.onto/domains/software-engineering/dependency_rules.md +216 -0
- package/.onto/domains/software-engineering/domain_scope.md +183 -0
- package/.onto/domains/software-engineering/extension_cases.md +551 -0
- package/.onto/domains/software-engineering/logic_rules.md +240 -0
- package/.onto/domains/software-engineering/problem_framing_profile.md +68 -0
- package/.onto/domains/software-engineering/structure_spec.md +185 -0
- package/.onto/domains/ui-design/competency_qs.md +567 -0
- package/.onto/domains/ui-design/concepts.md +194 -0
- package/.onto/domains/ui-design/conciseness_rules.md +190 -0
- package/.onto/domains/ui-design/dependency_rules.md +323 -0
- package/.onto/domains/ui-design/domain_scope.md +340 -0
- package/.onto/domains/ui-design/extension_cases.md +563 -0
- package/.onto/domains/ui-design/logic_rules.md +349 -0
- package/.onto/domains/ui-design/structure_spec.md +252 -0
- package/.onto/domains/visual-design/competency_qs.md +472 -0
- package/.onto/domains/visual-design/concepts.md +147 -0
- package/.onto/domains/visual-design/conciseness_rules.md +186 -0
- package/.onto/domains/visual-design/dependency_rules.md +282 -0
- package/.onto/domains/visual-design/domain_scope.md +290 -0
- package/.onto/domains/visual-design/extension_cases.md +480 -0
- package/.onto/domains/visual-design/logic_rules.md +232 -0
- package/.onto/domains/visual-design/structure_spec.md +213 -0
- package/.onto/principles/llm-native-development-guideline.md +401 -0
- package/.onto/principles/llm-runtime-interface-principles.md +665 -0
- package/.onto/principles/non-specialist-communication-guideline.md +74 -0
- package/.onto/principles/ontology-as-code-guideline.md +243 -0
- package/.onto/principles/ontology-as-code-naming-charter.md +130 -0
- package/.onto/principles/product-locality-principle.md +129 -0
- package/.onto/principles/productization-charter.md +569 -0
- package/.onto/processes/evolve/material-kind-adapter-contract.md +113 -0
- package/.onto/processes/reconstruct/reconstruct-boundary-contract.md +366 -0
- package/.onto/processes/reconstruct/source-profile-contract.md +107 -0
- package/.onto/processes/reconstruct/source-profiles/code.md +72 -0
- package/.onto/processes/reconstruct/source-profiles/database.md +74 -0
- package/.onto/processes/reconstruct/source-profiles/document.md +71 -0
- package/.onto/processes/reconstruct/source-profiles/spreadsheet.md +79 -0
- package/.onto/processes/review/binding-contract.md +270 -0
- package/.onto/processes/review/execution-preparation-artifacts.md +281 -0
- package/.onto/processes/review/interpretation-contract.md +245 -0
- package/.onto/processes/review/issue-stance-deliberation-contract.md +761 -0
- package/.onto/processes/review/lens-prompt-contract.md +402 -0
- package/.onto/processes/review/lens-registry.md +127 -0
- package/.onto/processes/review/pre-dispatch-contracts.md +428 -0
- package/.onto/processes/review/productized-live-path.md +398 -0
- package/.onto/processes/review/prompt-execution-runner-contract.md +187 -0
- package/.onto/processes/review/record-contract.md +427 -0
- package/.onto/processes/review/record-field-mapping.md +337 -0
- package/.onto/processes/review/review-context-manifest-contract.md +356 -0
- package/.onto/processes/review/review-execution-ux-contract.md +809 -0
- package/.onto/processes/review/review-target-profile-contract.md +259 -0
- package/.onto/processes/review/shared-phenomenon-contract.md +129 -0
- package/.onto/processes/review/synthesize-prompt-contract.md +343 -0
- package/.onto/processes/shared/target-material-kind-contract.md +198 -0
- package/.onto/roles/axiology.md +81 -0
- package/.onto/roles/conciseness.md +36 -0
- package/.onto/roles/coverage.md +34 -0
- package/.onto/roles/dependency.md +37 -0
- package/.onto/roles/evolution.md +35 -0
- package/.onto/roles/logic.md +104 -0
- package/.onto/roles/pragmatics.md +32 -0
- package/.onto/roles/semantics.md +36 -0
- package/.onto/roles/structure.md +33 -0
- package/.onto/roles/synthesize.md +92 -0
- package/AGENTS.md +240 -0
- package/CLAUDE.md +39 -0
- package/README.md +287 -0
- package/bin/onto +92 -0
- package/dist/cli.js +101 -0
- package/dist/core-api/reconstruct-api.js +222 -0
- package/dist/core-api/review-api.js +1271 -0
- package/dist/core-runtime/cli/assemble-review-record.js +431 -0
- package/dist/core-runtime/cli/bootstrap-review-binding.js +186 -0
- package/dist/core-runtime/cli/codex-nested-dispatch.js +226 -0
- package/dist/core-runtime/cli/codex-nested-dispatch.test.js +390 -0
- package/dist/core-runtime/cli/codex-nested-teamlead-executor.js +464 -0
- package/dist/core-runtime/cli/codex-nested-teamlead-executor.test.js +335 -0
- package/dist/core-runtime/cli/codex-review-unit-executor.js +228 -0
- package/dist/core-runtime/cli/complete-review-session.js +64 -0
- package/dist/core-runtime/cli/complexity-assessment.js +153 -0
- package/dist/core-runtime/cli/coordinator-helpers.js +583 -0
- package/dist/core-runtime/cli/coordinator-state-machine-deliberation.test.js +167 -0
- package/dist/core-runtime/cli/coordinator-state-machine.js +794 -0
- package/dist/core-runtime/cli/e2e-codex-multi-agent-fixes.test.js +615 -0
- package/dist/core-runtime/cli/e2e-start-review-session.test.js +312 -0
- package/dist/core-runtime/cli/health.js +44 -0
- package/dist/core-runtime/cli/inline-http-review-unit-executor.js +656 -0
- package/dist/core-runtime/cli/inline-http-review-unit-executor.test.js +567 -0
- package/dist/core-runtime/cli/materialize-review-execution-preparation.js +104 -0
- package/dist/core-runtime/cli/materialize-review-prompt-packets.js +952 -0
- package/dist/core-runtime/cli/migrate-session-roots.js +118 -0
- package/dist/core-runtime/cli/mock-review-unit-executor.js +285 -0
- package/dist/core-runtime/cli/onto-tools.js +369 -0
- package/dist/core-runtime/cli/prepare-review-session.js +272 -0
- package/dist/core-runtime/cli/render-review-final-output.js +350 -0
- package/dist/core-runtime/cli/repo-layout-migration-replace.smoke.test.js +106 -0
- package/dist/core-runtime/cli/review-invoke-auto-resolution.test.js +268 -0
- package/dist/core-runtime/cli/review-invoke-coordinator-topology.test.js +136 -0
- package/dist/core-runtime/cli/review-invoke-resolver-caching.test.js +201 -0
- package/dist/core-runtime/cli/review-invoke-topology-dispatch.test.js +192 -0
- package/dist/core-runtime/cli/review-invoke.js +2030 -0
- package/dist/core-runtime/cli/run-review-prompt-execution.js +2152 -0
- package/dist/core-runtime/cli/session-root-guard.js +168 -0
- package/dist/core-runtime/cli/spawn-watcher.js +173 -0
- package/dist/core-runtime/cli/spawn-watcher.test.js +457 -0
- package/dist/core-runtime/cli/start-review-session.js +68 -0
- package/dist/core-runtime/cli/strip-wrapping-code-fence.js +56 -0
- package/dist/core-runtime/cli/strip-wrapping-code-fence.test.js +79 -0
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.js +412 -0
- package/dist/core-runtime/cli/teamcreate-lens-deliberation-executor.test.js +351 -0
- package/dist/core-runtime/cli/topology-executor-mapping.js +139 -0
- package/dist/core-runtime/cli/topology-executor-mapping.test.js +173 -0
- package/dist/core-runtime/cli/write-review-interpretation.js +81 -0
- package/dist/core-runtime/config/onto-config-cli.js +278 -0
- package/dist/core-runtime/config/onto-config-key-path.js +288 -0
- package/dist/core-runtime/config/onto-config-key-path.test.js +195 -0
- package/dist/core-runtime/config/onto-config-preview.js +108 -0
- package/dist/core-runtime/config/onto-config-preview.test.js +132 -0
- package/dist/core-runtime/discovery/config-chain.js +118 -0
- package/dist/core-runtime/discovery/config-chain.test.js +103 -0
- package/dist/core-runtime/discovery/config-profile.js +199 -0
- package/dist/core-runtime/discovery/config-profile.test.js +233 -0
- package/dist/core-runtime/discovery/host-detection.js +33 -0
- package/dist/core-runtime/discovery/host-detection.test.js +186 -0
- package/dist/core-runtime/discovery/installation-paths.js +21 -0
- package/dist/core-runtime/discovery/installation-paths.test.js +65 -0
- package/dist/core-runtime/discovery/lens-registry.js +60 -0
- package/dist/core-runtime/discovery/lens-registry.test.js +81 -0
- package/dist/core-runtime/discovery/onto-home.js +71 -0
- package/dist/core-runtime/discovery/path-normalization.js +28 -0
- package/dist/core-runtime/discovery/path-normalization.test.js +22 -0
- package/dist/core-runtime/discovery/plugin-path.js +72 -0
- package/dist/core-runtime/discovery/plugin-path.test.js +95 -0
- package/dist/core-runtime/discovery/project-root.js +47 -0
- package/dist/core-runtime/discovery/settings-chain.js +353 -0
- package/dist/core-runtime/discovery/walk-up.js +17 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.js +344 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile-defense.test.js +915 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.js +564 -0
- package/dist/core-runtime/evolve/adapters/code-product/compile/compile.test.js +708 -0
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.js +165 -0
- package/dist/core-runtime/evolve/adapters/code-product/parsers/brief-parser.test.js +227 -0
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.js +59 -0
- package/dist/core-runtime/evolve/adapters/code-product/validators/validate.test.js +205 -0
- package/dist/core-runtime/evolve/adapters/methodology/adapter.js +16 -0
- package/dist/core-runtime/evolve/adapters/methodology/adapter.test.js +9 -0
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.js +298 -0
- package/dist/core-runtime/evolve/adapters/methodology/perspectives/authority-consistency.test.js +70 -0
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.js +46 -0
- package/dist/core-runtime/evolve/adapters/methodology/scope-types/process.test.js +73 -0
- package/dist/core-runtime/evolve/adapters/registry.js +47 -0
- package/dist/core-runtime/evolve/adapters/registry.test.js +67 -0
- package/dist/core-runtime/evolve/cli.js +256 -0
- package/dist/core-runtime/evolve/commands/align.js +194 -0
- package/dist/core-runtime/evolve/commands/align.test.js +82 -0
- package/dist/core-runtime/evolve/commands/apply.js +161 -0
- package/dist/core-runtime/evolve/commands/apply.test.js +138 -0
- package/dist/core-runtime/evolve/commands/close.js +39 -0
- package/dist/core-runtime/evolve/commands/close.test.js +99 -0
- package/dist/core-runtime/evolve/commands/defer.js +40 -0
- package/dist/core-runtime/evolve/commands/defer.test.js +134 -0
- package/dist/core-runtime/evolve/commands/draft.js +323 -0
- package/dist/core-runtime/evolve/commands/draft.test.js +178 -0
- package/dist/core-runtime/evolve/commands/e2e-evolve-full-cycle.test.js +208 -0
- package/dist/core-runtime/evolve/commands/error-messages.js +125 -0
- package/dist/core-runtime/evolve/commands/error-messages.test.js +167 -0
- package/dist/core-runtime/evolve/commands/propose-align.js +222 -0
- package/dist/core-runtime/evolve/commands/propose-align.test.js +136 -0
- package/dist/core-runtime/evolve/commands/reconstruct.js +330 -0
- package/dist/core-runtime/evolve/commands/reconstruct.test.js +278 -0
- package/dist/core-runtime/evolve/commands/shared.js +22 -0
- package/dist/core-runtime/evolve/commands/stale-check.js +103 -0
- package/dist/core-runtime/evolve/commands/stale-check.test.js +84 -0
- package/dist/core-runtime/evolve/commands/start.js +887 -0
- package/dist/core-runtime/evolve/commands/start.test.js +396 -0
- package/dist/core-runtime/evolve/config/project-config.js +99 -0
- package/dist/core-runtime/evolve/config/project-config.test.js +170 -0
- package/dist/core-runtime/evolve/renderers/align-packet.js +280 -0
- package/dist/core-runtime/evolve/renderers/align-packet.test.js +332 -0
- package/dist/core-runtime/evolve/renderers/draft-packet.js +303 -0
- package/dist/core-runtime/evolve/renderers/draft-packet.test.js +377 -0
- package/dist/core-runtime/evolve/renderers/format.js +5 -0
- package/dist/core-runtime/evolve/renderers/scope-md.js +237 -0
- package/dist/core-runtime/evolve/renderers/scope-md.test.js +306 -0
- package/dist/core-runtime/govern/cli.js +369 -0
- package/dist/core-runtime/govern/cli.test.js +314 -0
- package/dist/core-runtime/govern/drift-engine.js +103 -0
- package/dist/core-runtime/govern/drift-engine.test.js +319 -0
- package/dist/core-runtime/govern/promote-principle.js +206 -0
- package/dist/core-runtime/govern/promote-principle.test.js +368 -0
- package/dist/core-runtime/govern/queue.js +81 -0
- package/dist/core-runtime/govern/types.js +16 -0
- package/dist/core-runtime/install/cli.js +530 -0
- package/dist/core-runtime/install/detect.js +128 -0
- package/dist/core-runtime/install/detect.test.js +155 -0
- package/dist/core-runtime/install/gitignore-update.js +74 -0
- package/dist/core-runtime/install/gitignore-update.test.js +64 -0
- package/dist/core-runtime/install/install-integration.test.js +373 -0
- package/dist/core-runtime/install/prompts.js +389 -0
- package/dist/core-runtime/install/prompts.test.js +293 -0
- package/dist/core-runtime/install/types.js +26 -0
- package/dist/core-runtime/install/validation.js +295 -0
- package/dist/core-runtime/install/validation.test.js +313 -0
- package/dist/core-runtime/install/writer.js +254 -0
- package/dist/core-runtime/install/writer.test.js +218 -0
- package/dist/core-runtime/learning/extractor.js +461 -0
- package/dist/core-runtime/learning/feedback.js +179 -0
- package/dist/core-runtime/learning/health-report.js +165 -0
- package/dist/core-runtime/learning/health-report.test.js +169 -0
- package/dist/core-runtime/learning/loader.js +388 -0
- package/dist/core-runtime/learning/loader.test.js +102 -0
- package/dist/core-runtime/learning/promote/apply-state.js +240 -0
- package/dist/core-runtime/learning/promote/audit-obligation.js +195 -0
- package/dist/core-runtime/learning/promote/collector.js +432 -0
- package/dist/core-runtime/learning/promote/degraded-state.js +125 -0
- package/dist/core-runtime/learning/promote/domain-doc-proposer.js +166 -0
- package/dist/core-runtime/learning/promote/e2e-promote.test.js +6385 -0
- package/dist/core-runtime/learning/promote/health-snapshot.js +150 -0
- package/dist/core-runtime/learning/promote/insight-reclassifier.js +544 -0
- package/dist/core-runtime/learning/promote/judgment-auditor.js +517 -0
- package/dist/core-runtime/learning/promote/panel-reviewer.js +1158 -0
- package/dist/core-runtime/learning/promote/promote-executor.js +1675 -0
- package/dist/core-runtime/learning/promote/promoter.js +307 -0
- package/dist/core-runtime/learning/promote/retirement.js +122 -0
- package/dist/core-runtime/learning/promote/types.js +23 -0
- package/dist/core-runtime/learning/prompt-sections.js +51 -0
- package/dist/core-runtime/learning/shared/artifact-registry-init.js +45 -0
- package/dist/core-runtime/learning/shared/artifact-registry.js +254 -0
- package/dist/core-runtime/learning/shared/audit-obligation-kernel.js +73 -0
- package/dist/core-runtime/learning/shared/audit-state.js +99 -0
- package/dist/core-runtime/learning/shared/duplicate-check.js +28 -0
- package/dist/core-runtime/learning/shared/llm-caller.js +831 -0
- package/dist/core-runtime/learning/shared/llm-caller.test.js +601 -0
- package/dist/core-runtime/learning/shared/llm-tool-loop.js +393 -0
- package/dist/core-runtime/learning/shared/mode.js +25 -0
- package/dist/core-runtime/learning/shared/paths.js +84 -0
- package/dist/core-runtime/learning/shared/paths.test.js +79 -0
- package/dist/core-runtime/learning/shared/patterns.js +37 -0
- package/dist/core-runtime/learning/shared/recoverability.js +355 -0
- package/dist/core-runtime/learning/shared/recovery-context.js +374 -0
- package/dist/core-runtime/learning/shared/scope.js +1 -0
- package/dist/core-runtime/learning/shared/semantic-classifier.js +94 -0
- package/dist/core-runtime/learning/shared/specs/apply-execution-state-spec.js +42 -0
- package/dist/core-runtime/learning/shared/specs/audit-state-spec.js +37 -0
- package/dist/core-runtime/learning/shared/specs/backup-metadata-spec.js +39 -0
- package/dist/core-runtime/learning/shared/specs/emergency-log-spec.js +41 -0
- package/dist/core-runtime/learning/shared/specs/layout-version-spec.js +38 -0
- package/dist/core-runtime/learning/shared/specs/promote-decisions-spec.js +43 -0
- package/dist/core-runtime/learning/shared/specs/promote-report-spec.js +113 -0
- package/dist/core-runtime/learning/shared/specs/prune-log-spec.js +36 -0
- package/dist/core-runtime/learning/shared/specs/recovery-resolution-spec.js +48 -0
- package/dist/core-runtime/learning/shared/specs/restore-manifest-spec.js +43 -0
- package/dist/core-runtime/learning/shared/specs/spec-helpers.js +64 -0
- package/dist/core-runtime/learning/usage-tracker.js +190 -0
- package/dist/core-runtime/learning/usage-tracker.test.js +176 -0
- package/dist/core-runtime/llm/llm-caller.js +649 -0
- package/dist/core-runtime/llm/llm-tool-loop.js +401 -0
- package/dist/core-runtime/llm/model-switcher.js +62 -0
- package/dist/core-runtime/logger.js +22 -0
- package/dist/core-runtime/onboard/detect-review-axes.js +122 -0
- package/dist/core-runtime/onboard/detect-review-axes.test.js +127 -0
- package/dist/core-runtime/onboard/write-review-block.js +188 -0
- package/dist/core-runtime/onboard/write-review-block.test.js +240 -0
- package/dist/core-runtime/readers/brownfield-builder.js +150 -0
- package/dist/core-runtime/readers/brownfield-builder.test.js +136 -0
- package/dist/core-runtime/readers/code-chunk-collector.js +53 -0
- package/dist/core-runtime/readers/code-chunk-collector.test.js +136 -0
- package/dist/core-runtime/readers/file-utils.js +240 -0
- package/dist/core-runtime/readers/file-utils.test.js +146 -0
- package/dist/core-runtime/readers/lexicon-citation-check.js +93 -0
- package/dist/core-runtime/readers/lexicon-citation-check.test.js +77 -0
- package/dist/core-runtime/readers/mcp-figma.js +30 -0
- package/dist/core-runtime/readers/mcp-figma.test.js +82 -0
- package/dist/core-runtime/readers/mcp-generic.js +31 -0
- package/dist/core-runtime/readers/mcp-generic.test.js +76 -0
- package/dist/core-runtime/readers/ontology-index.js +148 -0
- package/dist/core-runtime/readers/ontology-index.test.js +245 -0
- package/dist/core-runtime/readers/ontology-query.js +168 -0
- package/dist/core-runtime/readers/ontology-query.test.js +311 -0
- package/dist/core-runtime/readers/ontology-resolve.js +48 -0
- package/dist/core-runtime/readers/ontology-resolve.test.js +48 -0
- package/dist/core-runtime/readers/patterns/index.js +7 -0
- package/dist/core-runtime/readers/review-log.js +213 -0
- package/dist/core-runtime/readers/review-log.test.js +313 -0
- package/dist/core-runtime/readers/scan-local.js +102 -0
- package/dist/core-runtime/readers/scan-local.test.js +102 -0
- package/dist/core-runtime/readers/scan-tarball.js +121 -0
- package/dist/core-runtime/readers/scan-tarball.test.js +283 -0
- package/dist/core-runtime/readers/scan-vault.js +34 -0
- package/dist/core-runtime/readers/scan-vault.test.js +81 -0
- package/dist/core-runtime/readers/types.js +42 -0
- package/dist/core-runtime/readers/types.test.js +94 -0
- package/dist/core-runtime/readers/viewpoint-collectors.js +229 -0
- package/dist/core-runtime/reconstruct/artifact-types.js +1 -0
- package/dist/core-runtime/reconstruct/directive-validation.js +123 -0
- package/dist/core-runtime/reconstruct/materialize-preparation.js +251 -0
- package/dist/core-runtime/reconstruct/record.js +198 -0
- package/dist/core-runtime/reconstruct/run.js +578 -0
- package/dist/core-runtime/reconstruct/seed-candidate-validation.js +356 -0
- package/dist/core-runtime/reconstruct/source-observations.js +62 -0
- package/dist/core-runtime/reconstruct/source-profiles.js +73 -0
- package/dist/core-runtime/release-channel/release-channel.js +90 -0
- package/dist/core-runtime/review/artifact-types.js +13 -0
- package/dist/core-runtime/review/citation-audit.js +204 -0
- package/dist/core-runtime/review/citation-audit.test.js +165 -0
- package/dist/core-runtime/review/controlled-lens-deliberation.js +125 -0
- package/dist/core-runtime/review/execution-plan-resolver.js +247 -0
- package/dist/core-runtime/review/execution-plan-resolver.test.js +243 -0
- package/dist/core-runtime/review/execution-topology-resolver-axis-first.test.js +246 -0
- package/dist/core-runtime/review/execution-topology-resolver.js +401 -0
- package/dist/core-runtime/review/execution-topology-resolver.test.js +315 -0
- package/dist/core-runtime/review/failure-records.js +57 -0
- package/dist/core-runtime/review/inline-context-embedder.js +141 -0
- package/dist/core-runtime/review/inline-context-embedder.test.js +154 -0
- package/dist/core-runtime/review/issue-artifact-runtime.js +859 -0
- package/dist/core-runtime/review/legacy-mode-policy.js +88 -0
- package/dist/core-runtime/review/lens-completion-policy.js +17 -0
- package/dist/core-runtime/review/materializers-effort-persist.test.js +79 -0
- package/dist/core-runtime/review/materializers.js +963 -0
- package/dist/core-runtime/review/ontology-path-classifier.js +179 -0
- package/dist/core-runtime/review/ontology-path-classifier.test.js +216 -0
- package/dist/core-runtime/review/packet-boundary-policy.js +215 -0
- package/dist/core-runtime/review/packet-boundary-policy.test.js +107 -0
- package/dist/core-runtime/review/participating-lens-paths.js +61 -0
- package/dist/core-runtime/review/participating-lens-paths.test.js +73 -0
- package/dist/core-runtime/review/review-artifact-utils.js +287 -0
- package/dist/core-runtime/review/review-config-legacy-translate.js +244 -0
- package/dist/core-runtime/review/review-config-legacy-translate.test.js +161 -0
- package/dist/core-runtime/review/review-config-validator.js +289 -0
- package/dist/core-runtime/review/review-config-validator.test.js +236 -0
- package/dist/core-runtime/review/review-execution-profile.js +193 -0
- package/dist/core-runtime/review/review-execution-route.js +52 -0
- package/dist/core-runtime/review/review-progress-contract.js +123 -0
- package/dist/core-runtime/review/review-record-validation.js +251 -0
- package/dist/core-runtime/review/review-result-classification.js +379 -0
- package/dist/core-runtime/review/review-state-machine.js +39 -0
- package/dist/core-runtime/review/route-visibility.js +125 -0
- package/dist/core-runtime/review/shape-pipeline-audit.test.js +311 -0
- package/dist/core-runtime/review/shape-to-topology-id.js +117 -0
- package/dist/core-runtime/review/shape-to-topology-id.test.js +132 -0
- package/dist/core-runtime/review/topology-shape-derivation.js +155 -0
- package/dist/core-runtime/review/topology-shape-derivation.test.js +195 -0
- package/dist/core-runtime/scope-runtime/constants.js +12 -0
- package/dist/core-runtime/scope-runtime/constraint-pool.js +166 -0
- package/dist/core-runtime/scope-runtime/constraint-pool.test.js +674 -0
- package/dist/core-runtime/scope-runtime/domain-validation-log.js +135 -0
- package/dist/core-runtime/scope-runtime/domain-validation-log.test.js +156 -0
- package/dist/core-runtime/scope-runtime/eval-persistence.js +65 -0
- package/dist/core-runtime/scope-runtime/eval-persistence.test.js +84 -0
- package/dist/core-runtime/scope-runtime/event-pipeline.js +64 -0
- package/dist/core-runtime/scope-runtime/event-pipeline.test.js +450 -0
- package/dist/core-runtime/scope-runtime/event-store.js +39 -0
- package/dist/core-runtime/scope-runtime/event-store.test.js +95 -0
- package/dist/core-runtime/scope-runtime/gate-guard.js +348 -0
- package/dist/core-runtime/scope-runtime/gate-guard.test.js +1047 -0
- package/dist/core-runtime/scope-runtime/hash.js +4 -0
- package/dist/core-runtime/scope-runtime/hash.test.js +33 -0
- package/dist/core-runtime/scope-runtime/id.js +4 -0
- package/dist/core-runtime/scope-runtime/id.test.js +17 -0
- package/dist/core-runtime/scope-runtime/reducer.js +297 -0
- package/dist/core-runtime/scope-runtime/reducer.test.js +759 -0
- package/dist/core-runtime/scope-runtime/scope-manager.js +161 -0
- package/dist/core-runtime/scope-runtime/state-machine.js +309 -0
- package/dist/core-runtime/scope-runtime/state-machine.test.js +704 -0
- package/dist/core-runtime/scope-runtime/types.js +116 -0
- package/dist/core-runtime/scope-runtime/types.test.js +69 -0
- package/dist/core-runtime/target-material-kind.js +256 -0
- package/dist/core-runtime/translate/render-for-user.js +169 -0
- package/dist/core-runtime/translate/render-for-user.test.js +122 -0
- package/dist/mcp/server.js +1011 -0
- package/dist/mcp/tool-schemas.js +93 -0
- package/dist/providers/capability-contract.js +1 -0
- package/package.json +68 -0
- package/settings.example.json +33 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3 Promote — Judgment Auditor (Step 8b).
|
|
3
|
+
*
|
|
4
|
+
* Design authority:
|
|
5
|
+
* - learn-phase3-design-v4.md DD-13 (P-14 sequencing)
|
|
6
|
+
* - learn-phase3-design-v6.md DD-17 (obligation ledger lifecycle)
|
|
7
|
+
* - learn-phase3-design-v9.md DD-17 (carry-forward + expired_unattended ingress)
|
|
8
|
+
* - learn-phase3-design-v7.md DD-21 (AuditObligation encapsulation — this
|
|
9
|
+
* module transitions obligations exclusively through AuditObligation.transition())
|
|
10
|
+
* - .onto/processes/learn/promote.md Step 8 (judgment re-verification threshold)
|
|
11
|
+
*
|
|
12
|
+
* Responsibility:
|
|
13
|
+
* - DD-13 P-14 pre-step: determine eligible agents for judgment audit
|
|
14
|
+
* (count_threshold OR outstanding obligation).
|
|
15
|
+
* - For each eligible agent, LLM-evaluate the `[judgment]`-type items in
|
|
16
|
+
* their global learnings file against the current context.
|
|
17
|
+
* - Emit AuditOutcome per item (retain | modify | delete | audit_to_conflict_proposal).
|
|
18
|
+
* - Transition matching AuditObligations through their lifecycle
|
|
19
|
+
* (pending → in_progress → fulfilled | blocked | no_eligible_agents).
|
|
20
|
+
* - Return a compact AuditSummary consumable by PromoteReport assembly.
|
|
21
|
+
*
|
|
22
|
+
* Scope boundary:
|
|
23
|
+
* - Phase A only. No file mutation; audit outcomes are proposals that flow
|
|
24
|
+
* into PromoteReport for user approval before Phase B applies them.
|
|
25
|
+
* - ConflictProposal emission for `audit_to_conflict_proposal` outcomes is
|
|
26
|
+
* handled by the orchestrator (promoter.ts) — this module returns raw
|
|
27
|
+
* outcomes and leaves proposal assembly to the caller, which holds the
|
|
28
|
+
* origin/lineage context (DD-19).
|
|
29
|
+
*
|
|
30
|
+
* Failure model:
|
|
31
|
+
* - LLM unreachable → obligation transitions in_progress → blocked.
|
|
32
|
+
* Next promote will re-enter pending (audit-state.ts processCarryForward).
|
|
33
|
+
* - Malformed LLM JSON → blocked (treated the same as unreachable).
|
|
34
|
+
* - No eligible items for an obligation's affected_agents → in_progress →
|
|
35
|
+
* no_eligible_agents (terminal).
|
|
36
|
+
*/
|
|
37
|
+
import { callLlm, hashPrompt } from "../shared/llm-caller.js";
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Policy
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
export const DEFAULT_AUDIT_POLICY = {
|
|
42
|
+
judgment_threshold: 10, // promote.md §8
|
|
43
|
+
obligation_max_carry_forward: 3,
|
|
44
|
+
};
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// Eligibility determination — DD-13 pre-step
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
/**
|
|
49
|
+
* Count `[judgment]`-type items per agent across the given item pool.
|
|
50
|
+
*
|
|
51
|
+
* The caller supplies global_items from CollectionResult. Judgment audit runs
|
|
52
|
+
* only against global items because audit is a re-verification of already-
|
|
53
|
+
* promoted judgments — project-level items are the promote panel's domain.
|
|
54
|
+
*/
|
|
55
|
+
function countJudgmentsByAgent(items) {
|
|
56
|
+
const counts = new Map();
|
|
57
|
+
for (const item of items) {
|
|
58
|
+
if (item.type !== "judgment")
|
|
59
|
+
continue;
|
|
60
|
+
counts.set(item.agent_id, (counts.get(item.agent_id) ?? 0) + 1);
|
|
61
|
+
}
|
|
62
|
+
return counts;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* DD-13 pre-step: resolve which agents are eligible for audit in this promote
|
|
66
|
+
* session.
|
|
67
|
+
*
|
|
68
|
+
* Two trigger paths:
|
|
69
|
+
* 1. count_threshold — an agent holds >= policy.judgment_threshold judgment
|
|
70
|
+
* items in its global file (promote.md §8).
|
|
71
|
+
* 2. obligation — an active obligation whose `affected_agents` list names
|
|
72
|
+
* the agent (DD-17 carry-forward path).
|
|
73
|
+
*
|
|
74
|
+
* When both paths fire for the same agent the obligation path wins so the
|
|
75
|
+
* audit explicitly fulfills the ledger entry.
|
|
76
|
+
*/
|
|
77
|
+
export function determineAuditEligibility(globalItems, state, policy = DEFAULT_AUDIT_POLICY) {
|
|
78
|
+
const counts = countJudgmentsByAgent(globalItems);
|
|
79
|
+
const eligibility = [];
|
|
80
|
+
const handledAgents = new Set();
|
|
81
|
+
// Obligation-triggered eligibility first (higher priority)
|
|
82
|
+
for (const ob of state.obligations) {
|
|
83
|
+
if (ob.status !== "pending")
|
|
84
|
+
continue;
|
|
85
|
+
for (const agent of ob.affected_agents) {
|
|
86
|
+
if (handledAgents.has(agent))
|
|
87
|
+
continue;
|
|
88
|
+
handledAgents.add(agent);
|
|
89
|
+
eligibility.push({
|
|
90
|
+
agent_id: agent,
|
|
91
|
+
obligation_id: ob.obligation_id,
|
|
92
|
+
reason: `obligation ${ob.obligation_id}: ${ob.reason}`,
|
|
93
|
+
judgment_count: counts.get(agent) ?? 0,
|
|
94
|
+
trigger: "obligation",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Count-threshold eligibility (only for agents not already covered)
|
|
99
|
+
for (const [agent, count] of counts) {
|
|
100
|
+
if (handledAgents.has(agent))
|
|
101
|
+
continue;
|
|
102
|
+
if (count < policy.judgment_threshold)
|
|
103
|
+
continue;
|
|
104
|
+
handledAgents.add(agent);
|
|
105
|
+
eligibility.push({
|
|
106
|
+
agent_id: agent,
|
|
107
|
+
obligation_id: null,
|
|
108
|
+
reason: `count_threshold: ${count} >= ${policy.judgment_threshold} judgment items`,
|
|
109
|
+
judgment_count: count,
|
|
110
|
+
trigger: "count_threshold",
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return eligibility;
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Prompt building
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
const AUDIT_SYSTEM_PROMPT = `You are re-verifying previously promoted [judgment]-type learnings for an agent. For each item, decide whether it is still contextually valid.
|
|
119
|
+
|
|
120
|
+
Output ONE JSON object with an "outcomes" array. For each item output:
|
|
121
|
+
|
|
122
|
+
{
|
|
123
|
+
"item_index": <0-based integer matching the input order>,
|
|
124
|
+
"decision": "retain" | "modify" | "delete" | "audit_to_conflict_proposal",
|
|
125
|
+
"reason": "<one-sentence justification>",
|
|
126
|
+
"modified_content": "<required only when decision == modify, otherwise null>"
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
Decision rules:
|
|
130
|
+
- "retain" — item remains valid as written; no action needed.
|
|
131
|
+
- "modify" — the core insight still holds but wording needs update; provide modified_content.
|
|
132
|
+
- "delete" — the judgment is no longer valid and should be retired.
|
|
133
|
+
- "audit_to_conflict_proposal" — the item conflicts with another global item;
|
|
134
|
+
a formal conflict proposal will be created for operator review.
|
|
135
|
+
|
|
136
|
+
Coherence rules:
|
|
137
|
+
- Return exactly one outcome per input item, in order.
|
|
138
|
+
- modified_content MUST be set when decision is "modify", and MUST be null otherwise.
|
|
139
|
+
|
|
140
|
+
Respond ONLY with valid JSON (no markdown fences):
|
|
141
|
+
{"outcomes": [...]}
|
|
142
|
+
`;
|
|
143
|
+
function buildAuditUserPrompt(agentId, items) {
|
|
144
|
+
const itemBlock = items
|
|
145
|
+
.map((item, i) => `${i}. tags=[${item.applicability_tags.join(" ")}] role=${item.role ?? "<no-role>"}\n content: ${item.content}`)
|
|
146
|
+
.join("\n");
|
|
147
|
+
return `Agent: ${agentId}
|
|
148
|
+
Judgment items to re-verify: ${items.length}
|
|
149
|
+
${itemBlock}
|
|
150
|
+
|
|
151
|
+
Respond with {"outcomes":[...]}.`;
|
|
152
|
+
}
|
|
153
|
+
function parseAuditResponse(text) {
|
|
154
|
+
let cleaned = text.trim();
|
|
155
|
+
if (cleaned.startsWith("```")) {
|
|
156
|
+
cleaned = cleaned.replace(/^```(?:json)?\s*/, "").replace(/```\s*$/, "");
|
|
157
|
+
}
|
|
158
|
+
const parsed = JSON.parse(cleaned);
|
|
159
|
+
if (!parsed || !Array.isArray(parsed.outcomes)) {
|
|
160
|
+
throw new Error(`audit response missing "outcomes" array (got keys: ${Object.keys(parsed ?? {}).join(",")})`);
|
|
161
|
+
}
|
|
162
|
+
return { outcomes: parsed.outcomes };
|
|
163
|
+
}
|
|
164
|
+
const VALID_DECISIONS = [
|
|
165
|
+
"retain",
|
|
166
|
+
"modify",
|
|
167
|
+
"delete",
|
|
168
|
+
"audit_to_conflict_proposal",
|
|
169
|
+
];
|
|
170
|
+
function normalizeOutcomes(raw, items, agentId) {
|
|
171
|
+
const outcomes = [];
|
|
172
|
+
const failures = [];
|
|
173
|
+
const seen = new Set();
|
|
174
|
+
for (const r of raw) {
|
|
175
|
+
if (typeof r.item_index !== "number") {
|
|
176
|
+
failures.push(`item_index missing/non-numeric`);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const idx = r.item_index;
|
|
180
|
+
if (idx < 0 || idx >= items.length) {
|
|
181
|
+
failures.push(`item_index ${idx} out of range 0..${items.length - 1}`);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (seen.has(idx)) {
|
|
185
|
+
failures.push(`item_index ${idx} duplicated`);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
seen.add(idx);
|
|
189
|
+
const decision = r.decision;
|
|
190
|
+
if (!VALID_DECISIONS.includes(decision)) {
|
|
191
|
+
failures.push(`item ${idx}: invalid decision "${String(r.decision)}"`);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const outcome = {
|
|
195
|
+
agent_id: agentId,
|
|
196
|
+
item: items[idx],
|
|
197
|
+
decision,
|
|
198
|
+
reason: typeof r.reason === "string" ? r.reason : "",
|
|
199
|
+
};
|
|
200
|
+
if (decision === "modify") {
|
|
201
|
+
if (typeof r.modified_content !== "string" || !r.modified_content) {
|
|
202
|
+
failures.push(`item ${idx}: decision is modify but modified_content missing`);
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
outcome.modified_content = r.modified_content;
|
|
206
|
+
}
|
|
207
|
+
else if (r.modified_content !== undefined &&
|
|
208
|
+
r.modified_content !== null) {
|
|
209
|
+
failures.push(`item ${idx}: decision is ${decision} but modified_content supplied`);
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
outcomes.push(outcome);
|
|
213
|
+
}
|
|
214
|
+
for (let i = 0; i < items.length; i++) {
|
|
215
|
+
if (!seen.has(i)) {
|
|
216
|
+
failures.push(`item ${i}: no outcome returned`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { outcomes, failures };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Maximum items per batched LLM call.
|
|
223
|
+
*
|
|
224
|
+
* Chunking keeps each prompt and response within a bounded size window and
|
|
225
|
+
* lets per-chunk failures be isolated rather than failing the whole agent.
|
|
226
|
+
*/
|
|
227
|
+
const AUDIT_BATCH_SIZE = 12;
|
|
228
|
+
/**
|
|
229
|
+
* Slice items into batches of `size` each. The constant AUDIT_BATCH_SIZE is
|
|
230
|
+
* a positive number; the dead `size <= 0` defensive branch was removed in
|
|
231
|
+
* the N-2 cleanup. If a future caller needs a configurable batch size and
|
|
232
|
+
* passes 0, the for-loop's `i += 0` would infinite-loop — that's an
|
|
233
|
+
* obviously broken contract that doesn't need silent special-casing.
|
|
234
|
+
*/
|
|
235
|
+
function chunk(items, size) {
|
|
236
|
+
const chunks = [];
|
|
237
|
+
for (let i = 0; i < items.length; i += size) {
|
|
238
|
+
chunks.push(items.slice(i, i + size));
|
|
239
|
+
}
|
|
240
|
+
return chunks;
|
|
241
|
+
}
|
|
242
|
+
async function auditAgent(config) {
|
|
243
|
+
const judgmentItems = config.globalItems.filter((item) => item.agent_id === config.agentId && item.type === "judgment");
|
|
244
|
+
if (judgmentItems.length === 0) {
|
|
245
|
+
return {
|
|
246
|
+
kind: "no_eligible_items",
|
|
247
|
+
outcomes: [],
|
|
248
|
+
llm_calls: 0,
|
|
249
|
+
judgment_count_total: 0,
|
|
250
|
+
failed_chunks_count: 0,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// Chunk into batches so large agents (37+ items) don't blow the LLM
|
|
254
|
+
// timeout window. Each chunk gets its own LLM call with the same
|
|
255
|
+
// 1-retry-on-validation-error pattern. Per-chunk provider errors are
|
|
256
|
+
// isolated so a single transient failure doesn't lose the whole agent.
|
|
257
|
+
const batches = chunk(judgmentItems, AUDIT_BATCH_SIZE);
|
|
258
|
+
let llmCalls = 0;
|
|
259
|
+
const allOutcomes = [];
|
|
260
|
+
const failureReasons = [];
|
|
261
|
+
const tryOnce = async (batchItems, retryFeedback) => {
|
|
262
|
+
let userPrompt = buildAuditUserPrompt(config.agentId, batchItems);
|
|
263
|
+
if (retryFeedback && retryFeedback.length > 0) {
|
|
264
|
+
userPrompt +=
|
|
265
|
+
"\n\nPrevious attempt was rejected. Validator feedback:\n" +
|
|
266
|
+
retryFeedback.map((f) => ` - ${f}`).join("\n") +
|
|
267
|
+
"\nFix these issues and respond again.";
|
|
268
|
+
}
|
|
269
|
+
let llmText;
|
|
270
|
+
try {
|
|
271
|
+
const result = await callLlm(AUDIT_SYSTEM_PROMPT, userPrompt, {
|
|
272
|
+
max_tokens: config.maxTokens ?? 4096,
|
|
273
|
+
...(config.modelId ? { model_id: config.modelId } : {}),
|
|
274
|
+
});
|
|
275
|
+
llmText = result.text;
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return {
|
|
279
|
+
kind: "provider_error",
|
|
280
|
+
outcomes: [],
|
|
281
|
+
failureReason: error instanceof Error ? error.message : String(error),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
let parsed;
|
|
285
|
+
try {
|
|
286
|
+
parsed = parseAuditResponse(llmText);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
return {
|
|
290
|
+
kind: "blocked",
|
|
291
|
+
outcomes: [],
|
|
292
|
+
failureReason: `malformed JSON: ${error instanceof Error ? error.message : String(error)}`,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
const normalized = normalizeOutcomes(parsed.outcomes, batchItems, config.agentId);
|
|
296
|
+
if (normalized.failures.length > 0) {
|
|
297
|
+
return {
|
|
298
|
+
kind: "blocked",
|
|
299
|
+
outcomes: normalized.outcomes,
|
|
300
|
+
failureReason: normalized.failures.join("; "),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return { kind: "success", outcomes: normalized.outcomes };
|
|
304
|
+
};
|
|
305
|
+
for (let i = 0; i < batches.length; i++) {
|
|
306
|
+
const batch = batches[i];
|
|
307
|
+
const first = await tryOnce(batch);
|
|
308
|
+
llmCalls += 1;
|
|
309
|
+
if (first.kind === "success") {
|
|
310
|
+
allOutcomes.push(...first.outcomes);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (first.kind === "provider_error") {
|
|
314
|
+
failureReasons.push(`batch ${i + 1}/${batches.length} (${batch.length} items): ` +
|
|
315
|
+
`provider error: ${first.failureReason ?? "unknown"}`);
|
|
316
|
+
// Provider errors skip retry and skip the batch entirely.
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
// first.kind === "blocked" (validation error) — retry the batch
|
|
320
|
+
const second = await tryOnce(batch, first.failureReason !== undefined ? [first.failureReason] : undefined);
|
|
321
|
+
llmCalls += 1;
|
|
322
|
+
if (second.kind === "success") {
|
|
323
|
+
allOutcomes.push(...second.outcomes);
|
|
324
|
+
continue;
|
|
325
|
+
}
|
|
326
|
+
failureReasons.push(`batch ${i + 1}/${batches.length} (${batch.length} items): ` +
|
|
327
|
+
`${second.failureReason ?? first.failureReason ?? "unknown"}`);
|
|
328
|
+
}
|
|
329
|
+
const failedChunksCount = failureReasons.length;
|
|
330
|
+
if (failedChunksCount === 0) {
|
|
331
|
+
return {
|
|
332
|
+
kind: "success",
|
|
333
|
+
outcomes: allOutcomes,
|
|
334
|
+
llm_calls: llmCalls,
|
|
335
|
+
judgment_count_total: judgmentItems.length,
|
|
336
|
+
failed_chunks_count: 0,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
if (allOutcomes.length === 0) {
|
|
340
|
+
return {
|
|
341
|
+
kind: "blocked",
|
|
342
|
+
outcomes: [],
|
|
343
|
+
llm_calls: llmCalls,
|
|
344
|
+
failure_reason: failureReasons.join(" | "),
|
|
345
|
+
judgment_count_total: judgmentItems.length,
|
|
346
|
+
failed_chunks_count: failedChunksCount,
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Some batches succeeded, some failed — partial success. The operator
|
|
350
|
+
// sees the partial outcomes plus the failure reasons for the missing
|
|
351
|
+
// batches in failed_agents.
|
|
352
|
+
return {
|
|
353
|
+
kind: "partial",
|
|
354
|
+
outcomes: allOutcomes,
|
|
355
|
+
llm_calls: llmCalls,
|
|
356
|
+
failure_reason: failureReasons.join(" | "),
|
|
357
|
+
judgment_count_total: judgmentItems.length,
|
|
358
|
+
failed_chunks_count: failedChunksCount,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* DD-13 + DD-17 entry point.
|
|
363
|
+
*
|
|
364
|
+
* Lifecycle contract:
|
|
365
|
+
* 1. Determine eligibility from global_items and state.obligations.
|
|
366
|
+
* 2. Mark each eligible obligation in_progress (via transition()).
|
|
367
|
+
* 3. For each eligible agent, call the LLM and collect outcomes.
|
|
368
|
+
* 4. Transition the obligation according to the result:
|
|
369
|
+
* - success → fulfilled
|
|
370
|
+
* - blocked (transient) → blocked
|
|
371
|
+
* - no_eligible_items → no_eligible_agents
|
|
372
|
+
* 5. Emit ObligationProcessed entries so PromoteReport preserves the
|
|
373
|
+
* canonical pre/post transition record (DD-17 CONCISENESS-02).
|
|
374
|
+
*
|
|
375
|
+
* Mutation note: `state.obligations[*]` are AuditObligation class instances.
|
|
376
|
+
* This function MUTATES their status via the class API — callers are
|
|
377
|
+
* expected to saveAuditState() after Phase A completes so the ledger reflects
|
|
378
|
+
* this pass's transitions.
|
|
379
|
+
*/
|
|
380
|
+
export async function runJudgmentAudit(config) {
|
|
381
|
+
const policy = config.policy ?? DEFAULT_AUDIT_POLICY;
|
|
382
|
+
const eligibility = determineAuditEligibility(config.globalItems, config.state, policy);
|
|
383
|
+
// Index obligations by id for quick lookup.
|
|
384
|
+
const obligationById = new Map(config.state.obligations.map((o) => [o.obligation_id, o]));
|
|
385
|
+
const obligationsSeen = new Set();
|
|
386
|
+
const obligationsProcessed = [];
|
|
387
|
+
// Transition pending → in_progress for each obligation being picked up.
|
|
388
|
+
// We capture the starting status for the ObligationProcessed record.
|
|
389
|
+
const startingStatus = new Map();
|
|
390
|
+
for (const e of eligibility) {
|
|
391
|
+
if (!e.obligation_id)
|
|
392
|
+
continue;
|
|
393
|
+
if (obligationsSeen.has(e.obligation_id))
|
|
394
|
+
continue;
|
|
395
|
+
obligationsSeen.add(e.obligation_id);
|
|
396
|
+
const ob = obligationById.get(e.obligation_id);
|
|
397
|
+
if (!ob)
|
|
398
|
+
continue;
|
|
399
|
+
startingStatus.set(ob.obligation_id, ob.status);
|
|
400
|
+
if (ob.status === "pending") {
|
|
401
|
+
ob.transition("in_progress", `P-14 picked up in session ${config.sessionId}`, { session_id: config.sessionId });
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
const allOutcomes = [];
|
|
405
|
+
const auditedAgents = [];
|
|
406
|
+
const failedAgents = [];
|
|
407
|
+
let llmCalls = 0;
|
|
408
|
+
// Run audits per eligible agent.
|
|
409
|
+
for (const e of eligibility) {
|
|
410
|
+
const agentConfig = {
|
|
411
|
+
agentId: e.agent_id,
|
|
412
|
+
globalItems: config.globalItems,
|
|
413
|
+
};
|
|
414
|
+
if (config.maxTokens !== undefined) {
|
|
415
|
+
agentConfig.maxTokens = config.maxTokens;
|
|
416
|
+
}
|
|
417
|
+
if (config.modelId !== undefined) {
|
|
418
|
+
agentConfig.modelId = config.modelId;
|
|
419
|
+
}
|
|
420
|
+
const result = await auditAgent(agentConfig);
|
|
421
|
+
llmCalls += result.llm_calls;
|
|
422
|
+
if (result.kind === "success") {
|
|
423
|
+
auditedAgents.push(e.agent_id);
|
|
424
|
+
allOutcomes.push(...result.outcomes);
|
|
425
|
+
if (e.obligation_id) {
|
|
426
|
+
const ob = obligationById.get(e.obligation_id);
|
|
427
|
+
if (ob && ob.status === "in_progress") {
|
|
428
|
+
ob.transition("fulfilled", `P-14 completed for ${e.agent_id}`, {
|
|
429
|
+
session_id: config.sessionId,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
if (result.kind === "partial") {
|
|
436
|
+
// Partial success: some chunks succeeded, some failed. The agent is
|
|
437
|
+
// counted as audited (its outcomes are real) but also recorded in
|
|
438
|
+
// failed_agents so the operator sees the missing chunks. Obligation
|
|
439
|
+
// transitions to blocked because the audit isn't complete.
|
|
440
|
+
auditedAgents.push(e.agent_id);
|
|
441
|
+
allOutcomes.push(...result.outcomes);
|
|
442
|
+
failedAgents.push({
|
|
443
|
+
agent_id: e.agent_id,
|
|
444
|
+
reason: `partial: ${result.failure_reason ?? "unknown"}`,
|
|
445
|
+
judgment_count_total: result.judgment_count_total,
|
|
446
|
+
failed_chunks_count: result.failed_chunks_count,
|
|
447
|
+
});
|
|
448
|
+
if (e.obligation_id) {
|
|
449
|
+
const ob = obligationById.get(e.obligation_id);
|
|
450
|
+
if (ob && ob.status === "in_progress") {
|
|
451
|
+
ob.transition("blocked", `P-14 partial failure: ${result.failure_reason ?? "unknown"}`, { session_id: config.sessionId });
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
if (result.kind === "no_eligible_items") {
|
|
457
|
+
if (e.obligation_id) {
|
|
458
|
+
const ob = obligationById.get(e.obligation_id);
|
|
459
|
+
if (ob && ob.status === "in_progress") {
|
|
460
|
+
ob.transition("no_eligible_agents", `no judgment items found for ${e.agent_id}`, { session_id: config.sessionId });
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
// result.kind === "blocked" — fully failed, surface as failed_agent
|
|
466
|
+
failedAgents.push({
|
|
467
|
+
agent_id: e.agent_id,
|
|
468
|
+
reason: result.failure_reason ?? "unknown failure",
|
|
469
|
+
judgment_count_total: result.judgment_count_total,
|
|
470
|
+
failed_chunks_count: result.failed_chunks_count,
|
|
471
|
+
});
|
|
472
|
+
if (e.obligation_id) {
|
|
473
|
+
const ob = obligationById.get(e.obligation_id);
|
|
474
|
+
if (ob && ob.status === "in_progress") {
|
|
475
|
+
ob.transition("blocked", `P-14 transient failure: ${result.failure_reason ?? "unknown"}`, { session_id: config.sessionId });
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// Build ObligationProcessed records from captured start/end status pairs.
|
|
480
|
+
for (const [obligationId, from] of startingStatus) {
|
|
481
|
+
const ob = obligationById.get(obligationId);
|
|
482
|
+
if (!ob)
|
|
483
|
+
continue;
|
|
484
|
+
obligationsProcessed.push({
|
|
485
|
+
obligation_id: obligationId,
|
|
486
|
+
transition: { from, to: ob.status },
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
const outcomesTally = {
|
|
490
|
+
retain: 0,
|
|
491
|
+
modify: 0,
|
|
492
|
+
delete: 0,
|
|
493
|
+
audit_to_conflict_proposal: 0,
|
|
494
|
+
};
|
|
495
|
+
for (const o of allOutcomes) {
|
|
496
|
+
outcomesTally[o.decision] += 1;
|
|
497
|
+
}
|
|
498
|
+
const summary = {
|
|
499
|
+
policy,
|
|
500
|
+
obligations_processed: obligationsProcessed,
|
|
501
|
+
eligibility,
|
|
502
|
+
execution: {
|
|
503
|
+
audited_agents: auditedAgents,
|
|
504
|
+
audited_items_count: allOutcomes.length,
|
|
505
|
+
llm_calls: llmCalls,
|
|
506
|
+
},
|
|
507
|
+
outcomes: outcomesTally,
|
|
508
|
+
failed_agents: failedAgents,
|
|
509
|
+
};
|
|
510
|
+
return { summary, outcomes: allOutcomes };
|
|
511
|
+
}
|
|
512
|
+
// ---------------------------------------------------------------------------
|
|
513
|
+
// Prompt hash helper — exported for audit trail tests
|
|
514
|
+
// ---------------------------------------------------------------------------
|
|
515
|
+
export function hashAuditPrompt(agentId, items) {
|
|
516
|
+
return hashPrompt(AUDIT_SYSTEM_PROMPT + "\n" + buildAuditUserPrompt(agentId, items));
|
|
517
|
+
}
|