@quickchatai/quickreview 0.0.0-stage → 1.1.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/LICENSE +23 -0
- package/README.md +385 -2
- package/THIRD-PARTY-NOTICES.md +134 -0
- package/agents/pass-abstraction.md +64 -0
- package/agents/pass-ask-human.md +134 -0
- package/agents/pass-backcompat.md +67 -0
- package/agents/pass-baseline.md +61 -0
- package/agents/pass-behaviour-delta.md +64 -0
- package/agents/pass-bounds.md +36 -0
- package/agents/pass-claims.md +31 -0
- package/agents/pass-concurrency.md +168 -0
- package/agents/pass-consistency.md +57 -0
- package/agents/pass-contracts.md +30 -0
- package/agents/pass-data-safety.md +54 -0
- package/agents/pass-deferred.md +35 -0
- package/agents/pass-delivery.md +37 -0
- package/agents/pass-duplication.md +60 -0
- package/agents/pass-intent.md +63 -0
- package/agents/pass-lint-conformance.md +46 -0
- package/agents/pass-maintainability.md +67 -0
- package/agents/pass-placement.md +68 -0
- package/agents/pass-prod-risk.md +24 -0
- package/agents/pass-rollout.md +32 -0
- package/agents/pass-roundtrip.md +46 -0
- package/agents/pass-security.md +31 -0
- package/agents/pass-simplicity.md +68 -0
- package/agents/pass-statelessness.md +27 -0
- package/agents/pass-style.md +37 -0
- package/agents/pass-sweep.md +57 -0
- package/agents/pass-tests.md +58 -0
- package/agents/pass-ui.md +23 -0
- package/agents/pass-validate.md +50 -0
- package/agents/pass-widened.md +46 -0
- package/agents/scan/pass-scan.md +86 -0
- package/bin/qcr.js +11 -0
- package/config.example.toml +1067 -0
- package/deploy/ansible/README.md +356 -0
- package/deploy/ansible/group_vars/all.yml +212 -0
- package/deploy/ansible/inventory.example.ini +25 -0
- package/deploy/ansible/playbook.yml +360 -0
- package/deploy/collect-secrets.sh +289 -0
- package/deploy/collect-slack-secrets.mjs +1190 -0
- package/deploy/github-app-manifest.json +31 -0
- package/deploy/manifest.schema.json +75 -0
- package/deploy/qcr-update.sh +803 -0
- package/deploy/reviewer/AGENTS.override.md +12 -0
- package/dist/extensions/cli/bash-guard-ambient.js +42 -0
- package/dist/extensions/cli/bash-guard-ambient.js.map +1 -0
- package/dist/extensions/cli/bash-guard.js +5 -0
- package/dist/extensions/cli/bash-guard.js.map +1 -0
- package/dist/extensions/cli/companion-guard.js +5 -0
- package/dist/extensions/cli/companion-guard.js.map +1 -0
- package/dist/extensions/cli/debug-round.js +8 -0
- package/dist/extensions/cli/debug-round.js.map +1 -0
- package/dist/extensions/cli/inject-bridge.js +5 -0
- package/dist/extensions/cli/inject-bridge.js.map +1 -0
- package/dist/extensions/cli/ledger-pin.js +5 -0
- package/dist/extensions/cli/ledger-pin.js.map +1 -0
- package/dist/extensions/cli/lens.js +13 -0
- package/dist/extensions/cli/lens.js.map +1 -0
- package/dist/extensions/cli/muted-theme.js +5 -0
- package/dist/extensions/cli/muted-theme.js.map +1 -0
- package/dist/extensions/cli/onboarding.js +5 -0
- package/dist/extensions/cli/onboarding.js.map +1 -0
- package/dist/extensions/cli/setup.js +5 -0
- package/dist/extensions/cli/setup.js.map +1 -0
- package/dist/extensions/cli/tui-view.js +5 -0
- package/dist/extensions/cli/tui-view.js.map +1 -0
- package/dist/extensions/companion-guard.js +361 -0
- package/dist/extensions/companion-guard.js.map +1 -0
- package/dist/extensions/debug-round.js +204 -0
- package/dist/extensions/debug-round.js.map +1 -0
- package/dist/extensions/inject-bridge.js +603 -0
- package/dist/extensions/inject-bridge.js.map +1 -0
- package/dist/extensions/muted-theme.js +12 -0
- package/dist/extensions/muted-theme.js.map +1 -0
- package/dist/extensions/onboarding.js +175 -0
- package/dist/extensions/onboarding.js.map +1 -0
- package/dist/extensions/setup-replay.js +269 -0
- package/dist/extensions/setup-replay.js.map +1 -0
- package/dist/extensions/setup-scan.js +998 -0
- package/dist/extensions/setup-scan.js.map +1 -0
- package/dist/extensions/setup-triage.js +175 -0
- package/dist/extensions/setup-triage.js.map +1 -0
- package/dist/extensions/setup.js +1160 -0
- package/dist/extensions/setup.js.map +1 -0
- package/dist/extensions/tui-view.js +389 -0
- package/dist/extensions/tui-view.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/client.js +376 -0
- package/dist/extensions/vendor/openviking-pi/client.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/config.js +189 -0
- package/dist/extensions/vendor/openviking-pi/config.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/index.js +421 -0
- package/dist/extensions/vendor/openviking-pi/index.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +86 -0
- package/dist/extensions/vendor/openviking-pi/lib/capture-adapter.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs +408 -0
- package/dist/extensions/vendor/openviking-pi/lib/takeover-core.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +41 -0
- package/dist/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hint.js +290 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hint.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-honest.js +148 -0
- package/dist/extensions/vendor/openviking-pi/qcr-honest.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js +68 -0
- package/dist/extensions/vendor/openviking-pi/qcr-hooks.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-leaf.js +77 -0
- package/dist/extensions/vendor/openviking-pi/qcr-leaf.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-lesson.js +216 -0
- package/dist/extensions/vendor/openviking-pi/qcr-lesson.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js +154 -0
- package/dist/extensions/vendor/openviking-pi/qcr-namespaces.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-recall.js +254 -0
- package/dist/extensions/vendor/openviking-pi/qcr-recall.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-shim.js +94 -0
- package/dist/extensions/vendor/openviking-pi/qcr-shim.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/qcr-write.js +333 -0
- package/dist/extensions/vendor/openviking-pi/qcr-write.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/recall.js +108 -0
- package/dist/extensions/vendor/openviking-pi/recall.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs +529 -0
- package/dist/extensions/vendor/openviking-pi/shared/capture-utils.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs +205 -0
- package/dist/extensions/vendor/openviking-pi/shared/credentials.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs +442 -0
- package/dist/extensions/vendor/openviking-pi/shared/pending-queue.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs +286 -0
- package/dist/extensions/vendor/openviking-pi/shared/profile-inject.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +189 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs +580 -0
- package/dist/extensions/vendor/openviking-pi/shared/recall-core.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs +11 -0
- package/dist/extensions/vendor/openviking-pi/shared/retryable.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs +63 -0
- package/dist/extensions/vendor/openviking-pi/shared/session-model.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs +58 -0
- package/dist/extensions/vendor/openviking-pi/shared/uri-guard.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
- package/dist/extensions/vendor/openviking-pi/shared/workspace-peer.mjs.map +1 -0
- package/dist/extensions/vendor/openviking-pi/sync.js +127 -0
- package/dist/extensions/vendor/openviking-pi/sync.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/takeover.js +25 -0
- package/dist/extensions/vendor/openviking-pi/takeover.js.map +1 -0
- package/dist/extensions/vendor/openviking-pi/tools.js +417 -0
- package/dist/extensions/vendor/openviking-pi/tools.js.map +1 -0
- package/dist/src/anomalies.js +483 -0
- package/dist/src/anomalies.js.map +1 -0
- package/dist/src/answerworker.js +180 -0
- package/dist/src/answerworker.js.map +1 -0
- package/dist/src/appstamp.js +68 -0
- package/dist/src/appstamp.js.map +1 -0
- package/dist/src/archive/admission.js +3 -0
- package/dist/src/archive/admission.js.map +1 -0
- package/dist/src/archive/archivedb.js +474 -0
- package/dist/src/archive/archivedb.js.map +1 -0
- package/dist/src/archive/archiver.js +1770 -0
- package/dist/src/archive/archiver.js.map +1 -0
- package/dist/src/archive/archivewrite.js +198 -0
- package/dist/src/archive/archivewrite.js.map +1 -0
- package/dist/src/archive/bundle.js +266 -0
- package/dist/src/archive/bundle.js.map +1 -0
- package/dist/src/archive/dbmove.js +638 -0
- package/dist/src/archive/dbmove.js.map +1 -0
- package/dist/src/archive/duplicatecounts.js +80 -0
- package/dist/src/archive/duplicatecounts.js.map +1 -0
- package/dist/src/archive/eligibility.js +113 -0
- package/dist/src/archive/eligibility.js.map +1 -0
- package/dist/src/archive/extract.js +288 -0
- package/dist/src/archive/extract.js.map +1 -0
- package/dist/src/archive/fsutil.js +330 -0
- package/dist/src/archive/fsutil.js.map +1 -0
- package/dist/src/archive/gzfile.js +277 -0
- package/dist/src/archive/gzfile.js.map +1 -0
- package/dist/src/archive/kinds.js +22 -0
- package/dist/src/archive/kinds.js.map +1 -0
- package/dist/src/archive/livecheckpoint.js +178 -0
- package/dist/src/archive/livecheckpoint.js.map +1 -0
- package/dist/src/archive/liveretention.js +145 -0
- package/dist/src/archive/liveretention.js.map +1 -0
- package/dist/src/archive/manifest.js +284 -0
- package/dist/src/archive/manifest.js.map +1 -0
- package/dist/src/archive/overseer.js +283 -0
- package/dist/src/archive/overseer.js.map +1 -0
- package/dist/src/archive/piglobal.js +129 -0
- package/dist/src/archive/piglobal.js.map +1 -0
- package/dist/src/archive/plan.js +398 -0
- package/dist/src/archive/plan.js.map +1 -0
- package/dist/src/archive/prarchive.js +831 -0
- package/dist/src/archive/prarchive.js.map +1 -0
- package/dist/src/archive/prfiles.js +303 -0
- package/dist/src/archive/prfiles.js.map +1 -0
- package/dist/src/archive/report.js +169 -0
- package/dist/src/archive/report.js.map +1 -0
- package/dist/src/archive/restore.js +276 -0
- package/dist/src/archive/restore.js.map +1 -0
- package/dist/src/archive/rows.js +106 -0
- package/dist/src/archive/rows.js.map +1 -0
- package/dist/src/archive/seal.js +480 -0
- package/dist/src/archive/seal.js.map +1 -0
- package/dist/src/archive/status.js +528 -0
- package/dist/src/archive/status.js.map +1 -0
- package/dist/src/archive/storepass.js +409 -0
- package/dist/src/archive/storepass.js.map +1 -0
- package/dist/src/backfill.js +217 -0
- package/dist/src/backfill.js.map +1 -0
- package/dist/src/bench/cost.js +87 -0
- package/dist/src/bench/exec.js +76 -0
- package/dist/src/bench/values.js +14 -0
- package/dist/src/botcontrol.js +127 -0
- package/dist/src/botcontrol.js.map +1 -0
- package/dist/src/botworker.js +805 -0
- package/dist/src/botworker.js.map +1 -0
- package/dist/src/capture.js +234 -0
- package/dist/src/capture.js.map +1 -0
- package/dist/src/cases.js +1491 -0
- package/dist/src/cases.js.map +1 -0
- package/dist/src/channelfs.js +27 -0
- package/dist/src/channelfs.js.map +1 -0
- package/dist/src/checklist.js +312 -0
- package/dist/src/checklist.js.map +1 -0
- package/dist/src/ciretry.js +91 -0
- package/dist/src/ciretry.js.map +1 -0
- package/dist/src/cli.js +1916 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/cliops.js +333 -0
- package/dist/src/cliops.js.map +1 -0
- package/dist/src/clonedir.js +15 -0
- package/dist/src/clonedir.js.map +1 -0
- package/dist/src/commandeffects.js +43 -0
- package/dist/src/commandeffects.js.map +1 -0
- package/dist/src/commands.js +1312 -0
- package/dist/src/commands.js.map +1 -0
- package/dist/src/companioninbox.js +203 -0
- package/dist/src/companioninbox.js.map +1 -0
- package/dist/src/compare.js +673 -0
- package/dist/src/compare.js.map +1 -0
- package/dist/src/config.js +1027 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/configcheck.js +111 -0
- package/dist/src/configcheck.js.map +1 -0
- package/dist/src/coreext.js +43 -0
- package/dist/src/coreext.js.map +1 -0
- package/dist/src/daemon.js +929 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/debuground.js +731 -0
- package/dist/src/debuground.js.map +1 -0
- package/dist/src/debugroundpi.js +219 -0
- package/dist/src/debugroundpi.js.map +1 -0
- package/dist/src/diagnostics.js +14 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/digest.js +139 -0
- package/dist/src/digest.js.map +1 -0
- package/dist/src/dispatch.js +1726 -0
- package/dist/src/dispatch.js.map +1 -0
- package/dist/src/engine/answerguard.js +18 -0
- package/dist/src/engine/answerguard.js.map +1 -0
- package/dist/src/engine/botsdk.js +262 -0
- package/dist/src/engine/botsdk.js.map +1 -0
- package/dist/src/engine/caserunner-sdk.js +332 -0
- package/dist/src/engine/caserunner-sdk.js.map +1 -0
- package/dist/src/engine/debugpi.js +194 -0
- package/dist/src/engine/debugpi.js.map +1 -0
- package/dist/src/eod.js +473 -0
- package/dist/src/eod.js.map +1 -0
- package/dist/src/eodpinwatch.js +391 -0
- package/dist/src/eodpinwatch.js.map +1 -0
- package/dist/src/escalation.js +1009 -0
- package/dist/src/escalation.js.map +1 -0
- package/dist/src/eventloop.js +779 -0
- package/dist/src/eventloop.js.map +1 -0
- package/dist/src/execboundary.js +430 -0
- package/dist/src/execboundary.js.map +1 -0
- package/dist/src/feedback.js +915 -0
- package/dist/src/feedback.js.map +1 -0
- package/dist/src/findingscheck.js +200 -0
- package/dist/src/findingscheck.js.map +1 -0
- package/dist/src/fsdenied.js +26 -0
- package/dist/src/fsdenied.js.map +1 -0
- package/dist/src/ghread.js +181 -0
- package/dist/src/ghread.js.map +1 -0
- package/dist/src/github.js +1063 -0
- package/dist/src/github.js.map +1 -0
- package/dist/src/homes.js +103 -0
- package/dist/src/homes.js.map +1 -0
- package/dist/src/hostroute.js +24 -0
- package/dist/src/hostroute.js.map +1 -0
- package/dist/src/improvements.js +625 -0
- package/dist/src/improvements.js.map +1 -0
- package/dist/src/install.js +946 -0
- package/dist/src/install.js.map +1 -0
- package/dist/src/installkind.js +40 -0
- package/dist/src/installkind.js.map +1 -0
- package/dist/src/ipc/capability.js +286 -0
- package/dist/src/ipc/capability.js.map +1 -0
- package/dist/src/ipc/client.js +226 -0
- package/dist/src/ipc/client.js.map +1 -0
- package/dist/src/ipc/control.js +70 -0
- package/dist/src/ipc/control.js.map +1 -0
- package/dist/src/ipc/ghreadshim.js +77 -0
- package/dist/src/ipc/ghreadshim.js.map +1 -0
- package/dist/src/ipc/launcher.js +65 -0
- package/dist/src/ipc/launcher.js.map +1 -0
- package/dist/src/ipc/permits.js +293 -0
- package/dist/src/ipc/permits.js.map +1 -0
- package/dist/src/ipc/postshim.js +137 -0
- package/dist/src/ipc/postshim.js.map +1 -0
- package/dist/src/ipc/protocol.js +239 -0
- package/dist/src/ipc/protocol.js.map +1 -0
- package/dist/src/ipc/server.js +312 -0
- package/dist/src/ipc/server.js.map +1 -0
- package/dist/src/ipc/workerspec.js +148 -0
- package/dist/src/ipc/workerspec.js.map +1 -0
- package/dist/src/learner/learner.js +1272 -0
- package/dist/src/learner/learner.js.map +1 -0
- package/dist/src/learner/miner.js +948 -0
- package/dist/src/learner/miner.js.map +1 -0
- package/dist/src/learner/packet.js +216 -0
- package/dist/src/learner/packet.js.map +1 -0
- package/dist/src/learner/receipt.js +135 -0
- package/dist/src/learner/receipt.js.map +1 -0
- package/dist/src/learner/status.js +38 -0
- package/dist/src/learner/status.js.map +1 -0
- package/dist/src/ledgercheck.js +120 -0
- package/dist/src/ledgercheck.js.map +1 -0
- package/dist/src/lessonledger.js +451 -0
- package/dist/src/lessonledger.js.map +1 -0
- package/dist/src/lessonselect.js +639 -0
- package/dist/src/lessonselect.js.map +1 -0
- package/dist/src/lessonshadow.js +540 -0
- package/dist/src/lessonshadow.js.map +1 -0
- package/dist/src/levers.js +302 -0
- package/dist/src/levers.js.map +1 -0
- package/dist/src/live/projection.js +450 -0
- package/dist/src/live/projection.js.map +1 -0
- package/dist/src/live/publish.js +83 -0
- package/dist/src/live/publish.js.map +1 -0
- package/dist/src/live/read.js +60 -0
- package/dist/src/live/read.js.map +1 -0
- package/dist/src/livecli.js +288 -0
- package/dist/src/livecli.js.map +1 -0
- package/dist/src/loginhint.js +42 -0
- package/dist/src/loginhint.js.map +1 -0
- package/dist/src/loginrefresh/atomic.js +66 -0
- package/dist/src/loginrefresh/atomic.js.map +1 -0
- package/dist/src/loginrefresh/lock.js +93 -0
- package/dist/src/loginrefresh/lock.js.map +1 -0
- package/dist/src/loginrefresh/main.js +58 -0
- package/dist/src/loginrefresh/main.js.map +1 -0
- package/dist/src/loginrefresh/pirefresh.js +49 -0
- package/dist/src/loginrefresh/pirefresh.js.map +1 -0
- package/dist/src/loginrefresh/refresher.js +286 -0
- package/dist/src/loginrefresh/refresher.js.map +1 -0
- package/dist/src/loginrefresh/supervisor.js +253 -0
- package/dist/src/loginrefresh/supervisor.js.map +1 -0
- package/dist/src/loginrefresh/types.js +4 -0
- package/dist/src/loginrefresh/types.js.map +1 -0
- package/dist/src/memory/context.js +251 -0
- package/dist/src/memory/context.js.map +1 -0
- package/dist/src/memory/datafence.js +5 -0
- package/dist/src/memory/datafence.js.map +1 -0
- package/dist/src/memory/delivery.js +131 -0
- package/dist/src/memory/delivery.js.map +1 -0
- package/dist/src/memory/eventtags.js +81 -0
- package/dist/src/memory/eventtags.js.map +1 -0
- package/dist/src/memory/health.js +713 -0
- package/dist/src/memory/health.js.map +1 -0
- package/dist/src/memory/import.js +504 -0
- package/dist/src/memory/import.js.map +1 -0
- package/dist/src/memory/layout.js +252 -0
- package/dist/src/memory/layout.js.map +1 -0
- package/dist/src/memory/legacy-file.js +100 -0
- package/dist/src/memory/legacy-file.js.map +1 -0
- package/dist/src/memory/lessons.js +370 -0
- package/dist/src/memory/lessons.js.map +1 -0
- package/dist/src/memory/ovsession.js +449 -0
- package/dist/src/memory/ovsession.js.map +1 -0
- package/dist/src/memory/relayout.js +259 -0
- package/dist/src/memory/relayout.js.map +1 -0
- package/dist/src/memory/roundactivity.js +180 -0
- package/dist/src/memory/roundactivity.js.map +1 -0
- package/dist/src/memory/selection.js +690 -0
- package/dist/src/memory/selection.js.map +1 -0
- package/dist/src/memory/shadowstatus.js +69 -0
- package/dist/src/memory/shadowstatus.js.map +1 -0
- package/dist/src/memory/store.js +83 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/memory/textidentity.js +8 -0
- package/dist/src/memory/textidentity.js.map +1 -0
- package/dist/src/metrics.js +773 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/missingconfig.js +8 -0
- package/dist/src/missingconfig.js.map +1 -0
- package/dist/src/npmverbs.js +226 -0
- package/dist/src/npmverbs.js.map +1 -0
- package/dist/src/onboard/choices.js +191 -0
- package/dist/src/onboard/choices.js.map +1 -0
- package/dist/src/onboard/engine.js +344 -0
- package/dist/src/onboard/engine.js.map +1 -0
- package/dist/src/onboard/launch.js +83 -0
- package/dist/src/onboard/launch.js.map +1 -0
- package/dist/src/onboard/steps/appslug.js +211 -0
- package/dist/src/onboard/steps/appslug.js.map +1 -0
- package/dist/src/onboard/steps/bringup.js +408 -0
- package/dist/src/onboard/steps/bringup.js.map +1 -0
- package/dist/src/onboard/steps/compose.js +343 -0
- package/dist/src/onboard/steps/compose.js.map +1 -0
- package/dist/src/onboard/steps/configdelivery.js +50 -0
- package/dist/src/onboard/steps/configdelivery.js.map +1 -0
- package/dist/src/onboard/steps/configfill.js +1148 -0
- package/dist/src/onboard/steps/configfill.js.map +1 -0
- package/dist/src/onboard/steps/deploysh.js +80 -0
- package/dist/src/onboard/steps/deploysh.js.map +1 -0
- package/dist/src/onboard/steps/embeddings.js +472 -0
- package/dist/src/onboard/steps/embeddings.js.map +1 -0
- package/dist/src/onboard/steps/escalation.js +571 -0
- package/dist/src/onboard/steps/escalation.js.map +1 -0
- package/dist/src/onboard/steps/githubapp.js +1092 -0
- package/dist/src/onboard/steps/githubapp.js.map +1 -0
- package/dist/src/onboard/steps/golive.js +506 -0
- package/dist/src/onboard/steps/golive.js.map +1 -0
- package/dist/src/onboard/steps/index.js +67 -0
- package/dist/src/onboard/steps/index.js.map +1 -0
- package/dist/src/onboard/steps/ingress.js +762 -0
- package/dist/src/onboard/steps/ingress.js.map +1 -0
- package/dist/src/onboard/steps/inventory.js +420 -0
- package/dist/src/onboard/steps/inventory.js.map +1 -0
- package/dist/src/onboard/steps/llmauth.js +893 -0
- package/dist/src/onboard/steps/llmauth.js.map +1 -0
- package/dist/src/onboard/steps/memory.js +1060 -0
- package/dist/src/onboard/steps/memory.js.map +1 -0
- package/dist/src/onboard/steps/memorykeys.js +43 -0
- package/dist/src/onboard/steps/memorykeys.js.map +1 -0
- package/dist/src/onboard/steps/preflight.js +172 -0
- package/dist/src/onboard/steps/preflight.js.map +1 -0
- package/dist/src/onboard/steps/proof.js +502 -0
- package/dist/src/onboard/steps/proof.js.map +1 -0
- package/dist/src/onboard/steps/ssh.js +300 -0
- package/dist/src/onboard/steps/ssh.js.map +1 -0
- package/dist/src/onboard/steps/topology.js +291 -0
- package/dist/src/onboard/steps/topology.js.map +1 -0
- package/dist/src/onboard/steps/transport.js +511 -0
- package/dist/src/onboard/steps/transport.js.map +1 -0
- package/dist/src/onboard/steps/verifyup.js +362 -0
- package/dist/src/onboard/steps/verifyup.js.map +1 -0
- package/dist/src/onboard/steps/vmdeploy.js +368 -0
- package/dist/src/onboard/steps/vmdeploy.js.map +1 -0
- package/dist/src/onboard/toml.js +53 -0
- package/dist/src/onboard/toml.js.map +1 -0
- package/dist/src/opencli.js +508 -0
- package/dist/src/opencli.js.map +1 -0
- package/dist/src/openpr.js +457 -0
- package/dist/src/openpr.js.map +1 -0
- package/dist/src/openviking/client.js +821 -0
- package/dist/src/openviking/client.js.map +1 -0
- package/dist/src/openviking/context.js +218 -0
- package/dist/src/openviking/context.js.map +1 -0
- package/dist/src/openviking/embedder.js +457 -0
- package/dist/src/openviking/embedder.js.map +1 -0
- package/dist/src/openviking/gapsink.js +38 -0
- package/dist/src/openviking/gapsink.js.map +1 -0
- package/dist/src/openviking/health.js +69 -0
- package/dist/src/openviking/health.js.map +1 -0
- package/dist/src/openviking/index.js +24 -0
- package/dist/src/openviking/index.js.map +1 -0
- package/dist/src/openviking/lessonfind.js +54 -0
- package/dist/src/openviking/lessonfind.js.map +1 -0
- package/dist/src/openviking/probe.js +89 -0
- package/dist/src/openviking/probe.js.map +1 -0
- package/dist/src/openviking/proc.js +95 -0
- package/dist/src/openviking/proc.js.map +1 -0
- package/dist/src/openviking/provisionreport.js +144 -0
- package/dist/src/openviking/provisionreport.js.map +1 -0
- package/dist/src/openviking/reembed.js +317 -0
- package/dist/src/openviking/reembed.js.map +1 -0
- package/dist/src/openviking/relayout.js +153 -0
- package/dist/src/openviking/relayout.js.map +1 -0
- package/dist/src/openviking/sidecar-main.js +39 -0
- package/dist/src/openviking/sidecar-main.js.map +1 -0
- package/dist/src/openviking/sidecar.js +79 -0
- package/dist/src/openviking/sidecar.js.map +1 -0
- package/dist/src/openviking/store.js +1758 -0
- package/dist/src/openviking/store.js.map +1 -0
- package/dist/src/openviking/supervisor.js +422 -0
- package/dist/src/openviking/supervisor.js.map +1 -0
- package/dist/src/openviking/types.js +5 -0
- package/dist/src/openviking/types.js.map +1 -0
- package/dist/src/operator-recovery.js +172 -0
- package/dist/src/operator-recovery.js.map +1 -0
- package/dist/src/operatormessage.js +44 -0
- package/dist/src/operatormessage.js.map +1 -0
- package/dist/src/outcomes.js +1361 -0
- package/dist/src/outcomes.js.map +1 -0
- package/dist/src/piauthcopy.js +5 -0
- package/dist/src/piauthcopy.js.map +1 -0
- package/dist/src/picli.js +45 -0
- package/dist/src/picli.js.map +1 -0
- package/dist/src/picwd.js +25 -0
- package/dist/src/picwd.js.map +1 -0
- package/dist/src/pilogin.js +35 -0
- package/dist/src/pilogin.js.map +1 -0
- package/dist/src/pingpong.js +1028 -0
- package/dist/src/pingpong.js.map +1 -0
- package/dist/src/posting-journal.js +441 -0
- package/dist/src/posting-journal.js.map +1 -0
- package/dist/src/posting-outbox.js +662 -0
- package/dist/src/posting-outbox.js.map +1 -0
- package/dist/src/posting-receipt.js +203 -0
- package/dist/src/posting-receipt.js.map +1 -0
- package/dist/src/posting.js +348 -0
- package/dist/src/posting.js.map +1 -0
- package/dist/src/postops.js +637 -0
- package/dist/src/postops.js.map +1 -0
- package/dist/src/pr-activity.js +11 -0
- package/dist/src/pr-activity.js.map +1 -0
- package/dist/src/pr-author.js +5 -0
- package/dist/src/pr-author.js.map +1 -0
- package/dist/src/pr-conversation.js +355 -0
- package/dist/src/pr-conversation.js.map +1 -0
- package/dist/src/pr-session-lifecycle.js +542 -0
- package/dist/src/pr-session-lifecycle.js.map +1 -0
- package/dist/src/preflight.js +341 -0
- package/dist/src/preflight.js.map +1 -0
- package/dist/src/priorresolve.js +275 -0
- package/dist/src/priorresolve.js.map +1 -0
- package/dist/src/qcrbin.js +180 -0
- package/dist/src/qcrbin.js.map +1 -0
- package/dist/src/recheck.js +1398 -0
- package/dist/src/recheck.js.map +1 -0
- package/dist/src/reconcile.js +820 -0
- package/dist/src/reconcile.js.map +1 -0
- package/dist/src/recordedfindings.js +15 -0
- package/dist/src/recordedfindings.js.map +1 -0
- package/dist/src/regression.js +546 -0
- package/dist/src/regression.js.map +1 -0
- package/dist/src/replay.js +598 -0
- package/dist/src/replay.js.map +1 -0
- package/dist/src/requiredpasses.js +113 -0
- package/dist/src/requiredpasses.js.map +1 -0
- package/dist/src/resumecheck.js +168 -0
- package/dist/src/resumecheck.js.map +1 -0
- package/dist/src/reviewcli.js +671 -0
- package/dist/src/reviewcli.js.map +1 -0
- package/dist/src/reviewcontext.js +22 -0
- package/dist/src/reviewcontext.js.map +1 -0
- package/dist/src/reviewdetach.js +574 -0
- package/dist/src/reviewdetach.js.map +1 -0
- package/dist/src/reviewhistory.js +284 -0
- package/dist/src/reviewhistory.js.map +1 -0
- package/dist/src/reviewhome.js +26 -0
- package/dist/src/reviewhome.js.map +1 -0
- package/dist/src/reviewmemory.js +110 -0
- package/dist/src/reviewmemory.js.map +1 -0
- package/dist/src/reviewrendercli.js +104 -0
- package/dist/src/reviewrendercli.js.map +1 -0
- package/dist/src/round-work.js +20 -0
- package/dist/src/round-work.js.map +1 -0
- package/dist/src/runhost.js +72 -0
- package/dist/src/runhost.js.map +1 -0
- package/dist/src/scanauth.js +25 -0
- package/dist/src/scanauth.js.map +1 -0
- package/dist/src/scanbox.js +846 -0
- package/dist/src/scanbox.js.map +1 -0
- package/dist/src/scancli.js +1074 -0
- package/dist/src/scancli.js.map +1 -0
- package/dist/src/scandriverlog.js +30 -0
- package/dist/src/scandriverlog.js.map +1 -0
- package/dist/src/session-bridge.js +75 -0
- package/dist/src/session-bridge.js.map +1 -0
- package/dist/src/session-command-payload.js +29 -0
- package/dist/src/session-command-payload.js.map +1 -0
- package/dist/src/session-command-supervisor.js +939 -0
- package/dist/src/session-command-supervisor.js.map +1 -0
- package/dist/src/sessionjsonl.js +85 -0
- package/dist/src/sessionjsonl.js.map +1 -0
- package/dist/src/sessions.js +541 -0
- package/dist/src/sessions.js.map +1 -0
- package/dist/src/setup/adapters.js +330 -0
- package/dist/src/setup/adapters.js.map +1 -0
- package/dist/src/setup/baselines.js +64 -0
- package/dist/src/setup/baselines.js.map +1 -0
- package/dist/src/setup/caserunner.js +554 -0
- package/dist/src/setup/caserunner.js.map +1 -0
- package/dist/src/setup/configcommit.js +358 -0
- package/dist/src/setup/configcommit.js.map +1 -0
- package/dist/src/setup/engine.js +672 -0
- package/dist/src/setup/engine.js.map +1 -0
- package/dist/src/setup/facts.js +593 -0
- package/dist/src/setup/facts.js.map +1 -0
- package/dist/src/setup/findings.js +948 -0
- package/dist/src/setup/findings.js.map +1 -0
- package/dist/src/setup/history.js +338 -0
- package/dist/src/setup/history.js.map +1 -0
- package/dist/src/setup/interview.js +185 -0
- package/dist/src/setup/interview.js.map +1 -0
- package/dist/src/setup/ledger.js +207 -0
- package/dist/src/setup/ledger.js.map +1 -0
- package/dist/src/setup/pins.js +43 -0
- package/dist/src/setup/pins.js.map +1 -0
- package/dist/src/setup/portrait.js +432 -0
- package/dist/src/setup/portrait.js.map +1 -0
- package/dist/src/setup/presentation.js +9 -0
- package/dist/src/setup/presentation.js.map +1 -0
- package/dist/src/setup/profile.js +417 -0
- package/dist/src/setup/profile.js.map +1 -0
- package/dist/src/setup/replay.js +240 -0
- package/dist/src/setup/replay.js.map +1 -0
- package/dist/src/setup/replaybuild.js +311 -0
- package/dist/src/setup/replaybuild.js.map +1 -0
- package/dist/src/setup/replayrun.js +806 -0
- package/dist/src/setup/replayrun.js.map +1 -0
- package/dist/src/setup/replaysource.js +169 -0
- package/dist/src/setup/replaysource.js.map +1 -0
- package/dist/src/setup/retune.js +333 -0
- package/dist/src/setup/retune.js.map +1 -0
- package/dist/src/setup/retunelog.js +51 -0
- package/dist/src/setup/retunelog.js.map +1 -0
- package/dist/src/setup/scan.js +725 -0
- package/dist/src/setup/scan.js.map +1 -0
- package/dist/src/setup/scanbuild.js +133 -0
- package/dist/src/setup/scanbuild.js.map +1 -0
- package/dist/src/setup/scanfacts.js +96 -0
- package/dist/src/setup/scanfacts.js.map +1 -0
- package/dist/src/setup/scanlease.js +251 -0
- package/dist/src/setup/scanlease.js.map +1 -0
- package/dist/src/setup/scanreport.js +289 -0
- package/dist/src/setup/scanreport.js.map +1 -0
- package/dist/src/setup/scanrun.js +1733 -0
- package/dist/src/setup/scanrun.js.map +1 -0
- package/dist/src/setup/scantree.js +257 -0
- package/dist/src/setup/scantree.js.map +1 -0
- package/dist/src/setup/stage2.js +617 -0
- package/dist/src/setup/stage2.js.map +1 -0
- package/dist/src/setup/stage2request.js +259 -0
- package/dist/src/setup/stage2request.js.map +1 -0
- package/dist/src/setup/survey.js +307 -0
- package/dist/src/setup/survey.js.map +1 -0
- package/dist/src/setup/surveyrun.js +549 -0
- package/dist/src/setup/surveyrun.js.map +1 -0
- package/dist/src/setup/textsniff.js +89 -0
- package/dist/src/setup/textsniff.js.map +1 -0
- package/dist/src/setup/trackersink.js +395 -0
- package/dist/src/setup/trackersink.js.map +1 -0
- package/dist/src/setup/triage.js +636 -0
- package/dist/src/setup/triage.js.map +1 -0
- package/dist/src/setup/tuning.js +585 -0
- package/dist/src/setup/tuning.js.map +1 -0
- package/dist/src/setup/unitcut.js +437 -0
- package/dist/src/setup/unitcut.js.map +1 -0
- package/dist/src/singleflight.js +72 -0
- package/dist/src/singleflight.js.map +1 -0
- package/dist/src/slack/announce.js +725 -0
- package/dist/src/slack/announce.js.map +1 -0
- package/dist/src/slack/api.js +227 -0
- package/dist/src/slack/api.js.map +1 -0
- package/dist/src/slack/messages.js +158 -0
- package/dist/src/slack/messages.js.map +1 -0
- package/dist/src/slack/origin.js +550 -0
- package/dist/src/slack/origin.js.map +1 -0
- package/dist/src/slack/policy.js +225 -0
- package/dist/src/slack/policy.js.map +1 -0
- package/dist/src/slack/reply.js +153 -0
- package/dist/src/slack/reply.js.map +1 -0
- package/dist/src/slack/router.js +189 -0
- package/dist/src/slack/router.js.map +1 -0
- package/dist/src/slack/socket.js +323 -0
- package/dist/src/slack/socket.js.map +1 -0
- package/dist/src/slack/types.js +11 -0
- package/dist/src/slack/types.js.map +1 -0
- package/dist/src/sqlitehint.js +30 -0
- package/dist/src/sqlitehint.js.map +1 -0
- package/dist/src/ssh-observation.js +25 -0
- package/dist/src/ssh-observation.js.map +1 -0
- package/dist/src/state.js +5869 -0
- package/dist/src/state.js.map +1 -0
- package/dist/src/statemachine.js +220 -0
- package/dist/src/statemachine.js.map +1 -0
- package/dist/src/stubs.js +52 -0
- package/dist/src/stubs.js.map +1 -0
- package/dist/src/takeover.js +506 -0
- package/dist/src/takeover.js.map +1 -0
- package/dist/src/takeoverpi.js +249 -0
- package/dist/src/takeoverpi.js.map +1 -0
- package/dist/src/terminal-failure.js +26 -0
- package/dist/src/terminal-failure.js.map +1 -0
- package/dist/src/thread-resolution-refusal.js +4 -0
- package/dist/src/thread-resolution-refusal.js.map +1 -0
- package/dist/src/tmux.js +126 -0
- package/dist/src/tmux.js.map +1 -0
- package/dist/src/trackerid.js +43 -0
- package/dist/src/trackerid.js.map +1 -0
- package/dist/src/transcriptindex.js +512 -0
- package/dist/src/transcriptindex.js.map +1 -0
- package/dist/src/tui/actions.js +404 -0
- package/dist/src/tui/actions.js.map +1 -0
- package/dist/src/tui/alerts.js +523 -0
- package/dist/src/tui/alerts.js.map +1 -0
- package/dist/src/tui/app.js +1835 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/archiveops.js +164 -0
- package/dist/src/tui/archiveops.js.map +1 -0
- package/dist/src/tui/autofile.js +191 -0
- package/dist/src/tui/autofile.js.map +1 -0
- package/dist/src/tui/board.js +1143 -0
- package/dist/src/tui/board.js.map +1 -0
- package/dist/src/tui/candidates.js +699 -0
- package/dist/src/tui/candidates.js.map +1 -0
- package/dist/src/tui/cellwidth.js +151 -0
- package/dist/src/tui/cellwidth.js.map +1 -0
- package/dist/src/tui/changelog-store.js +404 -0
- package/dist/src/tui/changelog-store.js.map +1 -0
- package/dist/src/tui/chord.js +26 -0
- package/dist/src/tui/chord.js.map +1 -0
- package/dist/src/tui/clipboard.js +81 -0
- package/dist/src/tui/clipboard.js.map +1 -0
- package/dist/src/tui/cmdbar.js +253 -0
- package/dist/src/tui/cmdbar.js.map +1 -0
- package/dist/src/tui/companion.js +1275 -0
- package/dist/src/tui/companion.js.map +1 -0
- package/dist/src/tui/companionplan.js +200 -0
- package/dist/src/tui/companionplan.js.map +1 -0
- package/dist/src/tui/companiontab.js +61 -0
- package/dist/src/tui/companiontab.js.map +1 -0
- package/dist/src/tui/confighome.js +105 -0
- package/dist/src/tui/confighome.js.map +1 -0
- package/dist/src/tui/connect.js +44 -0
- package/dist/src/tui/connect.js.map +1 -0
- package/dist/src/tui/deploy-ceremony.js +75 -0
- package/dist/src/tui/deploy-ceremony.js.map +1 -0
- package/dist/src/tui/deploy-drain.js +93 -0
- package/dist/src/tui/deploy-drain.js.map +1 -0
- package/dist/src/tui/deploy-process.js +234 -0
- package/dist/src/tui/deploy-process.js.map +1 -0
- package/dist/src/tui/deploytab.js +1263 -0
- package/dist/src/tui/deploytab.js.map +1 -0
- package/dist/src/tui/design.js +111 -0
- package/dist/src/tui/design.js.map +1 -0
- package/dist/src/tui/digesttab.js +148 -0
- package/dist/src/tui/digesttab.js.map +1 -0
- package/dist/src/tui/emptystate.js +32 -0
- package/dist/src/tui/emptystate.js.map +1 -0
- package/dist/src/tui/evidence.js +790 -0
- package/dist/src/tui/evidence.js.map +1 -0
- package/dist/src/tui/feed.js +415 -0
- package/dist/src/tui/feed.js.map +1 -0
- package/dist/src/tui/feedbacktab.js +907 -0
- package/dist/src/tui/feedbacktab.js.map +1 -0
- package/dist/src/tui/filters.js +72 -0
- package/dist/src/tui/filters.js.map +1 -0
- package/dist/src/tui/ghread.js +272 -0
- package/dist/src/tui/ghread.js.map +1 -0
- package/dist/src/tui/historypull.js +61 -0
- package/dist/src/tui/historypull.js.map +1 -0
- package/dist/src/tui/inboxpull.js +197 -0
- package/dist/src/tui/inboxpull.js.map +1 -0
- package/dist/src/tui/index.js +1425 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/issuesink.js +206 -0
- package/dist/src/tui/issuesink.js.map +1 -0
- package/dist/src/tui/jsonfile.js +32 -0
- package/dist/src/tui/jsonfile.js.map +1 -0
- package/dist/src/tui/keys.js +97 -0
- package/dist/src/tui/keys.js.map +1 -0
- package/dist/src/tui/layout.js +70 -0
- package/dist/src/tui/layout.js.map +1 -0
- package/dist/src/tui/learning.js +469 -0
- package/dist/src/tui/learning.js.map +1 -0
- package/dist/src/tui/lessonswitch.js +103 -0
- package/dist/src/tui/lessonswitch.js.map +1 -0
- package/dist/src/tui/livecontrol.js +167 -0
- package/dist/src/tui/livecontrol.js.map +1 -0
- package/dist/src/tui/memforward.js +310 -0
- package/dist/src/tui/memforward.js.map +1 -0
- package/dist/src/tui/memincident.js +287 -0
- package/dist/src/tui/memincident.js.map +1 -0
- package/dist/src/tui/memory.js +485 -0
- package/dist/src/tui/memory.js.map +1 -0
- package/dist/src/tui/memtab.js +513 -0
- package/dist/src/tui/memtab.js.map +1 -0
- package/dist/src/tui/metricstab.js +979 -0
- package/dist/src/tui/metricstab.js.map +1 -0
- package/dist/src/tui/model.js +104 -0
- package/dist/src/tui/model.js.map +1 -0
- package/dist/src/tui/mouse.js +83 -0
- package/dist/src/tui/mouse.js.map +1 -0
- package/dist/src/tui/msg.js +196 -0
- package/dist/src/tui/msg.js.map +1 -0
- package/dist/src/tui/nativecompanion.js +321 -0
- package/dist/src/tui/nativecompanion.js.map +1 -0
- package/dist/src/tui/openurl.js +17 -0
- package/dist/src/tui/openurl.js.map +1 -0
- package/dist/src/tui/paint.js +501 -0
- package/dist/src/tui/paint.js.map +1 -0
- package/dist/src/tui/panes.js +74 -0
- package/dist/src/tui/panes.js.map +1 -0
- package/dist/src/tui/pipane.js +166 -0
- package/dist/src/tui/pipane.js.map +1 -0
- package/dist/src/tui/poll-hooks.js +11 -0
- package/dist/src/tui/poll-hooks.js.map +1 -0
- package/dist/src/tui/poll.js +113 -0
- package/dist/src/tui/poll.js.map +1 -0
- package/dist/src/tui/proposals.js +715 -0
- package/dist/src/tui/proposals.js.map +1 -0
- package/dist/src/tui/prpause.js +132 -0
- package/dist/src/tui/prpause.js.map +1 -0
- package/dist/src/tui/reload.js +351 -0
- package/dist/src/tui/reload.js.map +1 -0
- package/dist/src/tui/remote.js +312 -0
- package/dist/src/tui/remote.js.map +1 -0
- package/dist/src/tui/rollover.js +767 -0
- package/dist/src/tui/rollover.js.map +1 -0
- package/dist/src/tui/scantab.js +1053 -0
- package/dist/src/tui/scantab.js.map +1 -0
- package/dist/src/tui/setupentry.js +81 -0
- package/dist/src/tui/setupentry.js.map +1 -0
- package/dist/src/tui/sidebar.js +602 -0
- package/dist/src/tui/sidebar.js.map +1 -0
- package/dist/src/tui/sshtriage.js +393 -0
- package/dist/src/tui/sshtriage.js.map +1 -0
- package/dist/src/tui/startup.js +172 -0
- package/dist/src/tui/startup.js.map +1 -0
- package/dist/src/tui/tabs.js +41 -0
- package/dist/src/tui/tabs.js.map +1 -0
- package/dist/src/tui/termmirror.js +217 -0
- package/dist/src/tui/termmirror.js.map +1 -0
- package/dist/src/tui/theme.js +95 -0
- package/dist/src/tui/theme.js.map +1 -0
- package/dist/src/tui/ticketstab.js +224 -0
- package/dist/src/tui/ticketstab.js.map +1 -0
- package/dist/src/tui/tmuxsocket.js +101 -0
- package/dist/src/tui/tmuxsocket.js.map +1 -0
- package/dist/src/tui/trackertickets.js +77 -0
- package/dist/src/tui/trackertickets.js.map +1 -0
- package/dist/src/tui/unwedge.js +245 -0
- package/dist/src/tui/unwedge.js.map +1 -0
- package/dist/src/tui/viewer.js +479 -0
- package/dist/src/tui/viewer.js.map +1 -0
- package/dist/src/tui/viewerinput.js +125 -0
- package/dist/src/tui/viewerinput.js.map +1 -0
- package/dist/src/updatenotice.js +143 -0
- package/dist/src/updatenotice.js.map +1 -0
- package/dist/src/usage.js +1007 -0
- package/dist/src/usage.js.map +1 -0
- package/dist/src/verdicts.js +3848 -0
- package/dist/src/verdicts.js.map +1 -0
- package/dist/src/version.js +58 -0
- package/dist/src/version.js.map +1 -0
- package/dist/src/wakes.js +411 -0
- package/dist/src/wakes.js.map +1 -0
- package/dist/src/webhook.js +725 -0
- package/dist/src/webhook.js.map +1 -0
- package/dist/src/webhookheal.js +238 -0
- package/dist/src/webhookheal.js.map +1 -0
- package/dist/src/wire.js +1801 -0
- package/dist/src/wire.js.map +1 -0
- package/dist/src/worker-session-host.js +531 -0
- package/dist/src/worker-session-host.js.map +1 -0
- package/dist/src/workerbreaker.js +112 -0
- package/dist/src/workerbreaker.js.map +1 -0
- package/dist/src/workercontrol.js +49 -0
- package/dist/src/workercontrol.js.map +1 -0
- package/dist/src/workerlease.js +351 -0
- package/dist/src/workerlease.js.map +1 -0
- package/dist/src/workerliveness.js +84 -0
- package/dist/src/workerliveness.js.map +1 -0
- package/dist/src/workerlog.js +65 -0
- package/dist/src/workerlog.js.map +1 -0
- package/dist/src/workerruntime.js +10 -0
- package/dist/src/workerruntime.js.map +1 -0
- package/dist/src/workersupervisor.js +1206 -0
- package/dist/src/workersupervisor.js.map +1 -0
- package/dist/src/workerusage.js +23 -0
- package/dist/src/workerusage.js.map +1 -0
- package/dist/src/workerworld.js +332 -0
- package/dist/src/workerworld.js.map +1 -0
- package/dist/src/worktrees.js +984 -0
- package/dist/src/worktrees.js.map +1 -0
- package/docker/Dockerfile +284 -0
- package/docker/Dockerfile.dockerignore +35 -0
- package/docker/README.md +221 -0
- package/docker/companion/Dockerfile +139 -0
- package/docker/companion/agents/evidence.md +34 -0
- package/docker/companion/agents/explore.md +26 -0
- package/docker/companion/agents/pass-survey.md +49 -0
- package/docker/companion/agents/study.md +26 -0
- package/docker/companion/entrypoint.sh +343 -0
- package/docker/companion/memory-health.mjs +269 -0
- package/docker/entrypoint.sh +782 -0
- package/docker/memory/Dockerfile +191 -0
- package/docker/memory/Dockerfile.dockerignore +20 -0
- package/docker/memory/README.md +60 -0
- package/docker/memory/entrypoint.sh +163 -0
- package/docker/setid/qcr-setid.c +109 -0
- package/docker/tunnel/Dockerfile.cloudflared +51 -0
- package/docker/tunnel/Dockerfile.ngrok +40 -0
- package/docker/tunnel/sidecar.mjs +411 -0
- package/docker/vm/tmux.conf +26 -0
- package/docker-compose.yml +348 -0
- package/extensions/cli/bash-guard-ambient.ts +71 -0
- package/extensions/cli/bash-guard.ts +12 -0
- package/extensions/cli/companion-guard.ts +8 -0
- package/extensions/cli/debug-round.ts +9 -0
- package/extensions/cli/inject-bridge.ts +8 -0
- package/extensions/cli/ledger-pin.ts +13 -0
- package/extensions/cli/lens.ts +22 -0
- package/extensions/cli/muted-theme.ts +9 -0
- package/extensions/cli/onboarding.ts +8 -0
- package/extensions/cli/setup.ts +8 -0
- package/extensions/cli/tui-view.ts +8 -0
- package/extensions/companion-guard.ts +411 -0
- package/extensions/debug-round.ts +281 -0
- package/extensions/inject-bridge.ts +630 -0
- package/extensions/inline-bash.ts +102 -0
- package/extensions/muted-theme.json +68 -0
- package/extensions/muted-theme.ts +23 -0
- package/extensions/onboarding.ts +233 -0
- package/extensions/setup-replay.ts +336 -0
- package/extensions/setup-scan.ts +1236 -0
- package/extensions/setup-triage.ts +190 -0
- package/extensions/setup.ts +1428 -0
- package/extensions/tui-view.ts +489 -0
- package/extensions/vendor/openviking-pi/LICENSE +201 -0
- package/extensions/vendor/openviking-pi/NOTICE +68 -0
- package/extensions/vendor/openviking-pi/README.md +550 -0
- package/extensions/vendor/openviking-pi/client.ts +588 -0
- package/extensions/vendor/openviking-pi/config.json +28 -0
- package/extensions/vendor/openviking-pi/config.ts +271 -0
- package/extensions/vendor/openviking-pi/index.ts +523 -0
- package/extensions/vendor/openviking-pi/lib/capture-adapter.d.mts +10 -0
- package/extensions/vendor/openviking-pi/lib/capture-adapter.mjs +88 -0
- package/extensions/vendor/openviking-pi/lib/takeover-core.d.mts +80 -0
- package/extensions/vendor/openviking-pi/lib/takeover-core.mjs +406 -0
- package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.d.mts +1 -0
- package/extensions/vendor/openviking-pi/lib/uri-guard-adapter.mjs +42 -0
- package/extensions/vendor/openviking-pi/patches/0000-vendoring-and-build-conformance.patch +726 -0
- package/extensions/vendor/openviking-pi/patches/0001-remove-session-before-compact-handler.patch +101 -0
- package/extensions/vendor/openviking-pi/patches/0002-no-ambient-work-in-subagent-leaves.patch +202 -0
- package/extensions/vendor/openviking-pi/patches/0003-never-auto-create-openviking-sessions.patch +120 -0
- package/extensions/vendor/openviking-pi/patches/0004-viking-write-durable-batch-write.patch +521 -0
- package/extensions/vendor/openviking-pi/patches/0005-second-memory-namespace.patch +786 -0
- package/extensions/vendor/openviking-pi/patches/0006-writes-that-stick-and-honest-errors.patch +996 -0
- package/extensions/vendor/openviking-pi/patches/0007-bounded-recall-no-commit.patch +794 -0
- package/extensions/vendor/openviking-pi/patches/0008-pr-derived-recall.patch +379 -0
- package/extensions/vendor/openviking-pi/patches/0009-pr-session-tools-in-round-areas.patch +375 -0
- package/extensions/vendor/openviking-pi/patches/0010-typed-lessons.patch +448 -0
- package/extensions/vendor/openviking-pi/patches/0011-review-session-memory-boundary.patch +382 -0
- package/extensions/vendor/openviking-pi/patches/0012-typecheck-against-the-real-pi.patch +129 -0
- package/extensions/vendor/openviking-pi/patches/0013-createopenviking-factory.patch +1168 -0
- package/extensions/vendor/openviking-pi/qcr-hint.ts +313 -0
- package/extensions/vendor/openviking-pi/qcr-honest.ts +183 -0
- package/extensions/vendor/openviking-pi/qcr-hooks.ts +87 -0
- package/extensions/vendor/openviking-pi/qcr-leaf.ts +78 -0
- package/extensions/vendor/openviking-pi/qcr-lesson.ts +231 -0
- package/extensions/vendor/openviking-pi/qcr-namespaces.ts +198 -0
- package/extensions/vendor/openviking-pi/qcr-recall.ts +288 -0
- package/extensions/vendor/openviking-pi/qcr-shim.ts +142 -0
- package/extensions/vendor/openviking-pi/qcr-write.ts +427 -0
- package/extensions/vendor/openviking-pi/recall.ts +149 -0
- package/extensions/vendor/openviking-pi/shared/capture-utils.d.mts +9 -0
- package/extensions/vendor/openviking-pi/shared/capture-utils.mjs +515 -0
- package/extensions/vendor/openviking-pi/shared/credentials.d.mts +14 -0
- package/extensions/vendor/openviking-pi/shared/credentials.mjs +228 -0
- package/extensions/vendor/openviking-pi/shared/pending-queue.d.mts +19 -0
- package/extensions/vendor/openviking-pi/shared/pending-queue.mjs +458 -0
- package/extensions/vendor/openviking-pi/shared/profile-inject.d.mts +17 -0
- package/extensions/vendor/openviking-pi/shared/profile-inject.mjs +294 -0
- package/extensions/vendor/openviking-pi/shared/recall-compress-core.mjs +195 -0
- package/extensions/vendor/openviking-pi/shared/recall-core.d.mts +13 -0
- package/extensions/vendor/openviking-pi/shared/recall-core.mjs +609 -0
- package/extensions/vendor/openviking-pi/shared/retryable.mjs +9 -0
- package/extensions/vendor/openviking-pi/shared/session-model.d.mts +3 -0
- package/extensions/vendor/openviking-pi/shared/session-model.mjs +57 -0
- package/extensions/vendor/openviking-pi/shared/uri-guard.mjs +56 -0
- package/extensions/vendor/openviking-pi/shared/workspace-peer.d.mts +5 -0
- package/extensions/vendor/openviking-pi/shared/workspace-peer.mjs +16 -0
- package/extensions/vendor/openviking-pi/sync.ts +163 -0
- package/extensions/vendor/openviking-pi/takeover.ts +36 -0
- package/extensions/vendor/openviking-pi/tools.ts +479 -0
- package/extensions/vendor/openviking-pi/upstream.json +48 -0
- package/package.json +138 -4
- package/profiles/default/README.md +21 -0
- package/profiles/default/addenda/.gitkeep +0 -0
- package/profiles/default/profile.toml +17 -0
- package/profiles/example-django/README.md +21 -0
- package/profiles/example-django/addenda/10-migration-discipline.md +13 -0
- package/profiles/example-django/addenda/20-new-column-nullability.md +12 -0
- package/profiles/example-django/addenda/30-test-doctrine.md +12 -0
- package/profiles/example-django/addenda/40-orm-usage.md +19 -0
- package/profiles/example-django/addenda/50-declared-shape.md +10 -0
- package/profiles/example-django/addenda/60-config-placement.md +14 -0
- package/profiles/example-django/heuristics.toml +24 -0
- package/profiles/example-django/profile.toml +9 -0
- package/profiles/fast/README.md +24 -0
- package/profiles/fast/profile.toml +59 -0
- package/profiles/minimal/README.md +17 -0
- package/profiles/minimal/addenda/.gitkeep +0 -0
- package/profiles/minimal/profile.toml +8 -0
- package/profiles/snappy/README.md +24 -0
- package/profiles/snappy/addenda/10-race-as-question.md +6 -0
- package/profiles/snappy/profile.toml +46 -0
- package/prompts/companion-day-open.md +46 -0
- package/prompts/companion-first-run.md +104 -0
- package/prompts/companion.md +821 -0
- package/prompts/conversation-system.md +117 -0
- package/prompts/eod-sweep.md +120 -0
- package/prompts/onboarding.md +74 -0
- package/prompts/pass-common.md +52 -0
- package/prompts/pass-quality-common.md +22 -0
- package/prompts/round-first.md +874 -0
- package/prompts/round-follow-up.md +991 -0
- package/prompts/round-re-review.md +889 -0
- package/prompts/round-recheck.md +196 -0
- package/prompts/round-staleness.md +856 -0
- package/schemas/review-result.v1.json +391 -0
- package/schemas/scan-result.v1.json +421 -0
- package/schemas/version.v1.json +57 -0
- package/scripts/approve-pr.sh +16 -0
- package/scripts/build-stamp.mjs +67 -0
- package/scripts/commit-verdict.sh +155 -0
- package/scripts/companion-e2e.sh +250 -0
- package/scripts/companion-memory-forward.mjs +1966 -0
- package/scripts/config-fingerprint.sh +28 -0
- package/scripts/deploy-manifest.mjs +141 -0
- package/scripts/deploy.sh +1435 -0
- package/scripts/directory-lock.mjs +193 -0
- package/scripts/heartbeat-fresh.mjs +54 -0
- package/scripts/install-locator.sh +328 -0
- package/scripts/install-wrapper.sh +76 -0
- package/scripts/memory-search-check.mjs +98 -0
- package/scripts/mint-token.sh +212 -0
- package/scripts/openviking-embedder.py +392 -0
- package/scripts/openviking-ov-conf.mjs +161 -0
- package/scripts/openviking-provision.mjs +1122 -0
- package/scripts/openviking-reembed.mjs +1154 -0
- package/scripts/post-review.sh +16 -0
- package/scripts/pr-checks.sh +256 -0
- package/scripts/pr-context.py +174 -0
- package/scripts/pr-context.sh +63 -0
- package/scripts/pr-self.sh +144 -0
- package/scripts/pr-threads.sh +145 -0
- package/scripts/qcr +15 -0
- package/scripts/qcr-host.sh +769 -0
- package/scripts/render-review.sh +24 -0
- package/scripts/reply-thread.sh +16 -0
- package/scripts/required-passes.py +112 -0
- package/scripts/smoke-companion.sh +211 -0
- package/scripts/tui-deploy-runner.mjs +61 -0
- package/scripts/verify-dist.mjs +201 -0
- package/scripts/vm-ghcr-login.sh +188 -0
- package/seeds/agents/pass-baseline.md +61 -0
- package/seeds/agents/pass-contracts.md +30 -0
- package/seeds/agents/pass-data-safety.md +54 -0
- package/seeds/agents/pass-delivery.md +37 -0
- package/seeds/agents/pass-prod-risk.md +24 -0
- package/seeds/agents/pass-security.md +31 -0
- package/seeds/agents/pass-statelessness.md +27 -0
- package/seeds/agents/pass-ui.md +23 -0
- package/seeds/agents/pass-validate.md +50 -0
- package/seeds/prompts/conversation-system.md +117 -0
- package/seeds/prompts/eod-sweep.md +120 -0
- package/seeds/prompts/pass-common.md +52 -0
- package/skills/companion/adjudicate/SKILL.md +247 -0
- package/skills/companion/evidence/SKILL.md +150 -0
- package/skills/companion/land/SKILL.md +200 -0
- package/skills/companion/replay/SKILL.md +138 -0
- package/skills/companion/setup/SKILL.md +167 -0
- package/skills/companion/survey/SKILL.md +160 -0
- package/skills/selfimprove/README.md +34 -0
- package/skills/selfimprove/SKILL.md +127 -0
- package/skills/selfimprove/agents/openai.yaml +2 -0
- package/skills/selfimprove/commands/selfimprove.md +6 -0
- package/skills/selfimprove/references/fix-loop.md +49 -0
- package/skills/selfimprove/references/ledger.md +20 -0
- package/skills/selfimprove/references/setup.md +40 -0
- package/src/anomalies.ts +566 -0
- package/src/answerworker.ts +251 -0
- package/src/appstamp.ts +65 -0
- package/src/archive/admission.ts +3 -0
- package/src/archive/archivedb.ts +548 -0
- package/src/archive/archiver.ts +1963 -0
- package/src/archive/archivewrite.ts +279 -0
- package/src/archive/bundle.ts +333 -0
- package/src/archive/dbmove.ts +911 -0
- package/src/archive/duplicatecounts.ts +98 -0
- package/src/archive/eligibility.ts +181 -0
- package/src/archive/extract.ts +342 -0
- package/src/archive/fsutil.ts +415 -0
- package/src/archive/gzfile.ts +370 -0
- package/src/archive/kinds.ts +21 -0
- package/src/archive/livecheckpoint.ts +217 -0
- package/src/archive/liveretention.ts +180 -0
- package/src/archive/manifest.ts +519 -0
- package/src/archive/overseer.ts +336 -0
- package/src/archive/piglobal.ts +174 -0
- package/src/archive/plan.ts +612 -0
- package/src/archive/prarchive.ts +984 -0
- package/src/archive/prfiles.ts +406 -0
- package/src/archive/report.ts +252 -0
- package/src/archive/restore.ts +330 -0
- package/src/archive/rows.ts +187 -0
- package/src/archive/seal.ts +630 -0
- package/src/archive/status.ts +719 -0
- package/src/archive/storepass.ts +581 -0
- package/src/backfill.ts +362 -0
- package/src/bench/cost.ts +113 -0
- package/src/bench/exec.ts +90 -0
- package/src/bench/values.ts +13 -0
- package/src/botcontrol.ts +176 -0
- package/src/botworker.ts +953 -0
- package/src/capture.ts +321 -0
- package/src/cases.ts +1789 -0
- package/src/channelfs.ts +26 -0
- package/src/checklist.ts +506 -0
- package/src/ciretry.ts +141 -0
- package/src/cli.ts +2271 -0
- package/src/cliops.ts +384 -0
- package/src/clonedir.ts +15 -0
- package/src/commandeffects.ts +57 -0
- package/src/commands.ts +1678 -0
- package/src/companioninbox.ts +239 -0
- package/src/compare.ts +957 -0
- package/src/config.ts +2050 -0
- package/src/configcheck.ts +133 -0
- package/src/coreext.ts +47 -0
- package/src/daemon.ts +1302 -0
- package/src/debuground.ts +927 -0
- package/src/debugroundpi.ts +262 -0
- package/src/diagnostics.ts +14 -0
- package/src/digest.ts +183 -0
- package/src/dispatch.ts +2250 -0
- package/src/engine/answerguard.ts +27 -0
- package/src/engine/botsdk.ts +336 -0
- package/src/engine/caserunner-sdk.ts +423 -0
- package/src/engine/debugpi.ts +235 -0
- package/src/eod.ts +669 -0
- package/src/eodpinwatch.ts +556 -0
- package/src/escalation.ts +1253 -0
- package/src/eventloop.ts +1045 -0
- package/src/execboundary.ts +633 -0
- package/src/feedback.ts +1162 -0
- package/src/findingscheck.ts +298 -0
- package/src/fsdenied.ts +24 -0
- package/src/ghread.ts +242 -0
- package/src/github.ts +1497 -0
- package/src/homes.ts +175 -0
- package/src/hostroute.ts +53 -0
- package/src/improvements.ts +787 -0
- package/src/install.ts +1103 -0
- package/src/installkind.ts +50 -0
- package/src/ipc/capability.ts +333 -0
- package/src/ipc/client.ts +269 -0
- package/src/ipc/control.ts +90 -0
- package/src/ipc/ghreadshim.ts +94 -0
- package/src/ipc/launcher.ts +65 -0
- package/src/ipc/permits.ts +362 -0
- package/src/ipc/postshim.ts +164 -0
- package/src/ipc/protocol.ts +342 -0
- package/src/ipc/server.ts +371 -0
- package/src/ipc/workerspec.ts +218 -0
- package/src/learner/learner.ts +1655 -0
- package/src/learner/miner.ts +1290 -0
- package/src/learner/packet.ts +340 -0
- package/src/learner/receipt.ts +168 -0
- package/src/learner/status.ts +107 -0
- package/src/ledgercheck.ts +157 -0
- package/src/lessonledger.ts +703 -0
- package/src/lessonselect.ts +888 -0
- package/src/lessonshadow.ts +810 -0
- package/src/levers.ts +393 -0
- package/src/live/projection.ts +491 -0
- package/src/live/publish.ts +92 -0
- package/src/live/read.ts +86 -0
- package/src/livecli.ts +336 -0
- package/src/loginhint.ts +56 -0
- package/src/loginrefresh/atomic.ts +76 -0
- package/src/loginrefresh/lock.ts +104 -0
- package/src/loginrefresh/main.ts +59 -0
- package/src/loginrefresh/pirefresh.ts +57 -0
- package/src/loginrefresh/refresher.ts +326 -0
- package/src/loginrefresh/supervisor.ts +273 -0
- package/src/loginrefresh/types.ts +35 -0
- package/src/memory/context.ts +385 -0
- package/src/memory/datafence.ts +9 -0
- package/src/memory/delivery.ts +171 -0
- package/src/memory/eventtags.ts +80 -0
- package/src/memory/health.ts +953 -0
- package/src/memory/import.ts +664 -0
- package/src/memory/layout.ts +261 -0
- package/src/memory/legacy-file.ts +104 -0
- package/src/memory/lessons.ts +447 -0
- package/src/memory/ovsession.ts +601 -0
- package/src/memory/relayout.ts +335 -0
- package/src/memory/roundactivity.ts +209 -0
- package/src/memory/selection.ts +989 -0
- package/src/memory/shadowstatus.ts +125 -0
- package/src/memory/store.ts +275 -0
- package/src/memory/textidentity.ts +8 -0
- package/src/metrics.ts +1056 -0
- package/src/missingconfig.ts +7 -0
- package/src/npmverbs.ts +264 -0
- package/src/onboard/choices.ts +222 -0
- package/src/onboard/engine.ts +518 -0
- package/src/onboard/launch.ts +115 -0
- package/src/onboard/steps/appslug.ts +265 -0
- package/src/onboard/steps/bringup.ts +482 -0
- package/src/onboard/steps/compose.ts +459 -0
- package/src/onboard/steps/configdelivery.ts +58 -0
- package/src/onboard/steps/configfill.ts +1352 -0
- package/src/onboard/steps/deploysh.ts +105 -0
- package/src/onboard/steps/embeddings.ts +550 -0
- package/src/onboard/steps/escalation.ts +640 -0
- package/src/onboard/steps/githubapp.ts +1414 -0
- package/src/onboard/steps/golive.ts +577 -0
- package/src/onboard/steps/index.ts +71 -0
- package/src/onboard/steps/ingress.ts +907 -0
- package/src/onboard/steps/inventory.ts +526 -0
- package/src/onboard/steps/llmauth.ts +1095 -0
- package/src/onboard/steps/memory.ts +1290 -0
- package/src/onboard/steps/memorykeys.ts +85 -0
- package/src/onboard/steps/preflight.ts +191 -0
- package/src/onboard/steps/proof.ts +624 -0
- package/src/onboard/steps/ssh.ts +377 -0
- package/src/onboard/steps/topology.ts +337 -0
- package/src/onboard/steps/transport.ts +665 -0
- package/src/onboard/steps/verifyup.ts +448 -0
- package/src/onboard/steps/vmdeploy.ts +442 -0
- package/src/onboard/toml.ts +50 -0
- package/src/opencli.ts +591 -0
- package/src/openpr.ts +568 -0
- package/src/openviking/client.ts +1131 -0
- package/src/openviking/context.ts +263 -0
- package/src/openviking/embedder.ts +516 -0
- package/src/openviking/gapsink.ts +63 -0
- package/src/openviking/health.ts +83 -0
- package/src/openviking/index.ts +119 -0
- package/src/openviking/lessonfind.ts +92 -0
- package/src/openviking/probe.ts +129 -0
- package/src/openviking/proc.ts +110 -0
- package/src/openviking/provisionreport.ts +160 -0
- package/src/openviking/reembed.ts +412 -0
- package/src/openviking/relayout.ts +177 -0
- package/src/openviking/sidecar-main.ts +38 -0
- package/src/openviking/sidecar.ts +106 -0
- package/src/openviking/store.ts +2025 -0
- package/src/openviking/supervisor.ts +474 -0
- package/src/openviking/types.ts +174 -0
- package/src/operator-recovery.ts +237 -0
- package/src/operatormessage.ts +52 -0
- package/src/outcomes.ts +1670 -0
- package/src/piauthcopy.ts +12 -0
- package/src/picli.ts +49 -0
- package/src/picwd.ts +25 -0
- package/src/pilogin.ts +37 -0
- package/src/pingpong.ts +1339 -0
- package/src/posting-journal.ts +549 -0
- package/src/posting-outbox.ts +802 -0
- package/src/posting-receipt.ts +324 -0
- package/src/posting.ts +603 -0
- package/src/postops.ts +832 -0
- package/src/pr-activity.ts +20 -0
- package/src/pr-author.ts +6 -0
- package/src/pr-conversation.ts +432 -0
- package/src/pr-session-lifecycle.ts +631 -0
- package/src/preflight.ts +391 -0
- package/src/priorresolve.ts +343 -0
- package/src/qcrbin.ts +186 -0
- package/src/recheck.ts +1775 -0
- package/src/reconcile.ts +1030 -0
- package/src/recordedfindings.ts +27 -0
- package/src/regression.ts +833 -0
- package/src/replay.ts +816 -0
- package/src/requiredpasses.ts +148 -0
- package/src/resumecheck.ts +246 -0
- package/src/reviewcli.ts +787 -0
- package/src/reviewcontext.ts +35 -0
- package/src/reviewdetach.ts +734 -0
- package/src/reviewhistory.ts +427 -0
- package/src/reviewhome.ts +36 -0
- package/src/reviewmemory.ts +133 -0
- package/src/reviewrendercli.ts +139 -0
- package/src/round-work.ts +42 -0
- package/src/runhost.ts +108 -0
- package/src/scanauth.ts +36 -0
- package/src/scanbox.ts +1081 -0
- package/src/scancli.ts +1296 -0
- package/src/scandriverlog.ts +32 -0
- package/src/session-bridge.ts +139 -0
- package/src/session-command-payload.ts +35 -0
- package/src/session-command-supervisor.ts +1142 -0
- package/src/sessionjsonl.ts +88 -0
- package/src/sessions.ts +659 -0
- package/src/setup/adapters.ts +335 -0
- package/src/setup/baselines.ts +110 -0
- package/src/setup/caserunner.ts +611 -0
- package/src/setup/configcommit.ts +443 -0
- package/src/setup/engine.ts +1001 -0
- package/src/setup/facts.ts +627 -0
- package/src/setup/findings.ts +1264 -0
- package/src/setup/history.ts +443 -0
- package/src/setup/interview.ts +243 -0
- package/src/setup/ledger.ts +324 -0
- package/src/setup/pins.ts +66 -0
- package/src/setup/portrait.ts +635 -0
- package/src/setup/presentation.ts +18 -0
- package/src/setup/profile.ts +508 -0
- package/src/setup/replay.ts +370 -0
- package/src/setup/replaybuild.ts +392 -0
- package/src/setup/replayrun.ts +1096 -0
- package/src/setup/replaysource.ts +198 -0
- package/src/setup/retune.ts +415 -0
- package/src/setup/retunelog.ts +95 -0
- package/src/setup/scan.ts +1033 -0
- package/src/setup/scanbuild.ts +168 -0
- package/src/setup/scanfacts.ts +107 -0
- package/src/setup/scanlease.ts +297 -0
- package/src/setup/scanreport.ts +373 -0
- package/src/setup/scanrun.ts +2268 -0
- package/src/setup/scantree.ts +259 -0
- package/src/setup/stage2.ts +926 -0
- package/src/setup/stage2request.ts +347 -0
- package/src/setup/survey.ts +458 -0
- package/src/setup/surveyrun.ts +758 -0
- package/src/setup/textsniff.ts +95 -0
- package/src/setup/trackersink.ts +433 -0
- package/src/setup/triage.ts +768 -0
- package/src/setup/tuning.ts +766 -0
- package/src/setup/unitcut.ts +523 -0
- package/src/singleflight.ts +86 -0
- package/src/slack/announce.ts +911 -0
- package/src/slack/api.ts +303 -0
- package/src/slack/messages.ts +288 -0
- package/src/slack/origin.ts +599 -0
- package/src/slack/policy.ts +354 -0
- package/src/slack/reply.ts +201 -0
- package/src/slack/router.ts +285 -0
- package/src/slack/socket.ts +384 -0
- package/src/slack/types.ts +108 -0
- package/src/sqlitehint.ts +32 -0
- package/src/ssh-observation.ts +30 -0
- package/src/state.ts +8243 -0
- package/src/statemachine.ts +369 -0
- package/src/stubs.ts +68 -0
- package/src/takeover.ts +634 -0
- package/src/takeoverpi.ts +293 -0
- package/src/terminal-failure.ts +41 -0
- package/src/thread-resolution-refusal.ts +2 -0
- package/src/tmux.ts +153 -0
- package/src/trackerid.ts +41 -0
- package/src/transcriptindex.ts +665 -0
- package/src/tui/actions.ts +484 -0
- package/src/tui/alerts.ts +666 -0
- package/src/tui/app.ts +1979 -0
- package/src/tui/archiveops.ts +192 -0
- package/src/tui/autofile.ts +233 -0
- package/src/tui/board.ts +1432 -0
- package/src/tui/candidates.ts +889 -0
- package/src/tui/cellwidth.ts +148 -0
- package/src/tui/changelog-store.ts +503 -0
- package/src/tui/chord.ts +25 -0
- package/src/tui/clipboard.ts +92 -0
- package/src/tui/cmdbar.ts +296 -0
- package/src/tui/companion.ts +1427 -0
- package/src/tui/companionplan.ts +247 -0
- package/src/tui/companiontab.ts +83 -0
- package/src/tui/confighome.ts +155 -0
- package/src/tui/connect.ts +68 -0
- package/src/tui/deploy-ceremony.ts +104 -0
- package/src/tui/deploy-drain.ts +129 -0
- package/src/tui/deploy-process.ts +265 -0
- package/src/tui/deploytab.ts +1523 -0
- package/src/tui/design.ts +125 -0
- package/src/tui/digesttab.ts +214 -0
- package/src/tui/emptystate.ts +39 -0
- package/src/tui/evidence.ts +999 -0
- package/src/tui/feed.ts +604 -0
- package/src/tui/feedbacktab.ts +1077 -0
- package/src/tui/filters.ts +90 -0
- package/src/tui/ghread.ts +321 -0
- package/src/tui/historypull.ts +81 -0
- package/src/tui/inboxpull.ts +236 -0
- package/src/tui/index.ts +1565 -0
- package/src/tui/issuesink.ts +238 -0
- package/src/tui/jsonfile.ts +42 -0
- package/src/tui/keys.ts +109 -0
- package/src/tui/layout.ts +108 -0
- package/src/tui/learning.ts +627 -0
- package/src/tui/lessonswitch.ts +118 -0
- package/src/tui/livecontrol.ts +228 -0
- package/src/tui/memforward.ts +443 -0
- package/src/tui/memincident.ts +363 -0
- package/src/tui/memory.ts +620 -0
- package/src/tui/memtab.ts +606 -0
- package/src/tui/metricstab.ts +1177 -0
- package/src/tui/model.ts +131 -0
- package/src/tui/mouse.ts +98 -0
- package/src/tui/msg.ts +268 -0
- package/src/tui/nativecompanion.ts +417 -0
- package/src/tui/openurl.ts +21 -0
- package/src/tui/paint.ts +511 -0
- package/src/tui/panes.ts +98 -0
- package/src/tui/pipane.ts +219 -0
- package/src/tui/poll-hooks.ts +12 -0
- package/src/tui/poll.ts +147 -0
- package/src/tui/proposals.ts +838 -0
- package/src/tui/prpause.ts +150 -0
- package/src/tui/reload.ts +436 -0
- package/src/tui/remote.ts +413 -0
- package/src/tui/rollover.ts +969 -0
- package/src/tui/scantab.ts +1290 -0
- package/src/tui/setupentry.ts +93 -0
- package/src/tui/sidebar.ts +749 -0
- package/src/tui/sshtriage.ts +510 -0
- package/src/tui/startup.ts +231 -0
- package/src/tui/tabs.ts +45 -0
- package/src/tui/termmirror.ts +224 -0
- package/src/tui/theme.ts +95 -0
- package/src/tui/ticketstab.ts +310 -0
- package/src/tui/tmuxsocket.ts +129 -0
- package/src/tui/trackertickets.ts +84 -0
- package/src/tui/unwedge.ts +286 -0
- package/src/tui/viewer.ts +575 -0
- package/src/tui/viewerinput.ts +173 -0
- package/src/updatenotice.ts +178 -0
- package/src/usage.ts +1154 -0
- package/src/verdicts.ts +4689 -0
- package/src/version.ts +80 -0
- package/src/wakes.ts +476 -0
- package/src/webhook.ts +942 -0
- package/src/webhookheal.ts +276 -0
- package/src/wire.ts +2153 -0
- package/src/worker-session-host.ts +602 -0
- package/src/workerbreaker.ts +156 -0
- package/src/workercontrol.ts +104 -0
- package/src/workerlease.ts +441 -0
- package/src/workerliveness.ts +103 -0
- package/src/workerlog.ts +79 -0
- package/src/workerruntime.ts +30 -0
- package/src/workersupervisor.ts +1538 -0
- package/src/workerusage.ts +42 -0
- package/src/workerworld.ts +427 -0
- package/src/worktrees.ts +1138 -0
- package/tests/fixtures/regression-cases.json +795 -0
- package/tests/fixtures/seed-manifest.json +19 -0
|
@@ -0,0 +1,1067 @@
|
|
|
1
|
+
# quickreviewd — EXAMPLE config. Copy to config.toml and fill in.
|
|
2
|
+
#
|
|
3
|
+
# Every runtime knob lives here (spec §2). The values below are safe defaults:
|
|
4
|
+
# dry_run is ON (every GitHub mutation is recorded to state/dryrun/ instead of
|
|
5
|
+
# executed) and every identity is empty. The ~10 values a new operator must
|
|
6
|
+
# supply are marked "← FILL (n)" — grep for FILL. Flip dry_run to false only
|
|
7
|
+
# as a deliberate cutover act, never as part of setup.
|
|
8
|
+
#
|
|
9
|
+
# YOU DO NOT HAVE TO FILL THIS BY HAND: `scripts/qcr onboard` interviews you
|
|
10
|
+
# for the few values only you can answer, derives the rest, and patches this
|
|
11
|
+
# file in place — every comment survives, and a re-run edits only what changed.
|
|
12
|
+
# It never writes dry_run in either direction; going live is its own explicit
|
|
13
|
+
# step. See docs/onboarding.md.
|
|
14
|
+
# ONE mutation class is exempt and executes for real even here: the App
|
|
15
|
+
# re-pointing its OWN webhook URL (see [ingress] below) — it can never touch
|
|
16
|
+
# the reviewed repo, and every execution is logged loudly.
|
|
17
|
+
|
|
18
|
+
dry_run = true
|
|
19
|
+
|
|
20
|
+
# The operations timezone: whose calendar day the system runs on.
|
|
21
|
+
# Every day-scoped feature (the [feedback] same-day addendum + its daily
|
|
22
|
+
# expiry, metrics day buckets, TUI alert memory, companion day rollover)
|
|
23
|
+
# derives its day from this one knob; [eod] and [slack.policy] `timezone`
|
|
24
|
+
# default from it and may still be overridden in their own sections.
|
|
25
|
+
[ops]
|
|
26
|
+
timezone = "UTC" # ← FILL: your IANA timezone, e.g. "Europe/Warsaw"
|
|
27
|
+
|
|
28
|
+
[github]
|
|
29
|
+
repo = "" # ← FILL (1): the repo to review, "owner/name"
|
|
30
|
+
app_slug = "" # ← FILL (2): your GitHub App slug
|
|
31
|
+
bot_login = "" # ← FILL (3): the App bot login, "<app_slug>[bot]"
|
|
32
|
+
review_team = "" # ← FILL (4): "org/team" whose review request triggers
|
|
33
|
+
# There is no reviewer knob here. The reviewer never hands a PR back: it always
|
|
34
|
+
# decides on the merits and posts a verdict. If you want a named person told
|
|
35
|
+
# about a particular KIND of change, that is the optional [escalation] section
|
|
36
|
+
# further down — off by default.
|
|
37
|
+
trigger_label = "AI review requested"
|
|
38
|
+
in_progress_label = "AI review in progress"
|
|
39
|
+
reviewed_label = "Automatic Review"
|
|
40
|
+
improvement_label = "Bot improvement"
|
|
41
|
+
issue_label = "bot-filed"
|
|
42
|
+
# secrets dir: app_id, app.pem, webhook_secret, tunnel_token; optional openai_api_key (pi, API-key
|
|
43
|
+
# route) and openai_embeddings_api_key (only with embedding_provider = "openai" in the openviking table)
|
|
44
|
+
# "" (recommended) = the install's config home, $XDG_CONFIG_HOME/qcr/<install>/secrets (the old
|
|
45
|
+
# ~/.config/quickreview-bot is never read — `qcr install migrate` moves it). A path here wins.
|
|
46
|
+
secrets_dir = ""
|
|
47
|
+
# The repo's default branch: the improvement filer's PR base, the
|
|
48
|
+
# replay diff base, the CLI-ops fixture base. PR review rounds always use each
|
|
49
|
+
# PR's own base_ref from the GitHub API, never this.
|
|
50
|
+
base_branch = "main" # ← FILL: your default branch ("main"/"master")
|
|
51
|
+
# Base-clone directory name under the sandbox root. "" (recommended) derives
|
|
52
|
+
# it from the repo slug's basename — "owner/name" ⇒ "name".
|
|
53
|
+
clone_dir = ""
|
|
54
|
+
|
|
55
|
+
[owner]
|
|
56
|
+
# The system's ONE accountable human, as a configured role. Every
|
|
57
|
+
# identity surface renders from here: Slack prose, the companion day-open
|
|
58
|
+
# labels, the pinned-memory head framing, the escalation-mention fallback.
|
|
59
|
+
# Empty values degrade to neutral wording ("the owner" / "the operator").
|
|
60
|
+
name = "" # ← FILL: the operator's display name for rendered prose
|
|
61
|
+
slack_id = "" # ← FILL (if enabling Slack): U…; required then, and a [slack.users] key
|
|
62
|
+
# (legacy alias on input: [slack] legacy_owner_slack_id)
|
|
63
|
+
github_login = "" # ← FILL: operator GitHub login; escalation-mention fallback
|
|
64
|
+
|
|
65
|
+
[server]
|
|
66
|
+
hostname = "" # ← FILL (6): the public webhook hostname.
|
|
67
|
+
# Leave empty when your ingress assigns
|
|
68
|
+
# its own (the quick tunnel does) — then
|
|
69
|
+
# [ingress] below carries the shape.
|
|
70
|
+
port = 8787 # loopback only; your HTTPS ingress fronts it
|
|
71
|
+
# (a tunnel sidecar, cloudflared on the
|
|
72
|
+
# host, or any reverse proxy)
|
|
73
|
+
|
|
74
|
+
# [ingress] — webhook-URL self-heal, for tunnels whose hostname
|
|
75
|
+
# ROTATES (the laptop quick-tunnel route). The tunnel sidecar writes
|
|
76
|
+
# its assigned bare hostname (e.g. "abc.trycloudflare.com") to `hostname_file`;
|
|
77
|
+
# the daemon watches it and re-points the GitHub App's own webhook URL on
|
|
78
|
+
# change (JWT-authed PATCH /app/hook/config, read-back verified). This is the
|
|
79
|
+
# ONE mutation class that executes even in dry_run (AGENTS.md invariant 6) — loudly
|
|
80
|
+
# logged, structurally closed to this one kind; it
|
|
81
|
+
# touches only the App's own configuration, never the reviewed repo. Off by
|
|
82
|
+
# default: with the section absent (or shape = "none") no watcher ever starts —
|
|
83
|
+
# a stable hostname (named tunnel, VM route) needs none of this.
|
|
84
|
+
#[ingress]
|
|
85
|
+
#shape = "tunnel-file" # "none" (default) | "tunnel-file"
|
|
86
|
+
#hostname_file = "" # "" ⇒ <root>/state/ingress/hostname
|
|
87
|
+
#debounce_ms = 3000 # settle time after a file change
|
|
88
|
+
#sweep_interval_s = 300 # polling backstop behind fs.watch
|
|
89
|
+
|
|
90
|
+
[daemon]
|
|
91
|
+
poll_interval_s = 300
|
|
92
|
+
# Rounds are network-IO-bound (model calls), not CPU-bound; the container's
|
|
93
|
+
# 2 CPU / 8 GB Docker cap is the hard resource guard.
|
|
94
|
+
max_concurrent_rounds = 12
|
|
95
|
+
round_deadline_min = 75
|
|
96
|
+
# A round overdue with no verdict whose session is dead is
|
|
97
|
+
# self-requeued by the daemon (fresh dispatch to the PR's own session) at most
|
|
98
|
+
# this many times per PR head. Past the cap the round is abandoned as an
|
|
99
|
+
# anomaly and the PR RETURNS TO ITS STANDING-VERDICT STATE — never an approval,
|
|
100
|
+
# and never a park: there is no "awaiting human" state.
|
|
101
|
+
max_self_requeues = 2
|
|
102
|
+
# Lost-prompt net: a running round whose inject file was consumed but whose
|
|
103
|
+
# session shows NO activity since the round started is re-queued (once per
|
|
104
|
+
# head, inside the max_self_requeues cap) after this many minutes — well before
|
|
105
|
+
# the deadline, so a dropped round prompt does not cost a full deadline window.
|
|
106
|
+
round_stall_grace_min = 10
|
|
107
|
+
# Durable daemon→Pi stage leases. Start is short because no model
|
|
108
|
+
# work exists yet; running is a fixed hard cap above the measured 23.4m live
|
|
109
|
+
# maximum and below the 75m defense-in-depth round deadline. Unknown evidence
|
|
110
|
+
# gets one minute once, never an open-ended extension.
|
|
111
|
+
session_command_start_lease_s = 120
|
|
112
|
+
session_command_running_max_min = 45
|
|
113
|
+
# Command-correlated execution milestones: no first pass, incomplete pass plan,
|
|
114
|
+
# and all-passes-done/no-verdict. Absolute start-derived bounds; activity cannot
|
|
115
|
+
# renew them.
|
|
116
|
+
round_first_pass_max_min = 5
|
|
117
|
+
round_passes_max_min = 35
|
|
118
|
+
round_finalize_grace_min = 5
|
|
119
|
+
# Once a round's review is CONFIRMED posted, a stage limit does not cancel
|
|
120
|
+
# it — the session's tail (ledger, findings record, verdict
|
|
121
|
+
# file) gets this long after the posting, and a round still without a verdict
|
|
122
|
+
# then is settled from the posting receipt. Never a requeue, never a second
|
|
123
|
+
# posting.
|
|
124
|
+
round_posted_tail_grace_min = 15
|
|
125
|
+
# A follow-up round whose pre-approval sweep is owed (a whole
|
|
126
|
+
# round-1-style plan after the delta's) gets this many extra minutes for its
|
|
127
|
+
# passes and its hard cap.
|
|
128
|
+
# follow_up_sweep_extra_min = 20
|
|
129
|
+
posting_receipt_grace_s = 120
|
|
130
|
+
# A review POST GitHub answers 5xx (or not at all) is handed to the daemon
|
|
131
|
+
# (receipt `deferred`) and retried at these minutes after the first failure,
|
|
132
|
+
# each attempt through the gate after a marker read; past the window the PR
|
|
133
|
+
# goes FAILED_LOUD (u to recover).
|
|
134
|
+
# posting_retry_offsets_min = [4, 12, 36]
|
|
135
|
+
# posting_retry_window_min = 60
|
|
136
|
+
session_command_unknown_grace_s = 60
|
|
137
|
+
session_command_unknown_max_checks = 1
|
|
138
|
+
session_command_max_start_retries = 2
|
|
139
|
+
# pi refuses every prompt while it compacts, so a command queued
|
|
140
|
+
# behind a compaction the session's inject bridge reports running is late, not
|
|
141
|
+
# lost — its start lease is held open for up to this long. Past it, the
|
|
142
|
+
# bounded same-session redelivery (max_prompt_redeliveries), and only then the
|
|
143
|
+
# kill-and-replay recovery, take over.
|
|
144
|
+
session_compaction_max_s = 600
|
|
145
|
+
# The central lens permit broker (bot workers): the most lens sessions alive at
|
|
146
|
+
# once across EVERY worker, granted first-in first-out. 20 is the VM's ruling
|
|
147
|
+
# (the CPU gate measured 20 sessions fine on 2 cores). Grants are spaced at
|
|
148
|
+
# least lens_grant_stagger_ms apart so a full wave never creates its sessions
|
|
149
|
+
# in one burst (the gate measured a 0.7-2.5 s loop stall for 8-20 at once);
|
|
150
|
+
# 0 turns the spacing off. status.json `permits` shows the use and the queue.
|
|
151
|
+
lens_permits = 20
|
|
152
|
+
lens_grant_stagger_ms = 250
|
|
153
|
+
# The idle-PR answer worker: an operator's message to a PR with no running
|
|
154
|
+
# worker is answered at once by a short worker that resumes the PR's session,
|
|
155
|
+
# replies and exits. It is ended at answer_timeout_s of wall clock and stops at
|
|
156
|
+
# answer_cap_usd of its own spend. It posts only when the message carried
|
|
157
|
+
# may_post (the viewer's Alt-p, `qcr message --may-post`), through the one gate.
|
|
158
|
+
answer_timeout_s = 600
|
|
159
|
+
answer_cap_usd = 2
|
|
160
|
+
round_stage_supervisor_stale_s = 180
|
|
161
|
+
# The daemon watches its own event loop (status.json
|
|
162
|
+
# `daemon.event_loop`, `qcr status`, the TUI board). One delay of
|
|
163
|
+
# event_loop_stall_max_s or more, or a p99 of event_loop_stall_p99_s or more
|
|
164
|
+
# over a window its samples cover, is a stall: it wakes the overseer
|
|
165
|
+
# (`daemon_event_loop_stalled`) at most once per cooldown, naming the cause —
|
|
166
|
+
# "the loop itself blocked" when the daemon itself was on CPU for most of the
|
|
167
|
+
# stall (the stall's own evidence wins; any throttling is named beside it);
|
|
168
|
+
# else "CPU starved" when the container (/sys/fs/cgroup/cpu.stat, over the
|
|
169
|
+
# same window) was throttled in event_loop_starved_throttle_ratio of its CFS
|
|
170
|
+
# periods or more; else "cause unknown" (host contention or a blocking wait).
|
|
171
|
+
event_loop_window_s = 300
|
|
172
|
+
event_loop_stall_max_s = 10
|
|
173
|
+
event_loop_stall_p99_s = 2
|
|
174
|
+
event_loop_wake_cooldown_min = 60
|
|
175
|
+
event_loop_starved_throttle_ratio = 0.2
|
|
176
|
+
# Zombie-round expiry: a round stuck 'overdue' longer than this whose
|
|
177
|
+
# PR has since verdicted/closed (i.e. a rerun would never touch it) is expired.
|
|
178
|
+
# 0 disables the sweep.
|
|
179
|
+
expire_overdue_after_h = 24
|
|
180
|
+
|
|
181
|
+
[eod]
|
|
182
|
+
time = "18:00"
|
|
183
|
+
# timezone defaults from [ops]; uncomment to run the EOD sweep on another clock.
|
|
184
|
+
#timezone = "Europe/Warsaw"
|
|
185
|
+
# Daily overseer heartbeat: anomaly-table + digest review pass.
|
|
186
|
+
heartbeat_time = "09:00"
|
|
187
|
+
# Watch the owner's pinned entries across the sweep. Curation must never
|
|
188
|
+
# touch them; this makes the invariant detectable rather than merely
|
|
189
|
+
# instructed. The window closes early when the day's digest appears.
|
|
190
|
+
pinned_watchdog = true
|
|
191
|
+
pinned_watchdog_window_min = 90
|
|
192
|
+
|
|
193
|
+
[caps]
|
|
194
|
+
improvement_pr_max_lines = 50
|
|
195
|
+
improvement_pr_max_files = 3
|
|
196
|
+
improvement_pr_per_day = 1
|
|
197
|
+
improvement_pr_per_week = 3
|
|
198
|
+
issues_per_day = 3
|
|
199
|
+
# Paths a bot improvement PR may never touch. This value REPLACES
|
|
200
|
+
# the shipped default shown here — adjust to your repo's shape — but files
|
|
201
|
+
# named .env* are refused unconditionally regardless of this list.
|
|
202
|
+
improvement_pr_deny_prefixes = ["migrations/", "infra/", "ansible/", ".github/workflows/"]
|
|
203
|
+
|
|
204
|
+
[models]
|
|
205
|
+
# default for every role; tiered pass models below
|
|
206
|
+
# Provider prefix is `openai-codex/` — the ChatGPT-OAuth route's provider key
|
|
207
|
+
# in pi's auth.json (direct `openai/` needs an API key we don't ship).
|
|
208
|
+
default = "openai-codex/gpt-6.1-sol"
|
|
209
|
+
conversation = "openai-codex/gpt-6.1-sol"
|
|
210
|
+
# Passes always run at sol-high — single variant, not raisable (already top).
|
|
211
|
+
risk_passes = ["pass-security", "pass-prod-risk", "pass-data-safety"]
|
|
212
|
+
# pass-validate's tier — its own configured tier (floored by a repo profile's
|
|
213
|
+
# min_tier for it), never raised to match a lens (src/dispatch.ts
|
|
214
|
+
# validatorTier). Shipped at sol-high: the validator is the adversarial gate
|
|
215
|
+
# over every finding. One validator call per round — not a hot-path multiplier.
|
|
216
|
+
validate_tier = "sol-high"
|
|
217
|
+
# Diffs under this many changed lines (additions+deletions) start at terra-med.
|
|
218
|
+
small_diff_lines = 150
|
|
219
|
+
# [models.pass_tiers] — per-lens tier pins: pass name → tier
|
|
220
|
+
# name (a key of [models.tiers]). SHIPPED DEFAULT (src/config.ts
|
|
221
|
+
# DEFAULT_PASS_TIERS): pass-baseline, pass-sweep and
|
|
222
|
+
# pass-behaviour-delta at "sol-high" (gpt-6.1-sol at high effort) — measured
|
|
223
|
+
# +6 defects on 18 AACR PRs for +18% cost per PR. An entry here replaces that
|
|
224
|
+
# lens's default pin (e.g. "pass-baseline" = "sol-med"); a repo profile lowers
|
|
225
|
+
# one lens's thinking with [lenses.<pass>] effort = "medium". A pinned lens
|
|
226
|
+
# runs at that tier on every PR whatever the diff size — the plan names it, it
|
|
227
|
+
# is not raisable, and every built variant of it carries that tier's spec. The
|
|
228
|
+
# validator never follows a pinned lens (it runs at validate_tier).
|
|
229
|
+
# Not for pass-validate (use validate_tier) nor for a risk pass (always
|
|
230
|
+
# sol-high). A profile min_tier still floors a pin. Unknown passes or tiers
|
|
231
|
+
# are refused at load. e.g.
|
|
232
|
+
# [models.pass_tiers]
|
|
233
|
+
# "pass-sweep" = "sol-high"
|
|
234
|
+
# "pass-baseline" = "sol-high"
|
|
235
|
+
|
|
236
|
+
[models.tiers]
|
|
237
|
+
# PassTier → model spec; the whole spec (incl. the `:thinking` suffix) rides
|
|
238
|
+
# the built agent's `model:` field — pi's --model accepts the suffix, and the
|
|
239
|
+
# native subagent extension reads only that field.
|
|
240
|
+
"terra-med" = "openai-codex/gpt-6.1-sol:medium"
|
|
241
|
+
"sol-med" = "openai-codex/gpt-6.1-sol:medium"
|
|
242
|
+
"sol-high" = "openai-codex/gpt-6.1-sol:high"
|
|
243
|
+
|
|
244
|
+
[models.pricing]
|
|
245
|
+
# Spend rates keyed by bare model id, USD per million tokens. Consumed by
|
|
246
|
+
# spend accounting; empty entries fall back to unpriced.
|
|
247
|
+
# "gpt-6-sol" = { input_per_mtok = 0.0, output_per_mtok = 0.0 }
|
|
248
|
+
|
|
249
|
+
[tui]
|
|
250
|
+
# qcr tui — the operator TUI on the owner's PC, polling the review VM over ssh.
|
|
251
|
+
# Read-only against the VM except the user's own keystrokes + inject files.
|
|
252
|
+
#
|
|
253
|
+
# target — where the daemon container lives relative to this TUI:
|
|
254
|
+
# "ssh" — the VM/server topology (the always-on recommendation): every
|
|
255
|
+
# poll, attach, digest read and evidence copy rides
|
|
256
|
+
# `ssh <ssh_host> …`, sharing one control master.
|
|
257
|
+
# "local" — the laptop topology (everything on THIS machine, e.g. the
|
|
258
|
+
# compose stack): the SAME commands run against local docker
|
|
259
|
+
# directly and no ssh process is ever spawned. `ssh_host` is
|
|
260
|
+
# ignored; `sudo_docker` still decides the sudo prefix. The
|
|
261
|
+
# memory forward follows this knob too — it reaches the daemon
|
|
262
|
+
# container's loopback memory engine with a plain `docker exec`
|
|
263
|
+
# (the forward script's --local mode) instead of the ssh hop.
|
|
264
|
+
# Always explicit: an empty ssh_host does NOT mean local.
|
|
265
|
+
target = "ssh"
|
|
266
|
+
ssh_host = "" # ← FILL (7): ssh alias of the VM running the container
|
|
267
|
+
# (leave "" when target = "local" — it is unused)
|
|
268
|
+
container = "quickreview-sandbox" # bundled local Compose: "quickreview-daemon-1" (onboarding fills this)
|
|
269
|
+
memory_container = "" # the container the memory forward relays into. "" = `container`
|
|
270
|
+
# (OpenViking is the daemon container's child). On a VM running
|
|
271
|
+
# the memory sidecar (the openviking table's endpoint =
|
|
272
|
+
# "remote") set "quickreview-memory"; flip it back with the endpoint.
|
|
273
|
+
remote_state_dir = "/opt/quickreview/state" # host path on ssh; inside the daemon container on local
|
|
274
|
+
remote_sandbox_root = "" # "" = read the container's qcr.layout label (release: /opt/qcr, legacy: /opt/quickreview/sandbox);
|
|
275
|
+
# a value here wins and is never probed
|
|
276
|
+
sudo_docker = true # docker on the VM needs sudo (root-owned socket)
|
|
277
|
+
poll_interval_s = 3
|
|
278
|
+
stale_after_s = 90 # DATA STALE banner past this written_at age
|
|
279
|
+
# (the daemon rewrites status.json every ~30s)
|
|
280
|
+
msg_timeout_s = 30 # quick-message: pending → undelivered after this
|
|
281
|
+
evidence_timeout_s = 60 # evidence copier: per-remote-read
|
|
282
|
+
# budget. A wedged ssh costs one sweep — the
|
|
283
|
+
# copy is retried on the next poll, never
|
|
284
|
+
# blocking the poll or the paint loop.
|
|
285
|
+
evidence_why_interval_s = 10 # evidence sweep pace: at most one
|
|
286
|
+
# `qcr why` per this many seconds (gap from
|
|
287
|
+
# the end of the last one), clamped 5–600 s.
|
|
288
|
+
# No `why` at all while the daemon is draining
|
|
289
|
+
# or its heartbeat is stale.
|
|
290
|
+
|
|
291
|
+
[pi]
|
|
292
|
+
# VERIFY-ON-PIN: package + version mirrored in package.json "qcrPi" block and the
|
|
293
|
+
# ansible group_vars; the image never floats.
|
|
294
|
+
package = "@earendil-works/pi-coding-agent"
|
|
295
|
+
version = "1.4.0"
|
|
296
|
+
session_dir = "state/pi-sessions"
|
|
297
|
+
# The lens settings that used to live here (subagent_max_concurrency,
|
|
298
|
+
# subagent_cache_group, subagent_cache_stagger_ms, subagent_pass_deadline_min)
|
|
299
|
+
# moved to [engine] (lens_max_concurrency, lens_cache_group,
|
|
300
|
+
# lens_cache_stagger_ms, lens_pass_deadline_min); a config that still sets them
|
|
301
|
+
# is refused.
|
|
302
|
+
# Who launches a round's lenses: "engine", our lens tool and discovery wave on
|
|
303
|
+
# an SDK session, the only value ("native", pi's own subagent glue, is retired
|
|
304
|
+
# and refused).
|
|
305
|
+
# lens_runtime = "engine"
|
|
306
|
+
# The round's engine starts the planned discovery wave itself at round start
|
|
307
|
+
# (rule 9) and the main session joins it with lens_wave. false = the main
|
|
308
|
+
# session launches the wave, with the same tools.
|
|
309
|
+
# engine_wave = true
|
|
310
|
+
|
|
311
|
+
# What hosts a pi session on the review, bench and scan routes: "sdk" runs it
|
|
312
|
+
# in-process on the pi SDK (the default and the only value; "proc", pi as a
|
|
313
|
+
# child process, is retired and refused). `qcr review` and the bench (`qcr-bench
|
|
314
|
+
# review`, `defect-judge`) host the SDK: in the bench each case, and each case
|
|
315
|
+
# of the judge's pool, runs in a host process of its own, so one crash or frozen
|
|
316
|
+
# loop costs one case, and `[pi] lens_runtime = "engine"` gives the review our
|
|
317
|
+
# lens tool. A route that has no host yet refuses "sdk".
|
|
318
|
+
# In the image the SDK runs the model's bash as the separate tool uid and
|
|
319
|
+
# fences the file tools off /proc, /run/qcr-in and the agent dir.
|
|
320
|
+
# The scan runs its leaves on the SDK inside its own detached driver process
|
|
321
|
+
# (`qcr scan start`), never inside the companion's pi; a scan the companion
|
|
322
|
+
# drives itself refuses.
|
|
323
|
+
# The lens tool's settings ride here too (docs/prompt-caching.md):
|
|
324
|
+
# lens_max_concurrency cap on running lens sessions per round (default 4);
|
|
325
|
+
# the daemon's [daemon] lens_permits is the bot's
|
|
326
|
+
# cross-worker budget
|
|
327
|
+
# lens_cache_group lens sessions per shared provider prompt-cache key
|
|
328
|
+
# (default 5; 0 = a random id each, no cache hits)
|
|
329
|
+
# lens_cache_stagger_ms how long a group's later sessions wait after its
|
|
330
|
+
# first, so the cache is written first (default 2500)
|
|
331
|
+
# lens_pass_deadline_min per-pass deadline in minutes: a pass still running
|
|
332
|
+
# is aborted and retried ONCE, and a second timeout
|
|
333
|
+
# fails that pass alone; 0 = no deadline (default 8)
|
|
334
|
+
# [engine]
|
|
335
|
+
# runtime = "sdk"
|
|
336
|
+
# lens_max_concurrency = 4
|
|
337
|
+
# lens_cache_group = 5
|
|
338
|
+
# lens_cache_stagger_ms = 2500
|
|
339
|
+
# lens_pass_deadline_min = 8
|
|
340
|
+
|
|
341
|
+
[memory]
|
|
342
|
+
# Round seeding — how much memory rides each round prompt and how
|
|
343
|
+
# long the daemon waits for it. Memory NEVER blocks or delays a round: past
|
|
344
|
+
# the deadline the round dispatches memory-less and logs the gap.
|
|
345
|
+
context_tokens = 2000
|
|
346
|
+
# The seed's whole budget, in ms (clamped 100…15000). One document embedding
|
|
347
|
+
# on a 2-CPU VM takes 3 s or more, and a seed's query queued behind one needs
|
|
348
|
+
# room for it. It costs at most
|
|
349
|
+
# a few seconds on a ~14-minute round. Keep it above the search's own
|
|
350
|
+
# search_timeout_ms (the openviking block, below).
|
|
351
|
+
context_timeout_ms = 9000
|
|
352
|
+
# The embedding tail of one written finding case, in ms (clamped
|
|
353
|
+
# 0…30000, 0 = off): the server goes on embedding a case batch after its
|
|
354
|
+
# write returns, so a round seed that starts within (cases × this) of the
|
|
355
|
+
# write waits that out before it sends its search — inside context_timeout_ms,
|
|
356
|
+
# never past it, keeping 3 s of the budget for the search itself. While any
|
|
357
|
+
# review round runs or is queued, the case writer also holds its backfill,
|
|
358
|
+
# its late activity and every case those two owe (only cases the capture
|
|
359
|
+
# pass's sync owes are written meanwhile).
|
|
360
|
+
case_embed_tail_ms = 4000
|
|
361
|
+
# Memory health (src/memory/health.ts) — how an outage reaches a
|
|
362
|
+
# person. Every probe_interval_s the daemon lists the reviewer memories root
|
|
363
|
+
# AUTHENTICATED, once with its own key and once with the sessions' ovcli.conf.
|
|
364
|
+
# A refused credential wakes memory_auth_failed at once (never graced, never
|
|
365
|
+
# held by a drain); no authenticated answer for down_after_min wakes
|
|
366
|
+
# memory_down (a server still warming up reads "unknown" for boot_grace_min;
|
|
367
|
+
# a drain holds the wake until it lifts). Either re-wakes every rewake_h while
|
|
368
|
+
# it lasts. The state rides status.json `memory`: the TUI board banner, its
|
|
369
|
+
# desktop notification, `qcr status`, and ONE tracker ticket the TUI files for
|
|
370
|
+
# an incident older than incident_ticket_after_min.
|
|
371
|
+
probe_interval_s = 120
|
|
372
|
+
down_after_min = 10
|
|
373
|
+
boot_grace_min = 5
|
|
374
|
+
rewake_h = 6
|
|
375
|
+
incident_ticket_after_min = 120
|
|
376
|
+
# Writes that stick: every [feedback] signal is ledgered with
|
|
377
|
+
# its memory state, and whatever memory has not taken yet the backfill pump
|
|
378
|
+
# writes every backfill_interval_s (at most 20 a tick, only while memory
|
|
379
|
+
# reads healthy). A signal owed for longer than write_backlog_after_min wakes
|
|
380
|
+
# memory_write_backlog (and again every rewake_h while the backlog lasts). A
|
|
381
|
+
# signal memory refused 12 times is given up on, loudly, and queued again at
|
|
382
|
+
# the daemon's next start and once a day.
|
|
383
|
+
backfill_interval_s = 60
|
|
384
|
+
write_backlog_after_min = 120
|
|
385
|
+
# Finding cases (src/cases.ts): one document per posted finding a
|
|
386
|
+
# human answered or whose fate is known, in reviewer memory's `finding-cases/` — the
|
|
387
|
+
# learner's context, searched by the EOD curator and the companion, never by a
|
|
388
|
+
# review round. Every cases_interval_s the daemon works out from state.db which
|
|
389
|
+
# cases are new or changed and, only while memory reads healthy, writes up to 2
|
|
390
|
+
# (one batch-write — each case is ~3.4 s on the VM's one-thread embedder — and
|
|
391
|
+
# never started while a review round is reading memory) and
|
|
392
|
+
# backfills two more PRs from the last cases_backfill_days days (resumable; 0
|
|
393
|
+
# turns the backfill off).
|
|
394
|
+
cases_interval_s = 120
|
|
395
|
+
cases_backfill_days = 60
|
|
396
|
+
# The learner (src/learner/): lessons_mine_lead_min before the EOD
|
|
397
|
+
# sweep (and on `qcr lessons mine`) the daemon mines the human outcomes of the
|
|
398
|
+
# last lessons_mine_days — refuted / contested findings, the [feedback]
|
|
399
|
+
# ledger, human comments and REQUEST_CHANGES on PRs the bot approved, recheck
|
|
400
|
+
# flips, and commits that changed a bot-approved PR's lines within
|
|
401
|
+
# lessons_recall_window_days of its merge — into lesson CANDIDATES. The EOD
|
|
402
|
+
# sweep is handed them as state/eod/<day>/outcomes.md (at most
|
|
403
|
+
# lessons_packet_new_max new a day, misses first; every undecided one is
|
|
404
|
+
# carried; undecided after lessons_expiry_ops_days it expires, recorded) and
|
|
405
|
+
# answers with an `eod-curation-receipt`. No receipt within
|
|
406
|
+
# lessons_receipt_wait_min wakes eod_curation_missing; a refused or unfound
|
|
407
|
+
# lesson wakes eod_lessons_not_persisted. The digests' "Learnings" from
|
|
408
|
+
# lessons_digest_backfill_from..to (written while memory refused every write)
|
|
409
|
+
# become candidates once.
|
|
410
|
+
lessons_mine_lead_min = 15
|
|
411
|
+
lessons_mine_days = 45
|
|
412
|
+
lessons_receipt_wait_min = 180
|
|
413
|
+
lessons_expiry_ops_days = 7
|
|
414
|
+
lessons_packet_new_max = 40
|
|
415
|
+
lessons_recall_window_days = 14
|
|
416
|
+
lessons_recurrence_days = 90
|
|
417
|
+
lessons_digest_backfill_from = "2026-08-31"
|
|
418
|
+
lessons_digest_backfill_to = "2026-10-02"
|
|
419
|
+
# How curated lessons and past finding cases reach a review.
|
|
420
|
+
# "off" — nothing runs: no selection, no shadow ledger.
|
|
421
|
+
# "shadow" — (the shipped value) every round selects the lessons and cases
|
|
422
|
+
# it WOULD carry, through OpenViking — one prefetch per round
|
|
423
|
+
# (two finds: one for the lessons, one for the cases), started
|
|
424
|
+
# after the round's handoff so it never delays the round, at
|
|
425
|
+
# most shadow_budget_ms (≤ 20000) — and the shadow ledger records
|
|
426
|
+
# them, plus every posted finding a delivered dont-raise lesson
|
|
427
|
+
# would have touched. No prompt, task file or agent changes.
|
|
428
|
+
# "on" — delivery: the same selection, awaited beside the round's
|
|
429
|
+
# memory seed within delivery_budget_ms (≤ 2000), reaches each
|
|
430
|
+
# lens's task file, the lessons files of the validator and of
|
|
431
|
+
# any lens the session adds, the main session's "Lessons in
|
|
432
|
+
# force" index and past-review cases (the bleed rule
|
|
433
|
+
# reworded), the validator's demotion-only `lesson-shape`
|
|
434
|
+
# addendum, and the repo facts for the paths a recheck or an
|
|
435
|
+
# author reply touches. A round that selects nothing renders
|
|
436
|
+
# exactly as under "off".
|
|
437
|
+
# Read `qcr lessons shadow-report` (and the `lessons` clause of `qcr status`)
|
|
438
|
+
# before switching to "on". The operator's kill switch sits beside this one:
|
|
439
|
+
# `qcr lessons off|on` and `qcr lessons suppress|unsuppress <lesson>`, through
|
|
440
|
+
# the root-sealed commands/operator/ channel only, stored in state.db.
|
|
441
|
+
delivery = "shadow"
|
|
442
|
+
delivery_budget_ms = 2000
|
|
443
|
+
shadow_budget_ms = 10000
|
|
444
|
+
# HOW MANY items the round's one context search may draw from each area it
|
|
445
|
+
# searches. `context_tokens` above is the budget; this is the corpus — the two
|
|
446
|
+
# bind independently.
|
|
447
|
+
#
|
|
448
|
+
# A round searches `experiences/` ONLY — the curated lessons of the memory
|
|
449
|
+
# layout (src/memory/layout.ts). Ops notes and feedback events live in `events/`,
|
|
450
|
+
# the owner's unpinned instructions in `preferences/` (the pinned ones ride the
|
|
451
|
+
# round's guaranteed head in full), and none of them belongs in a round's
|
|
452
|
+
# recalled context; nor do the built-in `skills`/`resources` overview blurbs
|
|
453
|
+
# that take most of the block when no quotas are set.
|
|
454
|
+
# Any other key here is IGNORED with one log line, and `experiences` defaults
|
|
455
|
+
# to 24 when it is missing. The count is generous on purpose — its job is to
|
|
456
|
+
# name the area, and `context_tokens` decides how much rides the prompt.
|
|
457
|
+
context_quotas = { experiences = 24 }
|
|
458
|
+
|
|
459
|
+
[openviking]
|
|
460
|
+
# OpenViking (github.com/volcengine/OpenViking) — the review system's context
|
|
461
|
+
# store, running as a SECOND process inside the quickreview container on
|
|
462
|
+
# LOOPBACK :1933. The daemon supervises it as a child process
|
|
463
|
+
# (restart + backoff, stdout folded into the daemon log) and reports its
|
|
464
|
+
# health, version, RSS and CPU in the heartbeat.
|
|
465
|
+
#
|
|
466
|
+
# TRIPLE-MIRRORED PINS, same discipline as [pi]: `version` and
|
|
467
|
+
# `llama_cpp_python_version` here == deploy/ansible/group_vars/all.yml
|
|
468
|
+
# (openviking_version / llama_cpp_python_version) == the Dockerfile venv layer,
|
|
469
|
+
# which installs BOTH by referencing those group_vars — never a literal.
|
|
470
|
+
# tests/openviking.test.ts fails on any drift; the heartbeat drift-checks the
|
|
471
|
+
# running server's self-reported /health version against `version` too.
|
|
472
|
+
#
|
|
473
|
+
# Every path below is a CONTAINER path. On a dev PC the binary is absent: the
|
|
474
|
+
# supervisor logs once, reports unavailable, and never crash-loops.
|
|
475
|
+
enabled = true
|
|
476
|
+
# Who runs the server. "local" (the default): the daemon supervises it, and the
|
|
477
|
+
# local embedder, as children of this container. "remote": the memory sidecar
|
|
478
|
+
# (docker/memory/) runs both on `host`:`port` — set host to the sidecar's name
|
|
479
|
+
# on the container network — and the daemon only probes its health. The sidecar
|
|
480
|
+
# owns the boot provisioning and the embedder re-embed. Never publish its port.
|
|
481
|
+
endpoint = "local"
|
|
482
|
+
version = "0.4.15"
|
|
483
|
+
# The vendored pi extension's upstream base commit (extensions/vendor/
|
|
484
|
+
# openviking-pi). Pinned beside the server version so a bump re-verifies the
|
|
485
|
+
# vendored patch series rather than silently rebasing onto new upstream behaviour.
|
|
486
|
+
extension_commit = "d436baa23c83938b22bb0aab08b0ce48568b5ff4"
|
|
487
|
+
# The daemon and every review session act as this user, holding a key the
|
|
488
|
+
# server confines to it — that confinement is what keeps companion memory out
|
|
489
|
+
# of a posted review. NEVER an ADMIN or ROOT key: ADMIN grants no cross-user
|
|
490
|
+
# data access anyway, and can list every user key in plaintext.
|
|
491
|
+
user = "reviewer"
|
|
492
|
+
account = ""
|
|
493
|
+
reviewer_key_file = "openviking_reviewer_key"
|
|
494
|
+
# ov.conf `server.auth_mode`. `api_key` is the required posture: the
|
|
495
|
+
# server confines each USER key to its own tree, and that confinement is the
|
|
496
|
+
# only thing keeping companion memory out of a posted review. `dev` bypasses
|
|
497
|
+
# authentication on loopback, which makes the two-user design nominal.
|
|
498
|
+
# MIRRORED into group_vars (openviking_auth_mode), which the entrypoint renders; tests/openviking.test.ts
|
|
499
|
+
# and the scripts/deploy.sh preflight both refuse on drift.
|
|
500
|
+
auth_mode = "api_key"
|
|
501
|
+
# The SERVER's own root key, by file name under the secrets mount. ov.conf
|
|
502
|
+
# needs it to run in api_key mode and boot provisioning needs it to mint users.
|
|
503
|
+
# It is the server's credential, never a client's: no daemon surface, no review
|
|
504
|
+
# session and no companion process ever holds it (writeOvcliConf refuses it as
|
|
505
|
+
# a session credential; packages/pi-plugin/extensions/bash-guard.ts refuses to read the files that
|
|
506
|
+
# carry it). Mirrored as openviking_root_key_file.
|
|
507
|
+
root_key_file = "openviking_root_key"
|
|
508
|
+
# The users boot provisioning ENSURES exist — created if absent, left exactly
|
|
509
|
+
# as they are if present, and NEVER rotated (a rotation orphans the keys
|
|
510
|
+
# already distributed to the companion's PC). Mirrored as
|
|
511
|
+
# openviking_provision_users (comma-joined).
|
|
512
|
+
provision_users = ["reviewer", "companion"]
|
|
513
|
+
request_timeout_ms = 10000
|
|
514
|
+
# The round seed's one context search, in ms (clamped 100…15000) — above one
|
|
515
|
+
# document embedding's time, and below
|
|
516
|
+
# [memory] context_timeout_ms, and a seed that sent its search late passes
|
|
517
|
+
# the time it has left, which wins when shorter.
|
|
518
|
+
search_timeout_ms = 8000
|
|
519
|
+
default_category = "experiences"
|
|
520
|
+
read_cache_ttl_ms = 15000
|
|
521
|
+
# NOT an openviking dependency — an undeclared optional extra. Without it the
|
|
522
|
+
# default local dense embedder raises EmbeddingConfigurationError at startup,
|
|
523
|
+
# so the official image cannot boot (verified against a running 0.4.15 server).
|
|
524
|
+
# It is also the runtime of the local English embedder (below).
|
|
525
|
+
llama_cpp_python_version = "0.3.35"
|
|
526
|
+
host = "127.0.0.1" # loopback ONLY — the port is never published
|
|
527
|
+
port = 1933
|
|
528
|
+
bin = "/opt/openviking/venv/bin/openviking-server"
|
|
529
|
+
# ~/.openviking is symlinked here at boot: memory lives on the STATE VOLUME so
|
|
530
|
+
# it survives an image rebuild. config_file/workspace derive from this.
|
|
531
|
+
home = "/opt/quickreview/state/openviking"
|
|
532
|
+
# config_file = "" # empty ⇒ <home>/ov.conf
|
|
533
|
+
# workspace = "" # empty ⇒ <home>/workspace
|
|
534
|
+
# ov.conf is TEMPLATED at boot by the entrypoint — the interactive
|
|
535
|
+
# `openviking-server init` wizard is never invoked in-container.
|
|
536
|
+
workers = 1 # ov.conf server.workers, 2-CPU cap
|
|
537
|
+
queue_concurrency = 2 # accepted, unused: the entrypoint takes ov.conf's queue concurrency from the deploy (group_vars openviking_queue_concurrency)
|
|
538
|
+
# Health gate is /ready, NEVER `doctor`: doctor makes live provider calls and
|
|
539
|
+
# exits 1 when no `vlm` is configured, which is our normal state. /health is
|
|
540
|
+
# unauthenticated and carries the version the drift check reads. The heartbeat
|
|
541
|
+
# reports the CACHED sample, so writing status.json never waits on the network.
|
|
542
|
+
health_interval_s = 30
|
|
543
|
+
# The /health + /ready probe and the local embedder's /health, in ms (clamped
|
|
544
|
+
# 100…20000). /ready runs an embedding and queues behind a case batch's
|
|
545
|
+
# embeddings, so a shorter limit flaps /ready under load. Memory health's
|
|
546
|
+
# "serving" half reads this probe.
|
|
547
|
+
health_timeout_ms = 6000
|
|
548
|
+
# The supervisor never gives up: a memory engine that stays down is worse than
|
|
549
|
+
# a slow retry, and every call site already degrades memory-less.
|
|
550
|
+
restart_backoff_ms = [1000, 2000, 5000, 15000, 30000, 60000]
|
|
551
|
+
restart_reset_after_s = 120 # an uptime this long resets the ladder
|
|
552
|
+
# The embedder. LOCAL is the shipped default: a small
|
|
553
|
+
# ENGLISH embedding model (bge-small-en-v1.5, 384 dims) served on LOOPBACK
|
|
554
|
+
# inside the container by scripts/openviking-embedder.py, over the pinned
|
|
555
|
+
# llama-cpp-python — so nothing but the model call ever leaves the machine,
|
|
556
|
+
# memory text included. ov.conf reaches it through the engine's
|
|
557
|
+
# OpenAI-COMPATIBLE client (provider "openai", api_base http://127.0.0.1:<port>/v1,
|
|
558
|
+
# no key): that client is asynchronous, so a search does not stall the
|
|
559
|
+
# server. Hosted embeddings are an explicit opt-in: embedding_provider =
|
|
560
|
+
# "openai" with model "text-embedding-3-small" / dimension 1536, and the
|
|
561
|
+
# credential in the secrets dir under `embedding_key_file` — a SEPARATE file
|
|
562
|
+
# from pi's `openai_api_key`, so either can be set without the other. ov.conf
|
|
563
|
+
# carries NO `vlm` section either way: extraction, summaries and digest are off
|
|
564
|
+
# (memories are authored, never extracted).
|
|
565
|
+
# Changing the embedder changes the vector space: the boot detects it, moves
|
|
566
|
+
# the old vectors aside and re-embeds reviewer memory (docs/memory-embeddings.md).
|
|
567
|
+
# MIRRORED into group_vars (openviking_embedding_*), whose value the VM boot
|
|
568
|
+
# renders — on the VM route an opt-in is written as inventory host vars beside
|
|
569
|
+
# these keys; tests/openviking.test.ts pins the SHIPPED default to local.
|
|
570
|
+
embedding_provider = "local"
|
|
571
|
+
embedding_model = "bge-small-en-v1.5-f16"
|
|
572
|
+
embedding_dimension = 384
|
|
573
|
+
embedding_key_file = "openai_embeddings_api_key"
|
|
574
|
+
# The local embedder's MODEL FILE — a rule-7 pin like `version`: the image
|
|
575
|
+
# downloads the GGUF from `local_embedder_url` at BUILD time and refuses it
|
|
576
|
+
# unless its sha256 matches; the service re-checks the hash at every start.
|
|
577
|
+
# TRIPLE MIRROR: these == group_vars openviking_local_embedder_* == the
|
|
578
|
+
# memory Dockerfile's model layer (tests/openviking.test.ts,
|
|
579
|
+
# tests/memory-image.test.ts and the scripts/deploy.sh preflight refuse on
|
|
580
|
+
# drift). A changed pin needs `scripts/deploy.sh rebuild`.
|
|
581
|
+
local_embedder_file = "/opt/openviking/models/bge-small-en-v1.5-f16.gguf"
|
|
582
|
+
local_embedder_url = "https://huggingface.co/CompendiumLabs/bge-small-en-v1.5-gguf/resolve/d32f8c040ea3b516330eeb75b72bcc2d3a780ab7/bge-small-en-v1.5-f16.gguf"
|
|
583
|
+
local_embedder_sha256 = "f0b2fef971e8366438bfd2d9aefea1b0115919389448806d290237f638bae999"
|
|
584
|
+
# The service: loopback only, never published (mirrored as
|
|
585
|
+
# openviking_local_embedder_port / _threads). One thread is the latency budget
|
|
586
|
+
# the model was chosen on — ~25 ms for a round's context query.
|
|
587
|
+
local_embedder_port = 1934
|
|
588
|
+
local_embedder_threads = 1
|
|
589
|
+
|
|
590
|
+
[companion]
|
|
591
|
+
# The local companion container — an ambient pi session on the owner's
|
|
592
|
+
# PC that watches the daemon through the TUI's feed and raises alert files.
|
|
593
|
+
# Every knob below is commented out: the defaults in src/config.ts
|
|
594
|
+
# (COMPANION_DEFAULTS) are the shipped configuration; uncomment to override.
|
|
595
|
+
# enabled = true # `qcr tui` starts it unless --no-companion
|
|
596
|
+
# container_name = "qcr-companion"
|
|
597
|
+
# image = "qcr-companion:release" # the release image (docker/Dockerfile) in companion mode, built from the app root: qcr companion rebuild
|
|
598
|
+
# pihome_volume = "companion-pihome" # its OWN pi auth — never the VM's auth.json
|
|
599
|
+
# session = "companion" # tmux session inside the container
|
|
600
|
+
# model = "openai-codex/gpt-6.1-sol:medium"
|
|
601
|
+
# repo_dir = "" # host review-sandbox repo → /workspace (rw);
|
|
602
|
+
# # empty = this sandbox root
|
|
603
|
+
# tracker_dir = "~/projects/your-tracker" # → /tracker (rw)
|
|
604
|
+
# tracker_docs_dir = "~/projects/your-tracker-docs"
|
|
605
|
+
# # → /tracker-docs (READ-ONLY): the tracker
|
|
606
|
+
# # protocol the companion follows. Outside
|
|
607
|
+
# # tracker_dir, so it needs its own mount.
|
|
608
|
+
# reviewed_repo_dir = "~/projects/your-reviewed-repo"
|
|
609
|
+
# # → mounted READ-ONLY into the container: the
|
|
610
|
+
# # reviewed repo's source, so the companion
|
|
611
|
+
# # can read the code a review is about. Never
|
|
612
|
+
# # writable — and a missing checkout just
|
|
613
|
+
# # drops the mount (under-equipped, never a
|
|
614
|
+
# # companion that refuses to start).
|
|
615
|
+
# evidence_dir = "~/.local/share/qcr/evidence"
|
|
616
|
+
# # → /evidence (READ-ONLY): finished-
|
|
617
|
+
# # round evidence (transcript, ledger, prompt,
|
|
618
|
+
# # verdict) the TUI copies down from the VM.
|
|
619
|
+
# # The companion reads plain files and gains
|
|
620
|
+
# # NO ssh and no credential. Kept indefinitely
|
|
621
|
+
# # and unbounded, so the default is a
|
|
622
|
+
# # deliberate home OUTSIDE the repo; empty
|
|
623
|
+
# # means <sandbox root>/evidence (gitignored).
|
|
624
|
+
# feed_dir = "" # → /feed; empty = state/companion/feed
|
|
625
|
+
# alerts_dir = "" # → /alerts; empty = state/companion/alerts
|
|
626
|
+
# ssh_dir = "~/.ssh" # accepted, unused: ~/.ssh is never mounted
|
|
627
|
+
# overdue_grace_min = 30 # watcher knobs
|
|
628
|
+
# stale_alert_s = 300
|
|
629
|
+
# awaiting_age_h = 24
|
|
630
|
+
# cooldown_min = 20
|
|
631
|
+
|
|
632
|
+
[sink]
|
|
633
|
+
# Where auto-filed defect flags (#bug reviewer-memory entries) land.
|
|
634
|
+
# "github" — defects filed as ISSUES on the reviewed repo. The TUI writes a
|
|
635
|
+
# file-issue command; the DAEMON files it through the one
|
|
636
|
+
# MutationGate with the [caps] day cap, title dedup and the
|
|
637
|
+
# [github] issue_label. In dry-run the gate writes an intent
|
|
638
|
+
# instead of creating anything. Recommended for new installs.
|
|
639
|
+
# "wayfinder" — tickets in a local filesystem wayfinder tracker on the
|
|
640
|
+
# operator's PC (set root/effort/parent below).
|
|
641
|
+
# "none" — auto-filing off (also the default when [sink] is absent).
|
|
642
|
+
kind = "none" # ← FILL (10): "github", "wayfinder", or "none"
|
|
643
|
+
# root = "" # wayfinder: tracker root; empty = [companion] tracker_dir
|
|
644
|
+
# effort = "" # wayfinder: effort auto-filed tickets land in (required)
|
|
645
|
+
# parent = "" # wayfinder: parent map id stamped into each ticket (required)
|
|
646
|
+
# tickets_effort = "" # TUI [2]-tab ticket projection's effort; empty = `effort`
|
|
647
|
+
|
|
648
|
+
[backfill]
|
|
649
|
+
# One-shot pre-daemon history import (`qcr backfill`) — read-only against
|
|
650
|
+
# GitHub, no gate involvement. Every knob defaults off [github] (see
|
|
651
|
+
# backfillDefaults in src/config.ts); uncomment only to re-run against a
|
|
652
|
+
# renamed label or a different identity.
|
|
653
|
+
# bot_login = "your-app[bot]" # reviews(author:) — with the [bot] suffix
|
|
654
|
+
# bot_actor = "your-app" # same identity as a timeline actor (no suffix)
|
|
655
|
+
# reviewed_label = "Automatic Review" # enumeration: the bot-review era marker
|
|
656
|
+
# trigger_label = "AI review requested" # tier-1 trigger candidate
|
|
657
|
+
# in_progress_label = "AI review in progress" # tier-2 (dispatch moment) fallback
|
|
658
|
+
# review_team_slug = "review" # team review request = tier-1 trigger
|
|
659
|
+
# concurrency = 2 # per-PR detail queries in flight
|
|
660
|
+
# max_search_pages = 10 # 100 hits/page; search caps at 1,000
|
|
661
|
+
|
|
662
|
+
[guards]
|
|
663
|
+
# Posting-time guards. Enforced on the single MutationGate (packages/pi-plugin/src/guards.ts).
|
|
664
|
+
# The sessions' post scripts (post-review.sh, approve-pr.sh, reply-thread.sh)
|
|
665
|
+
# hold no guard logic: they ask the daemon to post over its IPC socket
|
|
666
|
+
# (src/ipc/postshim.ts, src/postops.ts), so every post meets the same guards.
|
|
667
|
+
# All are on; a knob exists so a guard can be taken out of the
|
|
668
|
+
# path deliberately, in one place.
|
|
669
|
+
downgrade_on_human_approval = true # human APPROVED at this head ⇒ COMMENT, not REQUEST_CHANGES
|
|
670
|
+
skip_unchanged_head = true # same head, no author reply since ⇒ post nothing
|
|
671
|
+
recheck_pr_state_before_post = true # re-read the PR right before posting; merged/closed ⇒ refuse
|
|
672
|
+
# Guard 4: no green CI at this head ⇒ APPROVE is unavailable,
|
|
673
|
+
# regardless of findings. The review still posts, as a COMMENT with approval
|
|
674
|
+
# withheld, and the PR is re-queued when CI goes green at that head.
|
|
675
|
+
# Only the MOST RECENT run of each check name counts — GitHub auto-cancels
|
|
676
|
+
# superseded runs, and their permanent `cancelled` husks would otherwise
|
|
677
|
+
# withhold every approval forever. The latest run
|
|
678
|
+
# of every name must succeed; a genuinely failing/cancelled LATEST run still
|
|
679
|
+
# blocks exactly like a failing test.
|
|
680
|
+
block_approve_on_red_ci = true # red/pending CI ⇒ approval withheld, review posts as COMMENT
|
|
681
|
+
# A head with ZERO check-runs (conflicted PR, CI not
|
|
682
|
+
# started) carries no execution evidence — withhold there too. Set true for a repo that
|
|
683
|
+
# always runs CI (then `none` means something is wrong, not "no CI setup").
|
|
684
|
+
no_checks_is_red = true # zero checks at head ⇒ approval withheld until checks pass
|
|
685
|
+
# Guard 5: the head the round actually reviewed must still
|
|
686
|
+
# be the PR's live head at posting time. Sessions export QCR_EXPECTED_HEAD
|
|
687
|
+
# (the round prompt cites the sha) before posting; a mismatch refuses the
|
|
688
|
+
# post — the session ends the round without a verdict and the daemon re-runs
|
|
689
|
+
# against the new head. A missing expectation warns loudly but proceeds
|
|
690
|
+
# (sessions on older prompts — same belt-and-braces as rule 10's legacy input).
|
|
691
|
+
refuse_on_head_drift = true # live head != the sha the round reviewed ⇒ refuse to post
|
|
692
|
+
|
|
693
|
+
[recheck]
|
|
694
|
+
# Post-approval delta recheck. Once a PR is approved, these triggers
|
|
695
|
+
# ask the PR's OWN sticky session one question — "does this delta warrant a
|
|
696
|
+
# review, or change the verdict to REQUEST_CHANGES?" — with the standing
|
|
697
|
+
# verdict UPHELD BY DEFAULT. A trivial or empty delta costs one classification
|
|
698
|
+
# and a no-op; the only transition the path can produce is
|
|
699
|
+
# APPROVE -> REQUEST_CHANGES (never a re-approve, never a park). The fourth
|
|
700
|
+
# trigger, an author reply, is owned by ping-pong (src/pingpong.ts) and has no
|
|
701
|
+
# knob here.
|
|
702
|
+
enabled = true
|
|
703
|
+
on_push = true # a push landing after an approve — the core case
|
|
704
|
+
on_ci = true # CI completing at the approved head (adverse => evidence)
|
|
705
|
+
on_base_advance = true # the base branch moved; no PR-owned file changed => no-op
|
|
706
|
+
|
|
707
|
+
[review]
|
|
708
|
+
# A first-party agent-directive edit (.claude/**, prompts/**,
|
|
709
|
+
# AGENTS.md/CLAUDE.md in the reviewed repo) never auto-blocks on `kind:
|
|
710
|
+
# injection` — the round still decides on the merits (there is no park) and
|
|
711
|
+
# the review carries ONE short escalation comment
|
|
712
|
+
# @-mentioning the most recent human author of the touched directive files. This is the fallback mention when git history yields no
|
|
713
|
+
# attributable human login. It is a comment @-mention through the gated review
|
|
714
|
+
# — never a GitHub reviewer nomination (the never-hand-to-a-human rule).
|
|
715
|
+
escalation_mention_default = "" # ← FILL (8): fallback GitHub login for escalation @-mentions ("" = no @)
|
|
716
|
+
# The review preset: "default" (the measured best value — every
|
|
717
|
+
# benchmark-driven lever on, the lean plan), "max" (every model at its highest
|
|
718
|
+
# reasoning level + the full lever plan; ~2x cost, ~3x time) or "low" (every
|
|
719
|
+
# model at low reasoning; ~half default's cost and time, about the pre-lever
|
|
720
|
+
# review's recall). REVIEW_PRESETS in
|
|
721
|
+
# packages/pi-plugin/src/reviewconfig.ts. A lever set below overrides the preset.
|
|
722
|
+
preset = "default"
|
|
723
|
+
# The default preset fetches the SOURCE of the npm/PyPI packages a PR imports
|
|
724
|
+
# (package names and versions go to the public registries; nothing is
|
|
725
|
+
# installed or run) so passes can read what a library does. Set false to keep
|
|
726
|
+
# the reviewer off those registries — e.g. when your package names are private.
|
|
727
|
+
# dependency_sources = false
|
|
728
|
+
# Code-quality lenses (maintainability, duplication, abstraction; capped below
|
|
729
|
+
# blocking) run once a PR's non-test code adds 20 lines; the style lens runs
|
|
730
|
+
# only when your repo has a written style guide (a STYLEGUIDE/CODE_STYLE file
|
|
731
|
+
# or a "Code style" section in CONTRIBUTING) and applies only that guide.
|
|
732
|
+
# quality_lenses = false
|
|
733
|
+
# style_lens = false
|
|
734
|
+
# How many nits a review posts: "strict" (default — true-but-trivial nits are
|
|
735
|
+
# dropped, and review volume comes out of nits) or "open" (every true nit
|
|
736
|
+
# posts; style still needs your written guide).
|
|
737
|
+
# nits = "open"
|
|
738
|
+
# Per-lens cost knobs — both off by default, and the defaults are the review
|
|
739
|
+
# as shipped. skip_lenses lists passes never planned nor addable (known pass
|
|
740
|
+
# names only; pass-validate is refused — switch the validator off in the
|
|
741
|
+
# profile instead). validate_consequence_rule
|
|
742
|
+
# adds the validator's consequence rules (intent/contract appeals post as a
|
|
743
|
+
# [question], dead or latent code demotes to nit, a CI-enabled lint rule is a
|
|
744
|
+
# build defect, merges need a shared consequence).
|
|
745
|
+
# skip_lenses = ["pass-abstraction", "pass-duplication"]
|
|
746
|
+
# validate_consequence_rule = true
|
|
747
|
+
# Review latency levers (bench/aacr/PERF.md §6) — each removes
|
|
748
|
+
# serial time; none changes which lenses run. All on by default except
|
|
749
|
+
# validator sharding:
|
|
750
|
+
# wide_lens_fanout — a batched lens launch runs as wide as
|
|
751
|
+
# [engine] lens_max_concurrency (deprecated: the lens tool sets its own
|
|
752
|
+
# width);
|
|
753
|
+
# task_files — the daemon writes each lens's complete task to a file, and
|
|
754
|
+
# the engine starts the planned discovery wave from those files at
|
|
755
|
+
# round start and the session's `lens_wave` tool joins it
|
|
756
|
+
# (packages/pi-plugin/src/engine/lens/tool.ts; off ⇒ hand-written per-row `lens` calls);
|
|
757
|
+
# render_outputs — the review body and inline comments are rendered from
|
|
758
|
+
# the findings record instead of being written out a second time;
|
|
759
|
+
# validator_shards — EXPERIMENTAL, off (1), unvalidated: split the
|
|
760
|
+
# candidates over this many pass-validate children. Measured once on a
|
|
761
|
+
# 19-lens PR (PERF.md §7): the validator got SLOWER (101 -> 225 s) and the
|
|
762
|
+
# merged record dropped every doubted and downgraded mark, so it never
|
|
763
|
+
# earned the default; kept as a knob, not a recommended setting.
|
|
764
|
+
# wide_lens_fanout = false # deprecated: a no-op when [engine] runtime = "sdk" (the default)
|
|
765
|
+
# task_files = false
|
|
766
|
+
# render_outputs = false
|
|
767
|
+
# validator_shards = 2
|
|
768
|
+
# Duplicate merge (docs/duplicate-merge.md): one comment per root
|
|
769
|
+
# cause. Lens candidates are grouped deterministically before the validator
|
|
770
|
+
# (same file within 10 lines, a shared named identifier, or the same fix
|
|
771
|
+
# target), the validator merges or splits each group, and a post-check at
|
|
772
|
+
# render time merges two posted findings that are one root cause posted twice.
|
|
773
|
+
# dedup_merge = false
|
|
774
|
+
# Per-file coverage check: after the lenses return, every changed
|
|
775
|
+
# non-test source file no lens raised a finding on gets a targeted pass-sweep
|
|
776
|
+
# row (at most two, packed by line budget), each saying why it ran.
|
|
777
|
+
# coverage_check = false
|
|
778
|
+
# Follow-up rounds (docs/follow-up-rounds.md): every round after the
|
|
779
|
+
# first verifies the prior findings and reviews only the PR-owned change since
|
|
780
|
+
# the last reviewed head (base merges and rebases taken out), with one
|
|
781
|
+
# whole-PR pre-approval sweep before an approval when no full look has run
|
|
782
|
+
# since round 1 (or, once approved, when a push is large). Any doubt (no reviewed head, a rewound base, a git failure, a
|
|
783
|
+
# delta above follow_up_max_delta_ratio of the PR's diff lines) runs a
|
|
784
|
+
# full re-review instead. "full" re-reviews the whole PR every round.
|
|
785
|
+
# follow_up = "full"
|
|
786
|
+
# follow_up_max_delta_ratio = 0.6
|
|
787
|
+
# follow_up_sweep = false
|
|
788
|
+
# After a posted approval the sweep is owed only when the change since it
|
|
789
|
+
# reaches this many lines (additions + deletions); 0 never owes it.
|
|
790
|
+
# follow_up_post_approval_sweep_lines = 500
|
|
791
|
+
# A delta of at most this many lines gets the LEAN plan: no per-file sweep
|
|
792
|
+
# rows, and the quality and style lenses offered as addable instead of
|
|
793
|
+
# planned; 0 never. Read only under follow_up_extent = "rules"; the shipped
|
|
794
|
+
# "session" mode always plans the lean core and leaves this threshold to
|
|
795
|
+
# the session.
|
|
796
|
+
# follow_up_small_delta_lines = 150
|
|
797
|
+
# Split pass-baseline on a very large change: over this many changed
|
|
798
|
+
# lines (prose half; lockfiles, generated and vendored files not counted) the
|
|
799
|
+
# baseline is planned as 2-3 rows, each starting from one group of the
|
|
800
|
+
# change's files with the whole PR still its charter, so the round's longest
|
|
801
|
+
# reading runs in parallel. 2000 splits only the largest PRs; 0 never splits.
|
|
802
|
+
# baseline_split_lines = 2000
|
|
803
|
+
# The round's CONTEXT PACK (docs/prompt-caching.md): "pack-first"
|
|
804
|
+
# writes the diff, the change since the last review and the most-changed
|
|
805
|
+
# files' full text beside the task files, and every lens child carries it at
|
|
806
|
+
# the start of its prompt, after one cached warm-up per cache group — so the
|
|
807
|
+
# lenses read it from cache instead of re-reading it uncached (each lens's
|
|
808
|
+
# instructions move into a developer message after the pack). On by default
|
|
809
|
+
# (measured 40% cheaper on 10 cases, verdicts and recall held); "off" sends
|
|
810
|
+
# no pack. Needs [engine] lens_cache_group > 0.
|
|
811
|
+
# context_pack = "off"
|
|
812
|
+
# context_pack_max_tokens = 40000
|
|
813
|
+
# Loosened-test hint: weakened assertions in the PR's test files
|
|
814
|
+
# (exact → bound or contains, a tolerance widened, a count lowered, a timeout
|
|
815
|
+
# lengthened, an assert removed or commented out, a skip added) are found by
|
|
816
|
+
# code and named in pass-tests' plan reason; their presence also plans it.
|
|
817
|
+
# loosened_test_hint = false
|
|
818
|
+
# Repo profile — names a directory under profiles/ whose house-rule
|
|
819
|
+
# addenda pack (profiles/<name>/addenda/*.md) composes onto the built pass
|
|
820
|
+
# bodies after the built-in generic registry, and whose optional
|
|
821
|
+
# heuristics.toml extends lens selection with your repo's file shapes
|
|
822
|
+
# (framework settings globs, command dirs, flag-library names — ADD-only, the
|
|
823
|
+
# generic selection core always stays). "" = no profile (generic addenda and
|
|
824
|
+
# generic selection only). Ship-with options: "default" (the shipped
|
|
825
|
+
# behaviour — the base your own profile extends with `extends = "default"`),
|
|
826
|
+
# "minimal" (empty pack), "example-django" (a worked illustrative Django pack,
|
|
827
|
+
# heuristics included).
|
|
828
|
+
# See docs/profiles.md for authoring your own.
|
|
829
|
+
profile = ""
|
|
830
|
+
|
|
831
|
+
# EXTENSIONS to the first-party directive-path vocabulary the
|
|
832
|
+
# directive-edit escalation flow keys on (packages/pi-plugin/src/severity.ts). Extend-only by design:
|
|
833
|
+
# these ADD names, the built-ins (.claude/**, .cursor/**, root prompts/**,
|
|
834
|
+
# AGENTS.md/AGENT.md/CLAUDE.md/.cursorrules anywhere,
|
|
835
|
+
# .github/copilot-instructions.md) can never be removed — dropping one would
|
|
836
|
+
# silently re-enable auto-blocking on first-party directive edits. Leave
|
|
837
|
+
# empty unless your repo keeps agent directives under other names.
|
|
838
|
+
[review.directives]
|
|
839
|
+
extra_basenames = [] # e.g. ["COPILOT.md"]
|
|
840
|
+
extra_dir_segments = [] # e.g. [".aider"] — whole subtree, any depth
|
|
841
|
+
extra_root_dirs = [] # ROOT-only directive dirs, like prompts/
|
|
842
|
+
extra_files = [] # exact repo-relative paths
|
|
843
|
+
extra_vendored_segments = [] # extra third-party markers (case-insensitive)
|
|
844
|
+
|
|
845
|
+
# ---------------------------------------------------------------------------
|
|
846
|
+
# [escalation] — OPTIONAL, OFF BY DEFAULT.
|
|
847
|
+
#
|
|
848
|
+
# Two things this does NOT do, and cannot be configured to do:
|
|
849
|
+
#
|
|
850
|
+
# * It never hands the review back. The reviewer always decides on the
|
|
851
|
+
# merits and posts the verdict; an escalation is a note that goes out
|
|
852
|
+
# BESIDE it. Nothing here can withhold, defer or replace a verdict.
|
|
853
|
+
# * It never asks anyone to "review this PR". Every escalation names ONE
|
|
854
|
+
# thing — a file and line range, a migration, a named decision — and why
|
|
855
|
+
# that person. Think of it as a `[check this]` item with a name on it.
|
|
856
|
+
#
|
|
857
|
+
# Leave `enabled = false` and nothing below is read: no rule is evaluated, no
|
|
858
|
+
# extra API call is made, and the round prompts carry no escalation text
|
|
859
|
+
# whatever — the system BEHAVES exactly as a build without the feature.
|
|
860
|
+
# (The placeholder that renders empty leaves a blank line in the prompt, like
|
|
861
|
+
# the sibling notes beside it.)
|
|
862
|
+
# `qcr onboard`'s escalation step writes this section.
|
|
863
|
+
#
|
|
864
|
+
# The configuration cannot be half-done: `enabled = true` with no `targets`,
|
|
865
|
+
# or a rule pointing at a login that is not a target, or a rule that declares
|
|
866
|
+
# no condition, all REFUSE TO LOAD. That is deliberate — escalation switched
|
|
867
|
+
# on with nobody to escalate to is not a configuration.
|
|
868
|
+
[escalation]
|
|
869
|
+
enabled = false
|
|
870
|
+
# "comment" (the default) posts a gated COMMENT review @-mentioning the person
|
|
871
|
+
# with the narrow ask. "review_request" ALSO puts the PR in their
|
|
872
|
+
# review-requested queue — GitHub words that entry "review this pull request",
|
|
873
|
+
# which is exactly the framing this feature rules out, so the comment is still
|
|
874
|
+
# posted and still carries the real ask. "comment" is the shape that matches
|
|
875
|
+
# the intent; pick "review_request" only if your team lives in that queue.
|
|
876
|
+
shape = "comment"
|
|
877
|
+
# The CLOSED set of logins any escalation may reach. A session that names
|
|
878
|
+
# anyone else is silently dropped by the daemon — it is not negotiable.
|
|
879
|
+
targets = []
|
|
880
|
+
# May the PR's session ALSO escalate on its own judgement, bounded to the
|
|
881
|
+
# targets above? Off by default: the rules below stand on their own, and they
|
|
882
|
+
# are the half with no model in the loop.
|
|
883
|
+
session_judgement = false
|
|
884
|
+
# Hard cap per PR, across every round.
|
|
885
|
+
max_per_pr = 2
|
|
886
|
+
|
|
887
|
+
# Deterministic triggers. Each rule is a pure predicate over facts the daemon
|
|
888
|
+
# already has — no LLM judgement anywhere. A rule fires when EVERY condition it
|
|
889
|
+
# declares holds; a rule that declares none refuses to load.
|
|
890
|
+
#
|
|
891
|
+
# Conditions: paths (glob: * within a segment, ** across), labels (PR labels),
|
|
892
|
+
# min_severity (the round posted a finding at or above P0/P1/P2/P3), and
|
|
893
|
+
# failing_checks (the LATEST run of a named check is not green).
|
|
894
|
+
#
|
|
895
|
+
# [[escalation.rules]]
|
|
896
|
+
# name = "migrations"
|
|
897
|
+
# to = "example-teammate" # must appear in `targets` above
|
|
898
|
+
# why = "you own this repo's migration policy"
|
|
899
|
+
# paths = ["**/migrations/*.py"]
|
|
900
|
+
# [[escalation.rules]]
|
|
901
|
+
# name = "blockers-on-payments"
|
|
902
|
+
# to = "example-teammate"
|
|
903
|
+
# why = "payments changes go past you before they merge"
|
|
904
|
+
# paths = ["billing/**"]
|
|
905
|
+
# min_severity = "P1"
|
|
906
|
+
|
|
907
|
+
# Bounds on a SESSION-issued `drain` / `pause-pr`. A pi session
|
|
908
|
+
# (the overseer, or a PR's session on the owner's behalf in Slack) may hold
|
|
909
|
+
# either lever only for a bounded time, drawn from a per-day minute budget —
|
|
910
|
+
# so a session can stop review work for a reason, never indefinitely. The
|
|
911
|
+
# OPERATOR's own levers (`qcr drain on`, the deploy tab's D) are NOT bounded
|
|
912
|
+
# here: the deploy-window drain stands until the new boot's first healthy
|
|
913
|
+
# reconcile lifts it. Which of the two a command is comes
|
|
914
|
+
# from the channel it arrived on (the operator's is the root-owned
|
|
915
|
+
# `commands/operator/` directory a session cannot write into), never from a
|
|
916
|
+
# field in the file. All values are minutes; budgets count per [ops] timezone day.
|
|
917
|
+
[levers]
|
|
918
|
+
session_drain_max_min = 30 # longest single session drain
|
|
919
|
+
session_drain_budget_min_per_day = 90 # total session-drain minutes per day (>= the cap)
|
|
920
|
+
session_pause_max_min = 240 # longest single session pause of one PR
|
|
921
|
+
session_pause_budget_min_per_day = 480 # total session-pause minutes per PR per day (>= the cap)
|
|
922
|
+
|
|
923
|
+
# Archiving (docs/archiving.md): closed-PR history leaves every live
|
|
924
|
+
# path for a compressed archive under <root>/archive/ — nothing of analysis
|
|
925
|
+
# value is deleted, only proven duplicates. The archiver runs on its own timer,
|
|
926
|
+
# never before the first healthy reconcile + start_delay_min, and holds while
|
|
927
|
+
# draining, while the event loop is stalled or the CPU starved, and while
|
|
928
|
+
# either mount's free space is low or unknown. "plan" (the shipped value)
|
|
929
|
+
# computes what it WOULD move — status.json `archive`, `qcr status`,
|
|
930
|
+
# `qcr archive status --plan` — and writes nothing. "on" MOVES, every tick:
|
|
931
|
+
# first it restores reopened PRs' transcripts and payloads to their live paths;
|
|
932
|
+
# then it moves the old reader-less event rows and webhook deliveries into
|
|
933
|
+
# monthly SQLite files under archive/db/ (sealing finished months to .gz);
|
|
934
|
+
# then each eligible closed PR's files — every pi transcript, round prompt,
|
|
935
|
+
# session-command payload, finding, receipt, round file, inject leftover and
|
|
936
|
+
# processed verdict — into archive/pr-<n>/, REMOVING each from the live tree
|
|
937
|
+
# once its compressed copy is verified; then the overseer's non-current
|
|
938
|
+
# transcripts and pi's day-old global session files the same way. Nothing is
|
|
939
|
+
# deleted that is not verified in the archive or a proven duplicate. Read one
|
|
940
|
+
# `qcr archive status --plan` before flipping it. All optional — these are the
|
|
941
|
+
# defaults.
|
|
942
|
+
[archive]
|
|
943
|
+
mode = "plan" # off | plan | on — an unknown value refuses to load
|
|
944
|
+
after_days = 14 # closed PRs' files and webhook deliveries (clamped 7..3650)
|
|
945
|
+
events_after_days = 35 # the reader-less event kinds (clamped 31..3650; keeps qcr metrics d30 exact)
|
|
946
|
+
interval_s = 60 # the archiver's own timer (clamped 10..3600)
|
|
947
|
+
start_delay_min = 10 # after the first healthy reconcile (clamped 0..1440)
|
|
948
|
+
tick_budget_s = 20 # no new file is started after this (clamped 1..300)
|
|
949
|
+
max_prs_per_tick = 5 # (clamped 1..100)
|
|
950
|
+
max_mb_per_s = 8 # input rate cap for compress + verify (clamped 1..200)
|
|
951
|
+
disk_headroom_gb = 2 # free space kept on both mounts (clamped 0.5..1024)
|
|
952
|
+
db_batch_rows = 500 # the DB mover's starting batch; adapts 100..2000 to stay <= 25 ms
|
|
953
|
+
gzip_level = 6 # (clamped 1..9)
|
|
954
|
+
live_retention_days = 30 # a worker round's logs (state/live, state/lens) leave the live tree this long after
|
|
955
|
+
# their last write, once the PR's archive holds a verified copy (clamped 7..3650)
|
|
956
|
+
live_cap_gb = 20 # disk cap on state/live + state/lens; past it the archive_live_cap wake fires (0 = off, max 4096)
|
|
957
|
+
|
|
958
|
+
# The bot login's single refresher (src/loginrefresh/): the VM-only
|
|
959
|
+
# exception to "only the owner's pi /login refreshes" (packages/pi-plugin/src/engine/auth.ts).
|
|
960
|
+
# After the cutover ONE process the daemon spawns and supervises owns
|
|
961
|
+
# pihome/agent/auth.json and every worker borrows a refresh-blanked copy.
|
|
962
|
+
# Off until the cutover's config turns it on: while tmux pi sessions exist they
|
|
963
|
+
# refresh the file themselves, and a second refresher would rotate the refresh
|
|
964
|
+
# token under them. margin_min must exceed [daemon] round_deadline_min.
|
|
965
|
+
[login_refresh]
|
|
966
|
+
enabled = false
|
|
967
|
+
margin_min = 90 # refresh once the token has less than pi's 5 min + this left
|
|
968
|
+
|
|
969
|
+
# The companion's whole-repo scan — read only inside the companion,
|
|
970
|
+
# never on the VM. Stage 1 runs `pass-scan` over every unit of the saved unit
|
|
971
|
+
# cut (tests, migrations, lockfiles and prose never). The FIRST scan at these
|
|
972
|
+
# settings is a calibration run over a few units; every later cost preview is
|
|
973
|
+
# priced from the coverage ledger's actual costs, and a run stops hard at the
|
|
974
|
+
# estimate the operator approved. A repo profile's `[scan]` table overrides
|
|
975
|
+
# effort / tier / validator / exclude / depth / deep_lenses (the profile
|
|
976
|
+
# wins); the rest is the install's. All optional — these are the defaults.
|
|
977
|
+
[scan]
|
|
978
|
+
effort = "low" # stage 1's reasoning level: low | medium | high (= [models] effort_max)
|
|
979
|
+
tier = "sol-med" # whose model pass-scan runs on ([models.tiers])
|
|
980
|
+
validator = true # the skeptic: judges each finding at its lens's tier — confirmed / likely / doubtful, never dropped (its cost is in the price)
|
|
981
|
+
exclude = [] # repo-relative globs never scanned, e.g. ["generated/", "*.pb.go"]
|
|
982
|
+
calibration_units = 3 # units the first-scan calibration run reads
|
|
983
|
+
calibration_max_usd = 3.0 # the calibration run's hard stop
|
|
984
|
+
concurrency = 8 # scan cases in flight at once (stage 1 and stage 2)
|
|
985
|
+
case_max_files = 30 # one case reads at most this much; a bigger unit splits, name kept
|
|
986
|
+
case_max_lines = 3000 # (stage-2 rows too: split a bigger row)
|
|
987
|
+
unmeasured_rate_factor = 4 # stage 2: a deep lens never priced here costs stage 1's rate × this
|
|
988
|
+
depth = "standard" # "deep": stage 1 names a deep lens for every file, every lens digs past its row's
|
|
989
|
+
# files, a stage-2 proposal adds the floor below, and only a deep reading covers a file
|
|
990
|
+
deep_lenses = ["pass-consistency", "pass-delivery", "pass-duplication", "pass-maintainability"]
|
|
991
|
+
# the deep floor: each of these over every file stage 1 reads (one switched off by the profile is skipped);
|
|
992
|
+
# the order is the priority: under a budget the first lens covers the whole tree before the next starts
|
|
993
|
+
# Where `qcr scan start` drives a run (not a profile key). "docker": in a throwaway
|
|
994
|
+
# container from the companion image, mounting only the reviewed repo (read-only),
|
|
995
|
+
# the state home, the companion's pi login (read-only) and this config (read-only)
|
|
996
|
+
# — `qcr scan doctor` checks it all, and an image older than the checkout is
|
|
997
|
+
# refused until `qcr scan rebuild` (which builds it and touches no container).
|
|
998
|
+
# Unset, it is "host" inside the companion container.
|
|
999
|
+
# "host": a detached process on this machine, running the `pi` on the PATH (its own login).
|
|
1000
|
+
#
|
|
1001
|
+
# One login: the companion's. Log its pi in once (`qcr scan login` runs pi's OAuth
|
|
1002
|
+
# login straight away, in the running companion or over its pi home volume); the
|
|
1003
|
+
# companion alone refreshes it.
|
|
1004
|
+
# A scan reads that login read-only and runs every case on a fresh private copy with
|
|
1005
|
+
# the refresh token neutralised, so it never refreshes and never writes anything the
|
|
1006
|
+
# companion reads. The price: a scan case cannot outlive the access token — a start
|
|
1007
|
+
# or a case it would not outlive is refused; open the companion so it refreshes.
|
|
1008
|
+
sandbox = "docker"
|
|
1009
|
+
# pihome_volume = "companion-pihome" # whose login the scan reads; default [companion] pihome_volume
|
|
1010
|
+
# image = "qcr-scan" # the sandbox's image (docker/companion/Dockerfile): qcr scan rebuild
|
|
1011
|
+
|
|
1012
|
+
[slack]
|
|
1013
|
+
# The Slack concierge — ONE channel, one thread per PR. Tokens are
|
|
1014
|
+
# NEVER here: bot_token_file / app_token_file name flat files under
|
|
1015
|
+
# [github].secrets_dir (~/.config/qcr/<install>/secrets, /opt/quickreview/secrets in the
|
|
1016
|
+
# container). Turning `enabled` on is a deliberate deploy-time act: with it on,
|
|
1017
|
+
# a missing token file is a hard startup error, never a silent read-only mode.
|
|
1018
|
+
enabled = false
|
|
1019
|
+
channel = "" # ← FILL (9, if enabling Slack): the ONE channel id (C…)
|
|
1020
|
+
channel_kind = "public" # "public" | "private" (private needs an invite)
|
|
1021
|
+
bot_token_file = "slack_bot_token" # xoxb-…
|
|
1022
|
+
app_token_file = "slack_app_token" # xapp-…, connections:write, socket mode only
|
|
1023
|
+
legacy_owner_slack_id = "" # LEGACY alias of [owner] slack_id — set the [owner] key instead
|
|
1024
|
+
post_min_interval_ms = 1100 # Slack chat.postMessage is ~1 msg/s per channel
|
|
1025
|
+
reconnect_backoff_ms = [1000, 2000, 5000, 15000, 30000]
|
|
1026
|
+
server_ping_timeout_ms = 30000 # no server ping within this ⇒ reconnect
|
|
1027
|
+
catchup_max_age_s = 300 # accepted, unused: Slack inbound turns are retired
|
|
1028
|
+
max_reply_chars = 3000
|
|
1029
|
+
name_cache_ttl_s = 86400
|
|
1030
|
+
|
|
1031
|
+
[slack.users]
|
|
1032
|
+
# Slack member id -> GitHub login. The ONLY source of own-PR rights: a message
|
|
1033
|
+
# from an id that is not listed here can never claim to be a PR's author.
|
|
1034
|
+
# U0OPERATOR = "operator-github-login"
|
|
1035
|
+
|
|
1036
|
+
[slack.policy]
|
|
1037
|
+
# Every cap below is enforced in DAEMON CODE (src/slack/policy.ts), never by
|
|
1038
|
+
# prompt — a session can ask to speak, the daemon decides.
|
|
1039
|
+
daily_turns = 80 # channel-wide model turns per policy day
|
|
1040
|
+
per_user_daily_turns = 20 # per person, same window
|
|
1041
|
+
thread_replies_per_day = 6 # daemon posts into any one thread
|
|
1042
|
+
soft_exchange_limit = 3 # accepted, unused (no reader enforces it)
|
|
1043
|
+
announcements_per_hour = 20 # rolling hour; announcements bypass turn caps
|
|
1044
|
+
default_cooldown_min = 60 # for a non-built-in cause with no cooldown_min of its own
|
|
1045
|
+
# The day boundary for every cap (DST-correct). Defaults from [ops] timezone;
|
|
1046
|
+
# uncomment to run the Slack caps on another clock.
|
|
1047
|
+
#timezone = "Europe/Warsaw"
|
|
1048
|
+
pickup_grace_min = 20
|
|
1049
|
+
downtime_notice_min = 5
|
|
1050
|
+
heartbeat_interval_min = 5
|
|
1051
|
+
storm_corrections = 5 # accepted, unused: no code raises reconcile.storm
|
|
1052
|
+
awaiting_author_stale_h = 48 # accepted, unused: no code raises pr.awaiting_author_stale
|
|
1053
|
+
broadcast_verdicts = "never" # accepted, unused: verdicts always stay in-thread
|
|
1054
|
+
|
|
1055
|
+
[slack.policy.causes]
|
|
1056
|
+
# Per-cause switch + cooldown. Keys are per-PR at runtime ("round.overdue:5263")
|
|
1057
|
+
# so one stuck PR can never silence another.
|
|
1058
|
+
"round.overdue" = { enabled = true, cooldown_min = 60 }
|
|
1059
|
+
"round.malformed_verdict" = { enabled = true, cooldown_min = 60 }
|
|
1060
|
+
"review.failed_loud" = { enabled = true, cooldown_min = 60 }
|
|
1061
|
+
"pr.not_picked_up" = { enabled = true, cooldown_min = 120 }
|
|
1062
|
+
"daemon.up" = { enabled = true, cooldown_min = 0 }
|
|
1063
|
+
"daemon.stopping" = { enabled = true, cooldown_min = 0 }
|
|
1064
|
+
"slack.cap_reached" = { enabled = true, cooldown_min = 0 }
|
|
1065
|
+
"reconcile.storm" = { enabled = false, cooldown_min = 180 }
|
|
1066
|
+
"digest.eod" = { enabled = false, cooldown_min = 0 }
|
|
1067
|
+
"pr.awaiting_author_stale" = { enabled = false, cooldown_min = 1440 }
|