akm-cli 0.9.0-rc.0 → 0.9.0-rc.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1283 -22
- package/README.md +62 -37
- package/SECURITY.md +46 -31
- package/dist/akm +162 -38
- package/dist/akm-migrate +44 -0
- package/dist/assets/backends/schtasks-template.xml +2 -1
- package/dist/assets/hints/cli-hints-full.md +268 -118
- package/dist/assets/hints/cli-hints-short.md +87 -24
- package/dist/assets/{profiles → improve-strategies}/catchup.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/consolidate.json +3 -1
- package/dist/assets/{profiles → improve-strategies}/default.json +6 -7
- package/dist/assets/improve-strategies/frequent.json +15 -0
- package/dist/assets/{profiles → improve-strategies}/graph-refresh.json +4 -2
- package/dist/assets/{profiles → improve-strategies}/memory-focus.json +4 -1
- package/dist/assets/{profiles → improve-strategies}/proactive-maintenance.json +5 -5
- package/dist/assets/{profiles → improve-strategies}/quick.json +4 -2
- package/dist/assets/improve-strategies/reflect-distill.json +30 -0
- package/dist/assets/{profiles → improve-strategies}/thorough.json +1 -1
- package/dist/assets/prompts/consolidate-system.md +5 -5
- package/dist/assets/prompts/extract-session.md +2 -6
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/prompts/reflect-llm-framed-contract.md +11 -0
- package/dist/assets/prompts/reflect-llm-schema-contract.md +3 -0
- package/dist/assets/prompts/reflect-output-repair.md +3 -0
- package/dist/assets/prompts/workflow-unit-preamble.md +26 -0
- package/dist/assets/stash-skeleton/README.md +38 -10
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +14 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +13 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +9 -1
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +11 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +9 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +8 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +100 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +64 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +136 -0
- package/dist/assets/tasks/core/extract.yml +3 -2
- package/dist/assets/tasks/core/improve.yml +2 -1
- package/dist/assets/tasks/core/index-refresh.yml +1 -0
- package/dist/assets/tasks/core/sync.yml +1 -0
- package/dist/assets/tasks/core/version-check.yml +2 -1
- package/dist/assets/tasks/improve/akm-graph-refresh-weekly.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-catchup.yml +8 -0
- package/dist/assets/tasks/improve/akm-improve-consolidate.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-frequent.yml +5 -0
- package/dist/assets/tasks/improve/akm-improve-nightly.yml +5 -0
- package/dist/assets/templates/html/health.html +5 -4
- package/dist/assets/workflows/workflow-template.md +31 -15
- package/dist/cli/invocation.js +279 -0
- package/dist/cli/parse-args.js +5 -90
- package/dist/cli/retired-commands.js +78 -0
- package/dist/cli/shared.js +158 -48
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +747 -293
- package/dist/commands/agent/agent-dispatch.js +19 -18
- package/dist/commands/agent/agent-support.js +0 -24
- package/dist/commands/agent/contribute-cli.js +43 -97
- package/dist/commands/completions.js +80 -23
- package/dist/commands/config-cli.js +44 -281
- package/dist/commands/env/env-binding.js +99 -0
- package/dist/commands/env/env-cli.js +84 -224
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +45 -61
- package/dist/commands/env/secret.js +32 -62
- package/dist/commands/feedback-cli.js +179 -85
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +7 -8
- package/dist/commands/health/checks.js +279 -94
- package/dist/commands/health/html-report.js +197 -578
- package/dist/commands/health/improve-metrics.js +277 -246
- package/dist/commands/health/llm-usage.js +19 -19
- package/dist/commands/health/md-report.js +16 -7
- package/dist/commands/health/metrics.js +67 -32
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +508 -0
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +16 -56
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/{migrate-storage-node.mjs → commands/health/types-checks.js} +1 -5
- package/dist/commands/health/types-improve.js +29 -0
- package/dist/{output/text/save.js → commands/health/types-metrics.js} +1 -2
- package/dist/commands/health/types-result.js +7 -0
- package/dist/commands/health/types-runs.js +4 -0
- package/dist/commands/health/types-session-log.js +4 -0
- package/dist/commands/health/types-windows.js +4 -0
- package/dist/commands/health/types.js +26 -21
- package/dist/commands/health/windows.js +2 -3
- package/dist/commands/health.js +296 -167
- package/dist/commands/improve/anti-collapse.js +5 -5
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +65 -52
- package/dist/commands/improve/consolidate/chunking.js +9 -7
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +454 -1354
- package/dist/commands/improve/content-hash.js +39 -0
- package/dist/commands/improve/distill/content-repair.js +4 -10
- package/dist/commands/improve/distill/promote-memory.js +89 -64
- package/dist/commands/improve/distill/quality-gate.js +118 -42
- package/dist/commands/improve/distill-guards.js +1 -1
- package/dist/commands/improve/distill-promotion-policy.js +33 -888
- package/dist/commands/improve/distill.js +607 -363
- package/dist/commands/improve/eligibility.js +165 -79
- package/dist/commands/improve/extract-cli.js +35 -126
- package/dist/commands/improve/extract-prompt.js +6 -35
- package/dist/commands/improve/extract.js +640 -391
- package/dist/commands/improve/feedback-valence.js +2 -12
- package/dist/commands/improve/improve-cli.js +134 -135
- package/dist/commands/improve/improve-result-file.js +30 -50
- package/dist/commands/improve/improve-run-types.js +4 -0
- package/dist/commands/improve/improve-strategies.js +135 -0
- package/dist/commands/improve/improve.js +904 -701
- package/dist/commands/improve/locks.js +64 -111
- package/dist/commands/improve/loop-stages.js +1110 -923
- package/dist/commands/improve/memory/derived-ref.js +124 -0
- package/dist/commands/improve/memory/memory-belief.js +79 -7
- package/dist/commands/improve/memory/memory-contradiction-detect.js +49 -52
- package/dist/commands/improve/memory/memory-improve.js +25 -37
- package/dist/commands/improve/outcome-loop.js +25 -88
- package/dist/commands/improve/preparation.js +1034 -813
- package/dist/commands/improve/proactive-maintenance.js +34 -9
- package/dist/commands/improve/proposal-envelope.js +31 -0
- package/dist/commands/improve/reflect.js +983 -794
- package/dist/commands/improve/run-context.js +119 -0
- package/dist/commands/improve/salience.js +24 -127
- package/dist/commands/improve/session-asset.js +7 -3
- package/dist/commands/improve/shared.js +14 -34
- package/dist/commands/improve/source-identity.js +28 -0
- package/dist/commands/improve/triage.js +20 -17
- package/dist/commands/lint/base-linter.js +340 -313
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +185 -30
- package/dist/commands/{events.js → log.js} +28 -38
- package/dist/commands/migrate-cli.js +54 -0
- package/dist/commands/migration-tool.js +55 -0
- package/dist/commands/observability-cli.js +70 -208
- package/dist/commands/proposal/diff-format.js +50 -0
- package/dist/commands/proposal/drain-policies.js +0 -6
- package/dist/commands/proposal/drain.js +91 -40
- package/dist/commands/proposal/proposal-cli.js +134 -132
- package/dist/commands/proposal/proposal-types.js +56 -0
- package/dist/commands/proposal/proposal.js +83 -65
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +105 -88
- package/dist/commands/proposal/repository.js +1303 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +16 -6
- package/dist/commands/proposal/validators/proposal-validators.js +61 -12
- package/dist/commands/proposal/validators/proposals.js +6 -8
- package/dist/commands/read/curate.js +78 -73
- package/dist/commands/read/knowledge.js +510 -13
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +84 -15
- package/dist/commands/read/search-cli.js +203 -96
- package/dist/commands/read/search.js +126 -94
- package/dist/commands/read/show.js +226 -250
- package/dist/commands/registry-cli.js +34 -60
- package/dist/commands/remember.js +18 -57
- package/dist/commands/sources/add-cli.js +104 -49
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +63 -0
- package/dist/commands/sources/info.js +27 -15
- package/dist/commands/sources/init.js +30 -40
- package/dist/commands/sources/installed-stashes.js +469 -172
- package/dist/commands/sources/migration-help.js +7 -4
- package/dist/commands/sources/schema-repair.js +10 -9
- package/dist/commands/sources/self-update.js +182 -121
- package/dist/commands/sources/source-add.js +169 -178
- package/dist/commands/sources/source-clone.js +144 -41
- package/dist/commands/sources/source-manage.js +94 -59
- package/dist/commands/sources/sources-cli.js +64 -205
- package/dist/commands/sources/stash-cli.js +91 -54
- package/dist/commands/sources/stash-skeleton.js +1 -1
- package/dist/commands/tasks/tasks-cli.js +106 -104
- package/dist/commands/tasks/tasks.js +445 -262
- package/dist/commands/workflow-cli.js +232 -121
- package/dist/core/action-contributors.js +1 -1
- package/dist/core/activation-policy.js +49 -0
- package/dist/core/adapter/adapters/agent-skills-adapter.js +181 -0
- package/dist/core/adapter/adapters/akm-adapter.js +528 -0
- package/dist/core/adapter/adapters/akm-lint.js +392 -0
- package/dist/core/adapter/adapters/akm-metadata.js +387 -0
- package/dist/core/adapter/adapters/akm-task-adapter.js +149 -0
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +180 -0
- package/dist/core/adapter/adapters/claude-adapter.js +61 -0
- package/dist/core/adapter/adapters/dotenv-adapter.js +187 -0
- package/dist/core/adapter/adapters/generic-files-adapter.js +119 -0
- package/dist/core/adapter/adapters/index.js +80 -0
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +419 -0
- package/dist/core/adapter/adapters/okf-adapter.js +391 -0
- package/dist/core/adapter/adapters/opencode-adapter.js +68 -0
- package/dist/core/adapter/adapters/shared.js +286 -0
- package/dist/core/adapter/adapters/tool-dir-shared.js +217 -0
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +155 -0
- package/dist/core/adapter/bundle-adapter.js +4 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +44 -0
- package/dist/core/adapter/registry.js +56 -0
- package/dist/core/adapter/types.js +4 -0
- package/dist/core/asset/akm-markdown.js +30 -0
- package/dist/core/asset/asset-placement.js +243 -0
- package/dist/core/asset/asset-ref.js +110 -79
- package/dist/core/asset/asset-serialize.js +20 -0
- package/dist/core/asset/frontmatter.js +28 -12
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +274 -0
- package/dist/core/asset/stash-meta.js +2 -2
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +281 -86
- package/dist/core/config/config-io.js +42 -128
- package/dist/core/config/config-schema.js +233 -834
- package/dist/core/config/config-sources.js +162 -39
- package/dist/core/config/config-types.js +16 -11
- package/dist/core/config/config-version.js +29 -0
- package/dist/core/config/config-walker.js +126 -37
- package/dist/core/config/config.js +154 -331
- package/dist/core/config/deep-merge.js +41 -0
- package/dist/core/config/engine-semantics.js +28 -0
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +38 -0
- package/dist/core/config/schema/engines.js +116 -0
- package/dist/core/config/schema/experimental.js +47 -0
- package/dist/core/config/schema/feedback.js +31 -0
- package/dist/core/config/schema/improve-processes.js +389 -0
- package/dist/core/config/schema/improve.js +94 -0
- package/dist/core/config/schema/index-config.js +176 -0
- package/dist/core/config/schema/output.js +18 -0
- package/dist/core/config/schema/primitives.js +94 -0
- package/dist/core/config/schema/search.js +30 -0
- package/dist/core/config/schema/setup.js +18 -0
- package/dist/core/config/schema/sources-bundles.js +169 -0
- package/dist/core/config/schema/workflow.js +29 -0
- package/dist/core/env-secret-ref.js +155 -20
- package/dist/core/errors.js +17 -15
- package/dist/core/events-types.js +4 -0
- package/dist/core/events.js +46 -128
- package/dist/core/extra-params.js +62 -0
- package/dist/core/file-change.js +17 -0
- package/dist/core/file-lock.js +202 -57
- package/dist/core/fs-txn.js +392 -0
- package/dist/core/git-message.js +59 -0
- package/dist/core/improve-result.js +167 -0
- package/dist/core/json-schema.js +142 -0
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +1 -1
- package/dist/core/maintenance-barrier.js +135 -0
- package/dist/core/migration-operation.js +44 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/paths.js +22 -25
- package/dist/core/platform.js +10 -0
- package/dist/core/recognition-util.js +128 -0
- package/dist/core/redaction.js +392 -0
- package/dist/core/standards/resolve-standards-context.js +36 -65
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +5 -5
- package/dist/core/state/migrations.js +242 -11
- package/dist/core/state-db.js +98 -10
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +303 -0
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/time.js +20 -0
- package/dist/core/type-presentation.js +130 -0
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +834 -118
- package/dist/indexer/bundle-identity-guard.js +92 -0
- package/dist/indexer/db/graph-db.js +1 -25
- package/dist/indexer/db/llm-cache.js +1 -1
- package/dist/indexer/ensure-index.js +30 -9
- package/dist/indexer/graph/graph-boost.js +9 -30
- package/dist/indexer/graph/graph-extraction.js +41 -27
- package/dist/indexer/graph/graph-types.js +4 -0
- package/dist/indexer/index-writer-lock.js +93 -49
- package/dist/indexer/index-written-assets.js +100 -53
- package/dist/indexer/indexer.js +746 -329
- package/dist/indexer/init.js +18 -25
- package/dist/indexer/installations.js +142 -0
- package/dist/indexer/passes/dir-staleness.js +18 -10
- package/dist/indexer/passes/memory-inference.js +25 -15
- package/dist/indexer/passes/metadata.js +412 -243
- package/dist/indexer/scan/doc-to-entry.js +160 -0
- package/dist/indexer/scan/drain-dir.js +134 -0
- package/dist/indexer/search/db-search.js +292 -108
- package/dist/indexer/search/fts-query.js +64 -0
- package/dist/indexer/search/ranking-contributors.js +145 -25
- package/dist/indexer/search/ranking-types.js +4 -0
- package/dist/indexer/search/ranking.js +28 -71
- package/dist/indexer/search/search-attribution.js +67 -0
- package/dist/indexer/search/search-fields.js +18 -3
- package/dist/indexer/search/search-hit-enrichers.js +30 -40
- package/dist/indexer/search/search-source.js +157 -111
- package/dist/indexer/search/semantic-status.js +4 -1
- package/dist/indexer/usage/usage-events.js +10 -30
- package/dist/indexer/walk/file-context.js +3 -45
- package/dist/indexer/walk/matchers.js +42 -34
- package/dist/indexer/walk/path-resolver.js +11 -5
- package/dist/indexer/walk/walker.js +42 -14
- package/dist/integrations/agent/builder-shared.js +7 -0
- package/dist/integrations/agent/builders.js +5 -56
- package/dist/integrations/agent/config.js +3 -143
- package/dist/integrations/agent/detect.js +17 -2
- package/dist/integrations/agent/engine-resolution.js +231 -0
- package/dist/integrations/agent/index.js +1 -2
- package/dist/integrations/agent/model-aliases.js +16 -2
- package/dist/integrations/agent/profiles.js +36 -62
- package/dist/integrations/agent/prompts.js +46 -18
- package/dist/integrations/agent/runner-dispatch.js +93 -4
- package/dist/integrations/agent/runner.js +76 -208
- package/dist/integrations/agent/spawn.js +88 -196
- package/dist/integrations/harnesses/aider/agent-builder.js +114 -0
- package/dist/integrations/harnesses/aider/index.js +48 -0
- package/dist/integrations/harnesses/aider/result-extractor.js +53 -0
- package/dist/integrations/harnesses/amazonq/agent-builder.js +147 -0
- package/dist/integrations/harnesses/amazonq/index.js +45 -0
- package/dist/integrations/harnesses/amazonq/result-extractor.js +48 -0
- package/dist/integrations/harnesses/claude/agent-builder.js +46 -8
- package/dist/integrations/harnesses/claude/config-import.js +1 -3
- package/dist/integrations/harnesses/claude/index.js +24 -35
- package/dist/integrations/harnesses/claude/result-extractor.js +52 -0
- package/dist/integrations/harnesses/claude/session-log.js +27 -75
- package/dist/integrations/harnesses/codex/agent-builder.js +138 -0
- package/dist/integrations/harnesses/codex/index.js +52 -0
- package/dist/integrations/harnesses/codex/result-extractor.js +73 -0
- package/dist/integrations/harnesses/copilot/agent-builder.js +122 -0
- package/dist/integrations/harnesses/copilot/index.js +48 -0
- package/dist/integrations/harnesses/copilot/result-extractor.js +151 -0
- package/dist/integrations/harnesses/gemini/agent-builder.js +120 -0
- package/dist/integrations/harnesses/gemini/index.js +48 -0
- package/dist/integrations/harnesses/gemini/result-extractor.js +121 -0
- package/dist/integrations/harnesses/ids.js +24 -0
- package/dist/integrations/harnesses/index.js +54 -34
- package/dist/integrations/harnesses/opencode/agent-builder.js +23 -5
- package/dist/integrations/harnesses/opencode/config-import.js +1 -3
- package/dist/integrations/harnesses/opencode/index.js +14 -32
- package/dist/integrations/harnesses/opencode/session-log.js +67 -125
- package/dist/integrations/harnesses/opencode-sdk/harness.js +51 -0
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +681 -108
- package/dist/integrations/harnesses/openhands/agent-builder.js +128 -0
- package/dist/integrations/harnesses/openhands/index.js +48 -0
- package/dist/integrations/harnesses/openhands/result-extractor.js +103 -0
- package/dist/integrations/harnesses/pi/agent-builder.js +97 -0
- package/dist/integrations/harnesses/pi/index.js +45 -0
- package/dist/integrations/harnesses/pi/result-extractor.js +135 -0
- package/dist/integrations/harnesses/shared.js +17 -0
- package/dist/integrations/harnesses/types.js +43 -32
- package/dist/integrations/lockfile.js +211 -24
- package/dist/integrations/session-logs/index.js +36 -39
- package/dist/integrations/session-logs/provider-base.js +113 -0
- package/dist/llm/client.js +182 -110
- package/dist/llm/embedders/deterministic.js +2 -2
- package/dist/llm/embedders/remote.js +21 -9
- package/dist/llm/feature-gate.js +17 -57
- package/dist/llm/graph-extract.js +12 -13
- package/dist/llm/index-passes.js +8 -42
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +45 -30
- package/dist/llm/structured-call.js +16 -8
- package/dist/llm/usage-persist.js +30 -5
- package/dist/llm/usage-telemetry.js +59 -6
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/command-registry.js +27 -0
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +251 -0
- package/dist/output/html-render.js +11 -16
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -279
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +58 -84
- package/dist/output/shapes/passthrough.js +11 -39
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes/registry.js +12 -6
- package/dist/output/shapes.js +0 -9
- package/dist/output/text/{init.js → bundle-create.js} +3 -1
- package/dist/output/text/bundle-show.js +7 -0
- package/dist/output/text/command-format.js +562 -0
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/helpers.js +15 -1164
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +202 -0
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/registry.js +12 -6
- package/dist/output/text/show-directives.js +117 -0
- package/dist/output/text/show-format.js +103 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +332 -0
- package/dist/output/text/workflow.js +3 -2
- package/dist/output/text.js +10 -19
- package/dist/registry/factory.js +4 -6
- package/dist/registry/origin-resolve.js +16 -27
- package/dist/registry/providers/skills-sh.js +3 -3
- package/dist/registry/providers/static-index.js +15 -25
- package/dist/registry/resolve.js +43 -94
- package/dist/registry/semver.js +43 -0
- package/dist/runtime.js +81 -12
- package/dist/scripts/akm-migrate.js +35529 -0
- package/dist/setup/detect.js +5 -7
- package/dist/setup/detected-engines.js +136 -0
- package/dist/setup/engine-config.js +100 -0
- package/dist/setup/registry-stash-loader.js +3 -3
- package/dist/setup/semantic-assets.js +12 -9
- package/dist/setup/setup.js +444 -208
- package/dist/setup/steps/connection-shared.js +120 -0
- package/dist/setup/steps/connection.js +108 -305
- package/dist/setup/steps/platforms.js +13 -12
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +21 -15
- package/dist/setup/steps/stashdir.js +6 -4
- package/dist/setup/steps/tasks.js +236 -119
- package/dist/setup/steps.js +3 -2
- package/dist/sources/freshness.js +39 -0
- package/dist/sources/provider-factory.js +11 -17
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +278 -34
- package/dist/sources/providers/git-provider.js +54 -56
- package/dist/sources/providers/git-stash.js +420 -91
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +47 -22
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +2 -2
- package/dist/sources/resolve.js +11 -10
- package/dist/sources/snapshot-fetchers/types.js +4 -0
- package/dist/sources/{website-ingest.js → snapshot-fetchers/website-ingest.js} +110 -41
- package/dist/storage/database.js +60 -4
- package/dist/storage/engines/sqlite-migrations.js +156 -5
- package/dist/storage/locations.js +1 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +51 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -32
- package/dist/storage/repositories/index-connection.js +79 -0
- package/dist/storage/repositories/index-db.js +4 -3
- package/dist/storage/repositories/index-entries-repository.js +863 -0
- package/dist/{indexer/db/entry-mapper.js → storage/repositories/index-entry-mapper.js} +19 -2
- package/dist/storage/repositories/index-entry-types.js +4 -0
- package/dist/storage/repositories/index-fts-repository.js +167 -0
- package/dist/storage/repositories/index-llm-cache-repository.js +108 -0
- package/dist/storage/repositories/index-meta-repository.js +49 -0
- package/dist/{indexer/db/schema.js → storage/repositories/index-schema.js} +226 -100
- package/dist/storage/repositories/index-sql.js +12 -0
- package/dist/storage/repositories/index-utility-repository.js +356 -0
- package/dist/storage/repositories/index-vec-repository.js +250 -0
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +317 -75
- package/dist/storage/repositories/registry-cache.js +1 -1
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +110 -3
- package/dist/storage/repositories/workflow-runs-repository.js +240 -19
- package/dist/tasks/backends/cron.js +169 -46
- package/dist/tasks/backends/exec-utils.js +76 -3
- package/dist/tasks/backends/index.js +6 -9
- package/dist/tasks/backends/launchd.js +292 -55
- package/dist/tasks/backends/schtasks.js +557 -70
- package/dist/tasks/backends/types.js +4 -0
- package/dist/tasks/command-executable.js +93 -0
- package/dist/tasks/embedded.js +56 -38
- package/dist/tasks/parser.js +156 -64
- package/dist/tasks/resolve-akm-bin.js +144 -51
- package/dist/tasks/runner.js +377 -209
- package/dist/tasks/schedule.js +108 -19
- package/dist/tasks/scheduler-invocation.js +296 -0
- package/dist/tasks/schema.js +1 -1
- package/dist/tasks/task-id.js +35 -0
- package/dist/tasks/validator.js +30 -16
- package/dist/text-import-hook.mjs +1 -1
- package/dist/workflows/authoring/authoring.js +104 -43
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/cli.js +0 -16
- package/dist/workflows/concurrency-policy.js +15 -0
- package/dist/workflows/exec/brief.js +450 -0
- package/dist/workflows/exec/frozen-judge.js +47 -0
- package/dist/workflows/exec/native-executor.js +1038 -0
- package/dist/workflows/exec/param-secrets.js +115 -0
- package/dist/workflows/exec/report.js +1460 -0
- package/dist/workflows/exec/run-workflow.js +602 -0
- package/dist/workflows/exec/scheduler.js +71 -0
- package/dist/workflows/exec/step-work.js +1190 -0
- package/dist/workflows/exec/unit-writer.js +23 -0
- package/dist/workflows/exec/workflow-engine-gate.js +67 -0
- package/dist/workflows/exec/worktree.js +171 -0
- package/dist/workflows/ir/compile.js +246 -0
- package/dist/workflows/ir/freeze.js +233 -0
- package/dist/workflows/ir/params.js +54 -0
- package/dist/workflows/ir/plan-hash.js +68 -0
- package/dist/workflows/ir/schema.js +540 -0
- package/dist/workflows/parser.js +878 -304
- package/dist/workflows/program/expressions.js +181 -0
- package/dist/workflows/program/schema.js +51 -0
- package/dist/workflows/renderer.js +100 -45
- package/dist/workflows/resource-limits.js +22 -0
- package/dist/workflows/runtime/agent-identity.js +59 -14
- package/dist/workflows/runtime/checkin.js +1 -1
- package/dist/workflows/runtime/plan-classifier.js +131 -0
- package/dist/workflows/runtime/runs.js +376 -119
- package/dist/workflows/runtime/unit-checkin.js +45 -0
- package/dist/workflows/runtime/unit-phases.js +20 -0
- package/dist/workflows/runtime/workflow-asset-loader.js +241 -40
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +2 -3
- package/dist/workflows/validator.js +52 -30
- package/docs/README.md +42 -78
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.6.0.md +1 -1
- package/docs/migration/release-notes/0.7.0.md +9 -8
- package/docs/migration/release-notes/0.9.0.md +158 -14
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +844 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/data-and-telemetry.md +333 -0
- package/package.json +21 -17
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +4636 -0
- package/schemas/akm-task.json +87 -0
- package/schemas/akm-workflow.json +373 -0
- package/dist/akm-migrate-storage +0 -38
- package/dist/assets/help/help-accept.md +0 -12
- package/dist/assets/help/help-improve.md +0 -84
- package/dist/assets/help/help-proposals.md +0 -17
- package/dist/assets/help/help-propose.md +0 -17
- package/dist/assets/help/help-reject.md +0 -11
- package/dist/assets/profiles/frequent.json +0 -13
- package/dist/assets/profiles/recombine-only.json +0 -21
- package/dist/assets/profiles/reflect-distill.json +0 -30
- package/dist/assets/profiles/synthesize.json +0 -15
- package/dist/assets/prompts/procedural-system.md +0 -44
- package/dist/assets/prompts/recombine-system.md +0 -40
- package/dist/assets/prompts/staleness-detect-system.md +0 -6
- package/dist/assets/tasks/core/backup.yml +0 -4
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/assets/templates/html/default.html +0 -78
- package/dist/assets/templates/html/vendor/echarts.min.js +0 -45
- package/dist/assets/wiki/index-template.md +0 -12
- package/dist/assets/wiki/ingest-workflow-template.md +0 -83
- package/dist/assets/wiki/log-template.md +0 -8
- package/dist/assets/wiki/schema-template.md +0 -61
- package/dist/cli/config-migrate.js +0 -150
- package/dist/cli/config-validate.js +0 -39
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -487
- package/dist/commands/improve/calibration.js +0 -161
- package/dist/commands/improve/dedup.js +0 -482
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/improve/hot-probation.js +0 -45
- package/dist/commands/improve/improve-auto-accept.js +0 -276
- package/dist/commands/improve/improve-profiles.js +0 -168
- package/dist/commands/improve/procedural.js +0 -398
- package/dist/commands/improve/recombine.js +0 -818
- package/dist/commands/improve/schema-similarity-gate.js +0 -168
- package/dist/commands/lint/agent-linter.js +0 -44
- package/dist/commands/lint/command-linter.js +0 -44
- package/dist/commands/lint/default-linter.js +0 -16
- package/dist/commands/lint/fact-linter.js +0 -39
- package/dist/commands/lint/knowledge-linter.js +0 -16
- package/dist/commands/lint/memory-linter.js +0 -61
- package/dist/commands/lint/registry.js +0 -41
- package/dist/commands/lint/skill-linter.js +0 -45
- package/dist/commands/lint/task-linter.js +0 -50
- package/dist/commands/lint/workflow-linter.js +0 -81
- package/dist/commands/proposal/legacy-import.js +0 -115
- package/dist/commands/sources/history.js +0 -196
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/commands/wiki-cli.js +0 -292
- package/dist/core/asset/asset-registry.js +0 -76
- package/dist/core/asset/asset-spec.js +0 -259
- package/dist/core/config/config-migration.js +0 -602
- package/dist/core/deep-merge.js +0 -38
- package/dist/core/eval/rank-metrics.js +0 -113
- package/dist/core/ripgrep/install.js +0 -163
- package/dist/core/ripgrep/resolve.js +0 -81
- package/dist/indexer/db/db.js +0 -1413
- package/dist/indexer/manifest.js +0 -170
- package/dist/indexer/passes/metadata-contributors.js +0 -31
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -94
- package/dist/integrations/harnesses/opencode-sdk/index.js +0 -49
- package/dist/llm/call-ai.js +0 -62
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/output/shapes/distill.js +0 -14
- package/dist/output/shapes/history.js +0 -11
- package/dist/output/text/distill.js +0 -6
- package/dist/output/text/enable-disable.js +0 -8
- package/dist/output/text/history.js +0 -6
- package/dist/output/text/wiki.js +0 -16
- package/dist/registry/build-index.js +0 -386
- package/dist/scripts/migrate-storage.js +0 -19108
- package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +0 -9411
- package/dist/scripts/migrations/v16-to-v17.js +0 -141
- package/dist/setup/legacy-config.js +0 -106
- package/dist/storage/repositories/consolidation-repository.js +0 -38
- package/dist/storage/repositories/recombine-repository.js +0 -213
- package/dist/wiki/wiki-templates.js +0 -15
- package/dist/wiki/wiki.js +0 -1012
- package/dist/workflows/db.js +0 -215
- package/docs/data-and-telemetry.md +0 -226
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/registry.js +0 -0
- /package/dist/sources/{wiki-fetchers → snapshot-fetchers}/youtube.js +0 -0
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
2
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
3
|
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
import { decodeImproveResult } from "../../core/improve-result.js";
|
|
4
5
|
import { queryImproveRuns } from "../../storage/repositories/improve-runs-repository.js";
|
|
5
|
-
import {
|
|
6
|
+
import { decodeTaskHistoryMetadata } from "../../storage/repositories/task-history-repository.js";
|
|
6
7
|
export function roundRate(value) {
|
|
7
8
|
return Number(value.toFixed(4));
|
|
8
9
|
}
|
|
9
10
|
export function parseTaskMetadata(row) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
11
|
+
const metadata = decodeTaskHistoryMetadata(row.metadata_json);
|
|
12
|
+
return {
|
|
13
|
+
...(metadata.durationMs !== undefined ? { durationMs: metadata.durationMs } : {}),
|
|
14
|
+
...(metadata.detail ? { detail: metadata.detail } : {}),
|
|
15
|
+
...(metadata.engine !== undefined ? { engine: metadata.engine } : {}),
|
|
16
|
+
};
|
|
16
17
|
}
|
|
17
18
|
function createUnknownImproveMetrics() {
|
|
18
19
|
return {
|
|
@@ -20,14 +21,14 @@ function createUnknownImproveMetrics() {
|
|
|
20
21
|
completed: 0,
|
|
21
22
|
skipped: 0,
|
|
22
23
|
skipReasons: {},
|
|
24
|
+
resultRows: { total: 0, included: 0, skipped: { invalid: 0 } },
|
|
23
25
|
plannedRefs: 0,
|
|
24
|
-
|
|
26
|
+
strategyFilteredRefs: 0,
|
|
25
27
|
actions: {
|
|
26
28
|
reflect: { ok: 0, failed: 0, cooldown: 0, skipped: 0, guardRejected: 0, skippedByReason: {} },
|
|
27
29
|
distill: {
|
|
28
30
|
queued: 0,
|
|
29
31
|
llmFailed: 0,
|
|
30
|
-
qualityRejected: 0,
|
|
31
32
|
judgeRejected: 0,
|
|
32
33
|
validatorRejected: 0,
|
|
33
34
|
configDisabled: 0,
|
|
@@ -42,7 +43,6 @@ function createUnknownImproveMetrics() {
|
|
|
42
43
|
error: 0,
|
|
43
44
|
},
|
|
44
45
|
autoAccept: { promoted: 0, validationFailed: 0 },
|
|
45
|
-
calibration: summarizeCalibration([]),
|
|
46
46
|
reflectsWithErrorContext: 0,
|
|
47
47
|
coverageGapCount: 0,
|
|
48
48
|
evalCasesWritten: 0,
|
|
@@ -84,18 +84,16 @@ function createUnknownImproveMetrics() {
|
|
|
84
84
|
skippedAborted: 0,
|
|
85
85
|
unaccounted: 0,
|
|
86
86
|
htmlErrorCount: 0,
|
|
87
|
-
yieldEligibleRuns: 0,
|
|
88
|
-
yieldEligibleConsidered: 0,
|
|
89
|
-
yieldEligibleWritten: 0,
|
|
90
87
|
yieldRate: 0,
|
|
91
88
|
durationMs: 0,
|
|
92
|
-
writes: 0,
|
|
93
89
|
},
|
|
94
90
|
graphExtraction: {
|
|
95
91
|
ran: false,
|
|
96
92
|
extractedFiles: 0,
|
|
93
|
+
consideredFiles: 0,
|
|
97
94
|
entities: 0,
|
|
98
95
|
relations: 0,
|
|
96
|
+
extractionCoverage: 0,
|
|
99
97
|
cacheHits: 0,
|
|
100
98
|
cacheMisses: 0,
|
|
101
99
|
cacheHitRate: 0,
|
|
@@ -130,7 +128,6 @@ function createUnknownImproveMetrics() {
|
|
|
130
128
|
perfTelemetry: {
|
|
131
129
|
dedupPoolSize: 0,
|
|
132
130
|
llmPoolSize: 0,
|
|
133
|
-
judgedCacheSkipped: 0,
|
|
134
131
|
embedMs: 0,
|
|
135
132
|
embedCacheHits: 0,
|
|
136
133
|
embedCacheMisses: 0,
|
|
@@ -171,140 +168,134 @@ export function summarizeImproveCompleted(events) {
|
|
|
171
168
|
return metrics;
|
|
172
169
|
}
|
|
173
170
|
/**
|
|
174
|
-
*
|
|
175
|
-
* ImproveHealthMetrics. The aggregator merges these per-row metrics into one
|
|
176
|
-
* window-level metric.
|
|
171
|
+
* Read the machine-readable reason from a distill `outcome: "skipped"` result.
|
|
177
172
|
*/
|
|
178
|
-
function
|
|
179
|
-
const
|
|
173
|
+
function classifyDistillSkipReason(r) {
|
|
174
|
+
const explicitReason = typeof r?.skipReason === "string" ? r.skipReason : undefined;
|
|
175
|
+
return explicitReason || "unknown";
|
|
176
|
+
}
|
|
177
|
+
// ── projectRunMetrics phase helpers (chunk-9 WI-9.5c; file-level decompose of
|
|
178
|
+
// the single-envelope projection — each helper mutates its own disjoint
|
|
179
|
+
// subtree of the accumulator from the raw envelope, so call order does not
|
|
180
|
+
// matter; kept in envelope-field order for readability) ──────────────────────
|
|
181
|
+
/** plannedRefs / strategyFilteredRefs ref-count accounting. */
|
|
182
|
+
function applyPlannedRefs(metrics, result) {
|
|
180
183
|
// plannedRefs (array of {ref, reason})
|
|
181
184
|
const plannedRefs = result.plannedRefs;
|
|
182
185
|
if (Array.isArray(plannedRefs))
|
|
183
186
|
metrics.plannedRefs += plannedRefs.length;
|
|
184
|
-
//
|
|
187
|
+
// strategyFilteredRefs (array of {ref, reason}) — 2026-05-27: pre-filter
|
|
185
188
|
// bucket from `collectEligibleRefs` so the metric reflects work the
|
|
186
189
|
// planner dropped before signal-delta / per-pass dispatch.
|
|
187
|
-
const
|
|
188
|
-
if (Array.isArray(
|
|
189
|
-
metrics.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
190
|
+
const strategyFilteredRefs = result.strategyFilteredRefs;
|
|
191
|
+
if (Array.isArray(strategyFilteredRefs))
|
|
192
|
+
metrics.strategyFilteredRefs += strategyFilteredRefs.length;
|
|
193
|
+
}
|
|
194
|
+
/** One `actions[]` entry → the matching counter bucket (see ImproveHealthMetrics.actions jsdoc for the taxonomy). */
|
|
195
|
+
function applyAction(metrics, action) {
|
|
196
|
+
const mode = typeof action.mode === "string" ? action.mode : "";
|
|
197
|
+
switch (mode) {
|
|
198
|
+
case "reflect":
|
|
199
|
+
metrics.actions.reflect.ok += 1;
|
|
200
|
+
break;
|
|
201
|
+
case "reflect-failed":
|
|
202
|
+
metrics.actions.reflect.failed += 1;
|
|
203
|
+
break;
|
|
204
|
+
case "reflect-cooldown":
|
|
205
|
+
metrics.actions.reflect.cooldown += 1;
|
|
206
|
+
break;
|
|
207
|
+
case "reflect-skipped": {
|
|
208
|
+
metrics.actions.reflect.skipped += 1;
|
|
209
|
+
const r = action.result;
|
|
210
|
+
const reason = typeof r?.reason === "string" && r.reason.trim() ? r.reason : "unknown";
|
|
211
|
+
metrics.actions.reflect.skippedByReason[reason] = (metrics.actions.reflect.skippedByReason[reason] ?? 0) + 1;
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
case "reflect-guard-rejected":
|
|
215
|
+
metrics.actions.reflect.guardRejected += 1;
|
|
216
|
+
break;
|
|
217
|
+
case "distill": {
|
|
218
|
+
const r = action.result;
|
|
219
|
+
const outcome = typeof r?.outcome === "string" ? r.outcome : "";
|
|
220
|
+
switch (outcome) {
|
|
221
|
+
case "queued":
|
|
222
|
+
metrics.actions.distill.queued += 1;
|
|
201
223
|
break;
|
|
202
|
-
case "
|
|
203
|
-
metrics.actions.
|
|
224
|
+
case "llm_failed":
|
|
225
|
+
metrics.actions.distill.llmFailed += 1;
|
|
204
226
|
break;
|
|
205
|
-
case "
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
const reason = typeof r?.reason === "string" && r.reason.trim() ? r.reason : "unknown";
|
|
209
|
-
metrics.actions.reflect.skippedByReason[reason] = (metrics.actions.reflect.skippedByReason[reason] ?? 0) + 1;
|
|
227
|
+
case "quality_rejected":
|
|
228
|
+
case "review_needed":
|
|
229
|
+
metrics.actions.distill.judgeRejected += 1;
|
|
210
230
|
break;
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
metrics.actions.reflect.guardRejected += 1;
|
|
231
|
+
case "validation_failed":
|
|
232
|
+
metrics.actions.distill.validatorRejected += 1;
|
|
214
233
|
break;
|
|
215
|
-
case "
|
|
216
|
-
|
|
217
|
-
const outcome = typeof r?.outcome === "string" ? r.outcome : "";
|
|
218
|
-
switch (outcome) {
|
|
219
|
-
case "queued":
|
|
220
|
-
metrics.actions.distill.queued += 1;
|
|
221
|
-
break;
|
|
222
|
-
case "llm_failed":
|
|
223
|
-
metrics.actions.distill.llmFailed += 1;
|
|
224
|
-
break;
|
|
225
|
-
case "quality_rejected":
|
|
226
|
-
case "review_needed":
|
|
227
|
-
metrics.actions.distill.qualityRejected += 1;
|
|
228
|
-
metrics.actions.distill.judgeRejected += 1;
|
|
229
|
-
break;
|
|
230
|
-
case "validation_failed":
|
|
231
|
-
metrics.actions.distill.qualityRejected += 1;
|
|
232
|
-
metrics.actions.distill.validatorRejected += 1;
|
|
233
|
-
break;
|
|
234
|
-
case "config_disabled":
|
|
235
|
-
metrics.actions.distill.configDisabled += 1;
|
|
236
|
-
break;
|
|
237
|
-
case "skipped": {
|
|
238
|
-
// Previously dropped on the floor. The four sub-paths that emit
|
|
239
|
-
// `outcome: "skipped"` (see distill.ts:893, 1024, 1120, 1576):
|
|
240
|
-
// - recursive_lesson_input (type guard refused a lesson input)
|
|
241
|
-
// - conflict_noop (LLM resolved destination conflict as NOOP)
|
|
242
|
-
// - proposal-skipped cooldown / dedup at persistence
|
|
243
|
-
// 465 events/7d in the user's live stack. The result message
|
|
244
|
-
// typically encodes the reason; we also accept an explicit
|
|
245
|
-
// `skipReason` field when downstream code sets it.
|
|
246
|
-
metrics.actions.distill.deferred += 1;
|
|
247
|
-
const explicitReason = typeof r?.skipReason === "string" ? r.skipReason : undefined;
|
|
248
|
-
const msg = typeof r?.message === "string" ? r.message : "";
|
|
249
|
-
let reason = explicitReason ?? "unknown";
|
|
250
|
-
if (!explicitReason) {
|
|
251
|
-
if (/lesson inputs/i.test(msg))
|
|
252
|
-
reason = "recursive_lesson_input";
|
|
253
|
-
else if (/NOOP/.test(msg))
|
|
254
|
-
reason = "conflict_noop";
|
|
255
|
-
else if (/cooldown/i.test(msg))
|
|
256
|
-
reason = "proposal_cooldown";
|
|
257
|
-
else if (/content[_ ]?hash/i.test(msg))
|
|
258
|
-
reason = "content_hash_match";
|
|
259
|
-
}
|
|
260
|
-
metrics.actions.distill.deferredByReason[reason] =
|
|
261
|
-
(metrics.actions.distill.deferredByReason[reason] ?? 0) + 1;
|
|
262
|
-
break;
|
|
263
|
-
}
|
|
264
|
-
default:
|
|
265
|
-
break;
|
|
266
|
-
}
|
|
234
|
+
case "config_disabled":
|
|
235
|
+
metrics.actions.distill.configDisabled += 1;
|
|
267
236
|
break;
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
237
|
+
case "skipped": {
|
|
238
|
+
// Previously dropped on the floor. The four sub-paths that emit
|
|
239
|
+
// `outcome: "skipped"` (see distill.ts:893, 1024, 1120, 1576):
|
|
240
|
+
// - recursive_lesson_input (type guard refused a lesson input)
|
|
241
|
+
// - conflict_noop (LLM resolved destination conflict as NOOP)
|
|
242
|
+
// - proposal-skipped cooldown / dedup at persistence
|
|
243
|
+
// 465 events/7d in the user's live stack. The result message
|
|
244
|
+
// typically encodes the reason; we also accept an explicit
|
|
245
|
+
// `skipReason` field when downstream code sets it.
|
|
246
|
+
metrics.actions.distill.deferred += 1;
|
|
247
|
+
const reason = classifyDistillSkipReason(r);
|
|
248
|
+
metrics.actions.distill.deferredByReason[reason] =
|
|
249
|
+
(metrics.actions.distill.deferredByReason[reason] ?? 0) + 1;
|
|
274
250
|
break;
|
|
275
251
|
}
|
|
276
|
-
|
|
277
|
-
metrics.actions.memoryPrune += 1;
|
|
278
|
-
break;
|
|
279
|
-
case "memory-inference":
|
|
280
|
-
metrics.actions.memoryInference += 1;
|
|
281
|
-
break;
|
|
282
|
-
case "graph-extraction":
|
|
283
|
-
metrics.actions.graphExtraction += 1;
|
|
284
|
-
break;
|
|
285
|
-
case "error":
|
|
286
|
-
metrics.actions.error += 1;
|
|
252
|
+
default:
|
|
287
253
|
break;
|
|
288
254
|
}
|
|
255
|
+
break;
|
|
289
256
|
}
|
|
257
|
+
case "memory-prune":
|
|
258
|
+
metrics.actions.memoryPrune += 1;
|
|
259
|
+
break;
|
|
260
|
+
case "memory-inference":
|
|
261
|
+
metrics.actions.memoryInference += 1;
|
|
262
|
+
break;
|
|
263
|
+
case "graph-extraction":
|
|
264
|
+
metrics.actions.graphExtraction += 1;
|
|
265
|
+
break;
|
|
266
|
+
case "error":
|
|
267
|
+
metrics.actions.error += 1;
|
|
268
|
+
break;
|
|
290
269
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
270
|
+
}
|
|
271
|
+
/** actions: split reflect / distill by outcome, count others. */
|
|
272
|
+
function applyActionsList(metrics, result) {
|
|
273
|
+
const actions = result.actions;
|
|
274
|
+
if (!Array.isArray(actions))
|
|
275
|
+
return;
|
|
276
|
+
for (const action of actions) {
|
|
277
|
+
applyAction(metrics, action);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Read the bounded `distillSkipped` aggregate into the corresponding total and
|
|
282
|
+
* per-reason health metrics.
|
|
283
|
+
*/
|
|
284
|
+
function applyDistillSkippedAggregate(metrics, result) {
|
|
297
285
|
const distillSkipped = result.distillSkipped;
|
|
298
|
-
if (distillSkipped
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
286
|
+
if (!distillSkipped || typeof distillSkipped !== "object")
|
|
287
|
+
return;
|
|
288
|
+
metrics.actions.distill.skipped += toFiniteNumber(distillSkipped.total);
|
|
289
|
+
const byReason = distillSkipped.byReason;
|
|
290
|
+
if (byReason && typeof byReason === "object") {
|
|
291
|
+
for (const [reason, count] of Object.entries(byReason)) {
|
|
292
|
+
metrics.actions.distill.skippedByReason[reason] =
|
|
293
|
+
(metrics.actions.distill.skippedByReason[reason] ?? 0) + toFiniteNumber(count);
|
|
306
294
|
}
|
|
307
295
|
}
|
|
296
|
+
}
|
|
297
|
+
/** autoAccept + the small envelope-level counters (reflectsWithErrorContext, coverageGaps, evalCasesWritten, deadUrls). */
|
|
298
|
+
function applyMiscCounters(metrics, result) {
|
|
308
299
|
metrics.autoAccept.promoted += toFiniteNumber(result.gateAutoAcceptedCount);
|
|
309
300
|
metrics.autoAccept.validationFailed += toFiniteNumber(result.gateAutoAcceptFailedCount);
|
|
310
301
|
metrics.reflectsWithErrorContext += toFiniteNumber(result.reflectsWithErrorContext);
|
|
@@ -313,79 +304,86 @@ function projectRunMetrics(result) {
|
|
|
313
304
|
metrics.evalCasesWritten += toFiniteNumber(result.evalCasesWritten);
|
|
314
305
|
if (Array.isArray(result.deadUrls))
|
|
315
306
|
metrics.deadUrlCount += result.deadUrls.length;
|
|
307
|
+
}
|
|
308
|
+
function applyMemorySummary(metrics, result) {
|
|
316
309
|
const memorySummary = result.memorySummary;
|
|
317
|
-
if (memorySummary)
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
310
|
+
if (!memorySummary)
|
|
311
|
+
return;
|
|
312
|
+
metrics.memorySummary.eligible += toFiniteNumber(memorySummary.eligible);
|
|
313
|
+
metrics.memorySummary.derived += toFiniteNumber(memorySummary.derived);
|
|
314
|
+
}
|
|
315
|
+
function applyMemoryCleanup(metrics, result) {
|
|
321
316
|
const memoryCleanup = result.memoryCleanup;
|
|
322
|
-
if (memoryCleanup)
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
317
|
+
if (!memoryCleanup)
|
|
318
|
+
return;
|
|
319
|
+
if (Array.isArray(memoryCleanup.pruneCandidates))
|
|
320
|
+
metrics.memoryCleanup.pruneCandidates += memoryCleanup.pruneCandidates.length;
|
|
321
|
+
if (Array.isArray(memoryCleanup.contradictionCandidates))
|
|
322
|
+
metrics.memoryCleanup.contradictionCandidates += memoryCleanup.contradictionCandidates.length;
|
|
323
|
+
if (Array.isArray(memoryCleanup.beliefStateTransitions))
|
|
324
|
+
metrics.memoryCleanup.beliefStateTransitions += memoryCleanup.beliefStateTransitions.length;
|
|
325
|
+
if (Array.isArray(memoryCleanup.consolidationCandidates))
|
|
326
|
+
metrics.memoryCleanup.consolidationCandidates += memoryCleanup.consolidationCandidates.length;
|
|
327
|
+
if (Array.isArray(memoryCleanup.archived))
|
|
328
|
+
metrics.memoryCleanup.archived += memoryCleanup.archived.length;
|
|
329
|
+
if (Array.isArray(memoryCleanup.warnings))
|
|
330
|
+
metrics.memoryCleanup.warnings += memoryCleanup.warnings.length;
|
|
331
|
+
}
|
|
332
|
+
function applyConsolidation(metrics, result) {
|
|
336
333
|
const consolidation = result.consolidation;
|
|
337
|
-
if (consolidation)
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
metrics.consolidation.
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
334
|
+
if (!consolidation)
|
|
335
|
+
return;
|
|
336
|
+
metrics.consolidation.processed += toFiniteNumber(consolidation.processed);
|
|
337
|
+
metrics.consolidation.merged += toFiniteNumber(consolidation.merged);
|
|
338
|
+
metrics.consolidation.deleted += toFiniteNumber(consolidation.deleted);
|
|
339
|
+
metrics.consolidation.contradicted += toFiniteNumber(consolidation.contradicted);
|
|
340
|
+
if (Array.isArray(consolidation.promoted))
|
|
341
|
+
metrics.consolidation.promoted += consolidation.promoted.length;
|
|
342
|
+
metrics.consolidation.failedChunks += toFiniteNumber(consolidation.failedChunks);
|
|
343
|
+
metrics.consolidation.totalChunks += toFiniteNumber(consolidation.totalChunks);
|
|
344
|
+
metrics.consolidation.durationMs += toFiniteNumber(consolidation.durationMs);
|
|
345
|
+
metrics.consolidation.judgedNoAction += toFiniteNumber(consolidation.judgedNoAction);
|
|
346
|
+
metrics.consolidation.mergedSecondaries += toFiniteNumber(consolidation.mergedSecondaries);
|
|
347
|
+
metrics.consolidation.failedChunkMemories += toFiniteNumber(consolidation.failedChunkMemories);
|
|
348
|
+
// Structured emitter (new on this branch): consolidate.ts now pushes
|
|
349
|
+
// per-ref grouped `{ref, skips: [{op, reason}]}` entries to `skipReasons`
|
|
350
|
+
// for every deterministic post-LLM rejection. Each ref appears once but
|
|
351
|
+
// may carry multiple skips; aggregate every reason. Pre-fix envelopes have
|
|
352
|
+
// neither field, so be defensive.
|
|
353
|
+
const skipReasons = consolidation.skipReasons;
|
|
354
|
+
if (Array.isArray(skipReasons)) {
|
|
355
|
+
for (const entry of skipReasons) {
|
|
356
|
+
if (!entry || typeof entry !== "object")
|
|
357
|
+
continue;
|
|
358
|
+
const skips = entry.skips;
|
|
359
|
+
if (!Array.isArray(skips))
|
|
360
|
+
continue;
|
|
361
|
+
for (const skip of skips) {
|
|
362
|
+
if (!skip || typeof skip !== "object")
|
|
359
363
|
continue;
|
|
360
|
-
const
|
|
361
|
-
if (!
|
|
364
|
+
const reason = skip.reason;
|
|
365
|
+
if (typeof reason !== "string" || !reason.trim())
|
|
362
366
|
continue;
|
|
363
|
-
|
|
364
|
-
if (!skip || typeof skip !== "object")
|
|
365
|
-
continue;
|
|
366
|
-
const reason = skip.reason;
|
|
367
|
-
if (typeof reason !== "string" || !reason.trim())
|
|
368
|
-
continue;
|
|
369
|
-
metrics.consolidation.skipReasons[reason] = (metrics.consolidation.skipReasons[reason] ?? 0) + 1;
|
|
370
|
-
}
|
|
367
|
+
metrics.consolidation.skipReasons[reason] = (metrics.consolidation.skipReasons[reason] ?? 0) + 1;
|
|
371
368
|
}
|
|
372
369
|
}
|
|
373
|
-
// WS-5: extract perf telemetry from the consolidation envelope.
|
|
374
|
-
// Pre-WS-5 envelopes lack `perfTelemetry`; be defensive.
|
|
375
|
-
const perf = consolidation.perfTelemetry;
|
|
376
|
-
if (perf) {
|
|
377
|
-
metrics.perfTelemetry.runsWithTelemetry += 1;
|
|
378
|
-
metrics.perfTelemetry.dedupPoolSize += toFiniteNumber(perf.dedupPoolSize);
|
|
379
|
-
metrics.perfTelemetry.llmPoolSize += toFiniteNumber(perf.llmPoolSize);
|
|
380
|
-
metrics.perfTelemetry.judgedCacheSkipped += toFiniteNumber(perf.judgedCacheSkipped);
|
|
381
|
-
metrics.perfTelemetry.embedMs += toFiniteNumber(perf.embedMs);
|
|
382
|
-
metrics.perfTelemetry.embedCacheHits += toFiniteNumber(perf.embedCacheHits);
|
|
383
|
-
metrics.perfTelemetry.embedCacheMisses += toFiniteNumber(perf.embedCacheMisses);
|
|
384
|
-
const budgetFrac = toFiniteNumber(perf.estimatedBudgetFractionUsed);
|
|
385
|
-
if (budgetFrac > 1.0)
|
|
386
|
-
metrics.perfTelemetry.overBudgetRuns += 1;
|
|
387
|
-
}
|
|
388
370
|
}
|
|
371
|
+
// WS-5: extract perf telemetry from the consolidation envelope.
|
|
372
|
+
// Pre-WS-5 envelopes lack `perfTelemetry`; be defensive.
|
|
373
|
+
const perf = consolidation.perfTelemetry;
|
|
374
|
+
if (perf) {
|
|
375
|
+
metrics.perfTelemetry.runsWithTelemetry += 1;
|
|
376
|
+
metrics.perfTelemetry.dedupPoolSize += toFiniteNumber(perf.dedupPoolSize);
|
|
377
|
+
metrics.perfTelemetry.llmPoolSize += toFiniteNumber(perf.llmPoolSize);
|
|
378
|
+
metrics.perfTelemetry.embedMs += toFiniteNumber(perf.embedMs);
|
|
379
|
+
metrics.perfTelemetry.embedCacheHits += toFiniteNumber(perf.embedCacheHits);
|
|
380
|
+
metrics.perfTelemetry.embedCacheMisses += toFiniteNumber(perf.embedCacheMisses);
|
|
381
|
+
const budgetFrac = toFiniteNumber(perf.estimatedBudgetFractionUsed);
|
|
382
|
+
if (budgetFrac > 1.0)
|
|
383
|
+
metrics.perfTelemetry.overBudgetRuns += 1;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
function applyMemoryInference(metrics, result) {
|
|
389
387
|
const memoryInference = result.memoryInference;
|
|
390
388
|
if (memoryInference) {
|
|
391
389
|
const considered = toFiniteNumber(memoryInference.considered);
|
|
@@ -400,25 +398,17 @@ function projectRunMetrics(result) {
|
|
|
400
398
|
metrics.memoryInference.skippedAborted += toFiniteNumber(memoryInference.skippedAborted);
|
|
401
399
|
metrics.memoryInference.unaccounted += toFiniteNumber(memoryInference.unaccounted);
|
|
402
400
|
metrics.memoryInference.htmlErrorCount += toFiniteNumber(memoryInference.htmlErrorCount);
|
|
403
|
-
// Yield-rate gating: pre-cache-feature envelopes lack the `cacheHits`
|
|
404
|
-
// field entirely. Treating their `considered` as freshAttempts (since
|
|
405
|
-
// cacheHits=0) is mathematically tempting but operationally wrong —
|
|
406
|
-
// historical runs with the legacy schema have no cache instrumentation
|
|
407
|
-
// and the SUM dragged the reported rate to ~14% in local data. Only
|
|
408
|
-
// contribute to the yield aggregate when the envelope actually carries
|
|
409
|
-
// the field. See investigation 2026-05-26.
|
|
410
|
-
if (Object.hasOwn(memoryInference, "cacheHits")) {
|
|
411
|
-
metrics.memoryInference.yieldEligibleRuns += 1;
|
|
412
|
-
metrics.memoryInference.yieldEligibleConsidered += considered;
|
|
413
|
-
metrics.memoryInference.yieldEligibleWritten += writtenFacts;
|
|
414
|
-
}
|
|
415
401
|
}
|
|
416
402
|
metrics.memoryInference.durationMs += toFiniteNumber(result.memoryInferenceDurationMs);
|
|
403
|
+
}
|
|
404
|
+
function applyGraphExtraction(metrics, result) {
|
|
417
405
|
const graphExtraction = result.graphExtraction;
|
|
418
406
|
if (graphExtraction) {
|
|
419
407
|
const quality = graphExtraction.quality;
|
|
420
|
-
if (quality)
|
|
408
|
+
if (quality) {
|
|
421
409
|
metrics.graphExtraction.extractedFiles += toFiniteNumber(quality.extractedFiles);
|
|
410
|
+
metrics.graphExtraction.consideredFiles += toFiniteNumber(quality.consideredFiles);
|
|
411
|
+
}
|
|
422
412
|
metrics.graphExtraction.entities += toFiniteNumber(graphExtraction.totalEntities);
|
|
423
413
|
metrics.graphExtraction.relations += toFiniteNumber(graphExtraction.totalRelations);
|
|
424
414
|
const telemetry = graphExtraction.telemetry;
|
|
@@ -433,18 +423,40 @@ function projectRunMetrics(result) {
|
|
|
433
423
|
}
|
|
434
424
|
}
|
|
435
425
|
metrics.graphExtraction.durationMs += toFiniteNumber(result.graphExtractionDurationMs);
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
metrics.sessionExtraction.
|
|
445
|
-
metrics.sessionExtraction.durationMs += toFiniteNumber(e.durationMs);
|
|
426
|
+
}
|
|
427
|
+
function applySessionExtraction(metrics, result) {
|
|
428
|
+
if (!Array.isArray(result.extract))
|
|
429
|
+
return;
|
|
430
|
+
for (const e of result.extract) {
|
|
431
|
+
metrics.sessionExtraction.sessionsScanned += toFiniteNumber(e.sessionsProcessed);
|
|
432
|
+
metrics.sessionExtraction.sessionsSkipped += toFiniteNumber(e.sessionsSkipped);
|
|
433
|
+
if (Array.isArray(e.sessions)) {
|
|
434
|
+
metrics.sessionExtraction.sessionsExtracted += e.sessions.filter((s) => Array.isArray(s.proposalIds) && s.proposalIds.length > 0).length;
|
|
446
435
|
}
|
|
436
|
+
metrics.sessionExtraction.proposalsCreated += Array.isArray(e.proposals) ? e.proposals.length : 0;
|
|
437
|
+
metrics.sessionExtraction.warnings += Array.isArray(e.warnings) ? e.warnings.length : 0;
|
|
438
|
+
metrics.sessionExtraction.durationMs += toFiniteNumber(e.durationMs);
|
|
447
439
|
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Project a single `improve_runs.result_json` envelope into an accumulator-shaped
|
|
443
|
+
* ImproveHealthMetrics. The aggregator merges these per-row metrics into one
|
|
444
|
+
* window-level metric. File-level decomposed (chunk-9 WI-9.5c) into one
|
|
445
|
+
* `apply*` helper per envelope section above; each mutates its own disjoint
|
|
446
|
+
* subtree of the accumulator so the call order below is not load-bearing.
|
|
447
|
+
*/
|
|
448
|
+
function projectRunMetrics(result) {
|
|
449
|
+
const metrics = createUnknownImproveMetrics();
|
|
450
|
+
applyPlannedRefs(metrics, result);
|
|
451
|
+
applyActionsList(metrics, result);
|
|
452
|
+
applyDistillSkippedAggregate(metrics, result);
|
|
453
|
+
applyMiscCounters(metrics, result);
|
|
454
|
+
applyMemorySummary(metrics, result);
|
|
455
|
+
applyMemoryCleanup(metrics, result);
|
|
456
|
+
applyConsolidation(metrics, result);
|
|
457
|
+
applyMemoryInference(metrics, result);
|
|
458
|
+
applyGraphExtraction(metrics, result);
|
|
459
|
+
applySessionExtraction(metrics, result);
|
|
448
460
|
return metrics;
|
|
449
461
|
}
|
|
450
462
|
/**
|
|
@@ -465,19 +477,11 @@ function finalizeImproveMetrics(metrics) {
|
|
|
465
477
|
metrics.memoryInference.considered > 0 ||
|
|
466
478
|
metrics.memoryInference.written > 0 ||
|
|
467
479
|
metrics.memoryInference.durationMs > 0;
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
// envelopes. Only runs whose envelope carries a `cacheHits` field
|
|
471
|
-
// contribute to freshAttempts/yieldRate; legacy rows remain in
|
|
472
|
-
// `considered`/`written` for totals but are excluded from the rate so
|
|
473
|
-
// they cannot drag it down. See ImproveHealthMetrics.memoryInference
|
|
474
|
-
// jsdoc for the rationale.
|
|
475
|
-
metrics.memoryInference.freshAttempts = Math.max(0, metrics.memoryInference.yieldEligibleConsidered -
|
|
476
|
-
metrics.memoryInference.cacheHits -
|
|
477
|
-
metrics.memoryInference.skippedAborted);
|
|
480
|
+
// Yield denominator excludes cache hits and aborted records.
|
|
481
|
+
metrics.memoryInference.freshAttempts = Math.max(0, metrics.memoryInference.considered - metrics.memoryInference.cacheHits - metrics.memoryInference.skippedAborted);
|
|
478
482
|
metrics.memoryInference.yieldRate =
|
|
479
483
|
metrics.memoryInference.freshAttempts > 0
|
|
480
|
-
? roundRate(metrics.memoryInference.
|
|
484
|
+
? roundRate(metrics.memoryInference.written / metrics.memoryInference.freshAttempts)
|
|
481
485
|
: 0;
|
|
482
486
|
metrics.graphExtraction.ran =
|
|
483
487
|
metrics.graphExtraction.extractedFiles > 0 ||
|
|
@@ -485,6 +489,10 @@ function finalizeImproveMetrics(metrics) {
|
|
|
485
489
|
metrics.graphExtraction.durationMs > 0;
|
|
486
490
|
const cacheTotal = metrics.graphExtraction.cacheHits + metrics.graphExtraction.cacheMisses;
|
|
487
491
|
metrics.graphExtraction.cacheHitRate = cacheTotal > 0 ? roundRate(metrics.graphExtraction.cacheHits / cacheTotal) : 0;
|
|
492
|
+
metrics.graphExtraction.extractionCoverage =
|
|
493
|
+
metrics.graphExtraction.consideredFiles > 0
|
|
494
|
+
? roundRate(metrics.graphExtraction.extractedFiles / metrics.graphExtraction.consideredFiles)
|
|
495
|
+
: 0;
|
|
488
496
|
metrics.sessionExtraction.ran =
|
|
489
497
|
metrics.sessionExtraction.sessionsScanned > 0 ||
|
|
490
498
|
metrics.sessionExtraction.proposalsCreated > 0 ||
|
|
@@ -496,8 +504,8 @@ function finalizeImproveMetrics(metrics) {
|
|
|
496
504
|
*/
|
|
497
505
|
function mergeImproveMetrics(dst, src) {
|
|
498
506
|
dst.plannedRefs += src.plannedRefs;
|
|
499
|
-
//
|
|
500
|
-
// active
|
|
507
|
+
// strategyFilteredRefs is the count of refs the planner drops up-front for the
|
|
508
|
+
// active strategy — recomputed against the (stable) stash every run, so it is a
|
|
501
509
|
// snapshot, NOT a per-run increment. Summing it re-counts the same refs each
|
|
502
510
|
// run (the ~2.4M bug). Set from the most recent run in summarizeImproveRuns.
|
|
503
511
|
dst.actions.reflect.ok += src.actions.reflect.ok;
|
|
@@ -510,7 +518,6 @@ function mergeImproveMetrics(dst, src) {
|
|
|
510
518
|
}
|
|
511
519
|
dst.actions.distill.queued += src.actions.distill.queued;
|
|
512
520
|
dst.actions.distill.llmFailed += src.actions.distill.llmFailed;
|
|
513
|
-
dst.actions.distill.qualityRejected += src.actions.distill.qualityRejected;
|
|
514
521
|
dst.actions.distill.judgeRejected += src.actions.distill.judgeRejected;
|
|
515
522
|
dst.actions.distill.validatorRejected += src.actions.distill.validatorRejected;
|
|
516
523
|
dst.actions.distill.configDisabled += src.actions.distill.configDisabled;
|
|
@@ -565,11 +572,10 @@ function mergeImproveMetrics(dst, src) {
|
|
|
565
572
|
dst.memoryInference.skippedAborted += src.memoryInference.skippedAborted;
|
|
566
573
|
dst.memoryInference.unaccounted += src.memoryInference.unaccounted;
|
|
567
574
|
dst.memoryInference.htmlErrorCount += src.memoryInference.htmlErrorCount;
|
|
568
|
-
dst.memoryInference.
|
|
569
|
-
dst.memoryInference.yieldEligibleConsidered += src.memoryInference.yieldEligibleConsidered;
|
|
570
|
-
dst.memoryInference.yieldEligibleWritten += src.memoryInference.yieldEligibleWritten;
|
|
575
|
+
dst.memoryInference.retryAttempts += src.memoryInference.retryAttempts;
|
|
571
576
|
dst.memoryInference.durationMs += src.memoryInference.durationMs;
|
|
572
577
|
dst.graphExtraction.extractedFiles += src.graphExtraction.extractedFiles;
|
|
578
|
+
dst.graphExtraction.consideredFiles += src.graphExtraction.consideredFiles;
|
|
573
579
|
dst.graphExtraction.entities += src.graphExtraction.entities;
|
|
574
580
|
dst.graphExtraction.relations += src.graphExtraction.relations;
|
|
575
581
|
dst.graphExtraction.cacheHits += src.graphExtraction.cacheHits;
|
|
@@ -578,6 +584,7 @@ function mergeImproveMetrics(dst, src) {
|
|
|
578
584
|
dst.graphExtraction.failures += src.graphExtraction.failures;
|
|
579
585
|
dst.graphExtraction.htmlErrors += src.graphExtraction.htmlErrors;
|
|
580
586
|
dst.graphExtraction.nonArrayBatchFailures += src.graphExtraction.nonArrayBatchFailures;
|
|
587
|
+
dst.graphExtraction.retryAttempts += src.graphExtraction.retryAttempts;
|
|
581
588
|
dst.graphExtraction.durationMs += src.graphExtraction.durationMs;
|
|
582
589
|
dst.sessionExtraction.sessionsScanned += src.sessionExtraction.sessionsScanned;
|
|
583
590
|
dst.sessionExtraction.sessionsExtracted += src.sessionExtraction.sessionsExtracted;
|
|
@@ -588,7 +595,6 @@ function mergeImproveMetrics(dst, src) {
|
|
|
588
595
|
// WS-5: merge perf telemetry (additive sums).
|
|
589
596
|
dst.perfTelemetry.dedupPoolSize += src.perfTelemetry.dedupPoolSize;
|
|
590
597
|
dst.perfTelemetry.llmPoolSize += src.perfTelemetry.llmPoolSize;
|
|
591
|
-
dst.perfTelemetry.judgedCacheSkipped += src.perfTelemetry.judgedCacheSkipped;
|
|
592
598
|
dst.perfTelemetry.embedMs += src.perfTelemetry.embedMs;
|
|
593
599
|
dst.perfTelemetry.embedCacheHits += src.perfTelemetry.embedCacheHits;
|
|
594
600
|
dst.perfTelemetry.embedCacheMisses += src.perfTelemetry.embedCacheMisses;
|
|
@@ -598,6 +604,15 @@ function mergeImproveMetrics(dst, src) {
|
|
|
598
604
|
// totalAssets is intentionally NOT merged here — set from the most recent run in summarizeImproveRuns.
|
|
599
605
|
dst.coverage.acceptedProposals += src.coverage.acceptedProposals;
|
|
600
606
|
}
|
|
607
|
+
function compareImproveRunRecency(a, b) {
|
|
608
|
+
const started = a.started_at.localeCompare(b.started_at);
|
|
609
|
+
if (started !== 0)
|
|
610
|
+
return started;
|
|
611
|
+
const completed = a.completed_at.localeCompare(b.completed_at);
|
|
612
|
+
if (completed !== 0)
|
|
613
|
+
return completed;
|
|
614
|
+
return a.id.localeCompare(b.id);
|
|
615
|
+
}
|
|
601
616
|
export function summarizeImproveRuns(db, since, until) {
|
|
602
617
|
const accum = createUnknownImproveMetrics();
|
|
603
618
|
const rows = queryImproveRuns(db, since, until);
|
|
@@ -611,24 +626,32 @@ export function summarizeImproveRuns(db, since, until) {
|
|
|
611
626
|
};
|
|
612
627
|
// memorySummary is a whole-stash snapshot per run, so the window value is the
|
|
613
628
|
// MOST RECENT run's snapshot (current state) — not a sum across runs.
|
|
614
|
-
let
|
|
629
|
+
let latestCompleteRow;
|
|
615
630
|
let latestMemorySummary;
|
|
616
|
-
let
|
|
631
|
+
let latestStrategyFilteredRefs = 0;
|
|
632
|
+
if (!accum.resultRows)
|
|
633
|
+
throw new Error("invariant: improve result-row accounting was not initialized");
|
|
634
|
+
accum.resultRows.total = rows.length;
|
|
617
635
|
for (const row of rows) {
|
|
618
|
-
let
|
|
636
|
+
let decoded;
|
|
619
637
|
try {
|
|
620
|
-
|
|
638
|
+
decoded = decodeImproveResult(row.result_json);
|
|
621
639
|
}
|
|
622
640
|
catch {
|
|
641
|
+
accum.resultRows.skipped.invalid += 1;
|
|
623
642
|
continue;
|
|
624
643
|
}
|
|
644
|
+
accum.resultRows.included += 1;
|
|
645
|
+
const result = decoded.envelope;
|
|
625
646
|
const perRow = projectRunMetrics(result);
|
|
626
647
|
mergeImproveMetrics(accum, perRow);
|
|
627
648
|
const startMs = new Date(row.started_at).getTime();
|
|
628
|
-
if (
|
|
629
|
-
|
|
649
|
+
if (result.terminated === undefined &&
|
|
650
|
+
Number.isFinite(startMs) &&
|
|
651
|
+
(latestCompleteRow === undefined || compareImproveRunRecency(row, latestCompleteRow) > 0)) {
|
|
652
|
+
latestCompleteRow = row;
|
|
630
653
|
latestMemorySummary = perRow.memorySummary;
|
|
631
|
-
|
|
654
|
+
latestStrategyFilteredRefs = perRow.strategyFilteredRefs;
|
|
632
655
|
}
|
|
633
656
|
// Collect per-phase durations directly off the envelope. consolidation's
|
|
634
657
|
// duration lives inside the sub-object; memoryInference and graphExtraction
|
|
@@ -648,7 +671,7 @@ export function summarizeImproveRuns(db, since, until) {
|
|
|
648
671
|
finalizeImproveMetrics(accum);
|
|
649
672
|
if (latestMemorySummary)
|
|
650
673
|
accum.memorySummary = latestMemorySummary;
|
|
651
|
-
accum.
|
|
674
|
+
accum.strategyFilteredRefs = latestStrategyFilteredRefs;
|
|
652
675
|
accum.wallTime.byPhase = {
|
|
653
676
|
consolidation: summarizePhaseDurations(phaseDurations.consolidation),
|
|
654
677
|
memoryInference: summarizePhaseDurations(phaseDurations.memoryInference),
|
|
@@ -681,11 +704,16 @@ export function summarizePhaseDurations(samples) {
|
|
|
681
704
|
*/
|
|
682
705
|
export function projectImproveRunSummary(row, wallTimeMs, taskId) {
|
|
683
706
|
let result = {};
|
|
707
|
+
let resultStatus = "invalid";
|
|
684
708
|
try {
|
|
685
|
-
|
|
709
|
+
const decoded = decodeImproveResult(row.result_json);
|
|
710
|
+
result = decoded.envelope;
|
|
711
|
+
resultStatus = "valid";
|
|
686
712
|
}
|
|
687
713
|
catch {
|
|
688
|
-
//
|
|
714
|
+
// Keep the persisted row visible in per-run output, but do not project its
|
|
715
|
+
// unknown payload or admit its duration to result-derived denominators.
|
|
716
|
+
wallTimeMs = 0;
|
|
689
717
|
}
|
|
690
718
|
const perRow = projectRunMetrics(result);
|
|
691
719
|
finalizeImproveMetrics(perRow);
|
|
@@ -699,6 +727,9 @@ export function projectImproveRunSummary(row, wallTimeMs, taskId) {
|
|
|
699
727
|
completedAt: row.completed_at,
|
|
700
728
|
wallTimeMs,
|
|
701
729
|
ok: row.ok === 1,
|
|
730
|
+
resultStatus,
|
|
731
|
+
resultComplete: resultStatus === "valid" && result.terminated === undefined,
|
|
732
|
+
strategy: row.strategy,
|
|
702
733
|
scope: {
|
|
703
734
|
mode: row.scope_mode,
|
|
704
735
|
...(row.scope_value ? { value: row.scope_value } : {}),
|
|
@@ -744,10 +775,10 @@ export function buildImproveSkipSummary(events) {
|
|
|
744
775
|
// - Per-occurrence (no `count`): one event per skipped ref → SUM is correct.
|
|
745
776
|
// - Aggregated snapshot (carries `count`): a single per-run event whose count
|
|
746
777
|
// is the number of refs that hit a STABLE, whole-stash condition that run
|
|
747
|
-
// (`no_new_signal`, `
|
|
778
|
+
// (`no_new_signal`, `strategy_filtered_all_passes`). Each run re-counts the
|
|
748
779
|
// same stable set, so summing across the window re-counts it N times (the
|
|
749
780
|
// 2.7M / 3M inflation). For these we keep the MOST RECENT run's count — the
|
|
750
|
-
// current snapshot — matching how memorySummary/
|
|
781
|
+
// current snapshot — matching how memorySummary/strategyFilteredRefs are
|
|
751
782
|
// handled. Events arrive in chronological (offset) order, so the last
|
|
752
783
|
// count-bearing event per reason is the latest run's value.
|
|
753
784
|
const summed = {};
|