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
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
import fs from "node:fs";
|
|
20
20
|
import { parseFrontmatter } from "../../../core/asset/frontmatter.js";
|
|
21
21
|
import { appendEvent } from "../../../core/events.js";
|
|
22
|
-
import { parseEmbeddedJsonResponse } from "../../../
|
|
22
|
+
import { parseEmbeddedJsonResponse } from "../../../core/parse.js";
|
|
23
23
|
import { isProposalSkipped } from "../../proposal/repository.js";
|
|
24
24
|
import { assessMemoryKnowledgePromotionCandidate } from "../distill-promotion-policy.js";
|
|
25
25
|
import { emitProposal } from "../proposal-envelope.js";
|
|
@@ -38,7 +38,7 @@ import { persistOutputEncodingSalience, runLessonQualityJudge, writeQualityRejec
|
|
|
38
38
|
async function resolveKnowledgePromotionContent(ctx, baseContent, knowledgeRef) {
|
|
39
39
|
const durableInputRef = ctx.durableInputRef ?? ctx.inputRef;
|
|
40
40
|
let resolvedPromotionContent = baseContent;
|
|
41
|
-
const existingKnowledgePath = await ctx.lookup(durableImproveRef(knowledgeRef
|
|
41
|
+
const existingKnowledgePath = await ctx.lookup(durableImproveRef(knowledgeRef));
|
|
42
42
|
const existingKnowledgeContent = existingKnowledgePath && fs.existsSync(existingKnowledgePath)
|
|
43
43
|
? (() => {
|
|
44
44
|
try {
|
|
@@ -77,11 +77,11 @@ async function resolveKnowledgePromotionContent(ctx, baseContent, knowledgeRef)
|
|
|
77
77
|
// Existing content is authoritative — no update needed.
|
|
78
78
|
appendEvent({
|
|
79
79
|
eventType: "distill_invoked",
|
|
80
|
-
//
|
|
80
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
81
81
|
ref: ctx.itemRef ?? durableInputRef,
|
|
82
82
|
metadata: {
|
|
83
83
|
outcome: "skipped",
|
|
84
|
-
|
|
84
|
+
proposalRef: knowledgeRef,
|
|
85
85
|
message: "D-1: LLM resolved destination conflict as NOOP — existing content kept",
|
|
86
86
|
...ctx.eligMeta,
|
|
87
87
|
},
|
|
@@ -92,7 +92,8 @@ async function resolveKnowledgePromotionContent(ctx, baseContent, knowledgeRef)
|
|
|
92
92
|
ok: true,
|
|
93
93
|
outcome: "skipped",
|
|
94
94
|
inputRef: ctx.inputRef,
|
|
95
|
-
|
|
95
|
+
proposalRef: knowledgeRef,
|
|
96
|
+
skipReason: "conflict_noop",
|
|
96
97
|
message: "Existing knowledge content unchanged (contradiction resolution: NOOP)",
|
|
97
98
|
},
|
|
98
99
|
};
|
|
@@ -198,11 +199,11 @@ export async function promoteMemoryToKnowledge(ctx) {
|
|
|
198
199
|
if (isProposalSkipped(proposalResult)) {
|
|
199
200
|
appendEvent({
|
|
200
201
|
eventType: "distill_invoked",
|
|
201
|
-
//
|
|
202
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
202
203
|
ref: ctx.itemRef ?? durableInputRef,
|
|
203
204
|
metadata: {
|
|
204
205
|
outcome: "skipped",
|
|
205
|
-
|
|
206
|
+
proposalRef: promotion.knowledgeRef,
|
|
206
207
|
message: proposalResult.message,
|
|
207
208
|
skipReason: proposalResult.reason,
|
|
208
209
|
...eligMeta,
|
|
@@ -213,21 +214,21 @@ export async function promoteMemoryToKnowledge(ctx) {
|
|
|
213
214
|
ok: true,
|
|
214
215
|
outcome: "skipped",
|
|
215
216
|
inputRef,
|
|
216
|
-
|
|
217
|
+
proposalRef: promotion.knowledgeRef,
|
|
218
|
+
skipReason: proposalResult.reason,
|
|
217
219
|
message: proposalResult.message,
|
|
218
220
|
};
|
|
219
221
|
}
|
|
220
222
|
const proposal = proposalResult;
|
|
221
223
|
// G4: content-score the distilled OUTPUT so it carries a real encoding
|
|
222
224
|
// salience (encoding_source='content') from creation.
|
|
223
|
-
persistOutputEncodingSalience(durableImproveRef(promotion.knowledgeRef
|
|
225
|
+
persistOutputEncodingSalience(durableImproveRef(promotion.knowledgeRef), resolvedPromotionContent, existingRefVocabulary, outcomeWeightEnabled);
|
|
224
226
|
appendEvent({
|
|
225
227
|
eventType: "distill_invoked",
|
|
226
|
-
//
|
|
228
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
227
229
|
ref: ctx.itemRef ?? durableInputRef,
|
|
228
230
|
metadata: {
|
|
229
231
|
outcome: "queued",
|
|
230
|
-
lessonRef: promotion.knowledgeRef,
|
|
231
232
|
proposalRef: promotion.knowledgeRef,
|
|
232
233
|
proposalKind: "knowledge",
|
|
233
234
|
proposalId: proposal.id,
|
|
@@ -244,7 +245,6 @@ export async function promoteMemoryToKnowledge(ctx) {
|
|
|
244
245
|
ok: true,
|
|
245
246
|
outcome: "queued",
|
|
246
247
|
inputRef,
|
|
247
|
-
lessonRef: promotion.knowledgeRef,
|
|
248
248
|
proposalRef: promotion.knowledgeRef,
|
|
249
249
|
proposalKind: "knowledge",
|
|
250
250
|
proposalId: proposal.id,
|
|
@@ -13,9 +13,9 @@ import path from "node:path";
|
|
|
13
13
|
import { parseRefInput } from "../../../core/asset/resolve-ref.js";
|
|
14
14
|
import { timestampForFilename } from "../../../core/common.js";
|
|
15
15
|
import { appendEvent } from "../../../core/events.js";
|
|
16
|
+
import { parseEmbeddedJsonResponse } from "../../../core/parse.js";
|
|
16
17
|
import { withStateDb } from "../../../core/state-db.js";
|
|
17
18
|
import { getDefaultLlmConfig } from "../../../integrations/agent/engine-resolution.js";
|
|
18
|
-
import { parseEmbeddedJsonResponse } from "../../../llm/client.js";
|
|
19
19
|
import { callStructured } from "../../../llm/structured-call.js";
|
|
20
20
|
import { akmSearch } from "../../read/search.js";
|
|
21
21
|
import { scoreEncodingSalience } from "../encoding-salience.js";
|
|
@@ -234,26 +234,26 @@ export async function runReflectQualityJudge(config, candidateContent, sourceCon
|
|
|
234
234
|
*
|
|
235
235
|
* @param stash - Root stash directory.
|
|
236
236
|
* @param inputRef - The original input ref (for the event).
|
|
237
|
-
* @param
|
|
237
|
+
* @param proposalRef - The proposed lesson/knowledge ref.
|
|
238
238
|
* @param content - The raw content that failed the quality gate.
|
|
239
239
|
* @param score - Quality score from the judge.
|
|
240
240
|
* @param reason - Human-readable rejection reason.
|
|
241
241
|
* @param extraMeta - Optional additional metadata for the event.
|
|
242
242
|
* @param eventsCtx - Events context so the emit takes appendEvent's fast path (R25).
|
|
243
243
|
*/
|
|
244
|
-
export function writeQualityRejection(stash, inputRef,
|
|
244
|
+
export function writeQualityRejection(stash, inputRef, proposalRef, content, score, reason, extraMeta = {}, eligibilitySource, eventsCtx) {
|
|
245
245
|
// D-5 / #388: reviewNeeded flag selects "review_needed" vs "quality_rejected" outcome.
|
|
246
246
|
const outcome = extraMeta.reviewNeeded ? "review_needed" : "quality_rejected";
|
|
247
247
|
const rejectDir = path.join(stash, ".akm", "distill-rejected");
|
|
248
248
|
fs.mkdirSync(rejectDir, { recursive: true });
|
|
249
249
|
const ts = timestampForFilename();
|
|
250
|
-
fs.writeFileSync(path.join(rejectDir, `${ts}-${
|
|
250
|
+
fs.writeFileSync(path.join(rejectDir, `${ts}-${proposalRef.replace(/[:/\\]/g, "-")}.md`), `---\nscore: ${score}\nreason: ${reason}\noutcome: ${outcome}\n---\n\n${content}`, "utf8");
|
|
251
251
|
appendEvent({
|
|
252
252
|
eventType: "distill_invoked",
|
|
253
253
|
ref: inputRef,
|
|
254
254
|
metadata: {
|
|
255
255
|
outcome,
|
|
256
|
-
|
|
256
|
+
proposalRef,
|
|
257
257
|
score,
|
|
258
258
|
reason,
|
|
259
259
|
...extraMeta,
|
|
@@ -267,7 +267,7 @@ export function writeQualityRejection(stash, inputRef, lessonRef, content, score
|
|
|
267
267
|
ok: true,
|
|
268
268
|
outcome,
|
|
269
269
|
inputRef,
|
|
270
|
-
|
|
270
|
+
proposalRef,
|
|
271
271
|
score,
|
|
272
272
|
reason,
|
|
273
273
|
...extraMeta,
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
* # Lesson-name derivation rule
|
|
36
36
|
*
|
|
37
37
|
* A nested input preserves its first legitimate scope segment
|
|
38
|
-
* (`
|
|
38
|
+
* (`memories/project-a/deploy` → `lessons/project-a/memory-deploy-lesson`). An
|
|
39
39
|
* unscoped input stays flat; asset types are not project scopes. Origin prefixes
|
|
40
40
|
* remain durable provenance but are not embedded in the output path.
|
|
41
41
|
*
|
|
@@ -58,6 +58,7 @@ import { getImproveProcessConfig, loadConfig } from "../../core/config/config.js
|
|
|
58
58
|
import { UsageError } from "../../core/errors.js";
|
|
59
59
|
import { appendEvent, readEvents } from "../../core/events.js";
|
|
60
60
|
import { lintLessonContent } from "../../core/lesson-lint.js";
|
|
61
|
+
import { parseEmbeddedJsonResponse } from "../../core/parse.js";
|
|
61
62
|
import { getDbPath } from "../../core/paths.js";
|
|
62
63
|
import { resolveStandardsContext } from "../../core/standards/resolve-standards-context.js";
|
|
63
64
|
import { withStateDb } from "../../core/state-db.js";
|
|
@@ -65,7 +66,7 @@ import { warnVerbose } from "../../core/warn.js";
|
|
|
65
66
|
import { resolveAssetPath } from "../../indexer/walk/path-resolver.js";
|
|
66
67
|
import { getDefaultLlmConfig } from "../../integrations/agent/engine-resolution.js";
|
|
67
68
|
import { materializeLlmRunnerConnection, resolveImproveProcessRunner } from "../../integrations/agent/runner.js";
|
|
68
|
-
import { chatCompletion
|
|
69
|
+
import { chatCompletion } from "../../llm/client.js";
|
|
69
70
|
import { callStructured } from "../../llm/structured-call.js";
|
|
70
71
|
import { closeDatabase, openIndexDatabase } from "../../storage/repositories/index-connection.js";
|
|
71
72
|
import { getAllEntries } from "../../storage/repositories/index-entries-repository.js";
|
|
@@ -82,16 +83,13 @@ import { emitProposal } from "./proposal-envelope.js";
|
|
|
82
83
|
import { createRunContext, resolveRunStashDir } from "./run-context.js";
|
|
83
84
|
import { computeSalience, upsertAssetSalience } from "./salience.js";
|
|
84
85
|
import { MAX_REJECTED_PROPOSALS } from "./shared.js";
|
|
85
|
-
import {
|
|
86
|
-
// Re-exported for `reflect.ts`, which applies the same LLM-as-judge gate to
|
|
87
|
-
// reflect proposals (R-5 / #374).
|
|
88
|
-
export { runLessonQualityJudge };
|
|
86
|
+
import { durableImproveRef } from "./source-identity.js";
|
|
89
87
|
/**
|
|
90
88
|
* Asset-ref types that `akm distill` structurally refuses as inputs.
|
|
91
89
|
*
|
|
92
90
|
* Distill *produces* lessons from non-lesson sources (memory, skill, knowledge,
|
|
93
|
-
* etc.). Calling distill on an existing `
|
|
94
|
-
* `lesson
|
|
91
|
+
* etc.). Calling distill on an existing `lessons/*` ref would derive
|
|
92
|
+
* `lessons/lesson-<name>-lesson-lesson` (double `-lesson` suffix) — the
|
|
95
93
|
* recursive-ref defect observed across 323 archived rejected proposals.
|
|
96
94
|
*
|
|
97
95
|
* 08-F2: `env` and `secret` are refused as a STRUCTURAL floor — distill reads
|
|
@@ -122,8 +120,8 @@ export function isDistillRefusedInputType(type) {
|
|
|
122
120
|
/** Derive the proposed lesson ref from the input ref. See module docblock. */
|
|
123
121
|
export function deriveLessonRef(inputRef) {
|
|
124
122
|
const parsed = parseRefInput(inputRef);
|
|
125
|
-
// Strip
|
|
126
|
-
// distils into the same lesson namespace as `
|
|
123
|
+
// Strip the bundle: a feedback signal recorded against `team//skills/deploy`
|
|
124
|
+
// distils into the same lesson namespace as `skills/deploy`. The proposal
|
|
127
125
|
// id (a UUID) keeps the queue entries distinct, so collisions are not a
|
|
128
126
|
// problem — and reviewers want to see them next to each other anyway.
|
|
129
127
|
const parts = parsed.name.split("/");
|
|
@@ -146,20 +144,17 @@ export function deriveLessonRef(inputRef) {
|
|
|
146
144
|
//
|
|
147
145
|
// The actual implementations now live in `core/proposal-quality-validators.ts`
|
|
148
146
|
// so the same checks run inside `runProposalValidators` on `proposal accept`.
|
|
149
|
-
|
|
150
|
-
// (`from "../../src/commands/distill"`) continue to resolve.
|
|
151
|
-
import { detectDoubleFrontmatter, isValidDescription, isValidWhenToUse, } from "../proposal/validators/proposal-quality-validators.js";
|
|
152
|
-
export { detectDoubleFrontmatter, isValidDescription, isValidWhenToUse };
|
|
147
|
+
import { detectDoubleFrontmatter, isValidDescription } from "../proposal/validators/proposal-quality-validators.js";
|
|
153
148
|
// ── Prompt assembly ─────────────────────────────────────────────────────────
|
|
154
149
|
const LESSON_SYSTEM_PROMPT = distillLessonSystemPrompt;
|
|
155
150
|
const KNOWLEDGE_SYSTEM_PROMPT = distillKnowledgeSystemPrompt;
|
|
156
151
|
// ── Structured-output schemas (responseSchema lift) ─────────────────────────
|
|
157
152
|
//
|
|
158
|
-
// PR 1 of the asset-writers decision (see knowledge
|
|
153
|
+
// PR 1 of the asset-writers decision (see knowledge/projects/akm/
|
|
159
154
|
// asset-writers-investigation/00-synthesis): on providers that honour
|
|
160
155
|
// `response_format: json_schema`, ask the LLM for a typed JSON object and
|
|
161
|
-
// re-assemble the markdown locally. The
|
|
162
|
-
//
|
|
156
|
+
// re-assemble the markdown locally. The "emit raw markdown with embedded
|
|
157
|
+
// frontmatter" path supports providers that ignore
|
|
163
158
|
// the schema (and for the `chat` test seam, which is wired to return strings
|
|
164
159
|
// today). Shape-level rejection codes — MALFORMED_FRONTMATTER_BLOCK,
|
|
165
160
|
// FRONTMATTER_NOT_OBJECT, INVALID_YAML, UNBALANCED_CODE_FENCE — become
|
|
@@ -334,7 +329,11 @@ export function buildDistillPrompt(input) {
|
|
|
334
329
|
}
|
|
335
330
|
lines.push("Asset content:");
|
|
336
331
|
if (input.assetContent) {
|
|
337
|
-
|
|
332
|
+
// The output contract also uses YAML fences. Feeding source frontmatter
|
|
333
|
+
// verbatim caused local models to copy it into the lesson body, producing
|
|
334
|
+
// deterministic double-frontmatter rejection. Distillation needs the
|
|
335
|
+
// source body; its metadata is not evidence to reproduce.
|
|
336
|
+
const body = parseFrontmatter(input.assetContent).content.trim().slice(0, 3000);
|
|
338
337
|
lines.push("```");
|
|
339
338
|
lines.push(body);
|
|
340
339
|
lines.push("```");
|
|
@@ -523,7 +522,7 @@ async function loadAndScoreInputSalience(args) {
|
|
|
523
522
|
/**
|
|
524
523
|
* Recursive-distillation + secret-material input guard. Distill produces
|
|
525
524
|
* *lessons* from non-lesson sources; a lesson input would derive a recursive
|
|
526
|
-
* `lesson
|
|
525
|
+
* `lessons/lesson-<name>` ref (the 323-archived-proposals defect) and
|
|
527
526
|
* env/secret inputs must never be read or sent to the LLM. Emits the
|
|
528
527
|
* `distill_invoked(skipped)` event and returns the terminal skipped result,
|
|
529
528
|
* or `null` when the input type is allowed. Extracted verbatim from
|
|
@@ -542,12 +541,11 @@ function refuseDisallowedDistillInput(args) {
|
|
|
542
541
|
: "Distill refuses lesson inputs — lessons are the distilled form, not a source.";
|
|
543
542
|
appendEvent({
|
|
544
543
|
eventType: "distill_invoked",
|
|
545
|
-
//
|
|
546
|
-
// the pre-flip source-qualified durable ref (dormant: item_ref NULL today).
|
|
544
|
+
// Key on item_ref when the planner resolved one, otherwise the conceptId.
|
|
547
545
|
ref: options.itemRef ?? durableInputRef,
|
|
548
546
|
metadata: {
|
|
549
547
|
outcome: "skipped",
|
|
550
|
-
|
|
548
|
+
proposalRef: skippedRef,
|
|
551
549
|
message,
|
|
552
550
|
skipReason: isSecretInput ? "refused_secret_input" : "recursive_lesson_input",
|
|
553
551
|
...eligMeta,
|
|
@@ -558,7 +556,8 @@ function refuseDisallowedDistillInput(args) {
|
|
|
558
556
|
ok: true,
|
|
559
557
|
outcome: "skipped",
|
|
560
558
|
inputRef,
|
|
561
|
-
|
|
559
|
+
proposalRef: skippedRef,
|
|
560
|
+
skipReason: isSecretInput ? "refused_secret_input" : "recursive_lesson_input",
|
|
562
561
|
message,
|
|
563
562
|
};
|
|
564
563
|
}
|
|
@@ -569,11 +568,26 @@ export async function akmDistill(options) {
|
|
|
569
568
|
}
|
|
570
569
|
// Validate the ref shape up front so a typo never reaches the LLM.
|
|
571
570
|
const parsedInputRef = parseRefInput(inputRef);
|
|
572
|
-
const durableInputRef = durableImproveRef(inputRef
|
|
573
|
-
//
|
|
574
|
-
//
|
|
571
|
+
const durableInputRef = durableImproveRef(inputRef);
|
|
572
|
+
// The input asset's durable salience write key is item_ref when resolved,
|
|
573
|
+
// otherwise the input conceptId.
|
|
575
574
|
const salienceWriteKey = options.itemRef ?? durableInputRef;
|
|
576
575
|
const targetKind = options.proposalKind ?? "lesson";
|
|
576
|
+
const config = options.config ?? loadConfig();
|
|
577
|
+
const improveProfile = options.improveProfile ?? resolveImproveStrategy(undefined, config).config;
|
|
578
|
+
options = { ...options, improveProfile };
|
|
579
|
+
if (!resolveProcessEnabled("distill", improveProfile)) {
|
|
580
|
+
const proposalKind = targetKind === "knowledge" ? "knowledge" : "lesson";
|
|
581
|
+
return {
|
|
582
|
+
schemaVersion: 1,
|
|
583
|
+
ok: true,
|
|
584
|
+
outcome: "config_disabled",
|
|
585
|
+
inputRef,
|
|
586
|
+
proposalRef: proposalKind === "knowledge" ? deriveKnowledgeRef(inputRef) : deriveLessonRef(inputRef),
|
|
587
|
+
proposalKind,
|
|
588
|
+
message: "distill is disabled in config; enable processes.distill.enabled to activate.",
|
|
589
|
+
};
|
|
590
|
+
}
|
|
577
591
|
// Attribution tagging: spread into every distill_invoked event's metadata so
|
|
578
592
|
// the lane that selected this asset is recorded uniformly across all outcome
|
|
579
593
|
// branches. Empty object when no lane was supplied (direct `akm distill`).
|
|
@@ -587,8 +601,6 @@ export async function akmDistill(options) {
|
|
|
587
601
|
const refused = refuseDisallowedDistillInput({ options, parsedInputRef, inputRef, durableInputRef, eligMeta });
|
|
588
602
|
if (refused)
|
|
589
603
|
return refused;
|
|
590
|
-
const config = options.config ?? loadConfig();
|
|
591
|
-
options = { ...options, improveProfile: options.improveProfile ?? resolveImproveStrategy(undefined, config).config };
|
|
592
604
|
const stash = resolveRunStashDir(options.stashDir);
|
|
593
605
|
const chat = options.chat ?? chatCompletion;
|
|
594
606
|
const distillLlm = Object.hasOwn(options, "llmConfig")
|
|
@@ -604,31 +616,17 @@ export async function akmDistill(options) {
|
|
|
604
616
|
const outcomeWeightEnabled = config.improve?.salience?.outcomeWeightEnabled !== false;
|
|
605
617
|
// D-4 / #390: similar-lessons retrieval seam (test-injectable).
|
|
606
618
|
const fetchSimilarLessonsFn = options.fetchSimilarLessonsFn ?? ((query, n) => fetchTopSimilarLessons(query, n, options.stashDir));
|
|
607
|
-
|
|
608
|
-
// resolved above — no second config load, no new db handle. distill has no
|
|
609
|
-
// `dryRun` option (only the best-effort salience stamp below writes a
|
|
610
|
-
// source asset, routed through `ctx.writeAsset`); `sourceRun` has no
|
|
611
|
-
// existing run-level convention here (unlike extract/consolidate, distill
|
|
612
|
-
// simply forwards `options.sourceRun` verbatim wherever it is set — see
|
|
613
|
-
// the `promoteMemoryToKnowledge` call below), so this is a fresh,
|
|
614
|
-
// independent token following the same `<verb>-<ms>` shape.
|
|
615
|
-
const ctx = createRunContext({
|
|
619
|
+
const assetCtx = createRunContext({
|
|
616
620
|
stashDir: stash,
|
|
617
621
|
config,
|
|
618
622
|
eventsCtx: options.eventsCtx ?? {},
|
|
619
|
-
// Not yet wired into any proposal call site this stage (mirrors
|
|
620
|
-
// buildImproveRunContext's proposalsCtx comment in improve.ts).
|
|
621
623
|
proposalsCtx: options.ctx ?? {},
|
|
622
624
|
chat,
|
|
623
625
|
getLlmConfig: () => distillLlm ?? null,
|
|
624
626
|
sourceRun: options.sourceRun ?? `distill-${Date.now()}`,
|
|
625
627
|
dryRun: false,
|
|
626
628
|
signal: options.signal,
|
|
627
|
-
});
|
|
628
|
-
// D6: a fresh, per-invocation memo. loadAndScoreInputSalience below is the
|
|
629
|
-
// genuine content-read + write-back consumer (run-context.ts's D6 seam
|
|
630
|
-
// docblock cites this exact site).
|
|
631
|
-
const assetCtx = ctx.withFreshAssetMemo();
|
|
629
|
+
}).withFreshAssetMemo();
|
|
632
630
|
const { assetContent, existingRefVocabulary } = await loadAndScoreInputSalience({
|
|
633
631
|
inputRef,
|
|
634
632
|
durableInputRef,
|
|
@@ -643,7 +641,6 @@ export async function akmDistill(options) {
|
|
|
643
641
|
readEventsImpl,
|
|
644
642
|
options,
|
|
645
643
|
durableInputRef,
|
|
646
|
-
inputRef,
|
|
647
644
|
});
|
|
648
645
|
const feedback = filteredEvents.slice(-20).map((e) => ({
|
|
649
646
|
ts: e.ts,
|
|
@@ -661,7 +658,6 @@ export async function akmDistill(options) {
|
|
|
661
658
|
inputRef,
|
|
662
659
|
durableInputRef,
|
|
663
660
|
...(options.itemRef ? { itemRef: options.itemRef } : {}),
|
|
664
|
-
sourceName: options.sourceName,
|
|
665
661
|
assetContent,
|
|
666
662
|
filteredEvents,
|
|
667
663
|
config,
|
|
@@ -838,11 +834,11 @@ async function emitDistillLessonProposal(args) {
|
|
|
838
834
|
if (isProposalSkipped(proposalResult2)) {
|
|
839
835
|
appendEvent({
|
|
840
836
|
eventType: "distill_invoked",
|
|
841
|
-
//
|
|
837
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
842
838
|
ref: options.itemRef ?? durableInputRef,
|
|
843
839
|
metadata: {
|
|
844
840
|
outcome: "skipped",
|
|
845
|
-
|
|
841
|
+
proposalRef: effectiveLessonRef,
|
|
846
842
|
message: proposalResult2.message,
|
|
847
843
|
skipReason: proposalResult2.reason,
|
|
848
844
|
...eligMeta,
|
|
@@ -853,7 +849,8 @@ async function emitDistillLessonProposal(args) {
|
|
|
853
849
|
ok: true,
|
|
854
850
|
outcome: "skipped",
|
|
855
851
|
inputRef,
|
|
856
|
-
|
|
852
|
+
proposalRef: effectiveLessonRef,
|
|
853
|
+
skipReason: proposalResult2.reason,
|
|
857
854
|
message: proposalResult2.message,
|
|
858
855
|
};
|
|
859
856
|
}
|
|
@@ -861,14 +858,13 @@ async function emitDistillLessonProposal(args) {
|
|
|
861
858
|
// G4: content-score the distilled OUTPUT so it carries a real encoding
|
|
862
859
|
// salience (encoding_source='content') from creation — lessons never get
|
|
863
860
|
// another chance (they are refused as distill inputs).
|
|
864
|
-
persistOutputEncodingSalience(durableImproveRef(effectiveLessonRef
|
|
861
|
+
persistOutputEncodingSalience(durableImproveRef(effectiveLessonRef), content, existingRefVocabulary, outcomeWeightEnabled);
|
|
865
862
|
appendEvent({
|
|
866
863
|
eventType: "distill_invoked",
|
|
867
|
-
//
|
|
864
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
868
865
|
ref: options.itemRef ?? durableInputRef,
|
|
869
866
|
metadata: {
|
|
870
867
|
outcome: "queued",
|
|
871
|
-
lessonRef: effectiveLessonRef,
|
|
872
868
|
proposalRef: effectiveLessonRef,
|
|
873
869
|
proposalKind: effectiveProposalKind,
|
|
874
870
|
proposalId: proposal2.id,
|
|
@@ -886,7 +882,6 @@ async function emitDistillLessonProposal(args) {
|
|
|
886
882
|
ok: true,
|
|
887
883
|
outcome: "queued",
|
|
888
884
|
inputRef,
|
|
889
|
-
lessonRef: effectiveLessonRef,
|
|
890
885
|
proposalRef: effectiveLessonRef,
|
|
891
886
|
proposalKind: effectiveProposalKind,
|
|
892
887
|
proposalId: proposal2.id,
|
|
@@ -906,8 +901,8 @@ function assembleAndValidateDistillContent(args) {
|
|
|
906
901
|
const { raw, effectiveProposalKind, inputRef, durableInputRef, itemRef, effectiveLessonRef, exclusionSet, filteredFeedbackCount, eligMeta, eventsCtx, } = args;
|
|
907
902
|
// Structured-output path: when the provider honoured the JSON schema, `raw`
|
|
908
903
|
// is a JSON object string (not a markdown blob). Try to parse it and assemble
|
|
909
|
-
// the canonical `---\nfm\n---\n\nbody` form before
|
|
910
|
-
//
|
|
904
|
+
// the canonical `---\nfm\n---\n\nbody` form before using the markdown
|
|
905
|
+
// response path. Failure here (non-JSON response, missing
|
|
911
906
|
// required field, unexpected types) is non-fatal — we drop down to the
|
|
912
907
|
// markdown path which has its own auto-repair + lint pass.
|
|
913
908
|
let content;
|
|
@@ -952,11 +947,11 @@ function assembleAndValidateDistillContent(args) {
|
|
|
952
947
|
if (findings.length > 0) {
|
|
953
948
|
appendEvent({
|
|
954
949
|
eventType: "distill_invoked",
|
|
955
|
-
//
|
|
950
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
956
951
|
ref: itemRef ?? durableInputRef,
|
|
957
952
|
metadata: {
|
|
958
953
|
outcome: "validation_failed",
|
|
959
|
-
|
|
954
|
+
proposalRef: effectiveLessonRef,
|
|
960
955
|
proposalKind: effectiveProposalKind,
|
|
961
956
|
findingKinds: findings.map((f) => f.kind),
|
|
962
957
|
...(exclusionSet.size > 0 ? { filteredFeedbackCount } : {}),
|
|
@@ -1046,7 +1041,6 @@ function distillEmptyResponseResult(args) {
|
|
|
1046
1041
|
ok: true,
|
|
1047
1042
|
outcome: "config_disabled",
|
|
1048
1043
|
inputRef,
|
|
1049
|
-
lessonRef: effectiveLessonRef,
|
|
1050
1044
|
proposalRef: effectiveLessonRef,
|
|
1051
1045
|
proposalKind: effectiveProposalKind,
|
|
1052
1046
|
message: "distill is disabled in config; enable processes.distill.enabled to activate.",
|
|
@@ -1058,11 +1052,11 @@ function distillEmptyResponseResult(args) {
|
|
|
1058
1052
|
// is observable.
|
|
1059
1053
|
appendEvent({
|
|
1060
1054
|
eventType: "distill_invoked",
|
|
1061
|
-
//
|
|
1055
|
+
// Use item_ref when resolved, otherwise the input conceptId.
|
|
1062
1056
|
ref: itemRef ?? durableInputRef,
|
|
1063
1057
|
metadata: {
|
|
1064
1058
|
outcome: "llm_failed",
|
|
1065
|
-
|
|
1059
|
+
proposalRef: effectiveLessonRef,
|
|
1066
1060
|
proposalKind: effectiveProposalKind,
|
|
1067
1061
|
...(exclusionSet.size > 0 ? { filteredFeedbackCount } : {}),
|
|
1068
1062
|
...eligMeta,
|
|
@@ -1073,7 +1067,6 @@ function distillEmptyResponseResult(args) {
|
|
|
1073
1067
|
ok: true,
|
|
1074
1068
|
outcome: "llm_failed",
|
|
1075
1069
|
inputRef,
|
|
1076
|
-
lessonRef: effectiveLessonRef,
|
|
1077
1070
|
proposalRef: effectiveLessonRef,
|
|
1078
1071
|
proposalKind: effectiveProposalKind,
|
|
1079
1072
|
message: "LLM call returned no usable output (timeout, empty, or error).",
|
|
@@ -1124,22 +1117,18 @@ async function applyDistillQualityGate(args) {
|
|
|
1124
1117
|
* carry. Extracted verbatim from `akmDistill`.
|
|
1125
1118
|
*/
|
|
1126
1119
|
function readDistillFeedback(args) {
|
|
1127
|
-
const { readEventsImpl, options, durableInputRef
|
|
1120
|
+
const { readEventsImpl, options, durableInputRef } = args;
|
|
1128
1121
|
const { events: unfilteredEvents } = readEventsImpl({
|
|
1129
|
-
|
|
1122
|
+
ref: options.itemRef ?? durableInputRef,
|
|
1130
1123
|
type: "feedback",
|
|
1131
1124
|
excludeTags: options.excludeTags,
|
|
1132
1125
|
includeTags: options.includeTags,
|
|
1133
1126
|
});
|
|
1134
|
-
const events =
|
|
1135
|
-
? unfilteredEvents.filter((event) => event.ref === durableInputRef || event.ref === bareImproveRef(inputRef))
|
|
1136
|
-
: unfilteredEvents;
|
|
1127
|
+
const events = unfilteredEvents;
|
|
1137
1128
|
// #267 — feedback exclusion. Filter events whose `ref` matches the
|
|
1138
1129
|
// exclusion list BEFORE the prompt is built. The original event stream
|
|
1139
1130
|
// is never mutated; only the `feedback` slice that reaches the LLM is
|
|
1140
|
-
// affected.
|
|
1141
|
-
// helpers so callers can pass canonical or origin-prefixed refs and the
|
|
1142
|
-
// comparison still works against the event payload's `ref`.
|
|
1131
|
+
// affected. Exclusion refs are compared with event refs exactly.
|
|
1143
1132
|
const exclusionList = options.excludeFeedbackFromRefs ?? [];
|
|
1144
1133
|
const exclusionSet = new Set(exclusionList.map((ref) => ref.trim()).filter((ref) => ref.length > 0));
|
|
1145
1134
|
const originalEventCount = events.length;
|