tinybeeai 0.0.0-stage → 0.16.1
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/.railway/railway.ts +83 -0
- package/.railway/tsconfig.json +13 -0
- package/AGENTS.md +102 -0
- package/Dockerfile +108 -0
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/localdost.js +29 -0
- package/bin/tinybeeai.js +28 -0
- package/compose.yml +63 -0
- package/demo/payloads/ci_failure.json +46 -0
- package/demo/payloads/outage.json +18 -0
- package/demo/payloads/pr_comment_edited.json +50 -0
- package/demo/payloads/pr_merged.json +80 -0
- package/demo/payloads/pr_opened.json +69 -0
- package/demo/payloads/pr_synchronize.json +69 -0
- package/demo/payloads/ticket_created.json +138 -0
- package/demo/sample-app/playwright.config.ts +20 -0
- package/demo/sample-app/server.ts +163 -0
- package/demo/sample-app/tests/checkout.spec.ts +13 -0
- package/demo/sample-app/tests/smoke.spec.ts +8 -0
- package/dist/agent/approval-retries.js +59 -0
- package/dist/agent/approval-retries.js.map +1 -0
- package/dist/agent/approvals.js +390 -0
- package/dist/agent/approvals.js.map +1 -0
- package/dist/agent/chat-bridge.js +154 -0
- package/dist/agent/chat-bridge.js.map +1 -0
- package/dist/agent/chat-lead.js +475 -0
- package/dist/agent/chat-lead.js.map +1 -0
- package/dist/agent/chat-loop.js +106 -0
- package/dist/agent/chat-loop.js.map +1 -0
- package/dist/agent/chat-mcp.js +49 -0
- package/dist/agent/chat-mcp.js.map +1 -0
- package/dist/agent/chat-tool-blocks.js +453 -0
- package/dist/agent/chat-tool-blocks.js.map +1 -0
- package/dist/agent/chat-view.js +94 -0
- package/dist/agent/chat-view.js.map +1 -0
- package/dist/agent/chat-views.js +781 -0
- package/dist/agent/chat-views.js.map +1 -0
- package/dist/agent/chat.js +1703 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/destinations.js +150 -0
- package/dist/agent/destinations.js.map +1 -0
- package/dist/agent/llm-cli.js +451 -0
- package/dist/agent/llm-cli.js.map +1 -0
- package/dist/agent/llm-codex.js +493 -0
- package/dist/agent/llm-codex.js.map +1 -0
- package/dist/agent/llm-openai.js +211 -0
- package/dist/agent/llm-openai.js.map +1 -0
- package/dist/agent/llm.js +1464 -0
- package/dist/agent/llm.js.map +1 -0
- package/dist/agent/memory.js +33 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/mock-views.js +93 -0
- package/dist/agent/mock-views.js.map +1 -0
- package/dist/agent/model-availability.js +207 -0
- package/dist/agent/model-availability.js.map +1 -0
- package/dist/agent/model-errors.js +188 -0
- package/dist/agent/model-errors.js.map +1 -0
- package/dist/agent/model-guard.js +311 -0
- package/dist/agent/model-guard.js.map +1 -0
- package/dist/agent/prompts.js +374 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/qa-lenses/qa-auth.md +32 -0
- package/dist/agent/qa-lenses/qa-check-then-act.md +33 -0
- package/dist/agent/qa-lenses/qa-control-has-no-effect.md +32 -0
- package/dist/agent/qa-lenses/qa-dates.md +31 -0
- package/dist/agent/qa-lenses/qa-double-submit.md +34 -0
- package/dist/agent/qa-lenses/qa-feature-flag.md +29 -0
- package/dist/agent/qa-lenses/qa-migration.md +35 -0
- package/dist/agent/qa-lenses/qa-money.md +38 -0
- package/dist/agent/qa-lenses/qa-response-shape-break.md +33 -0
- package/dist/agent/qa-lenses/qa-validation.md +29 -0
- package/dist/agent/qa-prompts.js +660 -0
- package/dist/agent/qa-prompts.js.map +1 -0
- package/dist/agent/reasoning.js +55 -0
- package/dist/agent/reasoning.js.map +1 -0
- package/dist/agent/redact.js +48 -0
- package/dist/agent/redact.js.map +1 -0
- package/dist/agent/rules.js +927 -0
- package/dist/agent/rules.js.map +1 -0
- package/dist/agent/runs.js +440 -0
- package/dist/agent/runs.js.map +1 -0
- package/dist/agent/send-retry.js +62 -0
- package/dist/agent/send-retry.js.map +1 -0
- package/dist/agent/team-notes.js +288 -0
- package/dist/agent/team-notes.js.map +1 -0
- package/dist/agent/token-meter.js +31 -0
- package/dist/agent/token-meter.js.map +1 -0
- package/dist/agent/triage.js +506 -0
- package/dist/agent/triage.js.map +1 -0
- package/dist/api.js +1047 -0
- package/dist/api.js.map +1 -0
- package/dist/approval-targets.js +107 -0
- package/dist/approval-targets.js.map +1 -0
- package/dist/bee/cloudflared.js +108 -0
- package/dist/bee/cloudflared.js.map +1 -0
- package/dist/bee/health.js +99 -0
- package/dist/bee/health.js.map +1 -0
- package/dist/bee/hive-client.js +75 -0
- package/dist/bee/hive-client.js.map +1 -0
- package/dist/bee/identity.js +39 -0
- package/dist/bee/identity.js.map +1 -0
- package/dist/bee/models.js +510 -0
- package/dist/bee/models.js.map +1 -0
- package/dist/bee/pairing.js +351 -0
- package/dist/bee/pairing.js.map +1 -0
- package/dist/bee/relay-client.js +50 -0
- package/dist/bee/relay-client.js.map +1 -0
- package/dist/bee/routes.js +214 -0
- package/dist/bee/routes.js.map +1 -0
- package/dist/bee/setup-page.js +223 -0
- package/dist/bee/setup-page.js.map +1 -0
- package/dist/bee/state.js +41 -0
- package/dist/bee/state.js.map +1 -0
- package/dist/bee/status.js +117 -0
- package/dist/bee/status.js.map +1 -0
- package/dist/bee/tunnel-manager.js +245 -0
- package/dist/bee/tunnel-manager.js.map +1 -0
- package/dist/bee/updater.js +268 -0
- package/dist/bee/updater.js.map +1 -0
- package/dist/boot.js +41 -0
- package/dist/boot.js.map +1 -0
- package/dist/call/index.js +145 -0
- package/dist/call/index.js.map +1 -0
- package/dist/case-folders.js +294 -0
- package/dist/case-folders.js.map +1 -0
- package/dist/cases.js +554 -0
- package/dist/cases.js.map +1 -0
- package/dist/chat-blocks.js +709 -0
- package/dist/chat-blocks.js.map +1 -0
- package/dist/chat-parse-util.js +38 -0
- package/dist/chat-parse-util.js.map +1 -0
- package/dist/chat-results.js +96 -0
- package/dist/chat-results.js.map +1 -0
- package/dist/chat-stats.js +193 -0
- package/dist/chat-stats.js.map +1 -0
- package/dist/chat-view-specs.js +186 -0
- package/dist/chat-view-specs.js.map +1 -0
- package/dist/cli/doctor-ops.js +361 -0
- package/dist/cli/doctor-ops.js.map +1 -0
- package/dist/cli/doctor.js +289 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/dogfood.js +70 -0
- package/dist/cli/dogfood.js.map +1 -0
- package/dist/cli/env-file.js +34 -0
- package/dist/cli/env-file.js.map +1 -0
- package/dist/cli/eval-chat-cases.js +359 -0
- package/dist/cli/eval-chat-cases.js.map +1 -0
- package/dist/cli/eval-chat-results.js +85 -0
- package/dist/cli/eval-chat-results.js.map +1 -0
- package/dist/cli/eval-chat.js +508 -0
- package/dist/cli/eval-chat.js.map +1 -0
- package/dist/cli/eval-designer.js +67 -0
- package/dist/cli/eval-designer.js.map +1 -0
- package/dist/cli/eval-qa-review.js +284 -0
- package/dist/cli/eval-qa-review.js.map +1 -0
- package/dist/cli/golden-export.js +35 -0
- package/dist/cli/golden-export.js.map +1 -0
- package/dist/cli/index.js +90 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.js +746 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan-repo.js +199 -0
- package/dist/cli/scan-repo.js.map +1 -0
- package/dist/cli/seed.js +108 -0
- package/dist/cli/seed.js.map +1 -0
- package/dist/cli/tinybee.js +247 -0
- package/dist/cli/tinybee.js.map +1 -0
- package/dist/config.js +138 -0
- package/dist/config.js.map +1 -0
- package/dist/connect/aivision-local.js +833 -0
- package/dist/connect/aivision-local.js.map +1 -0
- package/dist/connect/aivision-token.js +84 -0
- package/dist/connect/aivision-token.js.map +1 -0
- package/dist/connect/crypto.js +65 -0
- package/dist/connect/crypto.js.map +1 -0
- package/dist/connect/deps.js +110 -0
- package/dist/connect/deps.js.map +1 -0
- package/dist/connect/engines.js +144 -0
- package/dist/connect/engines.js.map +1 -0
- package/dist/connect/github-access.js +74 -0
- package/dist/connect/github-access.js.map +1 -0
- package/dist/connect/github-app.js +129 -0
- package/dist/connect/github-app.js.map +1 -0
- package/dist/connect/index.js +9 -0
- package/dist/connect/index.js.map +1 -0
- package/dist/connect/model-choices.js +201 -0
- package/dist/connect/model-choices.js.map +1 -0
- package/dist/connect/providers.js +900 -0
- package/dist/connect/providers.js.map +1 -0
- package/dist/connect/readiness.js +232 -0
- package/dist/connect/readiness.js.map +1 -0
- package/dist/connect/redact.js +16 -0
- package/dist/connect/redact.js.map +1 -0
- package/dist/connect/registry.js +406 -0
- package/dist/connect/registry.js.map +1 -0
- package/dist/connect/store.js +283 -0
- package/dist/connect/store.js.map +1 -0
- package/dist/connect/tunnel.js +134 -0
- package/dist/connect/tunnel.js.map +1 -0
- package/dist/connect/types.js +8 -0
- package/dist/connect/types.js.map +1 -0
- package/dist/connections/index.js +5 -0
- package/dist/connections/index.js.map +1 -0
- package/dist/connections/manager.js +223 -0
- package/dist/connections/manager.js.map +1 -0
- package/dist/connections/presets.js +264 -0
- package/dist/connections/presets.js.map +1 -0
- package/dist/connections/store.js +132 -0
- package/dist/connections/store.js.map +1 -0
- package/dist/connections/tools.js +206 -0
- package/dist/connections/tools.js.map +1 -0
- package/dist/db-schema.js +355 -0
- package/dist/db-schema.js.map +1 -0
- package/dist/db.js +379 -0
- package/dist/db.js.map +1 -0
- package/dist/delivery.js +49 -0
- package/dist/delivery.js.map +1 -0
- package/dist/deploy-wait.js +701 -0
- package/dist/deploy-wait.js.map +1 -0
- package/dist/disk.js +243 -0
- package/dist/disk.js.map +1 -0
- package/dist/dot-health.js +966 -0
- package/dist/dot-health.js.map +1 -0
- package/dist/dot-remove.js +246 -0
- package/dist/dot-remove.js.map +1 -0
- package/dist/events.js +38 -0
- package/dist/events.js.map +1 -0
- package/dist/evidence-pack.js +423 -0
- package/dist/evidence-pack.js.map +1 -0
- package/dist/flows/answers.js +289 -0
- package/dist/flows/answers.js.map +1 -0
- package/dist/flows/change.js +811 -0
- package/dist/flows/change.js.map +1 -0
- package/dist/flows/checkStatus.js +524 -0
- package/dist/flows/checkStatus.js.map +1 -0
- package/dist/flows/ci.js +236 -0
- package/dist/flows/ci.js.map +1 -0
- package/dist/flows/ciFailure.js +76 -0
- package/dist/flows/ciFailure.js.map +1 -0
- package/dist/flows/common.js +522 -0
- package/dist/flows/common.js.map +1 -0
- package/dist/flows/default-branch.js +29 -0
- package/dist/flows/default-branch.js.map +1 -0
- package/dist/flows/defectDraft.js +447 -0
- package/dist/flows/defectDraft.js.map +1 -0
- package/dist/flows/defects.js +623 -0
- package/dist/flows/defects.js.map +1 -0
- package/dist/flows/digest.js +295 -0
- package/dist/flows/digest.js.map +1 -0
- package/dist/flows/impact.js +82 -0
- package/dist/flows/impact.js.map +1 -0
- package/dist/flows/index.js +23 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/intent-sources.js +72 -0
- package/dist/flows/intent-sources.js.map +1 -0
- package/dist/flows/mergeCases.js +169 -0
- package/dist/flows/mergeCases.js.map +1 -0
- package/dist/flows/nightlyRun.js +82 -0
- package/dist/flows/nightlyRun.js.map +1 -0
- package/dist/flows/outage.js +64 -0
- package/dist/flows/outage.js.map +1 -0
- package/dist/flows/postMerge.js +5 -0
- package/dist/flows/postMerge.js.map +1 -0
- package/dist/flows/prCheck.js +5 -0
- package/dist/flows/prCheck.js.map +1 -0
- package/dist/flows/prTarget.js +66 -0
- package/dist/flows/prTarget.js.map +1 -0
- package/dist/flows/qa.js +363 -0
- package/dist/flows/qa.js.map +1 -0
- package/dist/flows/questions.js +160 -0
- package/dist/flows/questions.js.map +1 -0
- package/dist/flows/recovery.js +64 -0
- package/dist/flows/recovery.js.map +1 -0
- package/dist/flows/rerun.js +50 -0
- package/dist/flows/rerun.js.map +1 -0
- package/dist/flows/testDesign.js +294 -0
- package/dist/flows/testDesign.js.map +1 -0
- package/dist/flows/testDesignJob.js +46 -0
- package/dist/flows/testDesignJob.js.map +1 -0
- package/dist/flows/testRepo.js +228 -0
- package/dist/flows/testRepo.js.map +1 -0
- package/dist/flows/testSavings.js +381 -0
- package/dist/flows/testSavings.js.map +1 -0
- package/dist/flows/testStatus.js +343 -0
- package/dist/flows/testStatus.js.map +1 -0
- package/dist/flows/ticketContext.js +425 -0
- package/dist/flows/ticketContext.js.map +1 -0
- package/dist/flows/ticketReview.js +249 -0
- package/dist/flows/ticketReview.js.map +1 -0
- package/dist/flows/ticks.js +73 -0
- package/dist/flows/ticks.js.map +1 -0
- package/dist/hive/admin.js +122 -0
- package/dist/hive/admin.js.map +1 -0
- package/dist/hive/auth.js +130 -0
- package/dist/hive/auth.js.map +1 -0
- package/dist/hive/billing.js +278 -0
- package/dist/hive/billing.js.map +1 -0
- package/dist/hive/config.js +63 -0
- package/dist/hive/config.js.map +1 -0
- package/dist/hive/db.js +186 -0
- package/dist/hive/db.js.map +1 -0
- package/dist/hive/embed.js +76 -0
- package/dist/hive/embed.js.map +1 -0
- package/dist/hive/errors.js +17 -0
- package/dist/hive/errors.js.map +1 -0
- package/dist/hive/google.js +75 -0
- package/dist/hive/google.js.map +1 -0
- package/dist/hive/index.js +25 -0
- package/dist/hive/index.js.map +1 -0
- package/dist/hive/jwt.js +57 -0
- package/dist/hive/jwt.js.map +1 -0
- package/dist/hive/keys.js +61 -0
- package/dist/hive/keys.js.map +1 -0
- package/dist/hive/mail.js +27 -0
- package/dist/hive/mail.js.map +1 -0
- package/dist/hive/native-push.js +255 -0
- package/dist/hive/native-push.js.map +1 -0
- package/dist/hive/pairing.js +342 -0
- package/dist/hive/pairing.js.map +1 -0
- package/dist/hive/presence.js +121 -0
- package/dist/hive/presence.js.map +1 -0
- package/dist/hive/push.js +185 -0
- package/dist/hive/push.js.map +1 -0
- package/dist/hive/relay.js +205 -0
- package/dist/hive/relay.js.map +1 -0
- package/dist/hive/routes.js +228 -0
- package/dist/hive/routes.js.map +1 -0
- package/dist/hive/server.js +12 -0
- package/dist/hive/server.js.map +1 -0
- package/dist/hive/session.js +28 -0
- package/dist/hive/session.js.map +1 -0
- package/dist/hive/tenants.js +287 -0
- package/dist/hive/tenants.js.map +1 -0
- package/dist/hive/tunnel/cloudflare.js +160 -0
- package/dist/hive/tunnel/cloudflare.js.map +1 -0
- package/dist/hive/tunnel/mock.js +52 -0
- package/dist/hive/tunnel/mock.js.map +1 -0
- package/dist/hive/tunnel/provider.js +19 -0
- package/dist/hive/tunnel/provider.js.map +1 -0
- package/dist/hive/updates.js +61 -0
- package/dist/hive/updates.js.map +1 -0
- package/dist/http-error.js +11 -0
- package/dist/http-error.js.map +1 -0
- package/dist/impact/classify.js +226 -0
- package/dist/impact/classify.js.map +1 -0
- package/dist/impact/find.js +259 -0
- package/dist/impact/find.js.map +1 -0
- package/dist/impact/pr.js +54 -0
- package/dist/impact/pr.js.map +1 -0
- package/dist/impact/store.js +365 -0
- package/dist/impact/store.js.map +1 -0
- package/dist/impact/text.js +158 -0
- package/dist/impact/text.js.map +1 -0
- package/dist/index.js +288 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/adf.js +397 -0
- package/dist/integrations/adf.js.map +1 -0
- package/dist/integrations/bot-marker.js +103 -0
- package/dist/integrations/bot-marker.js.map +1 -0
- package/dist/integrations/github-issues.js +705 -0
- package/dist/integrations/github-issues.js.map +1 -0
- package/dist/integrations/github.js +1284 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/issue-create.js +60 -0
- package/dist/integrations/issue-create.js.map +1 -0
- package/dist/integrations/jira.js +279 -0
- package/dist/integrations/jira.js.map +1 -0
- package/dist/integrations/linear.js +273 -0
- package/dist/integrations/linear.js.map +1 -0
- package/dist/integrations/own-identity-warm.js +47 -0
- package/dist/integrations/own-identity-warm.js.map +1 -0
- package/dist/integrations/own-identity.js +39 -0
- package/dist/integrations/own-identity.js.map +1 -0
- package/dist/integrations/status-change.js +42 -0
- package/dist/integrations/status-change.js.map +1 -0
- package/dist/lead-defects.js +202 -0
- package/dist/lead-defects.js.map +1 -0
- package/dist/lead-digest.js +333 -0
- package/dist/lead-digest.js.map +1 -0
- package/dist/lead-release.js +286 -0
- package/dist/lead-release.js.map +1 -0
- package/dist/lead.js +328 -0
- package/dist/lead.js.map +1 -0
- package/dist/legacy-names.js +51 -0
- package/dist/legacy-names.js.map +1 -0
- package/dist/limits.js +44 -0
- package/dist/limits.js.map +1 -0
- package/dist/link-trust.js +224 -0
- package/dist/link-trust.js.map +1 -0
- package/dist/links.js +219 -0
- package/dist/links.js.map +1 -0
- package/dist/loopback.js +35 -0
- package/dist/loopback.js.map +1 -0
- package/dist/model-cap.js +60 -0
- package/dist/model-cap.js.map +1 -0
- package/dist/model-usage.js +173 -0
- package/dist/model-usage.js.map +1 -0
- package/dist/monitor/backfill.js +39 -0
- package/dist/monitor/backfill.js.map +1 -0
- package/dist/monitor/browser-probe.js +198 -0
- package/dist/monitor/browser-probe.js.map +1 -0
- package/dist/monitor/catch-up.js +31 -0
- package/dist/monitor/catch-up.js.map +1 -0
- package/dist/monitor/pollers.js +1606 -0
- package/dist/monitor/pollers.js.map +1 -0
- package/dist/monitor/probes.js +178 -0
- package/dist/monitor/probes.js.map +1 -0
- package/dist/monitor/self-health.js +228 -0
- package/dist/monitor/self-health.js.map +1 -0
- package/dist/monitor/statuspage.js +105 -0
- package/dist/monitor/statuspage.js.map +1 -0
- package/dist/nightly-scheduler.js +127 -0
- package/dist/nightly-scheduler.js.map +1 -0
- package/dist/nightly.js +141 -0
- package/dist/nightly.js.map +1 -0
- package/dist/notify/headline.js +114 -0
- package/dist/notify/headline.js.map +1 -0
- package/dist/notify/push.js +174 -0
- package/dist/notify/push.js.map +1 -0
- package/dist/object-cards.js +585 -0
- package/dist/object-cards.js.map +1 -0
- package/dist/object-links.js +47 -0
- package/dist/object-links.js.map +1 -0
- package/dist/onboarding-checks.js +141 -0
- package/dist/onboarding-checks.js.map +1 -0
- package/dist/onboarding.js +401 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/path-filters.js +62 -0
- package/dist/path-filters.js.map +1 -0
- package/dist/phone/alerts.js +67 -0
- package/dist/phone/alerts.js.map +1 -0
- package/dist/phone/auth.js +240 -0
- package/dist/phone/auth.js.map +1 -0
- package/dist/phone/pairing.js +442 -0
- package/dist/phone/pairing.js.map +1 -0
- package/dist/phone/prefs.js +27 -0
- package/dist/phone/prefs.js.map +1 -0
- package/dist/phone/tailscale.js +161 -0
- package/dist/phone/tailscale.js.map +1 -0
- package/dist/pr-scope.js +441 -0
- package/dist/pr-scope.js.map +1 -0
- package/dist/proc.js +156 -0
- package/dist/proc.js.map +1 -0
- package/dist/profile/cache.js +108 -0
- package/dist/profile/cache.js.map +1 -0
- package/dist/profile/ci.js +216 -0
- package/dist/profile/ci.js.map +1 -0
- package/dist/profile/index.js +8 -0
- package/dist/profile/index.js.map +1 -0
- package/dist/profile/job.js +135 -0
- package/dist/profile/job.js.map +1 -0
- package/dist/profile/queries/go-tags.scm +47 -0
- package/dist/profile/queries/java-tags.scm +25 -0
- package/dist/profile/queries/javascript-tags.scm +104 -0
- package/dist/profile/queries/python-tags.scm +19 -0
- package/dist/profile/queries/typescript-tags.scm +28 -0
- package/dist/profile/scan-thread.js +42 -0
- package/dist/profile/scan-thread.js.map +1 -0
- package/dist/profile/scan-worker.js +16 -0
- package/dist/profile/scan-worker.js.map +1 -0
- package/dist/profile/scan.js +351 -0
- package/dist/profile/scan.js.map +1 -0
- package/dist/profile/stack.js +528 -0
- package/dist/profile/stack.js.map +1 -0
- package/dist/profile/store.js +35 -0
- package/dist/profile/store.js.map +1 -0
- package/dist/profile/tests.js +399 -0
- package/dist/profile/tests.js.map +1 -0
- package/dist/queue.js +350 -0
- package/dist/queue.js.map +1 -0
- package/dist/refs.js +756 -0
- package/dist/refs.js.map +1 -0
- package/dist/release-notes.js +272 -0
- package/dist/release-notes.js.map +1 -0
- package/dist/reports/build.js +243 -0
- package/dist/reports/build.js.map +1 -0
- package/dist/reports/index.js +211 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/store.js +150 -0
- package/dist/reports/store.js.map +1 -0
- package/dist/reports/ticket-titles.js +124 -0
- package/dist/reports/ticket-titles.js.map +1 -0
- package/dist/reports/trace-map.js +1278 -0
- package/dist/reports/trace-map.js.map +1 -0
- package/dist/reports/traceability.js +422 -0
- package/dist/reports/traceability.js.map +1 -0
- package/dist/repos/mirror.js +356 -0
- package/dist/repos/mirror.js.map +1 -0
- package/dist/repos-github.js +108 -0
- package/dist/repos-github.js.map +1 -0
- package/dist/repos.js +891 -0
- package/dist/repos.js.map +1 -0
- package/dist/review/backend-anthropic.js +90 -0
- package/dist/review/backend-anthropic.js.map +1 -0
- package/dist/review/backend-cli.js +248 -0
- package/dist/review/backend-cli.js.map +1 -0
- package/dist/review/backend-codex.js +81 -0
- package/dist/review/backend-codex.js.map +1 -0
- package/dist/review/backend-mock.js +686 -0
- package/dist/review/backend-mock.js.map +1 -0
- package/dist/review/backend-only.js +168 -0
- package/dist/review/backend-only.js.map +1 -0
- package/dist/review/backend.js +105 -0
- package/dist/review/backend.js.map +1 -0
- package/dist/review/baseline/render-v1.js +483 -0
- package/dist/review/baseline/render-v1.js.map +1 -0
- package/dist/review/change-summary.js +197 -0
- package/dist/review/change-summary.js.map +1 -0
- package/dist/review/changelog.js +40 -0
- package/dist/review/changelog.js.map +1 -0
- package/dist/review/check.js +494 -0
- package/dist/review/check.js.map +1 -0
- package/dist/review/checkout.js +185 -0
- package/dist/review/checkout.js.map +1 -0
- package/dist/review/classify.js +178 -0
- package/dist/review/classify.js.map +1 -0
- package/dist/review/coverage.js +347 -0
- package/dist/review/coverage.js.map +1 -0
- package/dist/review/decision-eval.js +121 -0
- package/dist/review/decision-eval.js.map +1 -0
- package/dist/review/deliver.js +104 -0
- package/dist/review/deliver.js.map +1 -0
- package/dist/review/designer-eval.js +280 -0
- package/dist/review/designer-eval.js.map +1 -0
- package/dist/review/dogfood-digest.js +136 -0
- package/dist/review/dogfood-digest.js.map +1 -0
- package/dist/review/dogfood-eval.js +486 -0
- package/dist/review/dogfood-eval.js.map +1 -0
- package/dist/review/environment.js +109 -0
- package/dist/review/environment.js.map +1 -0
- package/dist/review/eval.js +405 -0
- package/dist/review/eval.js.map +1 -0
- package/dist/review/glob.js +110 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/golden-export.js +219 -0
- package/dist/review/golden-export.js.map +1 -0
- package/dist/review/impact.js +406 -0
- package/dist/review/impact.js.map +1 -0
- package/dist/review/imports.js +542 -0
- package/dist/review/imports.js.map +1 -0
- package/dist/review/index.js +512 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/intent.js +128 -0
- package/dist/review/intent.js.map +1 -0
- package/dist/review/lenses.js +167 -0
- package/dist/review/lenses.js.map +1 -0
- package/dist/review/linked-tickets.js +293 -0
- package/dist/review/linked-tickets.js.map +1 -0
- package/dist/review/merge.js +370 -0
- package/dist/review/merge.js.map +1 -0
- package/dist/review/on-demand.js +218 -0
- package/dist/review/on-demand.js.map +1 -0
- package/dist/review/prompt-eval.js +299 -0
- package/dist/review/prompt-eval.js.map +1 -0
- package/dist/review/prompt-variants.js +37 -0
- package/dist/review/prompt-variants.js.map +1 -0
- package/dist/review/readability-eval.js +217 -0
- package/dist/review/readability-eval.js.map +1 -0
- package/dist/review/readability.js +295 -0
- package/dist/review/readability.js.map +1 -0
- package/dist/review/render.js +2409 -0
- package/dist/review/render.js.map +1 -0
- package/dist/review/repo.js +194 -0
- package/dist/review/repo.js.map +1 -0
- package/dist/review/report-plan.js +90 -0
- package/dist/review/report-plan.js.map +1 -0
- package/dist/review/routes.js +195 -0
- package/dist/review/routes.js.map +1 -0
- package/dist/review/run-summary.js +34 -0
- package/dist/review/run-summary.js.map +1 -0
- package/dist/review/run.js +245 -0
- package/dist/review/run.js.map +1 -0
- package/dist/review/scope.js +454 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/security.js +432 -0
- package/dist/review/security.js.map +1 -0
- package/dist/review/signals.js +550 -0
- package/dist/review/signals.js.map +1 -0
- package/dist/review/specs.js +150 -0
- package/dist/review/specs.js.map +1 -0
- package/dist/review/ste.js +133 -0
- package/dist/review/ste.js.map +1 -0
- package/dist/review/test-repo-file.js +18 -0
- package/dist/review/test-repo-file.js.map +1 -0
- package/dist/review/test-repo-lines.js +53 -0
- package/dist/review/test-repo-lines.js.map +1 -0
- package/dist/review/ticket-on-demand.js +232 -0
- package/dist/review/ticket-on-demand.js.map +1 -0
- package/dist/review/yaml.js +298 -0
- package/dist/review/yaml.js.map +1 -0
- package/dist/room.js +361 -0
- package/dist/room.js.map +1 -0
- package/dist/routes/activity.js +219 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/call.js +29 -0
- package/dist/routes/call.js.map +1 -0
- package/dist/routes/cards.js +40 -0
- package/dist/routes/cards.js.map +1 -0
- package/dist/routes/cases.js +133 -0
- package/dist/routes/cases.js.map +1 -0
- package/dist/routes/connect.js +268 -0
- package/dist/routes/connect.js.map +1 -0
- package/dist/routes/connection-presets.js +32 -0
- package/dist/routes/connection-presets.js.map +1 -0
- package/dist/routes/connections.js +177 -0
- package/dist/routes/connections.js.map +1 -0
- package/dist/routes/disk.js +19 -0
- package/dist/routes/disk.js.map +1 -0
- package/dist/routes/docs.js +71 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/dot-suggest.js +1002 -0
- package/dist/routes/dot-suggest.js.map +1 -0
- package/dist/routes/evidence-pack.js +16 -0
- package/dist/routes/evidence-pack.js.map +1 -0
- package/dist/routes/health.js +121 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/impact.js +48 -0
- package/dist/routes/impact.js.map +1 -0
- package/dist/routes/lead.js +50 -0
- package/dist/routes/lead.js.map +1 -0
- package/dist/routes/links.js +13 -0
- package/dist/routes/links.js.map +1 -0
- package/dist/routes/markdown.js +62 -0
- package/dist/routes/markdown.js.map +1 -0
- package/dist/routes/onboarding.js +47 -0
- package/dist/routes/onboarding.js.map +1 -0
- package/dist/routes/phone.js +231 -0
- package/dist/routes/phone.js.map +1 -0
- package/dist/routes/release-notes.js +30 -0
- package/dist/routes/release-notes.js.map +1 -0
- package/dist/routes/reports.js +102 -0
- package/dist/routes/reports.js.map +1 -0
- package/dist/routes/repos.js +91 -0
- package/dist/routes/repos.js.map +1 -0
- package/dist/routes/review.js +283 -0
- package/dist/routes/review.js.map +1 -0
- package/dist/routes/roles.js +114 -0
- package/dist/routes/roles.js.map +1 -0
- package/dist/routes/room.js +21 -0
- package/dist/routes/room.js.map +1 -0
- package/dist/routes/runner.js +156 -0
- package/dist/routes/runner.js.map +1 -0
- package/dist/routes/runs.js +84 -0
- package/dist/routes/runs.js.map +1 -0
- package/dist/routes/setup.js +18 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/test-runs.js +220 -0
- package/dist/routes/test-runs.js.map +1 -0
- package/dist/routes/ticket-status.js +17 -0
- package/dist/routes/ticket-status.js.map +1 -0
- package/dist/routes/traceability.js +143 -0
- package/dist/routes/traceability.js.map +1 -0
- package/dist/routes/true.js +142 -0
- package/dist/routes/true.js.map +1 -0
- package/dist/routes/updates.js +70 -0
- package/dist/routes/updates.js.map +1 -0
- package/dist/runner/adapters/index.js +12 -0
- package/dist/runner/adapters/index.js.map +1 -0
- package/dist/runner/adapters/playwright.js +68 -0
- package/dist/runner/adapters/playwright.js.map +1 -0
- package/dist/runner/aivision/cases.js +172 -0
- package/dist/runner/aivision/cases.js.map +1 -0
- package/dist/runner/aivision/cli.js +201 -0
- package/dist/runner/aivision/cli.js.map +1 -0
- package/dist/runner/aivision/index.js +281 -0
- package/dist/runner/aivision/index.js.map +1 -0
- package/dist/runner/aivision/server.js +394 -0
- package/dist/runner/aivision/server.js.map +1 -0
- package/dist/runner/aivision/shared.js +140 -0
- package/dist/runner/aivision/shared.js.map +1 -0
- package/dist/runner/artifact-cap.js +189 -0
- package/dist/runner/artifact-cap.js.map +1 -0
- package/dist/runner/artifacts.js +433 -0
- package/dist/runner/artifacts.js.map +1 -0
- package/dist/runner/command.js +564 -0
- package/dist/runner/command.js.map +1 -0
- package/dist/runner/copyfiles.js +221 -0
- package/dist/runner/copyfiles.js.map +1 -0
- package/dist/runner/engines.js +32 -0
- package/dist/runner/engines.js.map +1 -0
- package/dist/runner/evidence.js +114 -0
- package/dist/runner/evidence.js.map +1 -0
- package/dist/runner/host-env.js +160 -0
- package/dist/runner/host-env.js.map +1 -0
- package/dist/runner/index.js +1221 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/observe.js +603 -0
- package/dist/runner/observe.js.map +1 -0
- package/dist/runner/playwright-json.js +108 -0
- package/dist/runner/playwright-json.js.map +1 -0
- package/dist/runner/pwgen/exec.js +192 -0
- package/dist/runner/pwgen/exec.js.map +1 -0
- package/dist/runner/pwgen/explore.js +111 -0
- package/dist/runner/pwgen/explore.js.map +1 -0
- package/dist/runner/pwgen/index.js +423 -0
- package/dist/runner/pwgen/index.js.map +1 -0
- package/dist/runner/pwgen/propose.js +69 -0
- package/dist/runner/pwgen/propose.js.map +1 -0
- package/dist/runner/pwgen/source.js +632 -0
- package/dist/runner/pwgen/source.js.map +1 -0
- package/dist/runner/setup.js +222 -0
- package/dist/runner/setup.js.map +1 -0
- package/dist/runner/step-reporter.js +107 -0
- package/dist/runner/step-reporter.js.map +1 -0
- package/dist/runner/test-repo.js +326 -0
- package/dist/runner/test-repo.js.map +1 -0
- package/dist/runner/typed-value.js +46 -0
- package/dist/runner/typed-value.js.map +1 -0
- package/dist/runner/verify.js +133 -0
- package/dist/runner/verify.js.map +1 -0
- package/dist/runner/worktree.js +349 -0
- package/dist/runner/worktree.js.map +1 -0
- package/dist/sandbox.js +61 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/server.js +262 -0
- package/dist/server.js.map +1 -0
- package/dist/shadow-week.js +126 -0
- package/dist/shadow-week.js.map +1 -0
- package/dist/shutdown.js +92 -0
- package/dist/shutdown.js.map +1 -0
- package/dist/slack/index.js +645 -0
- package/dist/slack/index.js.map +1 -0
- package/dist/stages/config.js +147 -0
- package/dist/stages/config.js.map +1 -0
- package/dist/stages/index.js +41 -0
- package/dist/stages/index.js.map +1 -0
- package/dist/suites.js +293 -0
- package/dist/suites.js.map +1 -0
- package/dist/target-url.js +116 -0
- package/dist/target-url.js.map +1 -0
- package/dist/test-runs.js +662 -0
- package/dist/test-runs.js.map +1 -0
- package/dist/ticket-keys.js +97 -0
- package/dist/ticket-keys.js.map +1 -0
- package/dist/ticket-supersede.js +105 -0
- package/dist/ticket-supersede.js.map +1 -0
- package/dist/tinybee/ed25519.js +99 -0
- package/dist/tinybee/ed25519.js.map +1 -0
- package/dist/tinybee/models-routes.js +19 -0
- package/dist/tinybee/models-routes.js.map +1 -0
- package/dist/tinybee/pair-payload.js +41 -0
- package/dist/tinybee/pair-payload.js.map +1 -0
- package/dist/tinybee/update-manifest.js +77 -0
- package/dist/tinybee/update-manifest.js.map +1 -0
- package/dist/tinybee/well-known.js +64 -0
- package/dist/tinybee/well-known.js.map +1 -0
- package/dist/tinybee/workflows/activity.js +23 -0
- package/dist/tinybee/workflows/activity.js.map +1 -0
- package/dist/tinybee/workflows/cron.js +210 -0
- package/dist/tinybee/workflows/cron.js.map +1 -0
- package/dist/tinybee/workflows/engine.js +371 -0
- package/dist/tinybee/workflows/engine.js.map +1 -0
- package/dist/tinybee/workflows/from-text.js +203 -0
- package/dist/tinybee/workflows/from-text.js.map +1 -0
- package/dist/tinybee/workflows/routes.js +189 -0
- package/dist/tinybee/workflows/routes.js.map +1 -0
- package/dist/tinybee/workflows/scheduler.js +100 -0
- package/dist/tinybee/workflows/scheduler.js.map +1 -0
- package/dist/tinybee/workflows/skills.js +227 -0
- package/dist/tinybee/workflows/skills.js.map +1 -0
- package/dist/tinybee/workflows/store.js +205 -0
- package/dist/tinybee/workflows/store.js.map +1 -0
- package/dist/tinybee/workflows/types.js +180 -0
- package/dist/tinybee/workflows/types.js.map +1 -0
- package/dist/tinybee/workflows/yaml.js +323 -0
- package/dist/tinybee/workflows/yaml.js.map +1 -0
- package/dist/true/api.js +495 -0
- package/dist/true/api.js.map +1 -0
- package/dist/true/client.js +292 -0
- package/dist/true/client.js.map +1 -0
- package/dist/true/clock.js +36 -0
- package/dist/true/clock.js.map +1 -0
- package/dist/true/events.js +125 -0
- package/dist/true/events.js.map +1 -0
- package/dist/true/hosts.js +98 -0
- package/dist/true/hosts.js.map +1 -0
- package/dist/true/index.js +29 -0
- package/dist/true/index.js.map +1 -0
- package/dist/true/key.js +54 -0
- package/dist/true/key.js.map +1 -0
- package/dist/true/line.js +69 -0
- package/dist/true/line.js.map +1 -0
- package/dist/true/mask.js +31 -0
- package/dist/true/mask.js.map +1 -0
- package/dist/true/names.js +114 -0
- package/dist/true/names.js.map +1 -0
- package/dist/true/outbox.js +233 -0
- package/dist/true/outbox.js.map +1 -0
- package/dist/true/replay.js +164 -0
- package/dist/true/replay.js.map +1 -0
- package/dist/true/settings.js +123 -0
- package/dist/true/settings.js.map +1 -0
- package/dist/true/status.js +189 -0
- package/dist/true/status.js.map +1 -0
- package/dist/true/sync-cases.js +222 -0
- package/dist/true/sync-cases.js.map +1 -0
- package/dist/true/sync-manual.js +295 -0
- package/dist/true/sync-manual.js.map +1 -0
- package/dist/true/sync-runs.js +109 -0
- package/dist/true/sync-runs.js.map +1 -0
- package/dist/true/worker.js +414 -0
- package/dist/true/worker.js.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/updates/asks.js +38 -0
- package/dist/updates/asks.js.map +1 -0
- package/dist/updates/index.js +835 -0
- package/dist/updates/index.js.map +1 -0
- package/dist/updates/owner.js +24 -0
- package/dist/updates/owner.js.map +1 -0
- package/dist/updates/prefs.js +118 -0
- package/dist/updates/prefs.js.map +1 -0
- package/dist/updates/route.js +78 -0
- package/dist/updates/route.js.map +1 -0
- package/dist/updates/sources.js +345 -0
- package/dist/updates/sources.js.map +1 -0
- package/dist/updates/words.js +452 -0
- package/dist/updates/words.js.map +1 -0
- package/dist/version.js +53 -0
- package/dist/version.js.map +1 -0
- package/dist/view-compute.js +382 -0
- package/dist/view-compute.js.map +1 -0
- package/dist/view-spec.js +894 -0
- package/dist/view-spec.js.map +1 -0
- package/dist/web/apple-touch-icon.png +0 -0
- package/dist/web/assets/ApprovalCard-Br_z5z7G.css +1 -0
- package/dist/web/assets/ApprovalCard-CfGhGFo_.js +3 -0
- package/dist/web/assets/CardFromRef-BaTGmZ9c.js +2 -0
- package/dist/web/assets/CardFromRef-DO7i2uDd.css +1 -0
- package/dist/web/assets/Cases-8l_6UcLh.js +2 -0
- package/dist/web/assets/Cases-CpfED0uB.css +1 -0
- package/dist/web/assets/Chat-BKDiR0qt.js +3 -0
- package/dist/web/assets/Chat-DxjdyYUu.css +1 -0
- package/dist/web/assets/ConfirmDialog-CIMveD-b.js +2 -0
- package/dist/web/assets/ConnectSheet-Cm5vbZdR.js +4 -0
- package/dist/web/assets/Docs-HKGuY0WE.js +2 -0
- package/dist/web/assets/Docs-fodKx8S7.css +1 -0
- package/dist/web/assets/DotDetail-DskS3NWe.js +2 -0
- package/dist/web/assets/DotDetail-OWRSD_1x.css +1 -0
- package/dist/web/assets/DotStage-BZDclfzV.css +1 -0
- package/dist/web/assets/DotStage-CtMNzCN3.js +2 -0
- package/dist/web/assets/Dots-BqCsS34m.js +2 -0
- package/dist/web/assets/EvidencePack-DQ3kCJX4.js +2 -0
- package/dist/web/assets/EvidencePack-DV_9ETsA.css +1 -0
- package/dist/web/assets/FailedDeliveries-1F2kFcs9.js +2 -0
- package/dist/web/assets/FailedDeliveries-DXa2_VvI.css +1 -0
- package/dist/web/assets/Feed-5wiHRTFK.js +2 -0
- package/dist/web/assets/GfmView-C-NYaduC.js +4 -0
- package/dist/web/assets/ImpactList-C-RNuDB0.js +2 -0
- package/dist/web/assets/ImpactList-C612dFdw.css +1 -0
- package/dist/web/assets/Inbox-kc1bKVL_.js +2 -0
- package/dist/web/assets/JoinScreen-C3L4wmP3.js +2 -0
- package/dist/web/assets/JoinScreen-COeAUv5v.css +1 -0
- package/dist/web/assets/LeadDialog-N3Zul9Rw.js +8 -0
- package/dist/web/assets/LeadDialog-xyWjAuAS.css +1 -0
- package/dist/web/assets/ListeningLine-BRFNaczY.js +2 -0
- package/dist/web/assets/ListeningLine-pN8CgyiK.css +1 -0
- package/dist/web/assets/Mascots-pIyGpxtD.js +2 -0
- package/dist/web/assets/ModelChoices-BxO1zyyr.js +2 -0
- package/dist/web/assets/ModelChoices-DQJnVxfs.css +1 -0
- package/dist/web/assets/NewDotDialog-CDPUWmgN.js +2 -0
- package/dist/web/assets/NewDotDialog-DrPPqkSZ.css +1 -0
- package/dist/web/assets/NewTestRunDialog-BQBthVHE.js +2 -0
- package/dist/web/assets/NoBreakNames-Csxdqdt6.js +2 -0
- package/dist/web/assets/Pair-omex_K7H.js +2 -0
- package/dist/web/assets/PushSection-CmqHlE_2.js +2 -0
- package/dist/web/assets/ReleaseNotes-B6VqFewP.js +2 -0
- package/dist/web/assets/ReleaseNotes-DBJUL7Vm.css +1 -0
- package/dist/web/assets/ReportPage-BHS1xWEt.js +162 -0
- package/dist/web/assets/Reports-BEHnDIb1.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BVSt-cw-.js +2 -0
- package/dist/web/assets/ReviewChangeDialog-BbIlHRx0.css +1 -0
- package/dist/web/assets/Room-BoG_uge4.js +2 -0
- package/dist/web/assets/Room-evAfiW_e.css +1 -0
- package/dist/web/assets/RunActions-ZY7yf1AF.js +2 -0
- package/dist/web/assets/RunDetail-C8St20GQ.css +1 -0
- package/dist/web/assets/RunDetail-qADXjBvd.js +9 -0
- package/dist/web/assets/RunRow-BKEJv8ib.js +2 -0
- package/dist/web/assets/RunnerTry-Dgpp67-s.js +6 -0
- package/dist/web/assets/RunnerTry-DsweWOfO.css +1 -0
- package/dist/web/assets/Settings-fs-QJwNM.js +2 -0
- package/dist/web/assets/Setup-DI6hBEP-.js +2 -0
- package/dist/web/assets/TestRows-wh03T5Li.js +4 -0
- package/dist/web/assets/TestRun-DTOyF-Pv.js +2 -0
- package/dist/web/assets/TestRuns-ggDjm1Q8.js +2 -0
- package/dist/web/assets/TinyBeeAddLaptop-bc3pmh3T.js +2 -0
- package/dist/web/assets/TinyBeeAi-CkyOzhm5.js +2 -0
- package/dist/web/assets/TinyBeeConnections-B2K_P38u.js +2 -0
- package/dist/web/assets/TinyBeeHome-DSpxX5KS.js +3 -0
- package/dist/web/assets/TinyBeePlan-BamiLziu.js +2 -0
- package/dist/web/assets/TinyBeeSignup-vHcz0Wen.js +2 -0
- package/dist/web/assets/TinyBeeSkills-By9RLUse.js +2 -0
- package/dist/web/assets/TinyBeeWorkflow-DeNO7Jsh.js +2 -0
- package/dist/web/assets/TinyBeeWorkflowEditor-B6OGC2OT.js +2 -0
- package/dist/web/assets/TinyBeeWorkflows-BN4-h6lt.js +2 -0
- package/dist/web/assets/Trace-BBCI1aIB.css +1 -0
- package/dist/web/assets/Trace-aF92UWaH.js +2 -0
- package/dist/web/assets/UpdatesSection-CCWEbkue.js +2 -0
- package/dist/web/assets/Welcome-CCcy558Q.js +2 -0
- package/dist/web/assets/activity-C3qilrDm.css +1 -0
- package/dist/web/assets/activity-CBfTSxqw.js +2 -0
- package/dist/web/assets/authedMedia-BTYt_tyu.js +2 -0
- package/dist/web/assets/beeApi-BHW8Tx1s.js +2 -0
- package/dist/web/assets/data-CmXvx3Mj.js +2 -0
- package/dist/web/assets/engines-CfdJODFj.css +1 -0
- package/dist/web/assets/format-BBZ8vFyT.js +2 -0
- package/dist/web/assets/forms-Coc7p2UF.css +1 -0
- package/dist/web/assets/hivePush-DZJDokj7.js +2 -0
- package/dist/web/assets/impactModel-MY1OFuiP.js +2 -0
- package/dist/web/assets/index-B6qKm1NW.js +13 -0
- package/dist/web/assets/index-BvKyT1X7.css +1 -0
- package/dist/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/dist/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/dist/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/web/assets/lead-BL_P_kri.css +1 -0
- package/dist/web/assets/model-BIQy5IVG.js +2 -0
- package/dist/web/assets/modelsApi-PUSySRQw.js +2 -0
- package/dist/web/assets/newDotModel-BaLLyw57.js +2 -0
- package/dist/web/assets/onboarding-bfKqnM4Z.css +1 -0
- package/dist/web/assets/phone-Rs7FoyG0.css +1 -0
- package/dist/web/assets/phoneApi-BG_1-M-D.js +3 -0
- package/dist/web/assets/releaseModel-EynYMVOC.js +2 -0
- package/dist/web/assets/releaseNotesModel-A1Rtv3cV.js +2 -0
- package/dist/web/assets/reports-BWaA1HhM.js +37 -0
- package/dist/web/assets/reports-DXwdWQsB.css +1 -0
- package/dist/web/assets/router-W6nZsQ33.js +2 -0
- package/dist/web/assets/runs-BY0Owv93.css +1 -0
- package/dist/web/assets/shadowWeekModel-BUUiww09.js +2 -0
- package/dist/web/assets/storage-yvL36AWt.js +2 -0
- package/dist/web/assets/store-IqrqHuFR.js +2 -0
- package/dist/web/assets/testruns-BzIZ0cR0.css +1 -0
- package/dist/web/assets/testruns-DyaqX4ji.js +2 -0
- package/dist/web/assets/true-9Q68cs5b.js +2 -0
- package/dist/web/assets/true-DPGBpoir.css +1 -0
- package/dist/web/assets/ui-DcmhYyYp.js +13 -0
- package/dist/web/assets/ui-DxEDgbIx.css +1 -0
- package/dist/web/assets/usePauseDot-BV60ZVy1.js +2 -0
- package/dist/web/assets/usePauseDot-NrSzMI1C.css +1 -0
- package/dist/web/assets/usePush-Dsm-TjlG.js +2 -0
- package/dist/web/assets/useRefChips-CbafNx59.js +68 -0
- package/dist/web/assets/useRestoreDot-D0B6W82H.js +2 -0
- package/dist/web/assets/view-worker-pyeVAhUT.js +2 -0
- package/dist/web/assets/workflowUi-QYsd3n9J.js +2 -0
- package/dist/web/favicon.png +0 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/icon-maskable-512.png +0 -0
- package/dist/web/index.html +45 -0
- package/dist/web/manifest.webmanifest +23 -0
- package/dist/web/mascots/argus-attention.svg +7 -0
- package/dist/web/mascots/argus-ok.svg +7 -0
- package/dist/web/mascots/argus-outage.svg +7 -0
- package/dist/web/mascots/argus-running.svg +7 -0
- package/dist/web/mascots/bolt-attention.svg +7 -0
- package/dist/web/mascots/bolt-ok.svg +7 -0
- package/dist/web/mascots/bolt-outage.svg +7 -0
- package/dist/web/mascots/bolt-running.svg +7 -0
- package/dist/web/mascots/echo-attention.svg +7 -0
- package/dist/web/mascots/echo-ok.svg +7 -0
- package/dist/web/mascots/echo-outage.svg +7 -0
- package/dist/web/mascots/echo-running.svg +7 -0
- package/dist/web/mascots/lens-attention.svg +7 -0
- package/dist/web/mascots/lens-ok.svg +7 -0
- package/dist/web/mascots/lens-outage.svg +7 -0
- package/dist/web/mascots/lens-running.svg +7 -0
- package/dist/web/mascots/moss-attention.svg +7 -0
- package/dist/web/mascots/moss-ok.svg +7 -0
- package/dist/web/mascots/moss-outage.svg +7 -0
- package/dist/web/mascots/moss-running.svg +7 -0
- package/dist/web/mascots/nit-attention.svg +7 -0
- package/dist/web/mascots/nit-ok.svg +7 -0
- package/dist/web/mascots/nit-outage.svg +7 -0
- package/dist/web/mascots/nit-running.svg +7 -0
- package/dist/web/mascots/nova-attention.svg +7 -0
- package/dist/web/mascots/nova-ok.svg +7 -0
- package/dist/web/mascots/nova-outage.svg +7 -0
- package/dist/web/mascots/nova-running.svg +7 -0
- package/dist/web/mascots/penn-attention.svg +7 -0
- package/dist/web/mascots/penn-ok.svg +7 -0
- package/dist/web/mascots/penn-outage.svg +7 -0
- package/dist/web/mascots/penn-running.svg +7 -0
- package/dist/web/mascots/pip-attention.svg +7 -0
- package/dist/web/mascots/pip-ok.svg +7 -0
- package/dist/web/mascots/pip-outage.svg +7 -0
- package/dist/web/mascots/pip-running.svg +7 -0
- package/dist/web/mascots/ward-attention.svg +7 -0
- package/dist/web/mascots/ward-ok.svg +7 -0
- package/dist/web/mascots/ward-outage.svg +7 -0
- package/dist/web/mascots/ward-running.svg +7 -0
- package/dist/web/sw.js +98 -0
- package/dist/webhook-seen.js +53 -0
- package/dist/webhook-seen.js.map +1 -0
- package/dist/webhooks.js +625 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/zip.js +63 -0
- package/dist/zip.js.map +1 -0
- package/docs/API-V2.md +532 -0
- package/docs/CHAT-EVAL.md +130 -0
- package/docs/CHAT-UI.md +416 -0
- package/docs/CONNECTIONS.md +89 -0
- package/docs/DATA-MODEL.md +518 -0
- package/docs/DEPLOY.md +577 -0
- package/docs/DOGFOOD-LEDGER.md +81 -0
- package/docs/GITHUB.md +148 -0
- package/docs/INTEGRATION-MODEL.md +200 -0
- package/docs/LEAD-DOT.md +553 -0
- package/docs/LIST-PATTERNS.md +52 -0
- package/docs/MULTI-REPO.md +766 -0
- package/docs/PARITY.md +276 -0
- package/docs/PR-REVIEW-QA.md +1266 -0
- package/docs/PR-REVIEW.md +357 -0
- package/docs/SANDBOX.md +320 -0
- package/docs/SETUP.md +776 -0
- package/docs/SLACK.md +80 -0
- package/docs/STAGES.md +619 -0
- package/docs/TRACE-MAP.md +89 -0
- package/docs/TRACKERS.md +225 -0
- package/docs/VOICE.md +36 -0
- package/docs/tinybee/00-README.md +45 -0
- package/docs/tinybee/01-PRD.md +216 -0
- package/docs/tinybee/02-architecture-pairing.md +199 -0
- package/docs/tinybee/03-local-agent.md +222 -0
- package/docs/tinybee/04-local-setup-ui.md +128 -0
- package/docs/tinybee/05-mobile-app-ux.md +199 -0
- package/docs/tinybee/06-environments-and-delivery.md +148 -0
- package/docs/tinybee/07-coding-agent-handoff.md +116 -0
- package/docs/tinybee/OPEN-QUESTIONS.md +26 -0
- package/docs/tinybee/PROGRESS.md +134 -0
- package/package.json +111 -4
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Dogfood ledger: false positives and false negatives
|
|
2
|
+
|
|
3
|
+
The dot on :4500 reviews localdost itself. Each time it says something wrong (a false positive) or misses something real (a false negative), the case goes here with its cause and its fix, and becomes a golden eval case so it cannot come back. Counts are from the live dot's Inbox, 2026-10-07 to 2026-10-10: 361 drafts went out after approval and 262 were rejected (plus 187 expired and 102 superseded).
|
|
4
|
+
|
|
5
|
+
## False positives in the dot's reports
|
|
6
|
+
|
|
7
|
+
| Case | Seen | Cause | Fix |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| "1 bug found" when the facts show only a confirmed risk that no test reproduced | 28 rejected reports and checks | the headline counts confirmed risks as bugs | a bug is a reproduced failure (a failed test or a confirmed step failure); unreproduced risks are "N risks to test" in the headline, the check title and the PR comment, from one source |
|
|
10
|
+
| "N checks not tested yet" that does not match the list below it | 4 or more | the headline and the list are counted in different places | every number in a report comes from one structured summary; a consistency check refuses to draft when they differ |
|
|
11
|
+
| "85 of 138 tests passed" when 53 were skipped and none failed | every report | the line hides skipped tests | "85 passed, 53 skipped, 0 failed" |
|
|
12
|
+
| "138 automated tests ran: 85 passed, 53 skipped" (PR 127, 0.13.0 batch, [KAT-402](https://linear.app/katalon-pm/issue/KAT-402)) | The dot, on PR 127, and its own safety check held the draft over it | the count of "ran" added the skipped tests, which did not run | "85 automated tests ran and passed. 53 were skipped (they do not apply to this project)."; the consistency check reads the ran and skipped counts back from the summary and the facts for the safety reviewer say a skipped test did not run |
|
|
13
|
+
| A defect for behavior the PR says it changes on purpose (webhooks refused without a secret, fail-closed commit checks, paid fallback off by default, fork PRs not run) | 6 or more | the dot does not read the decisions in the PR body or the linked ticket | statements of intent in the PR body, the linked ticket and the repo docs ("decided", "by design", "behavior change", "intended") turn a matching risk into a "Behavior change to confirm" note, not a defect |
|
|
14
|
+
| A defect whose Expected is "the team decides" or "confirm this is wanted" | 4 | a design question was written as a bug | no Expected, no defect: it becomes a question on the ticket |
|
|
15
|
+
| The same defect filed again from a later PR or commit | 10 or more | dedupe only covers one run | match open defects by signature and by Linear search across runs; add evidence to the existing issue instead |
|
|
16
|
+
| Defects for an older head of a PR | several | drafts outlive the head they were made for | a draft for a head that is no longer the PR head is superseded, defects included |
|
|
17
|
+
| A ticket review draft in the Inbox with a summary line that did not match its lists, and two drafts for one ticket from different review runs ([KAT-371](https://linear.app/katalon-pm/issue/KAT-371)) | The dot, in the Inbox | the line took the model's counts while the comment capped and repeated lines; ticket comments never replaced an older pending draft | the line counts the rendered lists after the cap and after repeats are dropped; a newer review of the same ticket supersedes the older pending draft and the note names the newer run (tests in `ticket-comment`, `approvals-supersede`, `github-issues`) |
|
|
18
|
+
| A ticket that is Done, Canceled, or closed listed under "Tickets without acceptance criteria" in the daily digest (KAT-288 and others) | the owner's Daily digest report page | the model wrote the section from the ticket reviews of the last 24 hours and never asked the tracker whether the ticket is still open | the dot builds the section itself from the run records: a review that read the ticket without criteria, and the tracker (GitHub, Jira, Linear) says it is open now; a closed ticket, or one the tracker will not read, is left out; a model-written copy of the section is removed; eval case `digest-closed-tickets` |
|
|
19
|
+
| A merged PR listed under "Merged with bugs reported" in the daily digest when only a confirmed risk exists and no test failed (#79) | the owner's Daily digest report page | the model read a risk the verifier confirmed from the code as a bug | a bug is a failed test: the section lists a merge only with a reproduced failure, counted with the same summary line as the PR report; a risk-only run is "risk to test" in the digest lines, never "bug"; a model-written copy of the section is removed; eval case `digest-risk-only-prs` |
|
|
20
|
+
| Environment failures filed as product defects (disk full, ENOSPC, runner cancelled, a test timing out under load, the dot's own new test failing on its first run) | 8 | failures are classified only by the test result | environment signatures (ENOSPC, disk-full notices, cancelled jobs, load timeouts) classify as environment and never become a product defect |
|
|
21
|
+
| A defect for a rule the PR sets out on purpose: the map's evidence-only requirement rule, a requirement listed under each app with a new id, a finding that matches a stated decision | 4 drafts on 2026-10-10 (two were duplicates of each other) | the defect reviewer reads the code but not the PR's docs (docs/TRACE-MAP.md) or the commit that states the rule | intent-aware defects in [Report accuracy](https://github.com/duonghaijoe/localdost/pull/94); the same draft text on two heads is one defect |
|
|
22
|
+
| A defect whose own Expected is what the code does: selected cases show their full count across folders; a check run left open when counts disagree, though the run's cleanup closes it | 2 drafts on 2026-10-10 | the reviewer stops at the first line it cites and does not follow the call to the end of the run | defects found by reading the code must cite the line that shows the failure, see KAT-304's sibling lane on code-reading defects |
|
|
23
|
+
| A rejected defect came back on every new push to the same PR, because a finding read from the code is worded again on each run ([KAT-312](https://linear.app/katalon-pm/issue/KAT-312)) | The dot, on its own PRs | the draft step also matches a rejected finding of the same PR (any head, so also its merge) by the cited file, an overlapping line range and the review source, and the rejection holds until the cited lines change (golden case `rejected-finding-reworded-on-new-push`) |
|
|
24
|
+
| "No tests ran" in the Details of a report that lists "Ran 138 selected tests: 85 passed, 53 skipped, 0 failed" under What I tested (PR 104, [KAT-330](https://linear.app/katalon-pm/issue/KAT-330)) | The dot, on PR 104 | the review text is written before the test run and pasted unchanged into Details | test facts come from one source, the run's results: once the run has results, review-stage sentences that say the tests did not run are dropped, and the consistency check refuses to draft a report that says no tests ran while it lists results; a run that did not run keeps its wording; case `review-text-says-no-tests-ran` |
|
|
25
|
+
| "No tests ran in Safari." dropped from Details, and the pre-draft check refused a consistent report ([KAT-332](https://linear.app/katalon-pm/issue/KAT-332)) | The dot, on its own PR 106 | the "no tests ran" pattern also matched a sentence scoped to a place or condition | a sentence scoped with in, on, for, against, under, with or across is a coverage note and stays; only an unscoped claim is dropped or refused |
|
|
26
|
+
|
|
27
|
+
## False positives in the safety reviewer
|
|
28
|
+
|
|
29
|
+
| Case | Seen | Cause | Fix |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| "linear:KAT is outside the owner's permitted localdost Linear project" on every defect | 24 escalations | the model reads the Linear team key KAT as a different place from the localdost project | allowed destinations are a structured list (repo duonghaijoe/localdost; Linear team KAT, project localdost) checked by code; the model reviewer judges only the content |
|
|
32
|
+
| "Reviewer returned no decision" | 40 escalations | the review model was unavailable (spend cap), and unavailable means escalate | when the model is unavailable, the deterministic checks and the rule decide, and the draft says the review model was unavailable |
|
|
33
|
+
| "The draft is unusually long for an automatic post" on full QA reports | 10 | a fixed length limit | the QA report summary comment is long by design; the limit applies to other kinds |
|
|
34
|
+
| A model finding about content cleared as a destination note ("Contains a token from a different workspace") | found by the dot on [Safety review fixes](https://github.com/duonghaijoe/localdost/pull/95), KAT-305 | the destination filter matched "different workspace" and dropped the whole finding | a reason that names a content risk (token, secret, credential, personal data, blame) still escalates |
|
|
35
|
+
| A reason with a finding and a place or a length was cleared whole ("Contains a token and the body length looks odd", "The draft names a different customer team in the wrong project") | found by the dot on [Safety review fixes](https://github.com/duonghaijoe/localdost/pull/95), KAT-305 follow-up | the filters matched one phrase anywhere in the reason and dropped all of it; the length filter had no content guard | the reason is split into clauses (sentences, commas, "and"); it is cleared only when every clause is about the destination or the length, and a clause that names a content risk (now also "customer") keeps the escalation, for both filters |
|
|
36
|
+
| A correct QA report escalated over counts ("the draft says eight checks were not tested, but the records list six"; the report listed six checks plus "And 2 more checks in the run") | found on a live report, [KAT-329](https://linear.app/katalon-pm/issue/KAT-329) | the model compared the counts it read in the draft, which code already checks before drafting (one-summary consistency check) | a reason wholly about destination, length or counts (bugs, checks, tests, risks, questions: "says N but lists M") clears on the QA report summary and check run, with a note that code checked the counts; a reason about results ("says no bugs but a test failed") or with a content risk keeps the escalation; case `safety-count-reasons` |
|
|
37
|
+
|
|
38
|
+
## False negatives: real problems the dot missed
|
|
39
|
+
|
|
40
|
+
| Case | Found by | What the dot should have done |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| A forged webhook could make the runner check out and run fork code (worktree commit not verified) | Opus security review of #75 | a security pass on any diff that clones, checks out, runs code, or trusts event fields: "can an attacker choose what runs?" |
|
|
43
|
+
| A deleted dot's run could still post a PR comment or create an approval (run row gone, gate not stopped) | Opus review of #66 | the same pass: "what happens to in-flight work when the object is deleted?" |
|
|
44
|
+
| copyFiles could write outside the worktree through a symlinked folder; a named pipe could block the server | Opus reviews of #84 | the same pass: symlinks, TOCTOU, special files for any file copy from a checkout |
|
|
45
|
+
| `isRunCancelled` change made AI-Vision dispatch throw at once | CI on #66 | a "callers of a changed function" check: list every caller of a function whose contract changes |
|
|
46
|
+
| Every phone push failed with 403 for a day (803 failures) | Huy and I, by hand | self-health: three or more consecutive delivery failures with the same error raise an outage on the dot itself |
|
|
47
|
+
| A draft for an existing test overwrote edits made after it was written; a retire draft stayed approvable after the ticket check changed its mind; two repos with the same spec path merged into one spec | found by the dot on its own PR [A new ticket checks the existing tests it changes](https://github.com/duonghaijoe/localdost/pull/100), [KAT-314](https://linear.app/katalon-pm/issue/KAT-314), [KAT-315](https://linear.app/katalon-pm/issue/KAT-315), [KAT-316](https://linear.app/katalon-pm/issue/KAT-316) | the impact check itself: a draft records the case version it was based on, a changed verdict closes its Inbox draft, and a spec is keyed by repo and path |
|
|
48
|
+
| A draft for an existing test recorded its base version when it was stored, after the model answered, so an edit made during the review was lost on accept; the impact panel said nothing was waiting when its request failed | Opus review of #100 | the draft base is the version the review read; a failed load shows an error with a retry, never an empty state |
|
|
49
|
+
| A retire draft still retired a case that a person edited after the draft was written; the ticket review page showed "N existing tests checked" with no rows when its list failed to load | Opus review of [A new ticket checks the existing tests it changes](https://github.com/duonghaijoe/localdost/pull/100), [KAT-315](https://linear.app/katalon-pm/issue/KAT-315), [KAT-319](https://linear.app/katalon-pm/issue/KAT-319) | a retire draft records the case version the review read and approval refuses when it changed; every screen that loads the list shows an error with a retry |
|
|
50
|
+
| A refused connection in one repo of a two-repo dot marked a failure in the other repo as environment (default-branch facts read the newest run of any repo) ([KAT-320](https://linear.app/katalon-pm/issue/KAT-320)) | The dot, on PR 94 and on main | scope default-branch facts to the repo of the change |
|
|
51
|
+
| An environment failure (ENOSPC) on a linked check still marked the risk reproduced and drafted a file_defect ([KAT-321](https://linear.app/katalon-pm/issue/KAT-321)) | The dot, on PR 94 and on main | an environment failure never reproduces a risk and never drafts a defect, on every path |
|
|
52
|
+
| The burst test left a localdost-kat313-* temp folder with 500 run folders on every run ([KAT-322](https://linear.app/katalon-pm/issue/KAT-322)) | The dot, on PR 94 and on main | a test or fixture that makes a temp folder removes it, even when its child is killed |
|
|
53
|
+
| A head change or close on repo B's PR 84 superseded or expired repo A's pending defect for its PR 84 (the new-defect draft had no repo) ([KAT-323](https://linear.app/katalon-pm/issue/KAT-323)) | The dot, on PR 94 and on main | every defect and evidence draft carries its repo, and PR-state changes never touch a draft with an unknown repo |
|
|
54
|
+
| The same failing test in two repos of one dot shared one defect (the bug signature had no repo) ([KAT-324](https://linear.app/katalon-pm/issue/KAT-324)) | The dot, on PR 94 and on main | the repo is part of the bug key and signature in a multi-repo dot |
|
|
55
|
+
| An ENOSPC failure of an AI-Vision or generated check still marked the risk reproduced and drafted a defect ([KAT-325](https://linear.app/katalon-pm/issue/KAT-325)) | The dot, on PR 94 and on main | the environment signature applies to the failure text of every check kind, not only repo specs |
|
|
56
|
+
| A changed ticket (10% to 20%, later 30%) kept the old note, ticket line and draft steps on an open test update ([KAT-327](https://linear.app/katalon-pm/issue/KAT-327)) | The dot, on the ticket review | a new check of a changed ticket refreshes the note, the ticket line and the pending draft, and keeps the base-revision guard |
|
|
57
|
+
| Decimal values lost their fraction: "from 3 days to 4.5 days" proposed 4 ([KAT-328](https://linear.app/katalon-pm/issue/KAT-328)) | The dot, on the ticket review | a number keeps its decimal point and thousands separator in every value rule |
|
|
58
|
+
| Adding or removing a repo of a dot broke its defect links: a saved answer's bug key and a pending defect no longer matched, and drafting from the saved answer failed ([KAT-326](https://linear.app/katalon-pm/issue/KAT-326)) | The dot, on PR 94 and on main | a bug or defect lookup also tries the other repo shape of the key and signature |
|
|
59
|
+
| Every PR report showed the same test count | Huy | self-health: identical totals across different commits raise "test count looks stale" |
|
|
60
|
+
| 30 GB of temp folders leaked by test runs | disk full | resource leaks: new mkdtemp without cleanup in a diff is a risk; disk free dropping fast raises an alert |
|
|
61
|
+
| A test that fails just after midnight | CI | time-dependent tests ("today", local dates) are a risk the review names |
|
|
62
|
+
| A rejected report left its GitHub check stuck | me | an approval path with no close path is a risk the review names |
|
|
63
|
+
| Map and heatmap unreadable with real data | Huy | UI reviews check the screen with the dot's own real data size, not only demo data |
|
|
64
|
+
| One rejected defect stopped the same bug from being drafted on every later PR | found by the dot on [Report accuracy](https://github.com/duonghaijoe/localdost/pull/94), KAT-307 | the earlier-defect lookup matched rejections by bug signature across PRs | a rejection holds for its own PR; a later PR drafts the bug again |
|
|
65
|
+
| A failing assertion in a test the PR adds was reported as an environment problem | found by the dot on [Report accuracy](https://github.com/duonghaijoe/localdost/pull/94), KAT-308 | every failure of an added test on its first run was set aside | an added test that compared values and failed is a bug; only one that broke before any assertion is set aside |
|
|
66
|
+
| "Never push to acme/prod, only comment." made acme/prod an allowed place to post | found by the dot on [Safety review fixes](https://github.com/duonghaijoe/localdost/pull/95), KAT-306 | the allow word "only" in a forbid sentence made every repo in it allowed | only the clauses from the allow word on, minus the clauses that forbid, name allowed places |
|
|
67
|
+
| "Test count looks stale" never fired for dots that keep code in app/, packages/ or lib/ | found by the dot on [Safety review fixes](https://github.com/duonghaijoe/localdost/pull/95), KAT-311 | only changes under src/, client/, test/ and e2e/ counted as code, so every run of such a dot was left out of the streak | any changed path that is not docs (*.md, docs/), CI config or a lockfile counts as code |
|
|
68
|
+
| Test files that hung until CI timed out (18 minutes for multi-repo-review.test.ts) were put down to machine load and rerun | 2 CI runs and 1 local run on 2026-10-10, KAT-309 | a demo-mode test that found nothing on port 4320 started the sample shop in-process and never stopped it | the shop never holds a process open on its own; a test spawns a process that starts the shop and checks it exits |
|
|
69
|
+
| A cart total that shows the wrong discount was hidden as a stated behavior change next to "Discount banner removed from the cart" | found by the dot on [Report accuracy](https://github.com/duonghaijoe/localdost/pull/94), KAT-310 | a finding matched a decision when it shared two content words with the sentence | a match needs the decision's subject (its head noun and at least half of its words) and a result that agrees with what the decision says now happens; a failed test is read by its received value only, so an assertion that contradicts the decision is a bug |
|
|
70
|
+
| A connection refusal or a page that hung after a change that broke app startup was put down to the environment | found by the dot on [Report accuracy](https://github.com/duonghaijoe/localdost/pull/94), KAT-308 follow-up | every ECONNREFUSED and load-timeout signature was environment, whoever caused it | those two are environment only when the latest default-branch run shows the same signature on the same test, or the change touches no app code; otherwise "the app did not answer; this change may cause it" and a defect is drafted. A full disk, a cancelled job, out of memory and a missing browser stay environment always |
|
|
71
|
+
| Test files hung at 100% CPU with the test timeout never firing (chat-tickets.test.ts; the same loop froze a live server when many runs finished at once) | KAT-313, CI and local runs | every finished run queued its own artifact-cap pass that parsed every run row and read every run folder of the dot, so N finishing runs cost N-squared work inside setImmediate; a change that adds work per finished run, per job, or per poll result is a risk the review names, and a test that waits on a queue drain needs a burst-size check |
|
|
72
|
+
| A concrete code-path risk (a cited file and line, and the input that breaks it) that no test reproduced was shown only as a "risk to test" and never filed, after "bug" came to mean a reproduced failure | the follow-up to the "1 bug found" row, found while dogfooding | the reviewer names an optional failing input. A risk with a cited line and a concrete input is filed as a defect labelled "found by reading the code", with the file and line and the input in the body and lower confidence. It stays a "risk to test" in the headline and the counts, never a bug. It is never drafted for an environment failure, a rejection of it holds while the cited lines are unchanged, and it carries the repo. A vague risk (no input, or "some edge cases") is never filed. A stated decision or a design question still wins. Eval cases `code-path-risk-is-filed` and `vague-risk-is-not-filed` |
|
|
73
|
+
| A pending "found by reading the code" defect for PR 106 expired when 106 merged, losing a bug that lives on main ([KAT-333](https://linear.app/katalon-pm/issue/KAT-333)) | The dot, on 2026-10-12 | merging a PR expired every pending draft of that PR | a merge keeps pending defect drafts and their evidence drafts and records the merge commit; a close without a merge still expires them; PR comments and check runs keep the old behavior |
|
|
74
|
+
|
|
75
|
+
## Golden eval cases
|
|
76
|
+
|
|
77
|
+
Each row above is an eval case under `test/fixtures/qa-review/dogfood/`, run by `npm run eval:qa-review` and by unit tests: the input (diff, PR body, ticket, run facts at that head) and the expected outcome (no defect, a named defect, the headline counts, or an alert). The review evals run in CI, and a regression fails the build.
|
|
78
|
+
|
|
79
|
+
### Decision set (KAT-210)
|
|
80
|
+
|
|
81
|
+
`test/fixtures/qa-review/decisions/<approval id>/` holds real report and defect drafts with the decision a person gave each (`input.json`: the draft, the watch and the run facts; `expected.json`: approve or reject, and for a reject the escalation category). `test/decision-eval.test.ts` runs `src/review/decision-eval.ts` over them without a model: the safety rules (`safeReview` with the mock model) and the report consistency check must agree with the person. An approved draft that a gate holds, or a rejected draft that a gate lets through for a reason code can judge (a credential, copied instructions, the must-not rule, a destructive kind), is a disagreement and fails the test. A rejection for any other reason (a stale head, a duplicate, a claim the evidence does not back) needs a model and is skipped, and the test prints the count. A known disagreement goes in `decisions/allowlist.json` with a reason; an entry for a case that no longer disagrees also fails, so the list stays true. To refresh the set, run `npm run golden:export -- --db <copy of the dot database> --since <date> --limit 20` (the database opens read-only; point it at a copy), read every written file for a secret or personal data (the export masks email addresses, tokens, home paths and URLs outside github.com/duonghaijoe and linear.app/katalon-pm, but a person decides what is safe to commit), run `npm test`, and list each new disagreement in the allowlist or fix the gate.
|
package/docs/GITHUB.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# GitHub
|
|
2
|
+
|
|
3
|
+
A dot reads PR files and diffs, clones the commit it tests, and posts one sticky PR comment plus a check result. localdost can reach GitHub three ways: a GitHub App, a token (from the GitHub CLI or a personal access token, PAT), or neither (demo mode). Events arrive by webhook or by polling, and either works with an App or a token.
|
|
4
|
+
|
|
5
|
+
## Connect from the app
|
|
6
|
+
|
|
7
|
+
Open Setup, press **Connect** on the GitHub row, and pick how localdost signs in:
|
|
8
|
+
|
|
9
|
+
| Choice | What happens | Best for |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| **GitHub CLI login** | When `gh` is signed in on the server, **Use GitHub CLI login** connects. localdost reads the token from `gh` each time it starts | Your own machine |
|
|
12
|
+
| **GitHub App** | **Create GitHub App** opens GitHub with the name, permissions, and events filled in. Create the App, install it on your repos, and GitHub sends you back to Setup connected | A team server |
|
|
13
|
+
| **Personal access token** | Paste a fine-grained token with the [permissions](#permissions) below, press **Test**, then **Connect** | A server without `gh` where you cannot create an App |
|
|
14
|
+
|
|
15
|
+
Then pick the repos your dots watch. **Test** on the row checks the saved connection again, and **Disconnect** deletes it. When `GITHUB_TOKEN` or the App variables are set in the environment, the row shows **Set by environment** and stays read-only.
|
|
16
|
+
|
|
17
|
+
## Environment variables
|
|
18
|
+
|
|
19
|
+
| | GitHub App | PAT | Demo |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| Variables | `GITHUB_APP_ID`, `GITHUB_PRIVATE_KEY` | `GITHUB_TOKEN` | none |
|
|
22
|
+
| Check result | Check run with line annotations, queued and in progress states | Commit status, no annotations | Outbox |
|
|
23
|
+
| Comment author | `<app-name>[bot]` | The token's owner | Outbox |
|
|
24
|
+
| Repos | Every repo the App is installed on | Every repo the token can reach | Demo payloads |
|
|
25
|
+
|
|
26
|
+
When both App variables are set, App mode wins over `GITHUB_TOKEN`. `GITHUB_PRIVATE_KEY` holds the PEM text, with `\n` escapes allowed, or a path to the `.pem` file. localdost looks up the installation for each repo and caches the installation token until shortly before it expires.
|
|
27
|
+
|
|
28
|
+
For GitHub Enterprise Server, set `GITHUB_API_URL` (for example `https://github.example.com/api/v3`) and `GITHUB_SERVER_URL` (`https://github.example.com`).
|
|
29
|
+
|
|
30
|
+
## Pick a setup
|
|
31
|
+
|
|
32
|
+
| Situation | Setup |
|
|
33
|
+
|---|---|
|
|
34
|
+
| Trying it on your own machine | **GitHub CLI login** in Setup plus polling. `localdost init` writes the same with `gh auth token` |
|
|
35
|
+
| A team server with a public HTTPS URL | **GitHub App** in Setup plus webhooks |
|
|
36
|
+
| A server that GitHub cannot reach | GitHub App or token plus polling |
|
|
37
|
+
|
|
38
|
+
Do not combine a webhook and polling on the same repo. The webhook dedupes on the delivery id and polling on the commit, so each push would run twice. A dot made in the setup flow polls until GitHub has delivered a webhook to the server (the Event delivery step says so, and **Check again** reads the server). Once webhooks work, set `pollGithub` to `false` on the dot (`PATCH /api/dots/:id`) so it stops polling.
|
|
39
|
+
|
|
40
|
+
## Permissions
|
|
41
|
+
|
|
42
|
+
The same permissions apply to an App and to a fine-grained PAT:
|
|
43
|
+
|
|
44
|
+
| Permission | Access | Used for |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| Metadata | Read | Repo lookups, collaborator permission checks for checklist ticks |
|
|
47
|
+
| Contents | Read | Clones, file reads at a sha, compare, code search |
|
|
48
|
+
| Pull requests | Read and write | PR files and diffs, the sticky comment |
|
|
49
|
+
| Checks | Read and write | Check runs (App only) |
|
|
50
|
+
| Commit statuses | Read and write | Commit statuses (PAT mode) |
|
|
51
|
+
| Actions | Read | Failed job logs for CI failure triage, coverage artifacts for the PR review |
|
|
52
|
+
| Deployments | Read | The deploy wait of a merge run: the deployments of an environment and their statuses, see [Waiting for the deploy](SETUP.md#waiting-for-the-deploy). The same permission backs the Deployment status event |
|
|
53
|
+
| Issues | Read and write | Issues as a tracker: read issues and timelines, the ticket review comment, defect issues, status labels. Subscribe the App to the Issues event |
|
|
54
|
+
| Members (organization) | Read | The [PR scope](SETUP.md#pr-scope) `team` rule: read the members of a team of the org. Without it GitHub refuses the read: the PR runs without the scope, and its PR comment and check wait in the Inbox with the reason, and the dot shows "PR scope not applied" |
|
|
55
|
+
|
|
56
|
+
Webhook events the App subscribes to, matching these permissions:
|
|
57
|
+
|
|
58
|
+
| Event | Needs permission |
|
|
59
|
+
|---|---|
|
|
60
|
+
| Pull request, Push | Pull requests, Contents |
|
|
61
|
+
| Workflow run | Actions |
|
|
62
|
+
| Deployment status | Deployments |
|
|
63
|
+
| Issue comment | Issues, Pull requests |
|
|
64
|
+
| Issues | Issues |
|
|
65
|
+
|
|
66
|
+
An App made with **Create GitHub App** in Setup has the Issues and Members permissions and the Issues event. An App made earlier needs them added in its GitHub settings, and each installation must accept the new permissions. For an organization, an owner approves the Members permission. A PAT needs Issues read and write on the watched repos, and Members read on the organization when a dot uses the `team` rule; it has no events, so the poller reads issues instead.
|
|
67
|
+
|
|
68
|
+
A classic PAT needs the `repo` scope. localdost never pushes, merges, or reverts.
|
|
69
|
+
|
|
70
|
+
## GitHub App
|
|
71
|
+
|
|
72
|
+
**Create GitHub App** in Setup does every step below for you. To create the App by hand instead:
|
|
73
|
+
|
|
74
|
+
1. Open GitHub Settings, Developer settings, GitHub Apps, and create an App.
|
|
75
|
+
2. Set the webhook URL to `https://<your-host>/hooks/github`. Set a webhook secret and put the same value in `GITHUB_WEBHOOK_SECRET`. Leave the webhook inactive when you plan to poll. An App that **Create GitHub App** made before the public URL was set has no webhook: add the URL and the secret in the App's settings.
|
|
76
|
+
3. Grant the repository permissions in the table above.
|
|
77
|
+
4. Subscribe to the events in the next table.
|
|
78
|
+
5. Generate a private key. Set `GITHUB_APP_ID` and `GITHUB_PRIVATE_KEY`.
|
|
79
|
+
6. Install the App on the repos your dots watch.
|
|
80
|
+
|
|
81
|
+
## PAT
|
|
82
|
+
|
|
83
|
+
1. Create a fine-grained token with the permissions above on the watched repos, or run `gh auth login` and use `gh auth token`.
|
|
84
|
+
2. Paste it in Setup with **Personal access token**, or set `GITHUB_TOKEN`. In `.env.localdost`, `GITHUB_TOKEN=${cmd:gh auth token}` reads it at start, so the token never lands in a file.
|
|
85
|
+
3. For webhooks, add a repo webhook in the repo's Settings, Webhooks: URL `https://<your-host>/hooks/github`, content type `application/json`, the same secret as `GITHUB_WEBHOOK_SECRET`, and the events below. A token has no webhook of its own, so until someone adds this to each repo nothing arrives. GitHub sends a ping when the hook is added, and the setup flow's Event delivery step shows webhooks once it has seen one.
|
|
86
|
+
|
|
87
|
+
## Webhook events
|
|
88
|
+
|
|
89
|
+
| Event | What localdost does |
|
|
90
|
+
|---|---|
|
|
91
|
+
| Pull request | `opened`, `synchronize`, `reopened`, `ready_for_review` queue a PR check (a dot that already reviewed that head skips `ready_for_review`). `closed` with a merge queues a post-merge check. A repo entry can limit which PRs a dot takes, see [PR scope](SETUP.md#pr-scope) |
|
|
92
|
+
| Push | A push to the default branch queues a post-merge check, unless the repo's PR scope keeps out the PR whose merge it is. Branch deletes are ignored |
|
|
93
|
+
| Workflow run | A completed run with conclusion `failure` or `timed_out` queues CI failure triage |
|
|
94
|
+
| Deployment status | A `success` state for a repo and an environment wakes the merge runs of dots that wait for that deploy, see [Waiting for the deploy](SETUP.md#waiting-for-the-deploy). With an environment URL it also records the preview URL for that sha. A later PR check tests against it. Polling never sees it: a PR of a dot that polls has no preview, and the dot's `prTestTarget` decides what its check tests, see [PR tests without a preview](SETUP.md#pr-tests-without-a-preview) |
|
|
95
|
+
| Issue comment | An edit of the localdost sticky comment records checklist ticks, see [PR-REVIEW.md](PR-REVIEW.md#ticking-the-checklist). A new comment `/localdost review` on an issue, from a user with write access, queues a ticket review; on a pull request it queues a new check of the PR's latest push, for every dot that watches the repo as an app repo (a bot, and a comment that holds the localdost report, are no command) |
|
|
96
|
+
| Issues | For a dot with a GitHub Issues tracker: `opened`, an `edited` body or title, and a `labeled`, `typed`, or `milestoned` change that brings the issue into scope queue a ticket review, see [TRACKERS.md](TRACKERS.md#github-issues) |
|
|
97
|
+
|
|
98
|
+
GitHub's `ping` gets a 200. Other events get a 202 and are ignored. A bad signature gets a 401. With `GITHUB_WEBHOOK_SECRET` unset, `/hooks/github` answers 503 with a message that names the setting, and queues nothing. `LOCALDOST_ALLOW_UNSIGNED_WEBHOOKS=1` accepts unsigned deliveries again for a local demo and logs a warning at start.
|
|
99
|
+
|
|
100
|
+
For local development, `npx smee-client -u https://smee.io/<channel> -t http://localhost:4319/hooks/github` forwards deliveries and keeps the signatures valid.
|
|
101
|
+
|
|
102
|
+
## Polling
|
|
103
|
+
|
|
104
|
+
Set `LOCALDOST_POLL=1`, or `pollGithub: true` on one dot. Every `POLL_GITHUB_SEC` seconds (default 60) the poller does two things per watched repo:
|
|
105
|
+
|
|
106
|
+
- New commits on the default branch become one push event, which queues a post-merge check.
|
|
107
|
+
- Each open PR with a new head sha queues a PR check. A label change does not.
|
|
108
|
+
|
|
109
|
+
Polled events go through the same normalizer, dedupe keys, and job queue as webhooks. Cursors live in the `poll_cursors` table.
|
|
110
|
+
|
|
111
|
+
**First poll.** The first poll after boot records a cursor and queues nothing for the repo as a whole. A dot's own first poll of a repo is different (KAT-352): the dot takes the 5 most recently updated open PRs, so a new dot hears about work that is already open without flooding the queue on a busy repo. The dot is marked per repo in `poll_cursors` (`github-seed:<dot>:<repo>`), so it happens once. It is left out for a dot that was more than an hour old at its first poll (an upgrade or a re-enabled poller never replays PRs), for a PR this poll already sends to every dot, and for a PR the dot already reviewed at that head. The repo's [PR scope](SETUP.md#pr-scope) applies to these PRs like to any other. A new dot has had no moment to say whose PRs it takes, and a shared repo holds the PRs of other teams, so a first look at a repo whose scope names no authors, team or linked issue labels is held: the PR comment and the check of those runs wait for approval in the Inbox, and the "queued" status is not written. The event carries `firstLook: true` for this. Name authors, a team or labels in the scope and the first look posts on its own.
|
|
112
|
+
|
|
113
|
+
**After a gap.** A stored cursor older than an hour (`STALE_CURSOR_MS`: the server was down, or a laptop host slept) used to be recorded again with nothing replayed, so the PRs and the new issues of that time were never reviewed and nothing said so (KAT-363). Now the poll still re-records the commits of the default branch (the gap starts no post-merge run), but it takes the open PRs that changed since the old cursor: a new PR, a new head, a draft that turned ready, told from the PR map of the old cursor, so a PR the dot already saw at that head is not reviewed twice. The events go through the repo's [PR scope](SETUP.md#pr-scope) like any other, newest update first, and each dot takes at most 5 of them after its own scope (`CATCH_UP_MAX`, the same as a first poll), so on a repo shared by several teams the PRs of the others do not use up a dot's share. The PRs past a dot's share are recorded as seen and are not caught up later. Each event carries `catchUp: { since, gapMs }`, and its run starts with a "Caught up after a gap" step: "localdost did not poll GitHub for 9 h 55 min (since 13 Oct 22:10 UTC), so this was picked up late." The log has one line per poll with the counts. The issues of a GitHub tracker catch up the same way, see [TRACKERS.md](TRACKERS.md#github-issues), and so do the tickets of a Linear or Jira tracker, see [TRACKERS.md](TRACKERS.md#linear). A repo's first poll ever has no old cursor and catches up nothing.
|
|
114
|
+
|
|
115
|
+
**A dot made in the app polls.** `POST /api/dots` sets `pollGithub: true` on the new dot when the server has no webhook route, that is, no `LOCALDOST_PUBLIC_URL` or no `GITHUB_WEBHOOK_SECRET`. A `pollGithub` in the request body wins. Without this the in-app flow made a dot that never heard about a PR.
|
|
116
|
+
|
|
117
|
+
**Listening line.** `GET /api/dots` and `GET /api/dots/:id` return `listening`: `polling` (with `pollSec`), `webhooks`, or `none` (with `listeningMissing`: `GitHub connection`, `public URL`, `webhook secret`). Polling wins when both routes are set up. The dot page and the dot list show it as "Listening: polling every 60 s", "Listening: webhooks", or "Not listening: ..." with a Turn on polling button (`PATCH /api/dots/:id` with `pollGithub: true`). A paused dot, a demo or sandbox server, and a dot with no GitHub repo or GitHub Issues tracker have no `listening`. A dot with `listening: none` shows "Needs attention" in the app, whatever its last run said, since a dot that hears nothing is not all good. Polling that fails 3 times in a row (the dot's repos, and the repos of its GitHub tracker, each counted on its own) is `none` too, with `listeningMissing: []` and `listeningReason` (for example `GitHub polling for acme/shop failed 3 times in a row: HTTP 401: Bad credentials`): the line reads "Not listening: <reason>" with an Open Setup button, and the dot status is `attention` until one poll works again. The server keeps the count in memory, so a restart starts clean. `GET /api/dots` and `GET /api/dots/:id` also return `lastEventAt`, the time of the newest GitHub event the dot recorded (skipped events included, `null` before the first), and the line adds "Last event 2 h ago." so a quiet dot shows how long it has been quiet. An open dot list or dot page follows the line without a reload: the `dot` live event carries `delivery` (`listening`, `pollSec`, `listeningMissing`, `listeningReason`) when it changed, which the server checks every 5 seconds, so polling that breaks shows the reason and Open Setup, and polling that recovers shows "Listening" again.
|
|
118
|
+
|
|
119
|
+
A draft PR that turns ready is polled too: the poller keeps which PRs were drafts, and queues the PR check when one is no longer a draft, even though its head did not change.
|
|
120
|
+
|
|
121
|
+
A dot with a GitHub Issues tracker also polls its issue repos: issues opened, edited, or brought into scope since the last poll queue a ticket review.
|
|
122
|
+
|
|
123
|
+
Polling does not see CI failures, deployment previews, comment edits, or `/localdost review` comments. A merge run that waits for a deploy does not need the event: it reads the deployments from the API every 30 s ([Waiting for the deploy](SETUP.md#waiting-for-the-deploy)). With no preview, a PR check tests against the dot's base URL and labels the report, or skips the tests, by `prTestTarget` ([PR tests without a preview](SETUP.md#pr-tests-without-a-preview)). Checklist ticks made on GitHub therefore need the Issue comment webhook. Without it, tick items in the app's run page instead.
|
|
124
|
+
|
|
125
|
+
## Check status
|
|
126
|
+
|
|
127
|
+
A PR check can wait behind other reviews. localdost shows that on GitHub at once, so a PR never looks ignored:
|
|
128
|
+
|
|
129
|
+
| When | Check state | Title |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| The check job is enqueued | queued | `Queued, N ahead` |
|
|
132
|
+
| The run starts | in progress | The latest step, or `Running tests 12/22` once the tests start |
|
|
133
|
+
| The report is ready | completed | The report from the check-run renderer, written into the same check |
|
|
134
|
+
| A newer push to the same PR or branch | completed, neutral | `Superseded by <sha>` |
|
|
135
|
+
| The run fails, is cancelled, or ends without a report | completed, neutral | `Run failed`, `Cancelled`, `Interrupted`, or the last step |
|
|
136
|
+
| The report waits for approval | completed, action required | `Report waiting for approval` |
|
|
137
|
+
|
|
138
|
+
N counts the jobs that start first: the ones running now and the ones queued earlier. Progress updates go out at most every 30 seconds, and the latest state wins. A run that fails, is cancelled, is interrupted, is skipped, or ends without a report closes its check as neutral, and the title says which one happened. None of these says anything about whether the change works, so none of them blocks a merge. A report that waits for approval closes it as action required. A newer push replaces an older commit, which keeps one check: it says `Superseded by <sha>`, and its own report still completes that same check when its run finishes. A push in one repository never replaces a check in another repository of the same dot. If GitHub rejects a closing update, the check stays open in localdost too, and the next close tries again, so no check stays in progress.
|
|
139
|
+
|
|
140
|
+
With a token, GitHub has commit statuses only. Neutral and cancelled show as success, failure and timed out show as failure, and a report that waits for approval or a superseded commit shows as pending. A token never shows those two as green.
|
|
141
|
+
|
|
142
|
+
These status writes are templated, so auto-review skips them. They still follow the `check_run` rule. Only `act` writes them. Under `ask`, `act_when_asked`, or `hand_off` the check shows up with the final report only, and no status draft waits in the Inbox. In PAT mode each state is a pending commit status under the `localdost` context. In demo mode (no GitHub connection) nothing is written.
|
|
143
|
+
|
|
144
|
+
The job also publishes a `picked_up` live event, see [API-V2.md](API-V2.md#live-test-runs), and sends a low-urgency push when no app is open. The push follows the `push_notify` rule.
|
|
145
|
+
|
|
146
|
+
## Fork pull requests
|
|
147
|
+
|
|
148
|
+
A PR check on a fork PR would clone and run code from someone outside your repo. localdost skips the test run for a fork PR unless the dot sets `runner.trustForks: true`, and the PR comment says "Tests did not run: this PR comes from a fork. Ask a maintainer to check it again." The PR review still runs, because it only reads files. Details: [SANDBOX.md](SANDBOX.md#fork-safety).
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Integration model
|
|
2
|
+
|
|
3
|
+
localdost works next to the test tools a team already has: Xray in Jira, TestRail, Katalon True Platform, and Linear for tickets. Think of a new teammate who joins a team that already keeps its tests somewhere. First they read what exists and learn where everything lives, then they keep both places in step, and they always tell the person in charge what they changed. This document says how localdost brings existing tests in, keeps them in sync both ways, and works as an agent beside people, based on how Linear syncs with Jira and how Atlassian put agents into Jira.
|
|
4
|
+
|
|
5
|
+
It builds on the test management model in [DATA-MODEL.md](DATA-MODEL.md): folders, case versions, suites, plans, test runs, run items, results and step results. Facts about Linear and Atlassian were gathered on 2026-10-10; sources are at the end.
|
|
6
|
+
|
|
7
|
+
## What Linear does
|
|
8
|
+
|
|
9
|
+
**Import and sync are two separate tools.** The Jira importer brings history in once: issues, comments, labels, estimates, due dates, statuses, parent and sub-issue links, epics (as Linear projects) and images. The sync carries changes forward. Linear's advice is to turn on the sync first, then import history, then let the sync continue. Existing Jira issues join the sync only when they next change in Jira.
|
|
10
|
+
|
|
11
|
+
**One container maps to one container.** A Jira space links to one Linear team. Several Jira spaces can feed one team. Each link chooses a direction:
|
|
12
|
+
|
|
13
|
+
- One-way: items created in Jira appear in Linear, updates flow both ways, and items created in Linear stay in Linear.
|
|
14
|
+
- Two-way: an item created on either side gets a copy on the other.
|
|
15
|
+
|
|
16
|
+
**Only core fields sync.** Title, description, assignee, creator, priority, status, labels and due date sync. Custom fields do not transfer. Jira issue types become labels, and components become labels named "Component: X". New items created from Linear become the Jira type Task.
|
|
17
|
+
|
|
18
|
+
**People are matched by email.** A Jira user with no Linear match becomes an external author, who can write issues and comments but cannot be an assignee. For the sync, each person connects their own Jira account so their changes carry their name.
|
|
19
|
+
|
|
20
|
+
**Mismatches are left alone.** If a Jira status has no Linear equivalent, the Linear status does not change. Teams point unmapped work at a Triage state. If a Linear edit breaks a Jira rule, Linear keeps the edit and Jira does not change. Deleting a synced item on one side never deletes it on the other.
|
|
21
|
+
|
|
22
|
+
**Comments become one shared thread.** Linear uses the same pattern for GitHub Issues, Slack threads and Asks: link a container, choose a direction, sync core fields, share one comment thread, and land new work in Triage.
|
|
23
|
+
|
|
24
|
+
**Agents are delegates, not owners.** An agent is a workspace user that people assign or mention. When an issue is delegated to an agent, Linear sets a separate `delegate` field. The human assignee keeps ownership, and the issue stays in that person's My issues. Each piece of agent work is a session with a state: pending, active, awaiting input, error, complete or stale. The agent reports through activities:
|
|
25
|
+
|
|
26
|
+
- a thought (what it is doing),
|
|
27
|
+
- an action (a tool call and its result),
|
|
28
|
+
- an elicitation (a question for the person),
|
|
29
|
+
- a response (the outcome),
|
|
30
|
+
- an error.
|
|
31
|
+
|
|
32
|
+
A session can carry a plan, a checklist of steps. The agent must acknowledge within 10 seconds or Linear marks it unresponsive. Linear's interaction guidelines require five things:
|
|
33
|
+
|
|
34
|
+
- the agent says it is an agent,
|
|
35
|
+
- it uses the same actions a person would,
|
|
36
|
+
- it shows its state,
|
|
37
|
+
- it stops at once when asked,
|
|
38
|
+
- final responsibility stays with a human.
|
|
39
|
+
|
|
40
|
+
## What Atlassian does
|
|
41
|
+
|
|
42
|
+
**Agents sit in the assignee field next to people** (agents in Jira, open beta February 2026, generally available May 2026). A person engages an agent in four ways:
|
|
43
|
+
|
|
44
|
+
- picks it on the work item,
|
|
45
|
+
- mentions it in a comment,
|
|
46
|
+
- moves the item into a workflow status that an admin set to trigger the agent,
|
|
47
|
+
- drops the item into a board column set up for the agent.
|
|
48
|
+
|
|
49
|
+
**Agent output is private until a person shares it.** Results appear in an Agents section on the work item for the person who started the agent, and that person decides whether to publish them as a comment or attachment. Everyone with access can see that an agent ran. Approved updates land in the item history.
|
|
50
|
+
|
|
51
|
+
**Agents act with existing permissions and leave a trail.** Every action is logged on the work item. Admins get an inventory of agents, separate permissions for using and for building agents, and credit dashboards. Atlassian publishes no separate reject or approval gate. Review happens through the private output and the choice to publish.
|
|
52
|
+
|
|
53
|
+
**Outside agents connect over open standards.** The Forge module `rovo:agentConnector` puts a remote agent into Jira over Agent2Agent (A2A 1.0, JSON-RPC, streaming). People can then assign it work items, mention it, or chat with it. GitHub Copilot, Cursor and Claude Code are among the agents named. The Atlassian remote MCP server (generally available, OAuth 2.1) lets any MCP client read and write Jira with the user's permissions.
|
|
54
|
+
|
|
55
|
+
**Test tools in Jira store tests differently.**
|
|
56
|
+
|
|
57
|
+
- Xray adds the Jira issue types Test, Precondition, Test Set, Test Plan and Test Execution. A Test Run, one test inside one execution, lives inside Xray rather than as a Jira issue. Results import as JUnit or Xray JSON into a new or existing Test Execution.
|
|
58
|
+
- In Zephyr Scale, adding a case to a cycle creates an execution, so a case in 10 cycles has 10 executions.
|
|
59
|
+
|
|
60
|
+
## How localdost brings tests in
|
|
61
|
+
|
|
62
|
+
Linear does not ask people to design a mapping. Its Jira mapping is built in: a person connects, authorises, and picks the Jira space and the Linear team, and the import and mapping run in the background. localdost does the same. Each tool has one built-in mapping, and a team never maps fields by hand.
|
|
63
|
+
|
|
64
|
+
1. **Connect:** OAuth where the tool has it (Jira and Xray Cloud through Atlassian, Linear), an API token where it does not (TestRail, True Platform). The token is stored like every other connection and is scoped to read and write tests.
|
|
65
|
+
2. **Pick the container:** the dot lists what the token can see (projects, suites, repositories) and the person picks one.
|
|
66
|
+
3. **Import in the background:** localdost pulls history through the tool's REST API with the built-in mapping below, and shows progress on the dot page.
|
|
67
|
+
4. **Check the summary:** for example, "412 cases in 18 folders, 3 suites, 40 test runs imported. 3 statuses and 2 users need a choice." The few exceptions it lists can be adjusted, and the rest needs nothing.
|
|
68
|
+
|
|
69
|
+
| Tool | Container linked to a dot | Becomes in localdost |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| Xray | Jira project, optionally a test repository folder | folders, cases, suites (Test Sets), plans, test runs (Test Executions) |
|
|
72
|
+
| TestRail | project and suite | folders (sections), cases, plans, test runs, run items (tests), results |
|
|
73
|
+
| True Platform | project and test repository | folders, cases (with versions), suites, test runs, results |
|
|
74
|
+
| Linear or Jira (tickets) | team or space | requirements and acceptance criteria |
|
|
75
|
+
|
|
76
|
+
**What the built-in mapping does with each record:**
|
|
77
|
+
|
|
78
|
+
- **External references:** each imported record keeps the tool, remote id, remote key, URL, remote revision and last-synced time.
|
|
79
|
+
- **Folders:** keep their tree.
|
|
80
|
+
- **Custom fields:** go into a read-only `external.fields` bag. They show on the case but never sync, which is the same rule as Linear.
|
|
81
|
+
- **People:** a person with no email match becomes an external author.
|
|
82
|
+
- **Existing local cases:** an incoming case matches by external key first, then by title and steps, so a case is never duplicated.
|
|
83
|
+
- **Records the import missed:** join the sync when they next change on the remote side, as in Linear.
|
|
84
|
+
|
|
85
|
+
## How changes move between the tools
|
|
86
|
+
|
|
87
|
+
| Path | Transport | Why |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| Tool to localdost, as changes happen | webhooks: Jira (covers Xray's Test, Test Set, Test Plan and Test Execution issues) and Linear | changes arrive in seconds without polling |
|
|
90
|
+
| Tool to localdost, everything else | polling with a cursor ("changed since"), for objects or tools without webhooks, and as a catch-up after downtime | nothing is missed; Xray Test Runs are not Jira issues, so they need polling |
|
|
91
|
+
| localdost to the tool | the tool's REST API, with the authorised token | writes are exact, typed and carry the echo marker |
|
|
92
|
+
| A dot doing its own work (look up a case, comment, move a status on request) | the tool's MCP server where one exists (Atlassian remote MCP, Katalon MCP) | the agent acts with the user's permissions; MCP is request and response, so it is not the sync backbone |
|
|
93
|
+
|
|
94
|
+
To confirm per tool before building: whether TestRail and True Platform send webhooks, and what changed-since filters their APIs offer. Until that is known, polling is the default for both.
|
|
95
|
+
|
|
96
|
+
## How two-way sync works
|
|
97
|
+
|
|
98
|
+
**Every field has one owner, chosen when the link is made.** localdost does not settle conflicts by whichever edit came last:
|
|
99
|
+
|
|
100
|
+
| Data | Default owner | Other direction |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| Case title, steps, expected results, preconditions | the tool, for imported cases; localdost, for cases the dots design | the non-owner's edit becomes a proposal |
|
|
103
|
+
| Folders and suites | the tool | proposal |
|
|
104
|
+
| Test runs that localdost creates (from a PR, a merge, or a person) | localdost | pushed to the tool as a Test Execution or run |
|
|
105
|
+
| Results and step results that localdost produces | localdost | pushed; never pulled back over |
|
|
106
|
+
| Results a person records in the tool | the tool | pulled into the matching run item as a new attempt |
|
|
107
|
+
| Defects that localdost files | localdost at create, then the tracker for status and resolution | pulled |
|
|
108
|
+
|
|
109
|
+
**Edits by the non-owner become proposals.** If Xray changes the steps of a case that a dot designed, or a dot wants to change a case owned in TestRail, localdost makes a draft in the Inbox: "TestRail changed steps of Checkout total, apply here?" A person approves or rejects it. This is the same gate as every other outward write in localdost (act, ask or hand off).
|
|
110
|
+
|
|
111
|
+
**Statuses map per tool, and an unmapped status is flagged.** As in Linear, a remote status with no mapping leaves the local status alone. The item gets a "needs mapping" note on the sync page, so it never lands in a wrong state.
|
|
112
|
+
|
|
113
|
+
**Sync never loops.** Every write carries the localdost bot marker and records the remote revision or etag it produced. An incoming change whose revision matches a write of our own is an echo and is ignored.
|
|
114
|
+
|
|
115
|
+
**Deletes never travel.** A delete on either side archives the link and leaves a note, as in Linear.
|
|
116
|
+
|
|
117
|
+
**Every record keeps a sync log.** It holds the last pull, the last push, the last error and any open proposal. Failed writes retry with backoff, the same retry approved actions use, and show "Retrying, attempt N".
|
|
118
|
+
|
|
119
|
+
## How dots work with and beside people
|
|
120
|
+
|
|
121
|
+
**A dot is a delegate. A person stays the owner.** A dot works on an item on someone's behalf, in Linear's `delegate` sense. The human owner stays accountable and still sees the item as theirs. When a tool has only one assignee field, as in Jira, the dot is the assignee and the person who triggered it is recorded as its owner.
|
|
122
|
+
|
|
123
|
+
**People engage a dot the way the tools allow.**
|
|
124
|
+
|
|
125
|
+
- They assign or delegate an item to it.
|
|
126
|
+
- They mention it in a comment.
|
|
127
|
+
- They move an item into a status or board column that is set up for it.
|
|
128
|
+
- Inside localdost, they ask in chat, push a PR, or create a ticket.
|
|
129
|
+
|
|
130
|
+
**Each job is a session, and the dot narrates it.** A session has a state: working, waiting for you, error or done. The dot posts activities as it works: thoughts, actions with results, questions, the final response and errors. A session can carry a plan checklist. The dot acknowledges within 10 seconds. localdost run steps already work this way. Each tool shows the same session in its own form:
|
|
131
|
+
|
|
132
|
+
- Linear: agent activities,
|
|
133
|
+
- Jira: the Agents section,
|
|
134
|
+
- localdost: the run page.
|
|
135
|
+
|
|
136
|
+
**Outward writes wait for a person unless a rule allows them.** This is the approval gate Atlassian does not publish. A draft is visible to the person who started the work until it is approved, which matches Atlassian's private output. The dot's rules then decide what may post on its own.
|
|
137
|
+
|
|
138
|
+
**A dot discloses itself and stops when asked.**
|
|
139
|
+
|
|
140
|
+
- Every write carries the dot's name and the bot marker.
|
|
141
|
+
- "Stop" or "Hand off" ends the session at once.
|
|
142
|
+
- The dot resumes only when a person says so.
|
|
143
|
+
|
|
144
|
+
**A dot acts with scoped permissions and leaves an audit trail.** It acts with the connection's token, limited to what the dot needs. A paired member can approve, reject and pause, an editor can also change a dot but not the commands it runs on the server, and neither can archive, restore, or delete it. The audit table records every write with the actor and the before and after.
|
|
145
|
+
|
|
146
|
+
## Where a dot appears in each tool
|
|
147
|
+
|
|
148
|
+
| Tool | How the dot shows up | How a person engages it | How results go back |
|
|
149
|
+
|---|---|---|---|
|
|
150
|
+
| Linear | an agent app (OAuth actor app, assignable and mentionable) with sessions and activities | delegate the issue, or mention it | session activities, plan checklist, a comment with the QA review |
|
|
151
|
+
| Jira with Rovo | a remote agent through `rovo:agentConnector` (A2A) | assign the work item, mention it, workflow status or board column | Agents section output that the person publishes; comments and field updates through the Atlassian MCP server |
|
|
152
|
+
| Xray | through the Jira agent above | as above | results into a Test Execution: one Test Run per case, with step statuses, evidence and defects |
|
|
153
|
+
| TestRail | no agent surface: the dot is an API user | from localdost or the linked ticket | runs, tests and results with step results and attachments |
|
|
154
|
+
| True Platform | the Katalon MCP server and the report uploader | from localdost or the linked ticket | test runs and results; JUnit or Playwright reports first, then case and result mapping |
|
|
155
|
+
|
|
156
|
+
## Build order
|
|
157
|
+
|
|
158
|
+
1. **Connect and background import with the built-in mapping,** external references and the sync log, with True Platform first, then Xray, then TestRail.
|
|
159
|
+
2. **Result push:** each automated or manual localdost test run goes into the tool's execution object.
|
|
160
|
+
3. **Two-way case sync** with field owners, proposals in the Inbox, status mapping and echo protection.
|
|
161
|
+
4. **Agent surfaces:** the Linear agent app (the Linear agent epic, KAT-213), then the Jira remote agent over A2A.
|
|
162
|
+
|
|
163
|
+
## Sources
|
|
164
|
+
|
|
165
|
+
Linear (pages undated unless noted):
|
|
166
|
+
|
|
167
|
+
- [Jira importer](https://linear.app/docs/jira-to-linear)
|
|
168
|
+
- [Jira integration and sync](https://linear.app/docs/jira)
|
|
169
|
+
- [Jira sync launch (2023-12-20)](https://linear.app/changelog/2023-12-20-jira-sync)
|
|
170
|
+
- [GitHub Issues sync](https://linear.app/docs/github-to-linear)
|
|
171
|
+
- [Linear Asks](https://linear.app/docs/linear-asks)
|
|
172
|
+
- [Slack](https://linear.app/docs/slack)
|
|
173
|
+
- [Linear for Agents (2025-05-20)](https://linear.app/changelog/2025-05-20-linear-for-agents)
|
|
174
|
+
- [Agents in Linear](https://linear.app/docs/agents-in-linear)
|
|
175
|
+
- [Assigning and delegating issues](https://linear.app/docs/assigning-issues)
|
|
176
|
+
- [Agent developer docs](https://linear.app/developers/agents)
|
|
177
|
+
- [Agent interaction](https://linear.app/developers/agent-interaction)
|
|
178
|
+
- [Agent Interaction Guidelines (2025-07-30)](https://linear.app/developers/aig)
|
|
179
|
+
|
|
180
|
+
Atlassian:
|
|
181
|
+
|
|
182
|
+
- [AI agents in Jira (2026-02-25)](https://www.atlassian.com/blog/rovo/ai-agents-in-jira)
|
|
183
|
+
- [A new kind of teammate (2026-06-18)](https://www.atlassian.com/blog/ai-at-work/your-jira-board-just-got-a-new-kind-of-teammate)
|
|
184
|
+
- [Collaborate on work items with AI agents](https://support.atlassian.com/jira-software-cloud/docs/collaborate-on-work-items-with-ai-agents/)
|
|
185
|
+
- [Forge rovo:agentConnector](https://developer.atlassian.com/platform/forge/manifest-reference/modules/rovo-agent-connector/)
|
|
186
|
+
- [Rovo A2A](https://developer.atlassian.com/cloud/rovo-a2a/)
|
|
187
|
+
- [Atlassian remote MCP server](https://support.atlassian.com/rovo/docs/getting-started-with-the-atlassian-remote-mcp-server/)
|
|
188
|
+
- [Team '26 coverage (2026-05-06)](https://siliconangle.com/2026/05/06/atlassian-opens-teamwork-graph-pushes-rovo-agentic-execution-team-26)
|
|
189
|
+
|
|
190
|
+
Test tools:
|
|
191
|
+
|
|
192
|
+
- [Xray issue types](https://www.atlassian.com/devops/testing-tutorials/jira-xray-integration-manage-test-cases)
|
|
193
|
+
- [Xray result import](https://docs.getxray.app/display/XRAYCLOUD/Import+Execution+Results+-+REST+v2)
|
|
194
|
+
- [Zephyr Scale test cycles](https://support.smartbear.com/zephyr-scale-cloud/docs/en/test-cycles/test-cycles--overview-.html)
|
|
195
|
+
|
|
196
|
+
Not confirmed at the source:
|
|
197
|
+
|
|
198
|
+
- Linear: how comments and attachments sync with Jira, the status-mapping UI, and manual linking of existing items.
|
|
199
|
+
- Atlassian: who owns an item that an agent is assigned to.
|
|
200
|
+
- Xray: whether a Test Run is a Jira issue.
|