akm-cli 0.9.0-rc.8 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1063 -44
- package/README.md +51 -25
- package/SECURITY.md +14 -1
- package/STABILITY.md +497 -0
- package/dist/akm +148 -35
- package/dist/{akm-migrate-storage → akm-migrate} +6 -9
- package/dist/assets/hints/cli-hints-full.md +223 -95
- package/dist/assets/hints/cli-hints-short.md +85 -22
- package/dist/assets/improve-strategies/default.json +1 -1
- package/dist/assets/improve-strategies/reflect-distill.json +1 -1
- package/dist/assets/prompts/memory-infer-user.md +2 -3
- package/dist/assets/stash-skeleton/README.md +6 -5
- package/dist/assets/stash-skeleton/facts/conventions/assets/agent.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/command.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/fact.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/knowledge.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/lesson.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/memory.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/script.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/skill.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/assets/workflow.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/backlinks.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/domains.md +2 -0
- package/dist/assets/stash-skeleton/facts/conventions/organization.md +20 -9
- package/dist/assets/tasks/core/extract.yml +1 -1
- package/dist/assets/tasks/core/version-check.yml +1 -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 +1 -3
- package/dist/assets/workflows/workflow-template.md +32 -15
- package/dist/cli/invocation.js +40 -15
- package/dist/cli/parse-args.js +0 -22
- package/dist/cli/retired-commands.js +121 -0
- package/dist/cli/shared.js +154 -22
- package/dist/cli/unknown-flags.js +236 -0
- package/dist/cli-node.mjs +2 -1
- package/dist/cli.js +696 -258
- package/dist/commands/agent/agent-dispatch.js +14 -3
- package/dist/commands/agent/contribute-cli.js +73 -88
- package/dist/commands/completions.js +79 -22
- package/dist/commands/config-cli.js +17 -150
- package/dist/commands/env/env-cli.js +59 -143
- package/dist/commands/env/env.js +12 -163
- package/dist/commands/env/marker-path.js +6 -0
- package/dist/commands/env/secret-cli.js +36 -66
- package/dist/commands/env/secret.js +24 -57
- package/dist/commands/feedback-cli.js +141 -87
- package/dist/commands/health/accept-rate.js +58 -0
- package/dist/commands/health/advisories.js +3 -4
- package/dist/commands/health/checks.js +85 -23
- package/dist/commands/health/html-report.js +7 -10
- package/dist/commands/health/improve-metrics.js +25 -83
- package/dist/commands/health/md-report.js +5 -9
- package/dist/commands/health/metrics.js +62 -20
- package/dist/commands/health/renderers.js +47 -0
- package/dist/commands/health/report-view-model.js +4 -5
- package/dist/commands/health/stash-exposure.js +1 -1
- package/dist/commands/health/surfaces.js +3 -48
- package/dist/commands/health/task-runs.js +3 -67
- package/dist/commands/health/types-improve.js +7 -0
- package/dist/commands/health.js +99 -28
- package/dist/commands/improve/anti-collapse.js +2 -2
- package/dist/commands/improve/autonomy-gate.js +68 -0
- package/dist/commands/improve/collapse-detector.js +41 -40
- package/dist/commands/improve/consolidate/eligibility.js +1 -23
- package/dist/commands/improve/consolidate/merge.js +4 -0
- package/dist/commands/improve/consolidate.js +140 -1000
- package/dist/commands/improve/distill/promote-memory.js +12 -12
- package/dist/commands/improve/distill/quality-gate.js +6 -6
- package/dist/commands/improve/distill.js +58 -69
- package/dist/commands/improve/eligibility.js +105 -57
- package/dist/commands/improve/extract-cli.js +14 -133
- package/dist/commands/improve/improve-cli.js +98 -114
- package/dist/commands/improve/improve-result-file.js +1 -28
- package/dist/commands/improve/improve-strategies.js +8 -5
- package/dist/commands/improve/improve.js +128 -91
- package/dist/commands/improve/loop-stages.js +182 -20
- package/dist/commands/improve/memory/derived-ref.js +45 -43
- package/dist/commands/improve/memory/memory-belief.js +1 -1
- package/dist/commands/improve/memory/memory-contradiction-detect.js +4 -12
- package/dist/commands/improve/memory/memory-improve.js +6 -5
- package/dist/commands/improve/outcome-loop.js +22 -65
- package/dist/commands/improve/preparation.js +114 -123
- package/dist/commands/improve/proactive-maintenance.js +2 -5
- package/dist/commands/improve/reflect.js +56 -160
- package/dist/commands/improve/salience.js +11 -122
- package/dist/commands/improve/source-identity.js +10 -38
- package/dist/commands/lint/base-linter.js +20 -124
- package/dist/commands/lint/env-key-rules.js +31 -47
- package/dist/commands/lint/index.js +249 -43
- package/dist/commands/{events.js → log.js} +33 -38
- package/dist/commands/migrate-cli.js +92 -12
- package/dist/commands/migration-tool.js +46 -0
- package/dist/commands/observability-cli.js +70 -209
- package/dist/commands/proposal/drain.js +101 -29
- package/dist/commands/proposal/proposal-cli.js +76 -48
- package/dist/commands/proposal/proposal.js +54 -18
- package/dist/commands/proposal/propose-cli.js +88 -0
- package/dist/commands/proposal/propose.js +23 -15
- package/dist/commands/proposal/repository.js +701 -278
- package/dist/commands/proposal/validators/proposal-quality-validators.js +2 -8
- package/dist/commands/proposal/validators/proposal-validators.js +55 -7
- package/dist/commands/proposal/validators/proposals.js +4 -7
- package/dist/commands/read/curate.js +34 -53
- package/dist/commands/read/knowledge.js +150 -95
- package/dist/commands/read/registry-search.js +2 -2
- package/dist/commands/read/remember-cli.js +42 -15
- package/dist/commands/read/search-cli.js +180 -78
- package/dist/commands/read/search.js +58 -43
- package/dist/commands/read/show.js +197 -141
- package/dist/commands/registry-cli.js +12 -51
- package/dist/commands/remember.js +14 -57
- package/dist/commands/sources/add-cli.js +100 -31
- package/dist/commands/sources/bundle-cli.js +166 -0
- package/dist/commands/sources/bundle-config-ops.js +7 -2
- package/dist/commands/sources/info.js +18 -5
- package/dist/commands/sources/init.js +12 -12
- package/dist/commands/sources/installed-stashes.js +382 -98
- package/dist/commands/sources/schema-repair.js +3 -2
- package/dist/commands/sources/self-update.js +131 -38
- package/dist/commands/sources/source-add.js +72 -17
- package/dist/commands/sources/source-clone.js +129 -45
- package/dist/commands/sources/source-manage.js +43 -23
- package/dist/commands/sources/sources-cli.js +57 -208
- package/dist/commands/sources/stash-cli.js +46 -53
- package/dist/commands/tasks/tasks-cli.js +91 -97
- package/dist/commands/tasks/tasks.js +276 -421
- package/dist/commands/workflow-cli.js +175 -450
- package/dist/core/adapter/adapters/akm-adapter.js +47 -28
- package/dist/core/adapter/adapters/akm-lint.js +42 -27
- package/dist/core/adapter/adapters/akm-metadata.js +15 -44
- package/dist/core/adapter/adapters/akm-task-adapter.js +15 -13
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +55 -71
- package/dist/core/adapter/adapters/dotenv-adapter.js +1 -1
- package/dist/core/adapter/adapters/generic-files-adapter.js +2 -0
- package/dist/core/adapter/adapters/index.js +6 -6
- package/dist/core/adapter/adapters/llm-wiki-adapter.js +14 -8
- package/dist/core/adapter/adapters/okf-adapter.js +187 -19
- package/dist/core/adapter/adapters/shared.js +3 -19
- package/dist/core/adapter/adapters/tool-dir-shared.js +8 -3
- package/dist/core/adapter/adapters/website-snapshot-adapter.js +1 -0
- package/dist/core/adapter/detect-adapter.js +17 -0
- package/dist/core/adapter/recognize-match.js +6 -4
- package/dist/core/adapter/validate-context.js +214 -0
- package/dist/core/asset/akm-markdown.js +63 -0
- package/dist/core/asset/asset-placement.js +20 -6
- package/dist/core/asset/asset-ref.js +11 -9
- package/dist/core/asset/frontmatter-lint.js +30 -0
- package/dist/core/asset/frontmatter.js +37 -9
- package/dist/core/asset/markdown.js +40 -51
- package/dist/core/asset/resolve-ref.js +89 -18
- package/dist/core/asset/stash-meta.js +1 -1
- package/dist/core/bundle-id.js +51 -0
- package/dist/core/common.js +152 -38
- package/dist/core/config/config-io.js +12 -1
- package/dist/core/config/config-schema.js +35 -8
- package/dist/core/config/config-sources.js +55 -11
- package/dist/core/config/config-walker.js +25 -9
- package/dist/core/config/config.js +9 -48
- package/dist/core/config/experimental.js +21 -0
- package/dist/core/config/schema/embedding.js +5 -1
- package/dist/core/config/schema/experimental.js +30 -0
- package/dist/core/config/schema/improve-processes.js +0 -6
- package/dist/core/config/schema/improve.js +21 -3
- package/dist/core/config/schema/index-config.js +8 -15
- package/dist/core/config/schema/output.js +4 -1
- package/dist/core/config/schema/setup.js +9 -18
- package/dist/core/config/schema/sources-bundles.js +49 -33
- package/dist/core/config/schema/workflow.js +3 -3
- package/dist/core/env-secret-ref.js +76 -46
- package/dist/core/errors.js +18 -12
- package/dist/core/events.js +46 -128
- package/dist/core/file-change.js +6 -5
- package/dist/core/fs-txn.js +83 -7
- package/dist/core/git-message.js +2 -2
- package/dist/core/improve-result.js +1 -100
- package/dist/core/lesson-lint.js +1 -17
- package/dist/core/logs-db.js +2 -1
- package/dist/core/migration-operation.js +16 -0
- package/dist/core/mutation-target.js +78 -0
- package/dist/core/parse.js +4 -1
- package/dist/core/paths.js +17 -20
- package/dist/core/recognition-util.js +12 -14
- package/dist/core/redaction.js +34 -0
- package/dist/core/standards/resolve-standards-context.js +2 -14
- package/dist/core/standards/resolve-stash-standards.js +2 -2
- package/dist/core/standards/resolve-type-conventions.js +2 -2
- package/dist/core/state/migrations.js +41 -18
- package/dist/core/state-db.js +5 -14
- package/dist/core/structured.js +1 -1
- package/dist/core/subprocess.js +6 -4
- package/dist/core/text-truncation.js +9 -5
- package/dist/core/type-presentation.js +3 -3
- package/dist/core/warn.js +0 -3
- package/dist/core/write-source.js +771 -95
- package/dist/indexer/bundle-identity-guard.js +3 -2
- package/dist/indexer/db/graph-db.js +0 -24
- package/dist/indexer/ensure-index.js +1 -0
- package/dist/indexer/graph/graph-boost.js +9 -34
- package/dist/indexer/graph/graph-extraction.js +8 -5
- package/dist/indexer/index-writer-lock.js +53 -17
- package/dist/indexer/index-written-assets.js +16 -22
- package/dist/indexer/indexer.js +497 -239
- package/dist/indexer/installations.js +14 -96
- package/dist/indexer/passes/dir-staleness.js +16 -9
- package/dist/indexer/passes/memory-inference.js +11 -9
- package/dist/indexer/passes/metadata.js +113 -47
- package/dist/indexer/scan/doc-to-entry.js +38 -1
- package/dist/indexer/scan/drain-dir.js +13 -23
- package/dist/indexer/search/db-search.js +99 -54
- package/dist/indexer/search/fts-query.js +47 -24
- package/dist/indexer/search/ranking-contributors.js +42 -20
- package/dist/indexer/search/ranking.js +18 -99
- package/dist/indexer/search/search-fields.js +7 -2
- package/dist/indexer/search/search-source.js +82 -93
- package/dist/indexer/usage/usage-events.js +0 -89
- package/dist/indexer/walk/file-context.js +2 -1
- package/dist/indexer/walk/matchers.js +30 -43
- package/dist/indexer/walk/path-resolver.js +7 -2
- package/dist/indexer/walk/walker.js +38 -12
- package/dist/integrations/agent/builders.js +0 -6
- package/dist/integrations/agent/config.js +2 -2
- package/dist/integrations/agent/detect.js +49 -19
- package/dist/integrations/agent/engine-fallback.js +76 -0
- package/dist/integrations/agent/profiles.js +14 -0
- package/dist/integrations/agent/prompts.js +12 -8
- package/dist/integrations/agent/runner-dispatch.js +4 -2
- package/dist/integrations/agent/runner.js +0 -1
- package/dist/integrations/agent/spawn.js +5 -6
- package/dist/integrations/github.js +1 -1
- package/dist/integrations/harnesses/aider/agent-builder.js +6 -4
- package/dist/integrations/harnesses/amazonq/agent-builder.js +7 -4
- package/dist/integrations/harnesses/claude/session-log.js +0 -10
- package/dist/integrations/harnesses/codex/agent-builder.js +5 -2
- package/dist/integrations/harnesses/copilot/agent-builder.js +5 -3
- package/dist/integrations/harnesses/gemini/agent-builder.js +5 -3
- package/dist/integrations/harnesses/index.js +3 -7
- package/dist/integrations/harnesses/opencode/agent-builder.js +21 -2
- package/dist/integrations/harnesses/opencode/session-log.js +0 -15
- package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +13 -4
- package/dist/integrations/harnesses/openhands/agent-builder.js +9 -6
- package/dist/integrations/harnesses/pi/agent-builder.js +6 -4
- package/dist/integrations/lockfile.js +101 -6
- package/dist/integrations/session-logs/index.js +3 -28
- package/dist/llm/client.js +136 -100
- package/dist/llm/embedders/remote.js +13 -5
- package/dist/llm/feature-gate.js +4 -12
- package/dist/llm/graph-extract.js +5 -11
- package/dist/llm/memory-infer.js +144 -1
- package/dist/llm/metadata-enhance.js +5 -7
- package/dist/llm/structured-call.js +1 -1
- package/dist/llm/usage-persist.js +26 -5
- package/dist/llm/usage-telemetry.js +25 -2
- package/dist/output/cli-hints.js +1 -2
- package/dist/output/context.js +22 -7
- package/dist/output/format-exempt.js +80 -0
- package/dist/output/generic-render.js +259 -0
- package/dist/output/render-registry.js +57 -0
- package/dist/output/renderers.js +14 -36
- package/dist/output/shapes/curate.js +10 -1
- package/dist/output/shapes/events.js +12 -7
- package/dist/output/shapes/helpers.js +56 -83
- package/dist/output/shapes/migrate.js +8 -0
- package/dist/output/shapes/passthrough.js +7 -41
- package/dist/output/shapes/proposal/producer.js +15 -7
- package/dist/output/shapes.js +2 -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 +164 -96
- package/dist/output/text/env.js +1 -3
- package/dist/output/text/events.js +8 -7
- package/dist/output/text/health-format.js +103 -0
- package/dist/output/text/health.js +7 -0
- package/dist/output/text/helpers.js +10 -8
- package/dist/output/text/lint-format.js +43 -0
- package/dist/output/text/{save.js → lint.js} +2 -2
- package/dist/output/text/migrate.js +88 -0
- package/dist/output/text/proposal/producer.js +4 -2
- package/dist/output/text/proposal-format.js +44 -72
- package/dist/output/text/registry-commands.js +1 -2
- package/dist/output/text/show-directives.js +15 -7
- package/dist/output/text/status-list.js +32 -0
- package/dist/output/text/sync.js +5 -0
- package/dist/output/text/workflow-format.js +24 -203
- package/dist/output/text/workflow.js +1 -7
- package/dist/output/text.js +16 -17
- 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 +13 -23
- package/dist/registry/resolve.js +42 -7
- package/dist/registry/semver.js +34 -84
- package/dist/runtime.js +2 -23
- package/dist/scripts/akm-migrate-node.js +60290 -0
- package/dist/scripts/akm-migrate.js +59628 -0
- package/dist/setup/detect.js +42 -15
- package/dist/setup/registry-stash-loader.js +2 -2
- package/dist/setup/setup.js +236 -136
- package/dist/setup/steps/connection.js +7 -9
- package/dist/setup/steps/platforms.js +9 -9
- package/dist/setup/steps/semantic.js +15 -3
- package/dist/setup/steps/sources.js +12 -13
- package/dist/setup/steps/stashdir.js +2 -3
- package/dist/setup/steps/tasks.js +237 -120
- package/dist/sources/freshness.js +1 -1
- 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 +25 -23
- package/dist/sources/providers/git-stash.js +395 -106
- package/dist/sources/providers/git.js +2 -2
- package/dist/sources/providers/npm.js +16 -19
- package/dist/sources/providers/provider-utils.js +7 -4
- package/dist/sources/providers/sync-from-ref.js +3 -9
- package/dist/sources/providers/website.js +6 -1
- package/dist/sources/resolve.js +6 -5
- package/dist/sources/snapshot-fetchers/bluesky.js +146 -0
- package/dist/sources/snapshot-fetchers/content-extract.js +566 -0
- package/dist/sources/snapshot-fetchers/fetcher-util.js +41 -0
- package/dist/sources/snapshot-fetchers/github.js +100 -0
- package/dist/sources/snapshot-fetchers/host-guard.js +291 -0
- package/dist/sources/snapshot-fetchers/registry.js +17 -1
- package/dist/sources/snapshot-fetchers/robots.js +348 -0
- package/dist/sources/snapshot-fetchers/rss.js +282 -0
- package/dist/sources/snapshot-fetchers/secret-seam.js +42 -0
- package/dist/sources/snapshot-fetchers/website-ingest.js +566 -268
- package/dist/sources/snapshot-fetchers/x.js +910 -0
- package/dist/storage/database.js +7 -0
- package/dist/storage/engines/sqlite-migrations.js +23 -111
- package/dist/storage/managed-db.js +2 -2
- package/dist/storage/repositories/canaries-repository.js +1 -1
- package/dist/storage/repositories/events-repository.js +27 -11
- package/dist/storage/repositories/improve-runs-repository.js +6 -12
- package/dist/storage/repositories/index-connection.js +17 -6
- package/dist/storage/repositories/index-entries-repository.js +151 -240
- package/dist/storage/repositories/index-entry-mapper.js +15 -11
- package/dist/storage/repositories/index-fts-repository.js +5 -2
- package/dist/storage/repositories/index-llm-cache-repository.js +0 -1
- package/dist/storage/repositories/index-meta-repository.js +2 -3
- package/dist/storage/repositories/index-schema.js +10 -25
- package/dist/storage/repositories/index-utility-repository.js +15 -28
- package/dist/storage/repositories/index-vec-repository.js +6 -1
- package/dist/storage/repositories/outcome-repository.js +119 -0
- package/dist/storage/repositories/proposals-repository.js +296 -59
- package/dist/storage/repositories/registry-cache.js +19 -0
- package/dist/storage/repositories/salience-repository.js +172 -0
- package/dist/storage/repositories/task-history-repository.js +15 -13
- package/dist/storage/repositories/workflow-runs-repository.js +52 -40
- package/dist/tasks/backends/cron.js +105 -15
- package/dist/tasks/backends/index.js +1 -1
- package/dist/tasks/backends/launchd.js +85 -38
- package/dist/tasks/backends/schtasks.js +135 -15
- package/dist/tasks/embedded.js +56 -40
- package/dist/tasks/parser.js +7 -157
- package/dist/tasks/resolve-akm-bin.js +137 -59
- package/dist/tasks/runner.js +79 -42
- package/dist/tasks/scheduler-invocation.js +220 -10
- package/dist/tasks/schema.js +24 -1
- package/dist/tasks/task-id.js +1 -3
- package/dist/tasks/validator.js +20 -6
- package/dist/workflows/authoring/authoring.js +94 -143
- package/dist/workflows/authoring/scope-key.js +1 -1
- package/dist/workflows/exec/frozen-judge.js +28 -2
- package/dist/workflows/exec/native-executor.js +77 -57
- package/dist/workflows/exec/param-secrets.js +9 -9
- package/dist/workflows/exec/run-workflow.js +133 -79
- package/dist/workflows/exec/step-work.js +219 -346
- package/dist/{migrate-storage-node.mjs → workflows/exec/unit-dispatch.js} +1 -5
- package/dist/workflows/ir/compile.js +141 -270
- package/dist/workflows/ir/freeze.js +40 -30
- package/dist/workflows/ir/params.js +135 -11
- package/dist/workflows/ir/plan-hash.js +1 -1
- package/dist/workflows/ir/schema.js +25 -26
- package/dist/workflows/parser.js +872 -307
- package/dist/workflows/program/expressions.js +20 -208
- package/dist/workflows/program/schema.js +7 -10
- package/dist/workflows/renderer.js +95 -68
- package/dist/workflows/resource-limits.js +2 -0
- package/dist/workflows/runtime/checkin.js +3 -3
- package/dist/workflows/runtime/plan-classifier.js +16 -75
- package/dist/workflows/runtime/runs.js +186 -127
- package/dist/workflows/runtime/unit-checkin.js +1 -1
- package/dist/workflows/runtime/unit-phases.js +2 -2
- package/dist/workflows/runtime/workflow-asset-loader.js +232 -83
- package/dist/workflows/schema.js +1 -11
- package/dist/workflows/validate-summary.js +30 -36
- package/dist/workflows/validator.js +21 -62
- package/docs/README.md +68 -0
- package/docs/migration/README.md +8 -0
- package/docs/migration/release-notes/0.7.0.md +11 -11
- package/docs/migration/release-notes/0.9.0.md +208 -27
- package/docs/migration/v0.7-to-v0.8.md +46 -47
- package/docs/migration/v0.8-to-v0.9.md +564 -208
- package/docs/migration/v0.9.0-troubleshooting.md +561 -0
- package/docs/reference/README.md +12 -0
- package/docs/reference/cli.md +2253 -0
- package/docs/reference/configuration.md +358 -0
- package/docs/reference/data-and-telemetry.md +105 -42
- package/docs/reference/workflows.md +647 -0
- package/package.json +22 -11
- package/schemas/akm-asset-envelope.json +93 -0
- package/schemas/akm-config.json +81 -128
- package/schemas/akm-workflow.json +74 -73
- package/dist/assets/tasks/core/backup.yml +0 -5
- package/dist/assets/tasks/graph-refresh-weekly.yml +0 -10
- package/dist/cli/config-migrate.js +0 -1806
- package/dist/cli/config-validate.js +0 -41
- package/dist/commands/backup-cli.js +0 -56
- package/dist/commands/bundle/bundle-cli.js +0 -68
- package/dist/commands/bundle/bundle.js +0 -219
- package/dist/commands/graph/graph-cli.js +0 -124
- package/dist/commands/graph/graph.js +0 -489
- package/dist/commands/improve/extract-watch.js +0 -140
- package/dist/commands/mv-cli.js +0 -1221
- package/dist/commands/sources/history.js +0 -201
- package/dist/commands/tasks/default-tasks.js +0 -186
- package/dist/core/migration-backup.js +0 -1234
- package/dist/indexer/usage/unmigrated-vaults-guard.js +0 -95
- package/dist/llm/memory-infer-impl.js +0 -138
- package/dist/migrate/legacy/config-source-migration.js +0 -223
- package/dist/migrate/legacy/content-migration.js +0 -305
- package/dist/migrate/legacy/legacy-layout.js +0 -779
- package/dist/migrate/legacy/legacy-paths.js +0 -25
- package/dist/migrate/legacy/legacy-stash-json.js +0 -72
- package/dist/migrate/legacy/proposal-fs-import.js +0 -168
- package/dist/migrate/legacy/task-target-ref-migration.js +0 -272
- package/dist/migrate/legacy/three-db-cutover.js +0 -841
- package/dist/migrate/legacy/workflow-migrations-bodies.js +0 -52
- package/dist/migrate/legacy/workflow-migrations-frozen.js +0 -21
- package/dist/migrate/legacy-ref-grammar.js +0 -214
- 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/registry/build-index.js +0 -382
- package/dist/schemas/akm-config.json +0 -4704
- package/dist/schemas/akm-task.json +0 -87
- package/dist/schemas/akm-workflow.json +0 -372
- package/dist/scripts/migrate-storage.js +0 -3816
- package/dist/workflows/authoring/workflow-program-template.yaml +0 -31
- package/dist/workflows/cli.js +0 -53
- package/dist/workflows/exec/brief.js +0 -481
- package/dist/workflows/exec/report.js +0 -1460
- package/dist/workflows/exec/watch.js +0 -116
- package/dist/workflows/program/parser.js +0 -813
- package/dist/workflows/program/project.js +0 -104
|
@@ -24,9 +24,7 @@
|
|
|
24
24
|
* `~1MB` `echarts.min.js` self-contained/"inline" mode was removed along with
|
|
25
25
|
* the asset itself — `buildEchartsTag` always emits a `<script src>` tag
|
|
26
26
|
* pointed at the jsDelivr CDN, so viewing the report now requires network
|
|
27
|
-
* access.
|
|
28
|
-
* `AKM_ECHARTS=cdn` opted IN to the CDN with "inline" as the default; there is
|
|
29
|
-
* no more env var or option to opt back into an offline report.
|
|
27
|
+
* access. There is no env var or option to opt back into an offline report.
|
|
30
28
|
*/
|
|
31
29
|
import { escapeHtml } from "../../output/html-render.js";
|
|
32
30
|
import { pkgVersion } from "../../version.js";
|
|
@@ -158,10 +156,9 @@ function renderExecSummary(vm) {
|
|
|
158
156
|
: '<li><span class="k">No runs in window</span><span class="v">—</span></li>';
|
|
159
157
|
const windowRows = [
|
|
160
158
|
li("Report window", esc(vm.window)),
|
|
161
|
-
li("Compare window", esc(vm.compare)),
|
|
159
|
+
li(vm.comparisonMode === "custom" ? "Comparison windows" : "Compare window", esc(vm.compare)),
|
|
162
160
|
li("Runs", `${num(vm.totalRuns)} (${vm.failedRuns} failed)`),
|
|
163
161
|
li("Included result rows", num(vm.includedResultRows)),
|
|
164
|
-
li("Normalized result rows", num(vm.normalizedResultRows)),
|
|
165
162
|
li("Invalid result rows skipped", num(vm.skippedInvalidResultRows)),
|
|
166
163
|
li("Stash derived", `<abbr title="Whole-stash recount of derived assets at report time — not a per-run sum.">${num(vm.memorySummary.derived)}</abbr>`),
|
|
167
164
|
li("Stash eligible", `<abbr title="Whole-stash recount of eligible assets at report time — not a per-run sum.">${num(vm.memorySummary.eligible)}</abbr>`),
|
|
@@ -185,7 +182,7 @@ function renderExecSummary(vm) {
|
|
|
185
182
|
<ul>${quickNumbers}</ul>
|
|
186
183
|
</div>
|
|
187
184
|
<div>
|
|
188
|
-
<h4
|
|
185
|
+
<h4>${vm.comparisonMode === "custom" ? `Trend: ${esc(vm.compare)}` : `Trend vs prior ${esc(vm.compare)}`}</h4>
|
|
189
186
|
<ul>${trendRows}</ul>
|
|
190
187
|
<h4 style="margin-top:14px;">Period-over-period deltas</h4>
|
|
191
188
|
<ul>${deltaRows}</ul>
|
|
@@ -200,7 +197,7 @@ function renderExecSummary(vm) {
|
|
|
200
197
|
</div>
|
|
201
198
|
</div>
|
|
202
199
|
<div class="overall">Overall trend: <b>${esc(vm.trend.overall)}</b> ${overallEmoji}
|
|
203
|
-
· based on decision quality, output volume, failures, and latency vs the prior window.</div>`.trim();
|
|
200
|
+
· based on decision quality, output volume, failures, and latency ${vm.comparisonMode === "custom" ? "across the selected windows" : "vs the prior window"}.</div>`.trim();
|
|
204
201
|
}
|
|
205
202
|
/**
|
|
206
203
|
* Color is a health SIGNAL, not decoration: green/yellow/red where a card has
|
|
@@ -297,7 +294,7 @@ function renderActionItems(vm) {
|
|
|
297
294
|
cls: "warn",
|
|
298
295
|
title: "Semantic search blocked",
|
|
299
296
|
descHtml: `Embedding provider unreachable. ${esc(vm.sem.detail)}. Curate falls back to keyword search — relevance scoring degraded.`,
|
|
300
|
-
remedy: "akm config
|
|
297
|
+
remedy: "akm config list",
|
|
301
298
|
});
|
|
302
299
|
}
|
|
303
300
|
// Pending proposals to drain.
|
|
@@ -368,8 +365,8 @@ function renderActionItems(vm) {
|
|
|
368
365
|
cls: "warn",
|
|
369
366
|
title: `${vm.perf.overBudgetRuns} consolidation run${vm.perf.overBudgetRuns === 1 ? "" : "s"} exceeded budget`,
|
|
370
367
|
descHtml: "Consolidation phase wall time exceeded the total run budget on these runs. " +
|
|
371
|
-
"Consider increasing the timeout or reducing the consolidation pool via
|
|
372
|
-
remedy: "akm config
|
|
368
|
+
"Consider increasing the timeout or reducing the consolidation pool via strategy config.",
|
|
369
|
+
remedy: "akm config list",
|
|
373
370
|
});
|
|
374
371
|
}
|
|
375
372
|
// Session-log notes (informational, lowest priority).
|
|
@@ -12,10 +12,7 @@ export function parseTaskMetadata(row) {
|
|
|
12
12
|
return {
|
|
13
13
|
...(metadata.durationMs !== undefined ? { durationMs: metadata.durationMs } : {}),
|
|
14
14
|
...(metadata.detail ? { detail: metadata.detail } : {}),
|
|
15
|
-
...(metadata.
|
|
16
|
-
...(metadata.metadataVersion === 1 && metadata.legacyProfile !== undefined
|
|
17
|
-
? { legacyProfile: metadata.legacyProfile }
|
|
18
|
-
: {}),
|
|
15
|
+
...(metadata.engine !== undefined ? { engine: metadata.engine } : {}),
|
|
19
16
|
};
|
|
20
17
|
}
|
|
21
18
|
function createUnknownImproveMetrics() {
|
|
@@ -24,7 +21,7 @@ function createUnknownImproveMetrics() {
|
|
|
24
21
|
completed: 0,
|
|
25
22
|
skipped: 0,
|
|
26
23
|
skipReasons: {},
|
|
27
|
-
resultRows: { total: 0, included: 0,
|
|
24
|
+
resultRows: { total: 0, included: 0, skipped: { invalid: 0 } },
|
|
28
25
|
plannedRefs: 0,
|
|
29
26
|
strategyFilteredRefs: 0,
|
|
30
27
|
actions: {
|
|
@@ -32,7 +29,6 @@ function createUnknownImproveMetrics() {
|
|
|
32
29
|
distill: {
|
|
33
30
|
queued: 0,
|
|
34
31
|
llmFailed: 0,
|
|
35
|
-
qualityRejected: 0,
|
|
36
32
|
judgeRejected: 0,
|
|
37
33
|
validatorRejected: 0,
|
|
38
34
|
configDisabled: 0,
|
|
@@ -88,18 +84,16 @@ function createUnknownImproveMetrics() {
|
|
|
88
84
|
skippedAborted: 0,
|
|
89
85
|
unaccounted: 0,
|
|
90
86
|
htmlErrorCount: 0,
|
|
91
|
-
yieldEligibleRuns: 0,
|
|
92
|
-
yieldEligibleConsidered: 0,
|
|
93
|
-
yieldEligibleWritten: 0,
|
|
94
87
|
yieldRate: 0,
|
|
95
88
|
durationMs: 0,
|
|
96
|
-
writes: 0,
|
|
97
89
|
},
|
|
98
90
|
graphExtraction: {
|
|
99
91
|
ran: false,
|
|
100
92
|
extractedFiles: 0,
|
|
93
|
+
consideredFiles: 0,
|
|
101
94
|
entities: 0,
|
|
102
95
|
relations: 0,
|
|
96
|
+
extractionCoverage: 0,
|
|
103
97
|
cacheHits: 0,
|
|
104
98
|
cacheMisses: 0,
|
|
105
99
|
cacheHitRate: 0,
|
|
@@ -174,29 +168,11 @@ export function summarizeImproveCompleted(events) {
|
|
|
174
168
|
return metrics;
|
|
175
169
|
}
|
|
176
170
|
/**
|
|
177
|
-
*
|
|
178
|
-
* Prefers an explicit `skipReason`; otherwise sniffs the message. The WI-6.4
|
|
179
|
-
* fingerprint/backoff vocabulary is checked before the legacy patterns, which
|
|
180
|
-
* stay for historical improve_runs rows.
|
|
171
|
+
* Read the machine-readable reason from a distill `outcome: "skipped"` result.
|
|
181
172
|
*/
|
|
182
173
|
function classifyDistillSkipReason(r) {
|
|
183
174
|
const explicitReason = typeof r?.skipReason === "string" ? r.skipReason : undefined;
|
|
184
|
-
|
|
185
|
-
return explicitReason;
|
|
186
|
-
const msg = typeof r?.message === "string" ? r.message : "";
|
|
187
|
-
if (/lesson inputs/i.test(msg))
|
|
188
|
-
return "recursive_lesson_input";
|
|
189
|
-
if (/NOOP/.test(msg))
|
|
190
|
-
return "conflict_noop";
|
|
191
|
-
if (/fingerprint/i.test(msg))
|
|
192
|
-
return "fingerprint_match";
|
|
193
|
-
if (/rejection backoff/i.test(msg))
|
|
194
|
-
return "rejection_backoff";
|
|
195
|
-
if (/cooldown/i.test(msg))
|
|
196
|
-
return "proposal_cooldown";
|
|
197
|
-
if (/content[_ ]?hash/i.test(msg))
|
|
198
|
-
return "content_hash_match";
|
|
199
|
-
return "unknown";
|
|
175
|
+
return explicitReason || "unknown";
|
|
200
176
|
}
|
|
201
177
|
// ── projectRunMetrics phase helpers (chunk-9 WI-9.5c; file-level decompose of
|
|
202
178
|
// the single-envelope projection — each helper mutates its own disjoint
|
|
@@ -211,9 +187,7 @@ function applyPlannedRefs(metrics, result) {
|
|
|
211
187
|
// strategyFilteredRefs (array of {ref, reason}) — 2026-05-27: pre-filter
|
|
212
188
|
// bucket from `collectEligibleRefs` so the metric reflects work the
|
|
213
189
|
// planner dropped before signal-delta / per-pass dispatch.
|
|
214
|
-
|
|
215
|
-
// remains legacy data and must not be silently relabelled as a strategy metric.
|
|
216
|
-
const strategyFilteredRefs = result.schemaVersion === 2 ? result.strategyFilteredRefs : undefined;
|
|
190
|
+
const strategyFilteredRefs = result.strategyFilteredRefs;
|
|
217
191
|
if (Array.isArray(strategyFilteredRefs))
|
|
218
192
|
metrics.strategyFilteredRefs += strategyFilteredRefs.length;
|
|
219
193
|
}
|
|
@@ -252,11 +226,9 @@ function applyAction(metrics, action) {
|
|
|
252
226
|
break;
|
|
253
227
|
case "quality_rejected":
|
|
254
228
|
case "review_needed":
|
|
255
|
-
metrics.actions.distill.qualityRejected += 1;
|
|
256
229
|
metrics.actions.distill.judgeRejected += 1;
|
|
257
230
|
break;
|
|
258
231
|
case "validation_failed":
|
|
259
|
-
metrics.actions.distill.qualityRejected += 1;
|
|
260
232
|
metrics.actions.distill.validatorRejected += 1;
|
|
261
233
|
break;
|
|
262
234
|
case "config_disabled":
|
|
@@ -282,13 +254,6 @@ function applyAction(metrics, action) {
|
|
|
282
254
|
}
|
|
283
255
|
break;
|
|
284
256
|
}
|
|
285
|
-
case "distill-skipped": {
|
|
286
|
-
metrics.actions.distill.skipped += 1;
|
|
287
|
-
const r = action.result;
|
|
288
|
-
const reason = typeof r?.reason === "string" && r.reason.trim() ? r.reason : "unknown";
|
|
289
|
-
metrics.actions.distill.skippedByReason[reason] = (metrics.actions.distill.skippedByReason[reason] ?? 0) + 1;
|
|
290
|
-
break;
|
|
291
|
-
}
|
|
292
257
|
case "memory-prune":
|
|
293
258
|
metrics.actions.memoryPrune += 1;
|
|
294
259
|
break;
|
|
@@ -313,12 +278,8 @@ function applyActionsList(metrics, result) {
|
|
|
313
278
|
}
|
|
314
279
|
}
|
|
315
280
|
/**
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
* histogram from it into the SAME `distill.skipped` / `skippedByReason`
|
|
319
|
-
* metric the per-ref loop above populated. Legacy rows carry the per-ref rows
|
|
320
|
-
* and NO aggregate (counted above); new rows carry the aggregate and NO
|
|
321
|
-
* per-ref rows (counted here) — so a run is never double-counted.
|
|
281
|
+
* Read the bounded `distillSkipped` aggregate into the corresponding total and
|
|
282
|
+
* per-reason health metrics.
|
|
322
283
|
*/
|
|
323
284
|
function applyDistillSkippedAggregate(metrics, result) {
|
|
324
285
|
const distillSkipped = result.distillSkipped;
|
|
@@ -437,18 +398,6 @@ function applyMemoryInference(metrics, result) {
|
|
|
437
398
|
metrics.memoryInference.skippedAborted += toFiniteNumber(memoryInference.skippedAborted);
|
|
438
399
|
metrics.memoryInference.unaccounted += toFiniteNumber(memoryInference.unaccounted);
|
|
439
400
|
metrics.memoryInference.htmlErrorCount += toFiniteNumber(memoryInference.htmlErrorCount);
|
|
440
|
-
// Yield-rate gating: pre-cache-feature envelopes lack the `cacheHits`
|
|
441
|
-
// field entirely. Treating their `considered` as freshAttempts (since
|
|
442
|
-
// cacheHits=0) is mathematically tempting but operationally wrong —
|
|
443
|
-
// historical runs with the legacy schema have no cache instrumentation
|
|
444
|
-
// and the SUM dragged the reported rate to ~14% in local data. Only
|
|
445
|
-
// contribute to the yield aggregate when the envelope actually carries
|
|
446
|
-
// the field. See investigation 2026-05-26.
|
|
447
|
-
if (Object.hasOwn(memoryInference, "cacheHits")) {
|
|
448
|
-
metrics.memoryInference.yieldEligibleRuns += 1;
|
|
449
|
-
metrics.memoryInference.yieldEligibleConsidered += considered;
|
|
450
|
-
metrics.memoryInference.yieldEligibleWritten += writtenFacts;
|
|
451
|
-
}
|
|
452
401
|
}
|
|
453
402
|
metrics.memoryInference.durationMs += toFiniteNumber(result.memoryInferenceDurationMs);
|
|
454
403
|
}
|
|
@@ -456,8 +405,10 @@ function applyGraphExtraction(metrics, result) {
|
|
|
456
405
|
const graphExtraction = result.graphExtraction;
|
|
457
406
|
if (graphExtraction) {
|
|
458
407
|
const quality = graphExtraction.quality;
|
|
459
|
-
if (quality)
|
|
408
|
+
if (quality) {
|
|
460
409
|
metrics.graphExtraction.extractedFiles += toFiniteNumber(quality.extractedFiles);
|
|
410
|
+
metrics.graphExtraction.consideredFiles += toFiniteNumber(quality.consideredFiles);
|
|
411
|
+
}
|
|
461
412
|
metrics.graphExtraction.entities += toFiniteNumber(graphExtraction.totalEntities);
|
|
462
413
|
metrics.graphExtraction.relations += toFiniteNumber(graphExtraction.totalRelations);
|
|
463
414
|
const telemetry = graphExtraction.telemetry;
|
|
@@ -526,19 +477,11 @@ function finalizeImproveMetrics(metrics) {
|
|
|
526
477
|
metrics.memoryInference.considered > 0 ||
|
|
527
478
|
metrics.memoryInference.written > 0 ||
|
|
528
479
|
metrics.memoryInference.durationMs > 0;
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
// envelopes. Only runs whose envelope carries a `cacheHits` field
|
|
532
|
-
// contribute to freshAttempts/yieldRate; legacy rows remain in
|
|
533
|
-
// `considered`/`written` for totals but are excluded from the rate so
|
|
534
|
-
// they cannot drag it down. See ImproveHealthMetrics.memoryInference
|
|
535
|
-
// jsdoc for the rationale.
|
|
536
|
-
metrics.memoryInference.freshAttempts = Math.max(0, metrics.memoryInference.yieldEligibleConsidered -
|
|
537
|
-
metrics.memoryInference.cacheHits -
|
|
538
|
-
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);
|
|
539
482
|
metrics.memoryInference.yieldRate =
|
|
540
483
|
metrics.memoryInference.freshAttempts > 0
|
|
541
|
-
? roundRate(metrics.memoryInference.
|
|
484
|
+
? roundRate(metrics.memoryInference.written / metrics.memoryInference.freshAttempts)
|
|
542
485
|
: 0;
|
|
543
486
|
metrics.graphExtraction.ran =
|
|
544
487
|
metrics.graphExtraction.extractedFiles > 0 ||
|
|
@@ -546,6 +489,10 @@ function finalizeImproveMetrics(metrics) {
|
|
|
546
489
|
metrics.graphExtraction.durationMs > 0;
|
|
547
490
|
const cacheTotal = metrics.graphExtraction.cacheHits + metrics.graphExtraction.cacheMisses;
|
|
548
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;
|
|
549
496
|
metrics.sessionExtraction.ran =
|
|
550
497
|
metrics.sessionExtraction.sessionsScanned > 0 ||
|
|
551
498
|
metrics.sessionExtraction.proposalsCreated > 0 ||
|
|
@@ -571,7 +518,6 @@ function mergeImproveMetrics(dst, src) {
|
|
|
571
518
|
}
|
|
572
519
|
dst.actions.distill.queued += src.actions.distill.queued;
|
|
573
520
|
dst.actions.distill.llmFailed += src.actions.distill.llmFailed;
|
|
574
|
-
dst.actions.distill.qualityRejected += src.actions.distill.qualityRejected;
|
|
575
521
|
dst.actions.distill.judgeRejected += src.actions.distill.judgeRejected;
|
|
576
522
|
dst.actions.distill.validatorRejected += src.actions.distill.validatorRejected;
|
|
577
523
|
dst.actions.distill.configDisabled += src.actions.distill.configDisabled;
|
|
@@ -626,11 +572,10 @@ function mergeImproveMetrics(dst, src) {
|
|
|
626
572
|
dst.memoryInference.skippedAborted += src.memoryInference.skippedAborted;
|
|
627
573
|
dst.memoryInference.unaccounted += src.memoryInference.unaccounted;
|
|
628
574
|
dst.memoryInference.htmlErrorCount += src.memoryInference.htmlErrorCount;
|
|
629
|
-
dst.memoryInference.
|
|
630
|
-
dst.memoryInference.yieldEligibleConsidered += src.memoryInference.yieldEligibleConsidered;
|
|
631
|
-
dst.memoryInference.yieldEligibleWritten += src.memoryInference.yieldEligibleWritten;
|
|
575
|
+
dst.memoryInference.retryAttempts += src.memoryInference.retryAttempts;
|
|
632
576
|
dst.memoryInference.durationMs += src.memoryInference.durationMs;
|
|
633
577
|
dst.graphExtraction.extractedFiles += src.graphExtraction.extractedFiles;
|
|
578
|
+
dst.graphExtraction.consideredFiles += src.graphExtraction.consideredFiles;
|
|
634
579
|
dst.graphExtraction.entities += src.graphExtraction.entities;
|
|
635
580
|
dst.graphExtraction.relations += src.graphExtraction.relations;
|
|
636
581
|
dst.graphExtraction.cacheHits += src.graphExtraction.cacheHits;
|
|
@@ -639,6 +584,7 @@ function mergeImproveMetrics(dst, src) {
|
|
|
639
584
|
dst.graphExtraction.failures += src.graphExtraction.failures;
|
|
640
585
|
dst.graphExtraction.htmlErrors += src.graphExtraction.htmlErrors;
|
|
641
586
|
dst.graphExtraction.nonArrayBatchFailures += src.graphExtraction.nonArrayBatchFailures;
|
|
587
|
+
dst.graphExtraction.retryAttempts += src.graphExtraction.retryAttempts;
|
|
642
588
|
dst.graphExtraction.durationMs += src.graphExtraction.durationMs;
|
|
643
589
|
dst.sessionExtraction.sessionsScanned += src.sessionExtraction.sessionsScanned;
|
|
644
590
|
dst.sessionExtraction.sessionsExtracted += src.sessionExtraction.sessionsExtracted;
|
|
@@ -662,7 +608,7 @@ function compareImproveRunRecency(a, b) {
|
|
|
662
608
|
const started = a.started_at.localeCompare(b.started_at);
|
|
663
609
|
if (started !== 0)
|
|
664
610
|
return started;
|
|
665
|
-
const completed =
|
|
611
|
+
const completed = a.completed_at.localeCompare(b.completed_at);
|
|
666
612
|
if (completed !== 0)
|
|
667
613
|
return completed;
|
|
668
614
|
return a.id.localeCompare(b.id);
|
|
@@ -696,14 +642,11 @@ export function summarizeImproveRuns(db, since, until) {
|
|
|
696
642
|
continue;
|
|
697
643
|
}
|
|
698
644
|
accum.resultRows.included += 1;
|
|
699
|
-
if (decoded.normalizedLegacyPartial)
|
|
700
|
-
accum.resultRows.normalized += 1;
|
|
701
645
|
const result = decoded.envelope;
|
|
702
646
|
const perRow = projectRunMetrics(result);
|
|
703
647
|
mergeImproveMetrics(accum, perRow);
|
|
704
648
|
const startMs = new Date(row.started_at).getTime();
|
|
705
|
-
if (
|
|
706
|
-
result.terminated === undefined &&
|
|
649
|
+
if (result.terminated === undefined &&
|
|
707
650
|
Number.isFinite(startMs) &&
|
|
708
651
|
(latestCompleteRow === undefined || compareImproveRunRecency(row, latestCompleteRow) > 0)) {
|
|
709
652
|
latestCompleteRow = row;
|
|
@@ -765,7 +708,7 @@ export function projectImproveRunSummary(row, wallTimeMs, taskId) {
|
|
|
765
708
|
try {
|
|
766
709
|
const decoded = decodeImproveResult(row.result_json);
|
|
767
710
|
result = decoded.envelope;
|
|
768
|
-
resultStatus =
|
|
711
|
+
resultStatus = "valid";
|
|
769
712
|
}
|
|
770
713
|
catch {
|
|
771
714
|
// Keep the persisted row visible in per-run output, but do not project its
|
|
@@ -787,7 +730,6 @@ export function projectImproveRunSummary(row, wallTimeMs, taskId) {
|
|
|
787
730
|
resultStatus,
|
|
788
731
|
resultComplete: resultStatus === "valid" && result.terminated === undefined,
|
|
789
732
|
strategy: row.strategy,
|
|
790
|
-
legacyProfile: row.legacyProfile,
|
|
791
733
|
scope: {
|
|
792
734
|
mode: row.scope_mode,
|
|
793
735
|
...(row.scope_value ? { value: row.scope_value } : {}),
|
|
@@ -16,9 +16,7 @@ function renderTable(headers, rows) {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* Render `--detail per-run` rows as a TSV-ish aligned table. The column
|
|
19
|
-
* shape
|
|
20
|
-
* `scripts/improve-stats/runs-detail` bash helper; keep the same shape
|
|
21
|
-
* so operator muscle memory carries over.
|
|
19
|
+
* shape is stable so repeated operator reports remain easy to compare.
|
|
22
20
|
*
|
|
23
21
|
* Columns: ts | ok | actions | refl_ok/fail/cd/skip |
|
|
24
22
|
* distill_q/llm-fail/qrej/cfg/skip | cons_proc/promo/merge/del |
|
|
@@ -29,10 +27,9 @@ export function renderRunsDetailMd(runs) {
|
|
|
29
27
|
"ts",
|
|
30
28
|
"ok",
|
|
31
29
|
"strategy",
|
|
32
|
-
"legacy_profile",
|
|
33
30
|
"actions",
|
|
34
31
|
"refl_ok/fail/cd/skip",
|
|
35
|
-
"distill_q/llm-fail/
|
|
32
|
+
"distill_q/llm-fail/judge/validator/cfg/skip",
|
|
36
33
|
"cons_proc/promo/merge/del",
|
|
37
34
|
"mem_cons/written/skip",
|
|
38
35
|
"graph_f/e/r",
|
|
@@ -47,7 +44,8 @@ export function renderRunsDetailMd(runs) {
|
|
|
47
44
|
r.actions.reflect.skipped +
|
|
48
45
|
r.actions.distill.queued +
|
|
49
46
|
r.actions.distill.llmFailed +
|
|
50
|
-
r.actions.distill.
|
|
47
|
+
r.actions.distill.judgeRejected +
|
|
48
|
+
r.actions.distill.validatorRejected +
|
|
51
49
|
r.actions.distill.configDisabled +
|
|
52
50
|
r.actions.distill.skipped +
|
|
53
51
|
r.actions.memoryPrune +
|
|
@@ -58,10 +56,9 @@ export function renderRunsDetailMd(runs) {
|
|
|
58
56
|
r.startedAt,
|
|
59
57
|
String(r.ok),
|
|
60
58
|
r.strategy ?? "",
|
|
61
|
-
r.legacyProfile ?? "",
|
|
62
59
|
String(totalActions),
|
|
63
60
|
`${r.actions.reflect.ok}/${r.actions.reflect.failed}/${r.actions.reflect.cooldown}/${r.actions.reflect.skipped}`,
|
|
64
|
-
`${r.actions.distill.queued}/${r.actions.distill.llmFailed}/${r.actions.distill.
|
|
61
|
+
`${r.actions.distill.queued}/${r.actions.distill.llmFailed}/${r.actions.distill.judgeRejected}/${r.actions.distill.validatorRejected}/${r.actions.distill.configDisabled}/${r.actions.distill.skipped}`,
|
|
65
62
|
`${r.consolidation.processed}/${r.consolidation.promoted}/${r.consolidation.merged}/${r.consolidation.deleted}`,
|
|
66
63
|
`${r.memoryInference.considered}/${r.memoryInference.written}/${r.memoryInference.skippedNoFacts}`,
|
|
67
64
|
`${r.graphExtraction.extractedFiles}/${r.graphExtraction.entities}/${r.graphExtraction.relations}`,
|
|
@@ -94,7 +91,6 @@ export function renderWindowCompareMd(windows, deltas) {
|
|
|
94
91
|
const paths = [
|
|
95
92
|
"runs",
|
|
96
93
|
"improve.resultRows.included",
|
|
97
|
-
"improve.resultRows.normalized",
|
|
98
94
|
"improve.resultRows.skipped.invalid",
|
|
99
95
|
...INTERESTING_DELTA_PATHS,
|
|
100
96
|
];
|
|
@@ -6,28 +6,71 @@
|
|
|
6
6
|
* denominator-fixed coverage, the enrichment-vs-minting rollup, and the WS-5
|
|
7
7
|
* per-run degradation metrics.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { rethrowIfTestIsolationError } from "../../core/errors.js";
|
|
10
10
|
import { decodeImproveResult } from "../../core/improve-result.js";
|
|
11
|
+
import { withStateDb } from "../../core/state-db.js";
|
|
12
|
+
import { insertEvent } from "../../storage/repositories/events-repository.js";
|
|
11
13
|
import { queryImproveRuns } from "../../storage/repositories/improve-runs-repository.js";
|
|
12
14
|
import { listStateProposals } from "../../storage/repositories/proposals-repository.js";
|
|
15
|
+
import { getTopRetrievalSalience } from "../../storage/repositories/salience-repository.js";
|
|
13
16
|
import { roundRate, toFiniteNumber } from "./improve-metrics.js";
|
|
14
17
|
import { ENRICHMENT_LANES, } from "./types.js";
|
|
15
18
|
/** Event type appended + read back by the state.db round-trip probe. */
|
|
16
19
|
const HEALTH_PROBE_EVENT = "health_probe";
|
|
20
|
+
/** Synthetic sentinel ref (ref-grammar decision D-R3): a colon-free
|
|
21
|
+
* `<subsystem>/_<marker>` label. `health` has no asset stash-subdir, so
|
|
22
|
+
* `health/_probe` names the subsystem. */
|
|
23
|
+
const HEALTH_PROBE_REF = "health/_probe";
|
|
24
|
+
/**
|
|
25
|
+
* Verify state.db can accept a write and read it back — WITHOUT leaving any
|
|
26
|
+
* permanent trace (R-030). Earlier versions appended a `health_probe` event
|
|
27
|
+
* on every `akm health` invocation and never removed it: a read-only health
|
|
28
|
+
* check ran on a cron would grow state.db without bound (the only purge is
|
|
29
|
+
* `improve`'s retention pass, which a health-only user never runs). The probe
|
|
30
|
+
* row inserted here is deleted again inside the SAME connection once the
|
|
31
|
+
* round trip is confirmed, so the net effect on the `events` table is always
|
|
32
|
+
* zero rows — the round trip still genuinely exercises append + read against
|
|
33
|
+
* the real table, it just doesn't accumulate.
|
|
34
|
+
*/
|
|
17
35
|
export function probeStateDbRoundTrip(stateDbPath) {
|
|
18
|
-
const before = readEvents({}, { dbPath: stateDbPath }).nextOffset;
|
|
19
36
|
const started = Date.now();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
37
|
+
try {
|
|
38
|
+
return withStateDb((db) => {
|
|
39
|
+
const ts = new Date().toISOString();
|
|
40
|
+
const insertedId = insertEvent(db, {
|
|
41
|
+
eventType: HEALTH_PROBE_EVENT,
|
|
42
|
+
ts,
|
|
43
|
+
ref: HEALTH_PROBE_REF,
|
|
44
|
+
metadata: { source: "akm health" },
|
|
45
|
+
});
|
|
46
|
+
const durationMs = Date.now() - started;
|
|
47
|
+
if (insertedId === undefined) {
|
|
48
|
+
return { ok: false, durationMs, error: "probe event insert did not return a row id" };
|
|
49
|
+
}
|
|
50
|
+
// The round-trip matches on the exact (id, eventType, ref) triple
|
|
51
|
+
// written above, then removes the row regardless of outcome — a
|
|
52
|
+
// failed round trip must not leak a row any more than a successful
|
|
53
|
+
// one should.
|
|
54
|
+
let roundTripOk = false;
|
|
55
|
+
try {
|
|
56
|
+
const row = db
|
|
57
|
+
.prepare("SELECT 1 AS present FROM events WHERE id = ? AND event_type = ? AND ref = ?")
|
|
58
|
+
.get(insertedId, HEALTH_PROBE_EVENT, HEALTH_PROBE_REF);
|
|
59
|
+
roundTripOk = row !== undefined;
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
db.prepare("DELETE FROM events WHERE id = ?").run(insertedId);
|
|
63
|
+
}
|
|
64
|
+
if (!roundTripOk) {
|
|
65
|
+
return { ok: false, durationMs, error: "probe event was not readable after append" };
|
|
66
|
+
}
|
|
67
|
+
return { ok: true, durationMs };
|
|
68
|
+
}, { path: stateDbPath });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
rethrowIfTestIsolationError(err);
|
|
72
|
+
return { ok: false, durationMs: Date.now() - started, error: err instanceof Error ? err.message : String(err) };
|
|
29
73
|
}
|
|
30
|
-
return { ok: true, durationMs };
|
|
31
74
|
}
|
|
32
75
|
// ── WS-5 Observability helpers ───────────────────────────────────────────────
|
|
33
76
|
/**
|
|
@@ -170,10 +213,10 @@ export function computeDegradationMetrics(db, since, until) {
|
|
|
170
213
|
let entrenchmentFlagged;
|
|
171
214
|
let salienceUniformityFlagged;
|
|
172
215
|
try {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
216
|
+
// Fail-open: the asset_salience table may not exist yet (pre-WS-1 install).
|
|
217
|
+
// getTopRetrievalSalience (storage/repositories/salience-repository.ts,
|
|
218
|
+
// #672 part 2) owns the raw SQL; this call site's try/catch is unchanged.
|
|
219
|
+
const rows = getTopRetrievalSalience(db, 100);
|
|
177
220
|
if (rows.length >= 5) {
|
|
178
221
|
const vals = rows.map((r) => r.retrieval_salience).sort((a, b) => a - b);
|
|
179
222
|
const n = vals.length;
|
|
@@ -181,12 +224,11 @@ export function computeDegradationMetrics(db, since, until) {
|
|
|
181
224
|
return acc + vals.slice(i + 1).reduce((a, xj) => a + Math.abs(xi - xj), 0);
|
|
182
225
|
}, 0);
|
|
183
226
|
const mean = vals.reduce((a, b) => a + b, 0) / n;
|
|
184
|
-
//
|
|
185
|
-
|
|
227
|
+
// `sumAbsDiff` contains each unordered pair once, so the standard Gini
|
|
228
|
+
// denominator is n² × mean (the equivalent ordered-pair formula has 2n²).
|
|
229
|
+
const gini = mean > 0 ? sumAbsDiff / (n * n * mean) : 0;
|
|
186
230
|
// Re-express as a diversity proxy in [0,1]: high gini = low diversity.
|
|
187
231
|
// corpusCentroidDistance approximation: gini is "distance from uniform".
|
|
188
|
-
// Note: retrieval_salience values are in [0,1], so the max achievable Gini
|
|
189
|
-
// with this formula is ~0.5 (when one asset dominates and others are near 0).
|
|
190
232
|
// Two-tailed: >0.35 flags entrenchment (robustly above the ~0.1 uniform
|
|
191
233
|
// baseline); <0.08 flags uniformity collapse — the distribution no longer
|
|
192
234
|
// discriminates between assets (live 2026-07 value 0.040 sat unflagged
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
+
/**
|
|
5
|
+
* `akm health` document renderers, registered rather than intercepted (D7).
|
|
6
|
+
*
|
|
7
|
+
* Both handlers are **pure functions of the shaped result**. Everything the
|
|
8
|
+
* rich report needs — per-run rows, window-compare deltas, the pending
|
|
9
|
+
* proposal queue, and the window labels — travels in the result itself
|
|
10
|
+
* (`runs`/`deltas`/`report`, populated by `akm health --report`). There is no
|
|
11
|
+
* out-of-band context: an earlier revision bound the proposal queue through
|
|
12
|
+
* module state set by the command right before `output()`, which coupled the
|
|
13
|
+
* renderer to call order and made the command branch on the output format to
|
|
14
|
+
* know when to bind it. Putting the data in the envelope removed both.
|
|
15
|
+
*
|
|
16
|
+
* Returning `null` falls through to the generic renderer, so a result without
|
|
17
|
+
* the report dataset still renders — generically — instead of erroring or
|
|
18
|
+
* emitting an empty table.
|
|
19
|
+
*/
|
|
20
|
+
import { renderHtml, resolveTemplatePath } from "../../output/html-render.js";
|
|
21
|
+
import { registerHtmlRenderer, registerMdRenderer } from "../../output/render-registry.js";
|
|
22
|
+
import { buildHealthHtmlReplacements } from "./html-report.js";
|
|
23
|
+
import { renderRunsDetailMd, renderWindowCompareMd } from "./md-report.js";
|
|
24
|
+
function isHealthResult(value) {
|
|
25
|
+
return value !== null && typeof value === "object" && "status" in value;
|
|
26
|
+
}
|
|
27
|
+
registerMdRenderer("health", (result) => {
|
|
28
|
+
if (!isHealthResult(result))
|
|
29
|
+
return null;
|
|
30
|
+
if (result.windows && result.windows.length > 0) {
|
|
31
|
+
return renderWindowCompareMd(result.windows, result.deltas);
|
|
32
|
+
}
|
|
33
|
+
if (result.runs)
|
|
34
|
+
return renderRunsDetailMd(result.runs);
|
|
35
|
+
return null;
|
|
36
|
+
});
|
|
37
|
+
registerHtmlRenderer("health", (result) => {
|
|
38
|
+
if (!isHealthResult(result) || !result.report)
|
|
39
|
+
return null;
|
|
40
|
+
return renderHtml(resolveTemplatePath("health"), buildHealthHtmlReplacements(result, {
|
|
41
|
+
window: result.report.window,
|
|
42
|
+
compare: result.report.compare,
|
|
43
|
+
comparisonMode: result.report.comparisonMode,
|
|
44
|
+
proposals: result.report.pendingProposals,
|
|
45
|
+
deltas: result.deltas,
|
|
46
|
+
}));
|
|
47
|
+
});
|
|
@@ -75,7 +75,6 @@ function reshapeRun(r) {
|
|
|
75
75
|
resultComplete: r.resultComplete ?? (r.resultStatus === undefined || r.resultStatus === "valid"),
|
|
76
76
|
taskId: r.taskId ?? "manual",
|
|
77
77
|
strategy: r.strategy,
|
|
78
|
-
legacyProfile: r.legacyProfile,
|
|
79
78
|
startedAt: r.startedAt,
|
|
80
79
|
completedAt: r.completedAt,
|
|
81
80
|
wallTimeMs: wall,
|
|
@@ -94,7 +93,7 @@ function reshapeRun(r) {
|
|
|
94
93
|
processed: cons.processed,
|
|
95
94
|
failedChunks: cons.failedChunks,
|
|
96
95
|
totalChunks: cons.totalChunks,
|
|
97
|
-
miWritten: mi.written
|
|
96
|
+
miWritten: mi.written,
|
|
98
97
|
miConsidered: mi.considered,
|
|
99
98
|
miYieldRate: mi.yieldRate,
|
|
100
99
|
miCacheHits: mi.cacheHits,
|
|
@@ -238,7 +237,7 @@ function buildAggregatesPhase(result, runsPhase) {
|
|
|
238
237
|
const failedRuns = runs.filter((r) => !r.ok).length;
|
|
239
238
|
const invoked = improve.invoked || totalRuns;
|
|
240
239
|
const completed = improve.completed || totalRuns - failedRuns;
|
|
241
|
-
const miWritten = mi.written
|
|
240
|
+
const miWritten = mi.written;
|
|
242
241
|
return {
|
|
243
242
|
consolidation: cons,
|
|
244
243
|
memoryInference: mi,
|
|
@@ -251,7 +250,6 @@ function buildAggregatesPhase(result, runsPhase) {
|
|
|
251
250
|
llm,
|
|
252
251
|
memorySummary: improve.memorySummary,
|
|
253
252
|
includedResultRows: improve.resultRows?.included ?? totalRuns,
|
|
254
|
-
normalizedResultRows: improve.resultRows?.normalized ?? 0,
|
|
255
253
|
skippedInvalidResultRows: improve.resultRows?.skipped.invalid ?? invalidRuns.length,
|
|
256
254
|
invoked,
|
|
257
255
|
completed,
|
|
@@ -375,7 +373,7 @@ function buildSummaryRows(aggregates, trend) {
|
|
|
375
373
|
"Stash derived",
|
|
376
374
|
num(aggregates.memorySummary.derived),
|
|
377
375
|
"up",
|
|
378
|
-
"Whole-
|
|
376
|
+
"Whole-bundle recount of derived assets at report time — not a per-run sum.",
|
|
379
377
|
],
|
|
380
378
|
["Median wall time", fmtMs(wallTime.medianMs), trend.latency],
|
|
381
379
|
["P95 wall time", fmtMs(wallTime.p95Ms), trend.latency],
|
|
@@ -490,6 +488,7 @@ export function buildHealthReportViewModel(result, opts) {
|
|
|
490
488
|
return {
|
|
491
489
|
window: opts.window,
|
|
492
490
|
compare: opts.compare,
|
|
491
|
+
comparisonMode: opts.comparisonMode ?? "duration",
|
|
493
492
|
...meta,
|
|
494
493
|
runs: runsPhase.runs,
|
|
495
494
|
invalidRuns: runsPhase.invalidRuns,
|
|
@@ -40,7 +40,7 @@ export function collectStashExposureAdvisory(stashDir, git = realGit) {
|
|
|
40
40
|
message: `${trackedFiles.length} env/secret file(s) are git-tracked AND a remote is configured — ` +
|
|
41
41
|
`a 'git push' can leak tokens/keys (${preview}). ` +
|
|
42
42
|
"Run 'git rm --cached' on them (a .gitignore rule alone does NOT untrack already-tracked " +
|
|
43
|
-
"files) and then add env/+secrets/ to .gitignore to prevent recurrence (akm
|
|
43
|
+
"files) and then add env/+secrets/ to .gitignore to prevent recurrence (akm bundle create scaffolds it).",
|
|
44
44
|
evidence: { trackedSecretFiles: trackedFiles },
|
|
45
45
|
};
|
|
46
46
|
}
|