@joshuafolkken/kit 1.872.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/.claude-plugin/plugin.json +11 -0
- package/.claude/settings.json +110 -0
- package/.claude/skills/dependency-update/SKILL.md +76 -0
- package/.claude/skills/epic-commands/SKILL.md +463 -0
- package/.claude/skills/verify-ui/SKILL.md +96 -0
- package/.claude/skills/workflow-commands/SKILL.md +265 -0
- package/.claude/skills/workflow-commands/background-commands.md +130 -0
- package/.claude/skills/workflow-commands/backlogrun-child.md +364 -0
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +345 -0
- package/.claude/skills/workflow-commands/backlogrun-park.md +179 -0
- package/.claude/skills/workflow-commands/backlogrun-progress.md +600 -0
- package/.claude/skills/workflow-commands/backlogrun-steps.md +604 -0
- package/.claude/skills/workflow-commands/backlogrun.md +109 -0
- package/.claude/skills/workflow-commands/chain-rule.md +98 -0
- package/.claude/skills/workflow-commands/delegation.md +52 -0
- package/.claude/skills/workflow-commands/followup-reference.md +118 -0
- package/.claude/skills/workflow-commands/followup.md +222 -0
- package/.claude/skills/workflow-commands/fullrun-steps.md +93 -0
- package/.claude/skills/workflow-commands/fullrun.md +82 -0
- package/.claude/skills/workflow-commands/halfrun.md +73 -0
- package/.claude/skills/workflow-commands/into-target.md +48 -0
- package/.claude/skills/workflow-commands/issue-comments.md +109 -0
- package/.claude/skills/workflow-commands/issue-fold-existing.md +27 -0
- package/.claude/skills/workflow-commands/issue-scout.md +45 -0
- package/.claude/skills/workflow-commands/kickoff.md +82 -0
- package/.claude/skills/workflow-commands/latest-gate.md +85 -0
- package/.claude/skills/workflow-commands/needs-human-review.md +64 -0
- package/.claude/skills/workflow-commands/observation-filing.md +349 -0
- package/.claude/skills/workflow-commands/pre-gate-cut.md +340 -0
- package/.claude/skills/workflow-commands/prerequisite.md +62 -0
- package/.claude/skills/workflow-commands/retrospective.md +81 -0
- package/.claude/skills/workflow-commands/rule-residency.md +267 -0
- package/.claude/skills/workflow-commands/split-assessment.md +130 -0
- package/.claude/skills/workflow-commands/target-repository.md +58 -0
- package/.claude/skills/workflow-commands/working-tree-hold.md +66 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.coderabbit.yaml +50 -0
- package/.codex/config.toml +8 -0
- package/.codex/hooks.json +71 -0
- package/.cursorrules +45 -0
- package/.gitattributes +7 -0
- package/.github/dependabot.yml +19 -0
- package/.github/pull_request_template.md +1 -0
- package/.github/release.yml +18 -0
- package/.github/workflows/auto-tag.yml +111 -0
- package/.github/workflows/ci.yml +681 -0
- package/.github/workflows/dependabot-auto-merge.yml +55 -0
- package/.github/workflows/production.yml +47 -0
- package/.github/workflows/publish.yml +39 -0
- package/.github/workflows/sonar-qube.yml +34 -0
- package/.mcp.json +8 -0
- package/.ncurc.json +3 -0
- package/.prettierignore +20 -0
- package/.vscode/extensions.json +21 -0
- package/.vscode/settings.json +41 -0
- package/AGENTS.md +29 -0
- package/CLAUDE.md +207 -0
- package/CODE_OF_CONDUCT.md +132 -0
- package/GEMINI.md +30 -0
- package/LICENSE +21 -0
- package/README.md +41 -0
- package/SECURITY.md +34 -0
- package/cspell/index.yaml +177 -0
- package/dist/CLAUDE.md +207 -0
- package/dist/config-merge/index.d.ts +29 -0
- package/dist/config-merge/index.js +459 -0
- package/dist/hooks/batch-guard.js +28 -0
- package/dist/hooks/chunk-25JL6FMS.js +4970 -0
- package/dist/hooks/chunk-2ANGT3XM.js +375 -0
- package/dist/hooks/chunk-2EI5GBSW.js +42 -0
- package/dist/hooks/chunk-2OT5XE2N.js +5014 -0
- package/dist/hooks/chunk-2RUPMGGV.js +137 -0
- package/dist/hooks/chunk-2XIGZQMQ.js +3299 -0
- package/dist/hooks/chunk-33ELOKEV.js +910 -0
- package/dist/hooks/chunk-33YRTKM7.js +230 -0
- package/dist/hooks/chunk-36JQU5NN.js +77 -0
- package/dist/hooks/chunk-3EJBTWVS.js +1769 -0
- package/dist/hooks/chunk-3FK5SFAC.js +432 -0
- package/dist/hooks/chunk-3PWPYDD2.js +240 -0
- package/dist/hooks/chunk-3TQU7TDH.js +375 -0
- package/dist/hooks/chunk-3TVLSFZ6.js +432 -0
- package/dist/hooks/chunk-3VXYCB4E.js +77 -0
- package/dist/hooks/chunk-44M6JXGV.js +3398 -0
- package/dist/hooks/chunk-46EEEHC3.js +240 -0
- package/dist/hooks/chunk-4A7UVP2P.js +364 -0
- package/dist/hooks/chunk-4LFQEZS4.js +137 -0
- package/dist/hooks/chunk-4OCX3V2T.js +469 -0
- package/dist/hooks/chunk-4OHA5DE7.js +49 -0
- package/dist/hooks/chunk-4PMDW3YD.js +68 -0
- package/dist/hooks/chunk-4QHBNAI4.js +68 -0
- package/dist/hooks/chunk-4SSB3FEE.js +3273 -0
- package/dist/hooks/chunk-5A2WQ2CQ.js +5390 -0
- package/dist/hooks/chunk-5EVA2JQB.js +5390 -0
- package/dist/hooks/chunk-5P7VF5VE.js +3230 -0
- package/dist/hooks/chunk-5QWJGGZP.js +49 -0
- package/dist/hooks/chunk-5U5EZYG6.js +77 -0
- package/dist/hooks/chunk-5VUUF3ZV.js +240 -0
- package/dist/hooks/chunk-5WA7UBT3.js +374 -0
- package/dist/hooks/chunk-6EBGRQ3Q.js +301 -0
- package/dist/hooks/chunk-6TVHWMD3.js +432 -0
- package/dist/hooks/chunk-6V5OPIUU.js +13 -0
- package/dist/hooks/chunk-6VAGLEMB.js +68 -0
- package/dist/hooks/chunk-75BTXKFJ.js +3424 -0
- package/dist/hooks/chunk-75RHN67S.js +137 -0
- package/dist/hooks/chunk-76KC3BDD.js +3414 -0
- package/dist/hooks/chunk-76SLS7CZ.js +898 -0
- package/dist/hooks/chunk-7DHZ4DWT.js +5015 -0
- package/dist/hooks/chunk-7INSJDGE.js +458 -0
- package/dist/hooks/chunk-7VJ4FTDX.js +268 -0
- package/dist/hooks/chunk-7XCYNHQK.js +77 -0
- package/dist/hooks/chunk-A5YJ3H7E.js +375 -0
- package/dist/hooks/chunk-AAEXXUUL.js +268 -0
- package/dist/hooks/chunk-ABVEVV2M.js +432 -0
- package/dist/hooks/chunk-ACN3YXFL.js +68 -0
- package/dist/hooks/chunk-AD3XE3QZ.js +397 -0
- package/dist/hooks/chunk-AENFZPZH.js +230 -0
- package/dist/hooks/chunk-AFKRFQ6W.js +68 -0
- package/dist/hooks/chunk-AHD5IPWI.js +375 -0
- package/dist/hooks/chunk-AMK5JGV7.js +77 -0
- package/dist/hooks/chunk-ARN7NCQI.js +425 -0
- package/dist/hooks/chunk-AUFY653N.js +3425 -0
- package/dist/hooks/chunk-AXQBNFEF.js +375 -0
- package/dist/hooks/chunk-AYC7R6U4.js +3316 -0
- package/dist/hooks/chunk-AYEA2FJ7.js +5015 -0
- package/dist/hooks/chunk-B2LIXYFL.js +77 -0
- package/dist/hooks/chunk-B4HPNY2I.js +375 -0
- package/dist/hooks/chunk-B4YNCUGB.js +469 -0
- package/dist/hooks/chunk-B57S3VWT.js +922 -0
- package/dist/hooks/chunk-BINZ3PLI.js +364 -0
- package/dist/hooks/chunk-BIWLABFK.js +432 -0
- package/dist/hooks/chunk-BODUSXKK.js +410 -0
- package/dist/hooks/chunk-BQBAT2YK.js +375 -0
- package/dist/hooks/chunk-BUJEBW75.js +391 -0
- package/dist/hooks/chunk-BVNWORKA.js +72 -0
- package/dist/hooks/chunk-BWI47LQS.js +5205 -0
- package/dist/hooks/chunk-C25HRMJX.js +137 -0
- package/dist/hooks/chunk-CBFZNC74.js +375 -0
- package/dist/hooks/chunk-CECYXS4Y.js +3424 -0
- package/dist/hooks/chunk-CELGUP5F.js +49 -0
- package/dist/hooks/chunk-CMHANU3F.js +3442 -0
- package/dist/hooks/chunk-CMN372LI.js +68 -0
- package/dist/hooks/chunk-CPGZLMMK.js +3299 -0
- package/dist/hooks/chunk-CTQKXDC7.js +268 -0
- package/dist/hooks/chunk-CYAT4RIT.js +68 -0
- package/dist/hooks/chunk-CYTWYCH2.js +5014 -0
- package/dist/hooks/chunk-CZSOLRBA.js +77 -0
- package/dist/hooks/chunk-D2PIDYJR.js +3438 -0
- package/dist/hooks/chunk-DE57HI6T.js +137 -0
- package/dist/hooks/chunk-DGXDGAPG.js +5306 -0
- package/dist/hooks/chunk-DNYRSYQG.js +5014 -0
- package/dist/hooks/chunk-DTAXH2A2.js +240 -0
- package/dist/hooks/chunk-E2IZUWI5.js +375 -0
- package/dist/hooks/chunk-E4L2K2BL.js +397 -0
- package/dist/hooks/chunk-E55NKX5F.js +68 -0
- package/dist/hooks/chunk-ECXVCCVD.js +3079 -0
- package/dist/hooks/chunk-EPHO443D.js +68 -0
- package/dist/hooks/chunk-EUFK2BI2.js +375 -0
- package/dist/hooks/chunk-EYCD5ZAV.js +137 -0
- package/dist/hooks/chunk-F2SDYJU4.js +240 -0
- package/dist/hooks/chunk-F4B5D5TF.js +68 -0
- package/dist/hooks/chunk-FGEO3NDX.js +432 -0
- package/dist/hooks/chunk-FJYI52RE.js +137 -0
- package/dist/hooks/chunk-FXAKJKTB.js +18 -0
- package/dist/hooks/chunk-FYTZHIY4.js +3085 -0
- package/dist/hooks/chunk-G7JL2A5K.js +375 -0
- package/dist/hooks/chunk-GA3ITDBW.js +42 -0
- package/dist/hooks/chunk-GDR4H4SV.js +469 -0
- package/dist/hooks/chunk-GFKDXPSM.js +2855 -0
- package/dist/hooks/chunk-GIMRTKFU.js +566 -0
- package/dist/hooks/chunk-GOPHRLGO.js +240 -0
- package/dist/hooks/chunk-GX4HO7SJ.js +230 -0
- package/dist/hooks/chunk-GXKKK23T.js +240 -0
- package/dist/hooks/chunk-GZ6FUVIK.js +566 -0
- package/dist/hooks/chunk-H5HPY5M5.js +2869 -0
- package/dist/hooks/chunk-HCF3OGEE.js +1829 -0
- package/dist/hooks/chunk-HDEXAOUM.js +469 -0
- package/dist/hooks/chunk-HM2TY3TN.js +469 -0
- package/dist/hooks/chunk-HOA7NXA2.js +55 -0
- package/dist/hooks/chunk-HOFEWH6H.js +240 -0
- package/dist/hooks/chunk-HUUI6S5J.js +2669 -0
- package/dist/hooks/chunk-I4D3NVUD.js +469 -0
- package/dist/hooks/chunk-I4Q6WAJE.js +68 -0
- package/dist/hooks/chunk-IB6N4CR2.js +432 -0
- package/dist/hooks/chunk-IFLDYJMD.js +469 -0
- package/dist/hooks/chunk-IGU466YD.js +77 -0
- package/dist/hooks/chunk-IJCQUHKY.js +375 -0
- package/dist/hooks/chunk-IKUMBDJB.js +230 -0
- package/dist/hooks/chunk-IM3BDIBJ.js +5005 -0
- package/dist/hooks/chunk-IMYMAODK.js +3431 -0
- package/dist/hooks/chunk-IN2ZVGXA.js +5005 -0
- package/dist/hooks/chunk-ITVJ2MKQ.js +18 -0
- package/dist/hooks/chunk-J5RIJYTM.js +2669 -0
- package/dist/hooks/chunk-JFLMH4K5.js +3460 -0
- package/dist/hooks/chunk-JR25IFML.js +77 -0
- package/dist/hooks/chunk-JT5AUXFI.js +432 -0
- package/dist/hooks/chunk-JY5YVN6N.js +3234 -0
- package/dist/hooks/chunk-K5Q4ETVI.js +391 -0
- package/dist/hooks/chunk-K67V2F24.js +137 -0
- package/dist/hooks/chunk-KABG6AEW.js +3460 -0
- package/dist/hooks/chunk-KATZESEC.js +3273 -0
- package/dist/hooks/chunk-KFH4H7W7.js +469 -0
- package/dist/hooks/chunk-KMUEI6RX.js +910 -0
- package/dist/hooks/chunk-KMV4OY77.js +3438 -0
- package/dist/hooks/chunk-KQAZNWEY.js +137 -0
- package/dist/hooks/chunk-KZZR6JER.js +5015 -0
- package/dist/hooks/chunk-LAR6DREP.js +77 -0
- package/dist/hooks/chunk-LNCJWEZD.js +5015 -0
- package/dist/hooks/chunk-LRYD2GLM.js +6 -0
- package/dist/hooks/chunk-LXBKYHDV.js +77 -0
- package/dist/hooks/chunk-LYLKIUNE.js +5024 -0
- package/dist/hooks/chunk-LZKCFOVC.js +432 -0
- package/dist/hooks/chunk-M4FCIYRI.js +77 -0
- package/dist/hooks/chunk-M5M7327Q.js +3425 -0
- package/dist/hooks/chunk-MF72MHSX.js +3455 -0
- package/dist/hooks/chunk-MK56LKDO.js +397 -0
- package/dist/hooks/chunk-N3MJADY7.js +240 -0
- package/dist/hooks/chunk-NFQSUDBN.js +458 -0
- package/dist/hooks/chunk-NHREKY45.js +137 -0
- package/dist/hooks/chunk-NP5TTAAW.js +375 -0
- package/dist/hooks/chunk-NQTLTKTJ.js +2993 -0
- package/dist/hooks/chunk-NVRCZPBZ.js +391 -0
- package/dist/hooks/chunk-O46HMMLJ.js +469 -0
- package/dist/hooks/chunk-OFJGH2L4.js +240 -0
- package/dist/hooks/chunk-OLFMCZH5.js +240 -0
- package/dist/hooks/chunk-OMCZS46I.js +49 -0
- package/dist/hooks/chunk-OQZEZW5G.js +469 -0
- package/dist/hooks/chunk-P2MDAT2Y.js +1897 -0
- package/dist/hooks/chunk-P3M2JJIF.js +68 -0
- package/dist/hooks/chunk-PDVHQITQ.js +3453 -0
- package/dist/hooks/chunk-PNT2AMDH.js +391 -0
- package/dist/hooks/chunk-PR2LVSY6.js +3445 -0
- package/dist/hooks/chunk-PRR5R4JK.js +137 -0
- package/dist/hooks/chunk-PXT44QVN.js +566 -0
- package/dist/hooks/chunk-PZLWJLAP.js +469 -0
- package/dist/hooks/chunk-Q2FEAZJ2.js +77 -0
- package/dist/hooks/chunk-Q32WETDO.js +3265 -0
- package/dist/hooks/chunk-Q45DUBLE.js +3600 -0
- package/dist/hooks/chunk-Q7NZSWQ5.js +240 -0
- package/dist/hooks/chunk-QH2JNAMK.js +3085 -0
- package/dist/hooks/chunk-QNNWYQ2R.js +375 -0
- package/dist/hooks/chunk-QPU5H2OS.js +68 -0
- package/dist/hooks/chunk-QRAHZ5TO.js +1829 -0
- package/dist/hooks/chunk-QUZ5HPIE.js +469 -0
- package/dist/hooks/chunk-QVCRG34O.js +2893 -0
- package/dist/hooks/chunk-R3MY4E3S.js +1675 -0
- package/dist/hooks/chunk-R6TXJJXP.js +77 -0
- package/dist/hooks/chunk-REJU6VT7.js +1829 -0
- package/dist/hooks/chunk-REQAQLRC.js +2993 -0
- package/dist/hooks/chunk-RFCXPAHH.js +391 -0
- package/dist/hooks/chunk-RHI6Y22X.js +137 -0
- package/dist/hooks/chunk-RKZVOBBS.js +469 -0
- package/dist/hooks/chunk-RL57TT2Y.js +566 -0
- package/dist/hooks/chunk-RORDOD4S.js +3321 -0
- package/dist/hooks/chunk-RZKYW5P2.js +77 -0
- package/dist/hooks/chunk-SJPJ6VSI.js +391 -0
- package/dist/hooks/chunk-SKSIJQQQ.js +432 -0
- package/dist/hooks/chunk-SSQDZKXG.js +268 -0
- package/dist/hooks/chunk-SSX23SJ2.js +89 -0
- package/dist/hooks/chunk-SYHFKE4C.js +77 -0
- package/dist/hooks/chunk-TCGNI2ZY.js +42 -0
- package/dist/hooks/chunk-TG3WXJF5.js +137 -0
- package/dist/hooks/chunk-TH7IJAY5.js +77 -0
- package/dist/hooks/chunk-TLZ27PCY.js +240 -0
- package/dist/hooks/chunk-U652FXTN.js +566 -0
- package/dist/hooks/chunk-UEK47YUF.js +268 -0
- package/dist/hooks/chunk-UIO45H3O.js +432 -0
- package/dist/hooks/chunk-UNLZEEVH.js +5005 -0
- package/dist/hooks/chunk-UNRVF3SZ.js +432 -0
- package/dist/hooks/chunk-USLFAFOI.js +3453 -0
- package/dist/hooks/chunk-VAEELMLL.js +442 -0
- package/dist/hooks/chunk-VALSWLDQ.js +3453 -0
- package/dist/hooks/chunk-VC5JEPNY.js +3398 -0
- package/dist/hooks/chunk-VEZVK6C7.js +230 -0
- package/dist/hooks/chunk-VK5JKFAR.js +49 -0
- package/dist/hooks/chunk-VNF2KP7Z.js +469 -0
- package/dist/hooks/chunk-VWWCUMW6.js +2669 -0
- package/dist/hooks/chunk-W4JARUQV.js +137 -0
- package/dist/hooks/chunk-WCYPBPJC.js +5014 -0
- package/dist/hooks/chunk-WEOBMNJG.js +2993 -0
- package/dist/hooks/chunk-WKJU3J5Y.js +5390 -0
- package/dist/hooks/chunk-WMN4TSVF.js +3299 -0
- package/dist/hooks/chunk-WNON54PT.js +3469 -0
- package/dist/hooks/chunk-WOVKBPPX.js +137 -0
- package/dist/hooks/chunk-WRVFORYJ.js +432 -0
- package/dist/hooks/chunk-WUBVYGQZ.js +240 -0
- package/dist/hooks/chunk-WWULTUOM.js +68 -0
- package/dist/hooks/chunk-WXHKKB45.js +4962 -0
- package/dist/hooks/chunk-XAI3YTHJ.js +469 -0
- package/dist/hooks/chunk-XFZH6JZJ.js +77 -0
- package/dist/hooks/chunk-XGPWX6IA.js +137 -0
- package/dist/hooks/chunk-XIXXIVGY.js +566 -0
- package/dist/hooks/chunk-XKDOYJGA.js +922 -0
- package/dist/hooks/chunk-YALTVBHM.js +432 -0
- package/dist/hooks/chunk-YEBEPBFK.js +5014 -0
- package/dist/hooks/chunk-YI2BQ3DK.js +3441 -0
- package/dist/hooks/chunk-YVNBCFGG.js +1829 -0
- package/dist/hooks/chunk-YXBN3RGG.js +432 -0
- package/dist/hooks/chunk-Z2OOJSW3.js +3163 -0
- package/dist/hooks/chunk-ZA3HVBOY.js +2644 -0
- package/dist/hooks/chunk-ZKID46U3.js +137 -0
- package/dist/hooks/chunk-ZPMU2JV6.js +49 -0
- package/dist/hooks/chunk-ZRKY4W7O.js +432 -0
- package/dist/hooks/chunk-ZTMRB7LJ.js +268 -0
- package/dist/hooks/chunk-ZVPPBQ3L.js +3413 -0
- package/dist/hooks/codex-hook-adapter.js +164 -0
- package/dist/hooks/duplicate-read-guard.js +29 -0
- package/dist/hooks/format-edited.js +37 -0
- package/dist/hooks/investigation-guard.js +31 -0
- package/dist/hooks/pretool-guard.js +21 -0
- package/dist/hooks/session-lang.js +34 -0
- package/dist/hooks/stop-guard.js +1597 -0
- package/dist/josh.js +1795 -0
- package/dist/managed-marker/index.d.ts +10 -0
- package/dist/managed-marker/index.js +32 -0
- package/dist/self-sync-guard/index.d.ts +10 -0
- package/dist/self-sync-guard/index.js +49 -0
- package/dist/version/index.d.ts +93 -0
- package/dist/version/index.js +1024 -0
- package/env/index.d.ts +7 -0
- package/env/index.js +62 -0
- package/eslint/base.js +233 -0
- package/eslint/checkout-rooted-parser.js +34 -0
- package/eslint/config-fingerprint.js +103 -0
- package/eslint/rules/code-quality.js +292 -0
- package/eslint/rules/english-only-prose.js +135 -0
- package/eslint/rules/formatting.js +44 -0
- package/eslint/rules/import.js +83 -0
- package/eslint/rules/namespace-object-export.js +107 -0
- package/eslint/rules/naming-convention.js +109 -0
- package/eslint/rules/promise.js +17 -0
- package/eslint/rules/sonarjs.js +45 -0
- package/eslint/rules/test-filename.js +91 -0
- package/eslint/rules/typescript.js +186 -0
- package/eslint/rules/unicorn.js +191 -0
- package/eslint/vanilla.js +1 -0
- package/evals/scenarios/consult-not-execute.json +20 -0
- package/evals/scenarios/no-implicit-workflow.json +26 -0
- package/evals/scenarios/overrides-both-locations.json +29 -0
- package/evals/scenarios/upstream-interrupt.json +23 -0
- package/evals/scenarios/workflow-skill-loaded.json +16 -0
- package/lefthook/base.yml +131 -0
- package/lefthook/vanilla.yml +7 -0
- package/package.json +169 -0
- package/playwright.config.ts +160 -0
- package/pnpm-workspace.yaml +41 -0
- package/ports/index.d.ts +17 -0
- package/ports/index.js +256 -0
- package/prettier/index.d.ts +3 -0
- package/prettier/index.js +31 -0
- package/prompts/agent-lint-protocol.json +79 -0
- package/prompts/agent-rules.md +63 -0
- package/prompts/coding-standards.md +382 -0
- package/prompts/collaboration-workflow/consultation-vs-execution.md +8 -0
- package/prompts/collaboration-workflow/cross-repo-epic.md +54 -0
- package/prompts/collaboration-workflow/distributed-docs.md +7 -0
- package/prompts/collaboration-workflow/durable-rules.md +24 -0
- package/prompts/collaboration-workflow/epic-audit.md +56 -0
- package/prompts/collaboration-workflow/epic-bundle.md +109 -0
- package/prompts/collaboration-workflow/file-edits.md +124 -0
- package/prompts/collaboration-workflow/gh-rest.md +57 -0
- package/prompts/collaboration-workflow/issue-citation.md +38 -0
- package/prompts/collaboration-workflow/issue-template.md +190 -0
- package/prompts/collaboration-workflow/latest-first.md +14 -0
- package/prompts/collaboration-workflow/no-clones.md +11 -0
- package/prompts/collaboration-workflow/operating-rules.md +123 -0
- package/prompts/collaboration-workflow/output-bounds.md +107 -0
- package/prompts/collaboration-workflow/overview.md +35 -0
- package/prompts/collaboration-workflow/plan-comment.md +85 -0
- package/prompts/collaboration-workflow/proposal-request.md +23 -0
- package/prompts/collaboration-workflow/report-format.md +206 -0
- package/prompts/collaboration-workflow/residency.md +94 -0
- package/prompts/collaboration-workflow/rule-delivery.md +146 -0
- package/prompts/collaboration-workflow/shell-body.md +82 -0
- package/prompts/collaboration-workflow/simplicity-first.md +9 -0
- package/prompts/collaboration-workflow/single-source-rules.md +13 -0
- package/prompts/collaboration-workflow/turn-batching.md +137 -0
- package/prompts/collaboration-workflow/upstream-interrupt.md +51 -0
- package/prompts/collaboration-workflow/wip-cap.md +118 -0
- package/prompts/collaboration-workflow.md +52 -0
- package/prompts/refactoring.md +103 -0
- package/prompts/review-rubric.md +338 -0
- package/prompts/review.md +217 -0
- package/prompts/sonar-hotspot-handling.md +77 -0
- package/prompts/testing-guide.md +277 -0
- package/scripts/adopt/adopt-logic.ts +107 -0
- package/scripts/adopt/adopt-toolkits.ts +181 -0
- package/scripts/adopt/adopt.ts +171 -0
- package/scripts/agent/agent-argv.ts +140 -0
- package/scripts/agent/agent-diagnostics.ts +120 -0
- package/scripts/agent/agent-event.ts +173 -0
- package/scripts/agent/agent-exit-record.ts +32 -0
- package/scripts/agent/agent-launch-environment.ts +71 -0
- package/scripts/agent/agent-role-profile.ts +329 -0
- package/scripts/agent/api-outage.ts +51 -0
- package/scripts/agent/claude-agent-argv.ts +151 -0
- package/scripts/agent/claude-result-event.ts +98 -0
- package/scripts/agent/codex-agent-argv.ts +94 -0
- package/scripts/agent/codex-home-source.ts +11 -0
- package/scripts/agent/interactive-ask.ts +91 -0
- package/scripts/auto-ok/auto-ok-cli.ts +516 -0
- package/scripts/backlog/backlog-arrival.ts +147 -0
- package/scripts/backlog/backlog-budget-cli.ts +220 -0
- package/scripts/backlog/backlog-budget.ts +284 -0
- package/scripts/backlog/backlog-defect-priority.ts +77 -0
- package/scripts/backlog/backlog-drive-cli.ts +377 -0
- package/scripts/backlog/backlog-drive-finish.ts +23 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +81 -0
- package/scripts/backlog/backlog-drive-named.ts +101 -0
- package/scripts/backlog/backlog-drive-offer-argv.ts +29 -0
- package/scripts/backlog/backlog-drive-owner.ts +22 -0
- package/scripts/backlog/backlog-drive-restore.ts +67 -0
- package/scripts/backlog/backlog-drive.ts +322 -0
- package/scripts/backlog/backlog-named.ts +164 -0
- package/scripts/backlog/backlog-next.ts +376 -0
- package/scripts/backlog/backlog-offer-cli.ts +279 -0
- package/scripts/backlog/backlog-offer.ts +93 -0
- package/scripts/backlog/backlog-plan-cli.ts +235 -0
- package/scripts/backlog/backlog-plan.ts +231 -0
- package/scripts/backlog/backlog-pool.ts +322 -0
- package/scripts/backlog/backlog-ready.ts +146 -0
- package/scripts/backlog/backlog-scope.ts +144 -0
- package/scripts/backlog/backlog-stalled-cli.ts +30 -0
- package/scripts/backlog/backlog-stalled-detect.ts +143 -0
- package/scripts/backlog/backlog-stalled.ts +118 -0
- package/scripts/behavior/behavior-assertion.ts +87 -0
- package/scripts/behavior/behavior-cli.ts +88 -0
- package/scripts/behavior/behavior-rules.ts +128 -0
- package/scripts/build/build-bin.ts +36 -0
- package/scripts/build/build-claude-md.ts +42 -0
- package/scripts/build/build-config-merge.ts +26 -0
- package/scripts/build/build-hooks.ts +79 -0
- package/scripts/build/build-library.ts +83 -0
- package/scripts/build/build-managed-marker.ts +26 -0
- package/scripts/build/build-self-sync-guard.ts +26 -0
- package/scripts/build/build-version.ts +25 -0
- package/scripts/build/local-bin.ts +97 -0
- package/scripts/build/shim-shell.ts +25 -0
- package/scripts/bytes/bytes-command.ts +181 -0
- package/scripts/cases/cases-cli.ts +48 -0
- package/scripts/cases/cases-logic.ts +100 -0
- package/scripts/claude/skill-meta.ts +37 -0
- package/scripts/claude/workflow-destination.ts +13 -0
- package/scripts/clone/clone-aggregate.ts +76 -0
- package/scripts/clone/clone-fingerprint.ts +96 -0
- package/scripts/clone/clone-scan-cli.ts +39 -0
- package/scripts/clone/clone-scan.ts +158 -0
- package/scripts/config-merge/index.ts +19 -0
- package/scripts/config-merge/json-format.ts +128 -0
- package/scripts/config-merge/list-patch.ts +61 -0
- package/scripts/config-merge/parse-jsonc.ts +14 -0
- package/scripts/config-merge/patch-json-key.ts +439 -0
- package/scripts/config-merge/patch-json-list.ts +38 -0
- package/scripts/config-merge/patch-yaml-list.ts +107 -0
- package/scripts/cost-runtime/codex-usage.ts +119 -0
- package/scripts/cost-runtime/context-cut-payback.ts +77 -0
- package/scripts/cost-runtime/context-cut-threshold.ts +21 -0
- package/scripts/cost-runtime/cost-attribute.ts +168 -0
- package/scripts/cost-runtime/cost-blocks.ts +149 -0
- package/scripts/cost-runtime/cost-cli.ts +318 -0
- package/scripts/cost-runtime/cost-corpus.ts +278 -0
- package/scripts/cost-runtime/cost-format.ts +32 -0
- package/scripts/cost-runtime/cost-pricing.ts +176 -0
- package/scripts/cost-runtime/cost-tokens.ts +84 -0
- package/scripts/cost-runtime/cost-transcript.ts +531 -0
- package/scripts/cost-runtime/cost-usage.ts +287 -0
- package/scripts/cost-runtime/cost-verdict.ts +89 -0
- package/scripts/cost-runtime/own-session.ts +58 -0
- package/scripts/cost-runtime/transcript-cwd.ts +14 -0
- package/scripts/delegation/delegation-cli.ts +91 -0
- package/scripts/delegation/delegation-policy.ts +178 -0
- package/scripts/delegation/duplicate-read-guard.ts +244 -0
- package/scripts/delegation/fanout-cli.ts +61 -0
- package/scripts/delegation/fanout.ts +95 -0
- package/scripts/delegation/investigation-guard.ts +131 -0
- package/scripts/delegation/investigation-reads.ts +637 -0
- package/scripts/discovery/repo-discovery.ts +166 -0
- package/scripts/discovery/repo-map-logic.ts +102 -0
- package/scripts/discovery/repo-origin.ts +153 -0
- package/scripts/discovery/repo-party-cli.ts +69 -0
- package/scripts/discovery/repo-party.ts +46 -0
- package/scripts/doctor/doctor-consumer.ts +181 -0
- package/scripts/doctor/doctor-io.ts +210 -0
- package/scripts/doctor/doctor-logic.ts +122 -0
- package/scripts/doctor/doctor-ports.ts +117 -0
- package/scripts/doctor/doctor.ts +232 -0
- package/scripts/document/backlogrun-parent-read-set.ts +48 -0
- package/scripts/document/bash-output-cap.ts +45 -0
- package/scripts/document/document-byte-budget.ts +183 -0
- package/scripts/document/document-byte-check.ts +131 -0
- package/scripts/document/document-reachability.ts +131 -0
- package/scripts/document/document-read-cli.ts +82 -0
- package/scripts/document/document-scan.ts +108 -0
- package/scripts/document/document-section-cli.ts +101 -0
- package/scripts/document/document-section.ts +156 -0
- package/scripts/document/edit-files-cli.ts +280 -0
- package/scripts/document/entry-read-budget.ts +154 -0
- package/scripts/document/entry-read-set.ts +471 -0
- package/scripts/document/generate-catalog.ts +69 -0
- package/scripts/document/lane-child-read-set.ts +88 -0
- package/scripts/document/read-files-cli.ts +135 -0
- package/scripts/document/read-set-cli.ts +295 -0
- package/scripts/document/read-set-point-of-use.ts +89 -0
- package/scripts/document/read-set-pricing.ts +52 -0
- package/scripts/document/read-set-trim.ts +78 -0
- package/scripts/document/retired-phrases.ts +143 -0
- package/scripts/document/review-agent-type.ts +46 -0
- package/scripts/document/single-source.ts +73 -0
- package/scripts/epic/epic-audit-checks.ts +452 -0
- package/scripts/epic/epic-audit-cli.ts +374 -0
- package/scripts/epic/epic-audit-orphans.ts +142 -0
- package/scripts/epic/epic-audit-rationale.ts +191 -0
- package/scripts/epic/epic-audit-report.ts +101 -0
- package/scripts/epic/epic-audit.ts +240 -0
- package/scripts/epic/epic-bundle-cli.ts +472 -0
- package/scripts/epic/epic-bundle-evidence.ts +147 -0
- package/scripts/epic/epic-bundle-gaps.ts +86 -0
- package/scripts/epic/epic-bundle-referenced.ts +195 -0
- package/scripts/epic/epic-bundle.ts +309 -0
- package/scripts/epic/epic-busy.ts +204 -0
- package/scripts/epic/epic-candidate-confirm.ts +279 -0
- package/scripts/epic/epic-classify.ts +294 -0
- package/scripts/epic/epic-cross-repo.ts +366 -0
- package/scripts/epic/epic-fetch.ts +370 -0
- package/scripts/epic/epic-graph.ts +279 -0
- package/scripts/epic/epic-index.ts +209 -0
- package/scripts/epic/epic-issue.ts +172 -0
- package/scripts/epic/epic-lane-offer.ts +207 -0
- package/scripts/epic/epic-nested.ts +37 -0
- package/scripts/epic/epic-next-read.ts +141 -0
- package/scripts/epic/epic-next-views.ts +144 -0
- package/scripts/epic/epic-next.ts +477 -0
- package/scripts/epic/epic-outside-blocker.ts +113 -0
- package/scripts/epic/epic-relation-recheck.ts +108 -0
- package/scripts/epic/epic-report.ts +200 -0
- package/scripts/gate/core-budget.ts +292 -0
- package/scripts/gate/gate-log.ts +95 -0
- package/scripts/gate/gate-plan.ts +356 -0
- package/scripts/gate/gate-report.ts +207 -0
- package/scripts/gate/gate-skip.ts +123 -0
- package/scripts/gate/gate-tree.ts +49 -0
- package/scripts/gate/hook-gate-reuse.ts +130 -0
- package/scripts/gate/pre-commit-type-check.ts +187 -0
- package/scripts/gate/scoped-green.ts +260 -0
- package/scripts/gate/type-check-step.ts +90 -0
- package/scripts/gate/verification-gate.ts +531 -0
- package/scripts/gh/fix-gh-packages-logic.ts +232 -0
- package/scripts/gh/fix-gh-packages.ts +129 -0
- package/scripts/gh/gh-cli-token.ts +18 -0
- package/scripts/gh/gh-spawn.ts +44 -0
- package/scripts/git/animation-helpers.ts +81 -0
- package/scripts/git/change-base.ts +26 -0
- package/scripts/git/changed-file-scope.ts +209 -0
- package/scripts/git/changed-paths.ts +30 -0
- package/scripts/git/constants.ts +41 -0
- package/scripts/git/git-ai-review-scan.ts +154 -0
- package/scripts/git/git-animation.ts +41 -0
- package/scripts/git/git-branch.ts +127 -0
- package/scripts/git/git-command.ts +587 -0
- package/scripts/git/git-commit.ts +27 -0
- package/scripts/git/git-common-directory.ts +38 -0
- package/scripts/git/git-epic-add-body.ts +365 -0
- package/scripts/git/git-epic-add-plan.ts +421 -0
- package/scripts/git/git-epic-add.ts +249 -0
- package/scripts/git/git-epic-body.ts +150 -0
- package/scripts/git/git-epic-chains.ts +411 -0
- package/scripts/git/git-epic-close-comment.ts +199 -0
- package/scripts/git/git-epic-close.ts +393 -0
- package/scripts/git/git-epic-decision.ts +171 -0
- package/scripts/git/git-epic-parse.ts +351 -0
- package/scripts/git/git-epic-promote.ts +102 -0
- package/scripts/git/git-epic-read.ts +73 -0
- package/scripts/git/git-epic-reconcile.ts +246 -0
- package/scripts/git/git-epic-reference.ts +98 -0
- package/scripts/git/git-epic-relations.ts +78 -0
- package/scripts/git/git-epic-remove-plan.ts +152 -0
- package/scripts/git/git-epic-remove.ts +101 -0
- package/scripts/git/git-epic-run.ts +223 -0
- package/scripts/git/git-epic-sections.ts +98 -0
- package/scripts/git/git-epic-shape.ts +81 -0
- package/scripts/git/git-epic-validate.ts +155 -0
- package/scripts/git/git-error.ts +78 -0
- package/scripts/git/git-execa-error.ts +35 -0
- package/scripts/git/git-fixture-workspace.ts +88 -0
- package/scripts/git/git-followup-cleanup.ts +88 -0
- package/scripts/git/git-followup-flush.ts +63 -0
- package/scripts/git/git-followup-label.ts +67 -0
- package/scripts/git/git-followup-pending.ts +95 -0
- package/scripts/git/git-followup-stages.ts +149 -0
- package/scripts/git/git-gh-api-path.ts +118 -0
- package/scripts/git/git-gh-check.ts +21 -0
- package/scripts/git/git-gh-command.ts +17 -0
- package/scripts/git/git-gh-exec.ts +344 -0
- package/scripts/git/git-gh-failure.ts +103 -0
- package/scripts/git/git-gh-helpers.ts +44 -0
- package/scripts/git/git-gh-issue-list.ts +257 -0
- package/scripts/git/git-gh-issue-read.ts +457 -0
- package/scripts/git/git-gh-issue-rest.ts +238 -0
- package/scripts/git/git-gh-issue-write.ts +285 -0
- package/scripts/git/git-gh-issue.ts +161 -0
- package/scripts/git/git-gh-pr-auto-merge.ts +85 -0
- package/scripts/git/git-gh-pr-read.ts +322 -0
- package/scripts/git/git-gh-pr-rest.ts +172 -0
- package/scripts/git/git-gh-pr-review.ts +103 -0
- package/scripts/git/git-gh-pr-rollup.ts +91 -0
- package/scripts/git/git-gh-pr-snapshot.ts +138 -0
- package/scripts/git/git-gh-pr.ts +219 -0
- package/scripts/git/git-gh-reachability.ts +56 -0
- package/scripts/git/git-gh-repo.ts +37 -0
- package/scripts/git/git-gh-rest-state.ts +14 -0
- package/scripts/git/git-issue.ts +168 -0
- package/scripts/git/git-location-environment.ts +62 -0
- package/scripts/git/git-ls-remote.ts +28 -0
- package/scripts/git/git-next-issues.ts +98 -0
- package/scripts/git/git-notify.ts +104 -0
- package/scripts/git/git-pr-ai-review.ts +180 -0
- package/scripts/git/git-pr-checks-eval.ts +265 -0
- package/scripts/git/git-pr-checks-parse.ts +153 -0
- package/scripts/git/git-pr-checks-watch.ts +184 -0
- package/scripts/git/git-pr-checks.ts +387 -0
- package/scripts/git/git-pr-coderabbit.ts +129 -0
- package/scripts/git/git-pr-confirmation.ts +64 -0
- package/scripts/git/git-pr-error.ts +25 -0
- package/scripts/git/git-pr-followup-wrapup.ts +225 -0
- package/scripts/git/git-pr-followup.ts +436 -0
- package/scripts/git/git-pr-managed-config.ts +69 -0
- package/scripts/git/git-pr-messages.ts +37 -0
- package/scripts/git/git-pr.ts +181 -0
- package/scripts/git/git-prompt-display.ts +22 -0
- package/scripts/git/git-prompt.ts +207 -0
- package/scripts/git/git-push-transport.ts +173 -0
- package/scripts/git/git-push.ts +27 -0
- package/scripts/git/git-remote-branch.ts +40 -0
- package/scripts/git/git-spawn.ts +47 -0
- package/scripts/git/git-staging.ts +128 -0
- package/scripts/git/git-stash.ts +124 -0
- package/scripts/git/git-status.ts +198 -0
- package/scripts/git/git-worktree.ts +110 -0
- package/scripts/git/github-issue-url.ts +105 -0
- package/scripts/git/gone-branch.ts +113 -0
- package/scripts/git/issue-labels.ts +279 -0
- package/scripts/git/listing-cutoff.ts +51 -0
- package/scripts/git/main-merge-guard.ts +134 -0
- package/scripts/git/main-merge.ts +120 -0
- package/scripts/git/main-sync.ts +121 -0
- package/scripts/git/parse-json-array.ts +102 -0
- package/scripts/git/schemas.ts +166 -0
- package/scripts/git/stash-orphans.ts +91 -0
- package/scripts/git/stash-pop-args.ts +59 -0
- package/scripts/git/stash-pop-cli.ts +105 -0
- package/scripts/git/telegram-notify.ts +404 -0
- package/scripts/hooks/batch-guard.ts +144 -0
- package/scripts/hooks/check-commit-message.ts +134 -0
- package/scripts/hooks/codex-hook-adapter.ts +155 -0
- package/scripts/hooks/edited-cspell.ts +128 -0
- package/scripts/hooks/format-edited-file-fixtures.ts +109 -0
- package/scripts/hooks/format-edited-file.ts +510 -0
- package/scripts/hooks/format-rewrite-notice.ts +99 -0
- package/scripts/hooks/pre-push-unit.ts +146 -0
- package/scripts/hooks/pretool-guard.ts +96 -0
- package/scripts/hooks/prevent-main-commit.ts +38 -0
- package/scripts/hooks/prompt-hooks.ts +38 -0
- package/scripts/hooks/reserved-run.ts +90 -0
- package/scripts/hooks/stop-guard.ts +135 -0
- package/scripts/init/claude-plugin-config.ts +51 -0
- package/scripts/init/distributed-paths.ts +100 -0
- package/scripts/init/hook-command-rewrite.ts +85 -0
- package/scripts/init/hook-launch.ts +31 -0
- package/scripts/init/init-actions.ts +147 -0
- package/scripts/init/init-ai-copy.ts +235 -0
- package/scripts/init/init-copy-content.ts +50 -0
- package/scripts/init/init-logic-deploy-vps.ts +43 -0
- package/scripts/init/init-logic-json-merge.ts +340 -0
- package/scripts/init/init-logic-migrate.ts +62 -0
- package/scripts/init/init-logic-package-key-order.ts +50 -0
- package/scripts/init/init-logic-secretlint.ts +36 -0
- package/scripts/init/init-logic-sonar.ts +197 -0
- package/scripts/init/init-logic-templates.ts +142 -0
- package/scripts/init/init-logic-workspace.ts +59 -0
- package/scripts/init/init-logic-yaml-merge.ts +57 -0
- package/scripts/init/init-logic.ts +474 -0
- package/scripts/init/init-paths.ts +11 -0
- package/scripts/init/init-sonar.ts +32 -0
- package/scripts/init/init.ts +219 -0
- package/scripts/init/kit-base-preset.ts +60 -0
- package/scripts/init/plugin-install-hint.ts +47 -0
- package/scripts/init/tsconfig-preset-migration.ts +67 -0
- package/scripts/issue/baseline-measure.ts +105 -0
- package/scripts/issue/behavior-change-lint.ts +122 -0
- package/scripts/issue/defect-rate-cli.ts +167 -0
- package/scripts/issue/defect-rate.ts +145 -0
- package/scripts/issue/issue-backlinks-cli.ts +97 -0
- package/scripts/issue/issue-backlinks.ts +164 -0
- package/scripts/issue/issue-cite-cli.ts +158 -0
- package/scripts/issue/issue-cite.ts +102 -0
- package/scripts/issue/issue-comment-cli.ts +95 -0
- package/scripts/issue/issue-fold-cli.ts +104 -0
- package/scripts/issue/issue-fold-existing-cli.ts +81 -0
- package/scripts/issue/issue-fold-existing.ts +73 -0
- package/scripts/issue/issue-fold.ts +42 -0
- package/scripts/issue/issue-lint-cli.ts +60 -0
- package/scripts/issue/issue-lint.ts +26 -0
- package/scripts/issue/issue-logic.ts +50 -0
- package/scripts/issue/issue-read-cli.ts +190 -0
- package/scripts/issue/issue-read.ts +145 -0
- package/scripts/issue/issue-scout-cli.ts +482 -0
- package/scripts/issue/issue-scout.ts +244 -0
- package/scripts/issue/issue-state-cli.ts +260 -0
- package/scripts/issue/issue-state.ts +109 -0
- package/scripts/issue/markdown-section.ts +39 -0
- package/scripts/issue/measure-rerun-cli.ts +98 -0
- package/scripts/issue/reproduction-measure.ts +59 -0
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +1171 -0
- package/scripts/josh/agent-session-environment.ts +188 -0
- package/scripts/josh/cli-body.ts +96 -0
- package/scripts/josh/command-suggest.ts +57 -0
- package/scripts/josh/file-map-stamp.ts +264 -0
- package/scripts/josh/hook-decision.ts +479 -0
- package/scripts/josh/josh-command-map.ts +196 -0
- package/scripts/josh/josh-command-types.ts +226 -0
- package/scripts/josh/josh-commands-ai.ts +327 -0
- package/scripts/josh/josh-commands-backlog.ts +54 -0
- package/scripts/josh/josh-commands-clone.ts +18 -0
- package/scripts/josh/josh-commands-development.ts +206 -0
- package/scripts/josh/josh-commands-document.ts +45 -0
- package/scripts/josh/josh-commands-guard.ts +38 -0
- package/scripts/josh/josh-commands-hooks.ts +42 -0
- package/scripts/josh/josh-commands-issue.ts +69 -0
- package/scripts/josh/josh-commands-lane.ts +75 -0
- package/scripts/josh/josh-commands-lint.ts +37 -0
- package/scripts/josh/josh-commands-maintenance.ts +80 -0
- package/scripts/josh/josh-commands-project.ts +53 -0
- package/scripts/josh/josh-commands-split.ts +20 -0
- package/scripts/josh/josh-commands-versioning.ts +48 -0
- package/scripts/josh/josh-commands-workflow.ts +116 -0
- package/scripts/josh/josh-composite-arguments.ts +55 -0
- package/scripts/josh/josh-environment-file.ts +31 -0
- package/scripts/josh/josh-in-process.ts +80 -0
- package/scripts/josh/josh-logic.ts +308 -0
- package/scripts/josh/josh-run.ts +53 -0
- package/scripts/josh/josh-script-reader.ts +11 -0
- package/scripts/josh/josh-verdict.ts +111 -0
- package/scripts/josh/josh.ts +60 -0
- package/scripts/josh/kit-only.ts +33 -0
- package/scripts/josh/path-decision.ts +104 -0
- package/scripts/josh/platform-temporary.ts +66 -0
- package/scripts/josh/process-identity.ts +335 -0
- package/scripts/josh/session-language-cli.ts +51 -0
- package/scripts/josh/session-language.ts +30 -0
- package/scripts/josh/stamp-file.ts +194 -0
- package/scripts/lane/lane-await.ts +165 -0
- package/scripts/lane/lane-cache-run.ts +39 -0
- package/scripts/lane/lane-cache.ts +135 -0
- package/scripts/lane/lane-capacity.ts +69 -0
- package/scripts/lane/lane-child-invocation.ts +73 -0
- package/scripts/lane/lane-child-marker.ts +58 -0
- package/scripts/lane/lane-cli.ts +410 -0
- package/scripts/lane/lane-close.ts +197 -0
- package/scripts/lane/lane-dispatch-log.ts +13 -0
- package/scripts/lane/lane-dispatch.ts +458 -0
- package/scripts/lane/lane-environment.ts +253 -0
- package/scripts/lane/lane-guard-policy.ts +136 -0
- package/scripts/lane/lane-install.ts +94 -0
- package/scripts/lane/lane-launch-cli.ts +133 -0
- package/scripts/lane/lane-occupancy.ts +112 -0
- package/scripts/lane/lane-open.ts +275 -0
- package/scripts/lane/lane-output.ts +124 -0
- package/scripts/lane/lane-paths.ts +96 -0
- package/scripts/lane/lane-reap.ts +137 -0
- package/scripts/lane/lane-registry.ts +261 -0
- package/scripts/lane/lane-relaunch.ts +68 -0
- package/scripts/lane/lane-report.ts +95 -0
- package/scripts/lane/lane-resume.ts +61 -0
- package/scripts/lane/lane-seed.ts +44 -0
- package/scripts/lane/lane-start-point.ts +175 -0
- package/scripts/lane/openai-lane-supervisor-cli.ts +32 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +63 -0
- package/scripts/lane/openai-lane-supervisor.ts +337 -0
- package/scripts/lib/bounded-pool.ts +109 -0
- package/scripts/lib/buffered-process.ts +82 -0
- package/scripts/lib/caddy-logs.sh +45 -0
- package/scripts/lib/cli-flags.ts +19 -0
- package/scripts/lib/json-value.ts +24 -0
- package/scripts/lib/poll.ts +57 -0
- package/scripts/lib/read-file.ts +16 -0
- package/scripts/lib/schemas.ts +67 -0
- package/scripts/lib/spawn-exit.ts +45 -0
- package/scripts/lib/status-icons.ts +24 -0
- package/scripts/lines/effective-limit.ts +156 -0
- package/scripts/lines/line-budget.ts +404 -0
- package/scripts/lines/line-targets.ts +80 -0
- package/scripts/lines/lines-command.ts +174 -0
- package/scripts/lint/cspell-cached.ts +41 -0
- package/scripts/lint/lint-parallel.ts +72 -0
- package/scripts/lint/lint-related-scope.ts +128 -0
- package/scripts/lint/lint-related.ts +104 -0
- package/scripts/managed-marker/index.ts +5 -0
- package/scripts/managed-marker/managed-marker-logic.ts +67 -0
- package/scripts/observations/observation-ledger-home.ts +32 -0
- package/scripts/observations/observation-ledger-line.ts +93 -0
- package/scripts/observations/observation-ledger.ts +35 -0
- package/scripts/observations/observations-flush-cli.ts +42 -0
- package/scripts/observations/observations-flush-landing.ts +97 -0
- package/scripts/observations/observations-flush.ts +420 -0
- package/scripts/overrides/lockfile-overrides.ts +105 -0
- package/scripts/overrides/overrides-check.ts +84 -0
- package/scripts/overrides/overrides-files.ts +19 -0
- package/scripts/overrides/overrides-logic.ts +211 -0
- package/scripts/overrides/schemas.ts +49 -0
- package/scripts/package/package-scout-cli.ts +195 -0
- package/scripts/package/package-scout-format.ts +151 -0
- package/scripts/package/package-scout.ts +121 -0
- package/scripts/ports/port-command.ts +87 -0
- package/scripts/propagate/propagate-git-failure.ts +191 -0
- package/scripts/propagate/propagate-git.ts +224 -0
- package/scripts/propagate/propagate-publish.ts +181 -0
- package/scripts/propagate/propagate-run.ts +201 -0
- package/scripts/propagate/propagate-steps.ts +421 -0
- package/scripts/propagate/propagate-targets.ts +160 -0
- package/scripts/propagate/propagate.ts +216 -0
- package/scripts/refactor/import-graph.ts +187 -0
- package/scripts/refactor/refactor-lint.ts +250 -0
- package/scripts/refactor/refactor-scan-cli.ts +10 -0
- package/scripts/refactor/refactor-scan.ts +124 -0
- package/scripts/refactor/refactor-targets.ts +103 -0
- package/scripts/release/release-cli.ts +88 -0
- package/scripts/release/release-history.ts +132 -0
- package/scripts/release/release-plan.ts +130 -0
- package/scripts/release/release-publish.ts +152 -0
- package/scripts/release/release-scope-cli.ts +103 -0
- package/scripts/release/release-tag.ts +93 -0
- package/scripts/release/release-worktree.ts +71 -0
- package/scripts/repo/auto-merge-setting-logic.ts +100 -0
- package/scripts/repo/auto-merge-setting.ts +37 -0
- package/scripts/repo/repo-setting.ts +112 -0
- package/scripts/report/report-lint-cli.ts +49 -0
- package/scripts/report/report-lint.ts +250 -0
- package/scripts/retrospective/retrospective-cli.ts +97 -0
- package/scripts/retrospective/retrospective.ts +127 -0
- package/scripts/review/disposition-cli.ts +44 -0
- package/scripts/review/disposition-logic.ts +45 -0
- package/scripts/review/live-evidence.ts +62 -0
- package/scripts/review/review-attest-cli.ts +115 -0
- package/scripts/review/review-attest.ts +319 -0
- package/scripts/review/review-brief-cli.ts +290 -0
- package/scripts/review/review-brief.ts +440 -0
- package/scripts/review/review-checkout.ts +56 -0
- package/scripts/review/review-finding-ledger.ts +167 -0
- package/scripts/review/review-findings-cli.ts +57 -0
- package/scripts/review/review-level.ts +86 -0
- package/scripts/review/review-record-cli.ts +196 -0
- package/scripts/review/review-record.ts +74 -0
- package/scripts/review/review-round2-cli.ts +84 -0
- package/scripts/review/review-round2.ts +139 -0
- package/scripts/review/review-stamps.ts +113 -0
- package/scripts/review/review-tree.ts +58 -0
- package/scripts/rules/bash-triggers.ts +44 -0
- package/scripts/rules/decision-oracle.ts +342 -0
- package/scripts/rules/delivered-rules-harness.ts +72 -0
- package/scripts/rules/delivered-rules.ts +793 -0
- package/scripts/rules/early-heartbeat.ts +241 -0
- package/scripts/rules/file-body.ts +150 -0
- package/scripts/rules/filing-cap.ts +133 -0
- package/scripts/rules/filing-offer.ts +81 -0
- package/scripts/rules/firing-point.ts +63 -0
- package/scripts/rules/gh-api.ts +65 -0
- package/scripts/rules/git-argv.ts +129 -0
- package/scripts/rules/git-force.ts +104 -0
- package/scripts/rules/implementation-cut-verdict.ts +84 -0
- package/scripts/rules/implementation-cut.ts +202 -0
- package/scripts/rules/issue-citation.ts +242 -0
- package/scripts/rules/issue-fold.ts +73 -0
- package/scripts/rules/issue-scout.ts +64 -0
- package/scripts/rules/josh-git-bare.ts +80 -0
- package/scripts/rules/lane-carry-conflict.ts +96 -0
- package/scripts/rules/lane-interactive-ask.ts +71 -0
- package/scripts/rules/lane-park.ts +122 -0
- package/scripts/rules/lane-switch-main.ts +139 -0
- package/scripts/rules/oracle-consulted.ts +81 -0
- package/scripts/rules/oracle-firing.ts +151 -0
- package/scripts/rules/oracle-list-cli.ts +81 -0
- package/scripts/rules/piped-verification.ts +126 -0
- package/scripts/rules/poll-loop.ts +125 -0
- package/scripts/rules/pre-gate-cut.ts +207 -0
- package/scripts/rules/prior-comment-read.ts +106 -0
- package/scripts/rules/raw-field-body.ts +56 -0
- package/scripts/rules/reply-language.ts +116 -0
- package/scripts/rules/rule-body-guard.ts +206 -0
- package/scripts/rules/rule-guard.ts +23 -0
- package/scripts/rules/rule-value-cli.ts +129 -0
- package/scripts/rules/rule-value.ts +397 -0
- package/scripts/rules/run-tail.ts +178 -0
- package/scripts/rules/shell-body-trigger.ts +204 -0
- package/scripts/rules/shell-segments.ts +45 -0
- package/scripts/rules/stop-rules.ts +329 -0
- package/scripts/rules/tail-commands.ts +35 -0
- package/scripts/rules/test-declared-commit.ts +51 -0
- package/scripts/rules/third-party-write.ts +90 -0
- package/scripts/rules/top-level-scripts-guard.ts +47 -0
- package/scripts/rules/worktree-guard.ts +130 -0
- package/scripts/run/detached-launch.ts +360 -0
- package/scripts/run/run-carry-args.ts +264 -0
- package/scripts/run/run-carry-change.ts +69 -0
- package/scripts/run/run-carry-cli.ts +441 -0
- package/scripts/run/run-carry-flush.ts +63 -0
- package/scripts/run/run-carry-stash.ts +71 -0
- package/scripts/run/run-carry-streak.ts +113 -0
- package/scripts/run/run-carry.ts +550 -0
- package/scripts/run/run-cut-args.ts +132 -0
- package/scripts/run/run-cut-cli.ts +461 -0
- package/scripts/run/run-cut-handoff.ts +126 -0
- package/scripts/run/run-cut.ts +531 -0
- package/scripts/run/run-ending-cli.ts +111 -0
- package/scripts/run/run-ending.ts +239 -0
- package/scripts/run/run-entry-cli.ts +135 -0
- package/scripts/run/run-entry.ts +95 -0
- package/scripts/run/run-event-cli.ts +210 -0
- package/scripts/run/run-event-follow.ts +65 -0
- package/scripts/run/run-event-render.ts +75 -0
- package/scripts/run/run-event-scope.ts +127 -0
- package/scripts/run/run-event-stream-emit.ts +140 -0
- package/scripts/run/run-event-stream.ts +258 -0
- package/scripts/run/run-event-watch.ts +37 -0
- package/scripts/run/run-headless.ts +105 -0
- package/scripts/run/run-hold-cli.ts +310 -0
- package/scripts/run/run-hold.ts +264 -0
- package/scripts/run/run-invocation.ts +237 -0
- package/scripts/run/run-issue-number.ts +19 -0
- package/scripts/run/run-liveness-cli.ts +169 -0
- package/scripts/run/run-liveness.ts +424 -0
- package/scripts/run/run-merge-cli.ts +385 -0
- package/scripts/run/run-merge-steps.ts +326 -0
- package/scripts/run/run-merge.ts +158 -0
- package/scripts/run/run-next-cli.ts +48 -0
- package/scripts/run/run-next.ts +80 -0
- package/scripts/run/run-preflight.ts +337 -0
- package/scripts/run/run-prep-cli.ts +151 -0
- package/scripts/run/run-prep.ts +84 -0
- package/scripts/run/run-progress-args.ts +65 -0
- package/scripts/run/run-progress-cli.ts +508 -0
- package/scripts/run/run-progress-clock.ts +320 -0
- package/scripts/run/run-progress-config.ts +119 -0
- package/scripts/run/run-progress-read.ts +199 -0
- package/scripts/run/run-progress.ts +366 -0
- package/scripts/run/run-report-cli.ts +71 -0
- package/scripts/run/run-report.ts +78 -0
- package/scripts/run/run-review-cli.ts +130 -0
- package/scripts/run/run-review-steps.ts +161 -0
- package/scripts/run/run-review.ts +121 -0
- package/scripts/run/run-ship-cli.ts +431 -0
- package/scripts/run/run-ship-detach.ts +200 -0
- package/scripts/run/run-ship-probe.ts +103 -0
- package/scripts/run/run-ship-return.ts +75 -0
- package/scripts/run/run-ship-review-steps.ts +227 -0
- package/scripts/run/run-ship-review.ts +177 -0
- package/scripts/run/run-ship-stage.ts +150 -0
- package/scripts/run/run-ship.ts +78 -0
- package/scripts/run/run-status-cli.ts +175 -0
- package/scripts/run/run-status.ts +77 -0
- package/scripts/run/run-step-cli.ts +111 -0
- package/scripts/run/run-step.ts +292 -0
- package/scripts/run/run-stop-notify.ts +52 -0
- package/scripts/run/run-stranded-cli.ts +31 -0
- package/scripts/run/run-stranded-detect.ts +134 -0
- package/scripts/run/run-stranded.ts +120 -0
- package/scripts/run/run-tail-cli.ts +105 -0
- package/scripts/run/run-tail.ts +61 -0
- package/scripts/run/run-transcript.golden.txt +57 -0
- package/scripts/run/run-wake-cli.ts +428 -0
- package/scripts/run/run-wake-describe.ts +97 -0
- package/scripts/run/run-wake-driver.ts +80 -0
- package/scripts/run/run-wake-handoff.ts +29 -0
- package/scripts/run/run-wake-loop.ts +223 -0
- package/scripts/run/run-wake-session.ts +150 -0
- package/scripts/run/run-wake-work.ts +104 -0
- package/scripts/run/run-wake.ts +607 -0
- package/scripts/run/run-watcher-guard-cli.ts +37 -0
- package/scripts/run/run-watcher-guard.ts +59 -0
- package/scripts/run/run-watcher-hook.ts +86 -0
- package/scripts/security/secretlint-scan.ts +86 -0
- package/scripts/security/security-audit-logic.ts +51 -0
- package/scripts/security/security-audit-provision-logic.ts +217 -0
- package/scripts/security/security-audit-provision.ts +186 -0
- package/scripts/security/security-audit.ts +132 -0
- package/scripts/security/security-updates-logic.ts +131 -0
- package/scripts/security/security-updates.ts +38 -0
- package/scripts/security/sonar-file.ts +44 -0
- package/scripts/self-sync-guard/index.ts +5 -0
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +98 -0
- package/scripts/self-sync-guard/self-sync-refusal.ts +22 -0
- package/scripts/sonar/sonar-hotspots-cli.ts +149 -0
- package/scripts/sonar/sonar-hotspots.ts +111 -0
- package/scripts/split/split-assess-cli.ts +52 -0
- package/scripts/split/split-assess.ts +124 -0
- package/scripts/sync/dependabot-pin-logic.ts +135 -0
- package/scripts/sync/directory-copy-guard.ts +187 -0
- package/scripts/sync/file-content.ts +49 -0
- package/scripts/sync/managed-config-scope-cli.ts +64 -0
- package/scripts/sync/managed-config-scope.ts +123 -0
- package/scripts/sync/plugin-skill-directories.ts +15 -0
- package/scripts/sync/reconcile-templates.ts +53 -0
- package/scripts/sync/removed-skill-manifest.ts +27 -0
- package/scripts/sync/skill-migration.ts +192 -0
- package/scripts/sync/sync-configs.ts +156 -0
- package/scripts/sync/sync-hook-safety.ts +82 -0
- package/scripts/sync/sync.ts +417 -0
- package/scripts/sync/synced-paths.ts +52 -0
- package/scripts/sync/template-source-logic.ts +122 -0
- package/scripts/sync/workflow-pin-logic.ts +240 -0
- package/scripts/test/classify-isolation.ts +149 -0
- package/scripts/test/e2e-retry-check.ts +150 -0
- package/scripts/test/http-fault-injection.ts +79 -0
- package/scripts/test/josh-harness-environment.ts +260 -0
- package/scripts/test/josh-harness.ts +96 -0
- package/scripts/test/pilot-files.ts +457 -0
- package/scripts/test/pilot-measure.ts +78 -0
- package/scripts/test/test-declared-changed.ts +99 -0
- package/scripts/test/test-declared-logic.ts +91 -0
- package/scripts/test/test-declared-match.ts +106 -0
- package/scripts/test/test-declared.ts +180 -0
- package/scripts/test/test-e2e-guard.ts +86 -0
- package/scripts/test/test-network-guard.ts +453 -0
- package/scripts/test/test-red-commit.ts +51 -0
- package/scripts/test/test-red-logic.ts +76 -0
- package/scripts/test/test-red.ts +154 -0
- package/scripts/test/test-related-scope.ts +115 -0
- package/scripts/test/test-related.ts +73 -0
- package/scripts/test/test-repository-guard.ts +317 -0
- package/scripts/test/test-state-guard.ts +85 -0
- package/scripts/test/test-stdout-guard.ts +54 -0
- package/scripts/test/test-telegram-guard.ts +90 -0
- package/scripts/test/test-type-logic.ts +31 -0
- package/scripts/test/test-unit-guard.ts +185 -0
- package/scripts/test/unit-guard-environment.ts +12 -0
- package/scripts/test/unit-projects.ts +139 -0
- package/scripts/test/unit-worker-share.ts +251 -0
- package/scripts/test/vitest-include-globs.ts +12 -0
- package/scripts/time-runtime/time-agent-bundles.ts +128 -0
- package/scripts/time-runtime/time-background.ts +300 -0
- package/scripts/time-runtime/time-batch-guard-fixtures.ts +66 -0
- package/scripts/time-runtime/time-batch-guard.ts +529 -0
- package/scripts/time-runtime/time-bundle-call.ts +575 -0
- package/scripts/time-runtime/time-bundles.ts +536 -0
- package/scripts/time-runtime/time-call-identity.ts +37 -0
- package/scripts/time-runtime/time-command-key.ts +35 -0
- package/scripts/time-runtime/time-density-hook.ts +166 -0
- package/scripts/time-runtime/time-density.ts +147 -0
- package/scripts/time-runtime/time-followup-stage.ts +107 -0
- package/scripts/time-runtime/time-format.ts +186 -0
- package/scripts/time-runtime/time-hook-transcript.ts +82 -0
- package/scripts/time-runtime/time-instant.ts +20 -0
- package/scripts/time-runtime/time-markers.ts +228 -0
- package/scripts/time-runtime/time-phase-names.ts +123 -0
- package/scripts/time-runtime/time-reported-failure.ts +227 -0
- package/scripts/time-runtime/time-round-trips.ts +279 -0
- package/scripts/time-runtime/time-shell.ts +286 -0
- package/scripts/time-runtime/time-single-check.ts +65 -0
- package/scripts/time-runtime/time-spans.ts +545 -0
- package/scripts/time-runtime/time-transcript-line.ts +253 -0
- package/scripts/time-runtime/time-writes.ts +71 -0
- package/scripts/ui/ui-routes-cli.ts +122 -0
- package/scripts/ui/ui-routes.ts +102 -0
- package/scripts/version/bump-version.ts +71 -0
- package/scripts/version/effective-upstream.ts +93 -0
- package/scripts/version/index.ts +25 -0
- package/scripts/version/kit-descriptor.ts +10 -0
- package/scripts/version/kit-version-config.ts +30 -0
- package/scripts/version/latest-corepack.ts +404 -0
- package/scripts/version/latest-lane-guard.ts +49 -0
- package/scripts/version/latest-regression.ts +93 -0
- package/scripts/version/latest-scope-cli.ts +147 -0
- package/scripts/version/latest-stamp.ts +107 -0
- package/scripts/version/latest-update.ts +198 -0
- package/scripts/version/package-manager-version.ts +95 -0
- package/scripts/version/parse-json.ts +13 -0
- package/scripts/version/preinstall-version-update.ts +84 -0
- package/scripts/version/publishable-range-check.ts +74 -0
- package/scripts/version/publishable-range.ts +123 -0
- package/scripts/version/release-age.ts +146 -0
- package/scripts/version/release-hold.ts +142 -0
- package/scripts/version/running-binary.ts +42 -0
- package/scripts/version/upgrade-command-guard.ts +49 -0
- package/scripts/version/upgrade-shell-command.ts +30 -0
- package/scripts/version/version-check-logic.ts +333 -0
- package/scripts/version/version-check.ts +14 -0
- package/scripts/version/version-command-config.ts +177 -0
- package/scripts/version/version-commands.ts +296 -0
- package/scripts/version/version-remote.ts +86 -0
- package/scripts/version/version-targets.ts +81 -0
- package/scripts/yaml/yaml-document.ts +46 -0
- package/scripts-ai/completion-gate.ts +13 -0
- package/scripts-ai/environment-loader.ts +9 -0
- package/scripts-ai/epic-check.ts +34 -0
- package/scripts-ai/epic-cli-argv.ts +77 -0
- package/scripts-ai/epic-cli-remove.ts +71 -0
- package/scripts-ai/epic-cli.ts +413 -0
- package/scripts-ai/epic.ts +192 -0
- package/scripts-ai/followup-issue-number.ts +31 -0
- package/scripts-ai/git-followup-finish.ts +217 -0
- package/scripts-ai/git-followup-workflow.ts +252 -0
- package/scripts-ai/git-workflow.ts +246 -0
- package/scripts-ai/telegram-test-logic.ts +88 -0
- package/scripts-ai/telegram-test.ts +130 -0
- package/templates/gitignore +76 -0
- package/templates/sonar-project.properties +52 -0
- package/templates/workflows/ci.yml +639 -0
- package/templates/workflows/dependabot-auto-merge.yml +428 -0
- package/tsconfig/base.json +50 -0
- package/tsconfig.sonar.json +34 -0
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
# `backlogrun` — the detailed procedure behind the manifest
|
|
2
|
+
|
|
3
|
+
**This is the detailed procedure behind `backlogrun.md`'s manifest, relocated here so the entry read
|
|
4
|
+
carries the manifest, not the prose** (joshuafolkken/kit#2190). `backlogrun.md` is the resident
|
|
5
|
+
manifest; it routes here for the fine print of each step, read on demand rather than at the entry.
|
|
6
|
+
This file is **reference-only** and is read at its point of use — it is classified point-of-use in
|
|
7
|
+
`entry-read-set.ts`, exactly as the four `backlogrun-*.md` phase documents are, so a `backlogrun`
|
|
8
|
+
entry never opens it whole up front. Each section below is the single source of the rule it carries;
|
|
9
|
+
`backlogrun.md` points here rather than restating any of it.
|
|
10
|
+
|
|
11
|
+
## What one invocation approves
|
|
12
|
+
|
|
13
|
+
**One `backlogrun` approves every merge of every issue `pnpm josh backlog:next` offers** — the issues
|
|
14
|
+
carrying `auto-ok`, every child of an epic whose root carries it, **and an issue this run filed, once
|
|
15
|
+
it has become such a child**. A filing is placed into an epic by `pnpm josh epic:bundle`, which
|
|
16
|
+
`prompts/review.md` → "Review round cap" and `SKILL.md` → §2i both make **Tier A rather than
|
|
17
|
+
optional**; where that epic's root carries `auto-ok`, the child is offered from the next ask onwards
|
|
18
|
+
without anybody having labelled it.
|
|
19
|
+
|
|
20
|
+
**Two repairs that would bound this the other way are prohibited** (joshuafolkken/kit#1675): dropping
|
|
21
|
+
a run's own filings from the pool, and requiring a person's `auto-ok` on a child as well. What
|
|
22
|
+
replaces them is "The brake that replaces the promise" below.
|
|
23
|
+
|
|
24
|
+
That declaration is the authorization: **`backlogrun` declares "everything opted in", and a named
|
|
25
|
+
epic declares "the children of that epic".** The declaration *is* the statement of what may be
|
|
26
|
+
executed unattended, and that is the one thing a run must not leave ambiguous — which is why what runs
|
|
27
|
+
is stated by the keyword and its arguments, never inferred from the shape of a request.
|
|
28
|
+
|
|
29
|
+
**Which issues may be opted in stays a person's decision.** `auto-ok` is applied only by a person —
|
|
30
|
+
this file is that rule's single source, now that `backlogrun` owns the opted-in pool
|
|
31
|
+
(joshuafolkken/kit#1965) — and a run that labelled its own inputs would be widening its own
|
|
32
|
+
authorization. The split is: **which ones carry the label, a person; in what order and how many at
|
|
33
|
+
once, the run.** **What a run does move is the pool's contents**: an issue it files and bundles into an
|
|
34
|
+
already opted-in epic is offered from the next ask onwards, and the brake below bounds that quantity
|
|
35
|
+
rather than the membership.
|
|
36
|
+
|
|
37
|
+
**The end-of-run retrospective is the one carve-out, revised here rather than worked around**
|
|
38
|
+
(joshuafolkken/kit#2328). When a run drains its backlog, the retrospective files the improvements worth
|
|
39
|
+
carrying into the next run and applies `auto-ok` to them, so the next run can pick them up without
|
|
40
|
+
waiting for a person — the single path on which a run labels its own input. This is not the
|
|
41
|
+
self-widening the rule guards against, because the brakes in "The brake that replaces the promise"
|
|
42
|
+
below bound it with no exception: a retrospective's filings are counted against the ten-per-invocation
|
|
43
|
+
ceiling, the WIP cap of 30, `--max`, the 150,000-token session budget and the 8-hour whole-run bound
|
|
44
|
+
exactly as any other filing is. And a retrospective that judges nothing worth carrying files nothing,
|
|
45
|
+
so the "file → drain → file again" loop converges the moment improvements run out. Every other filing
|
|
46
|
+
route is unchanged: `auto-ok` stays a person's to apply.
|
|
47
|
+
|
|
48
|
+
A Tier C action inside a child still stops that child, exactly as it does for any batch child.
|
|
49
|
+
|
|
50
|
+
**A named issue is approved by the keyword and its number, not by `auto-ok`** (joshuafolkken/kit#1984).
|
|
51
|
+
`backlogrun #N1 #N2 …` runs those issues whether or not they carry the label — typing them is the
|
|
52
|
+
authorization, exactly as `queue` was explicit authorization to merge each of its issues. The pool
|
|
53
|
+
that follows is unchanged: still `auto-ok`, still a person's to opt in. "Named issues run first, in
|
|
54
|
+
order" below is the procedure.
|
|
55
|
+
|
|
56
|
+
### The brake that replaces the promise
|
|
57
|
+
|
|
58
|
+
**The promise was an authorization boundary rather than a convenience**, so withdrawing it without
|
|
59
|
+
putting something in its place would leave "file → run → file again" with no ceiling at all — the
|
|
60
|
+
self-widening `split-assessment.md` refuses when it forbids a `fullrun` promoting itself to a batch.
|
|
61
|
+
**What bounds it now is the invocation's own budget, and every part of that is counted in the carry
|
|
62
|
+
record rather than in the conversation** ("The session cut is inside the invocation" below):
|
|
63
|
+
|
|
64
|
+
| The bound | What it limits | Where it is counted |
|
|
65
|
+
| --- | --- | --- |
|
|
66
|
+
| `--max` | how many issues one invocation may merge — a run's own filing competes for that number rather than extending it | `run:carry --merged` |
|
|
67
|
+
| `--idle`, and the 8-hour whole-run bound | how long one invocation may go on looking for more | the record's `started_at` |
|
|
68
|
+
| **Ten filings per invocation** | how much one invocation may add to the pool at all, on **every** filing route (`SKILL.md` → §2d) | `run:carry --filed` |
|
|
69
|
+
| The WIP cap of 30 open issues | how large the pool may become, across invocations | `prompts/collaboration-workflow/wip-cap.md` |
|
|
70
|
+
|
|
71
|
+
**The last two are what actually replace the promise, and the first of them is why the loop
|
|
72
|
+
terminates**: one invocation may add at most ten issues to the pool and merge at most `--max` of
|
|
73
|
+
them, after which the run ends and the next one waits for a person to type the keyword. The old
|
|
74
|
+
promise bounded the *kind* of work that could run; these bound the *amount*, which is the only thing
|
|
75
|
+
left to bound once a run's own filings are admitted deliberately.
|
|
76
|
+
|
|
77
|
+
**Two filing routes are exempt from the depth test (`SKILL.md` → §2i), and the ten-filings ceiling
|
|
78
|
+
still covers them:**
|
|
79
|
+
|
|
80
|
+
- **`route:tier-a` and `route:interrupt` stay exempt** — a filing the run cannot proceed without is
|
|
81
|
+
citing its own blockage by construction. **Their number is still capped**: §2d's ten-filings
|
|
82
|
+
ceiling is stated "at every entry point", and `run:carry --filed` counts it across session cuts.
|
|
83
|
+
- **A review branch-2 filing stays exempt** because it has already cleared a bar the discretionary
|
|
84
|
+
route has not — a confirmed defect reaching a runtime path, with a written failure scenario — and
|
|
85
|
+
gating it on a citation as well would drop the one kind of finding both documents agree is never
|
|
86
|
+
dropped.
|
|
87
|
+
|
|
88
|
+
**This section is the single source of how the `epic:bundle` obligation and this authorization
|
|
89
|
+
boundary meet.** `SKILL.md` → §2i points here rather than restating it.
|
|
90
|
+
|
|
91
|
+
## Named issues run first, in order
|
|
92
|
+
|
|
93
|
+
**`backlogrun #N1 #N2 …` runs the named issues before it touches the pool** (joshuafolkken/kit#1984,
|
|
94
|
+
folding in the old `queue` keyword). They run in the order they were typed, **one at a time — no
|
|
95
|
+
lanes**, because the order is the point of naming them. Only once the named list is exhausted does the
|
|
96
|
+
loop below drain the opted-in backlog. A bare `backlogrun` names none and starts straight on the loop,
|
|
97
|
+
exactly as it always did.
|
|
98
|
+
|
|
99
|
+
**`pnpm josh backlog:plan #N1 #N2 …` reports the whole plan** — the named prefix first, in order, then
|
|
100
|
+
the pool — so the person sees the shape of the run before anything starts. `scripts/backlog/backlog-named.ts`
|
|
101
|
+
is the single source of that order and of the failure branch below; the plan renders it rather than
|
|
102
|
+
restating it.
|
|
103
|
+
|
|
104
|
+
**Each named issue is a full `fullrun` in a delegated unit**, exactly as a backlog child is
|
|
105
|
+
(`backlogrun-child.md` → "Each child runs in a delegated unit"), and the once-per-session steps — `josh latest`
|
|
106
|
+
on `required`, the progress watcher — run once for the whole invocation, never per issue
|
|
107
|
+
("What runs once per session, not once per issue" below). Between issues, `pnpm josh ms`
|
|
108
|
+
brings the previous merge into the checkout the next one implements in. The parent reads each issue's
|
|
109
|
+
state back from GitHub — `pnpm josh issue:state <N>` — never the unit's summary.
|
|
110
|
+
|
|
111
|
+
**A named issue that cannot finish parks, and the rest of the named list is skipped** — starting the
|
|
112
|
+
issues after it would break the order they were named in. **The run does not stop there**: it goes on
|
|
113
|
+
to drain the opted-in backlog, and the completion report lists the named issues it did not start.
|
|
114
|
+
`backlog_named.after_failure` is the single source.
|
|
115
|
+
|
|
116
|
+
- A named issue read back `CLOSED` — merged, or already `already-done` — is finished; continue with the
|
|
117
|
+
next.
|
|
118
|
+
- A **`needs-human-review`** named issue stops the whole run before its commit (`SKILL.md` → §2z),
|
|
119
|
+
exactly as any child does — the named issues after it are not started and neither is the pool.
|
|
120
|
+
- Everything else about running one — the verification gate, the hand-off, the guards — is
|
|
121
|
+
this file's and is not restated here.
|
|
122
|
+
|
|
123
|
+
**`--only` runs the named list and stops there, draining no pool** (joshuafolkken/kit#1984) — the old
|
|
124
|
+
`queue`'s scope kept under one keyword. `backlogrun #N1 #N2 … --only` runs the named issues in order and
|
|
125
|
+
ends, and the completion report says in one line that `--only` held it back from the opted-in backlog.
|
|
126
|
+
A named issue that fails **under `--only` ends the run** rather than falling through to a pool, and the
|
|
127
|
+
issues after it are skipped as ever. **`--only` with no named issues has nothing to run and is refused
|
|
128
|
+
before anything starts.** `backlog_named.startup` is the single source of both, and
|
|
129
|
+
`pnpm josh backlog:plan #N1 #N2 … --only` renders the named-only plan the run will take.
|
|
130
|
+
|
|
131
|
+
## The session cut is inside the invocation
|
|
132
|
+
|
|
133
|
+
**This section is the single source of the mechanism.** The record, the two commands, the answer table
|
|
134
|
+
and what each one means are all here. **A named-issue `backlogrun #N1 #N2 …` pins its list across the
|
|
135
|
+
cut**: the record keeps the **opening** list at every cut, and the issues it has finished live in the
|
|
136
|
+
record's `done` field rather than shrinking the string — a resumed session reads `remaining` from
|
|
137
|
+
`pnpm josh run:carry --json` and runs those, then drains the pool as ever. **`--only` rides in that
|
|
138
|
+
invocation string like every other token**, so a resumed session runs the remaining named issues and
|
|
139
|
+
**stops** rather than draining the pool the person excluded.
|
|
140
|
+
|
|
141
|
+
**Typing `backlogrun` once authorizes the declared budget, and a session cut is an execution detail of
|
|
142
|
+
spending it** (joshuafolkken/kit#1714). `backlogrun-progress.md` → "The hand-off" stops the _session_ at the seam;
|
|
143
|
+
under `backlogrun` that seam does not stop the _run_. The next session picks the same invocation up
|
|
144
|
+
and carries on with the budget already partly spent.
|
|
145
|
+
|
|
146
|
+
**A resumed session's carried-over lanes are polled beside new work, never waited out** —
|
|
147
|
+
`backlogrun-progress.md` → "A carried-over merge does not stand in front of the next lane" is the
|
|
148
|
+
single source.
|
|
149
|
+
|
|
150
|
+
**This is not an exception to the explicit-invocation rule above.** What §0 forbids is **inferring** a
|
|
151
|
+
workflow from the shape of a request; it never required the keystroke to land in every session's
|
|
152
|
+
transcript. A resumed session is a machine continuing an authorization a person gave, exactly as a
|
|
153
|
+
delegated child runs `fullrun` in a unit where nobody typed the keyword.
|
|
154
|
+
|
|
155
|
+
**The authorization boundary is carried by the budget, not by the keystroke.** So the budget has to
|
|
156
|
+
survive the cut, and the conversation is the one place it cannot live:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
pnpm josh run:carry --begin "backlogrun --max 5 --idle 30" --owner "$PPID" # alias: josh rc
|
|
160
|
+
pnpm josh run:carry --json # read it back in a resumed session
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**`--owner "$PPID"` is not decoration.** It names the parent loop's own long-lived process, which is
|
|
164
|
+
what lets the command answer `busy` instead of letting a second parent count into a budget that is
|
|
165
|
+
still being spent. Left off, the record declares no owner and every standing record reads as not
|
|
166
|
+
provably live — refused rather than resumed, so nothing is lost silently, but the useful half of the
|
|
167
|
+
answer is gone. When the sandbox cannot read a process-start token, a live PID is conservatively held
|
|
168
|
+
as `busy`: stopping on a reused PID costs a decision, while replacing a genuinely live owner creates
|
|
169
|
+
two parents on one budget.
|
|
170
|
+
|
|
171
|
+
**Ask it before the plan, in the same turn as the first `git switch main && git pull`.** The contract
|
|
172
|
+
is `docs/josh-commands.md` → "`josh run:carry`"; what this loop does with each answer is here:
|
|
173
|
+
|
|
174
|
+
| It answers | What the run does |
|
|
175
|
+
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
176
|
+
| `began` | Nothing was carried. This is the invocation's first session: report the plan and run the decision pass as written below |
|
|
177
|
+
| `resumed` | **This session is continuing a run that was cut** — a `--cut` handed the record off, or a `--resume` adopted it. Read the record with `--json` and take the budget figures from it, never from this session's own zero. Report the plan again — the pool has moved — and skip nothing else |
|
|
178
|
+
| `busy` | The record's **owner process is still running and no cut handed it off**: another parent is spending this budget right now. **Stop; do not open a lane.** Counting into it would put two parents on one record. (A record a `--cut` _did_ hand off answers `resumed` here even with its owner still alive — joshuafolkken/kit#1935.) Nothing here is yours to end — either that run finishes and ends its own record, or a person decides it is over |
|
|
179
|
+
| `standing` | A record is here that **no cut or supervisor handed off** — an unwatched crash, and the same command retyped over it. **Stop; do not open a lane**, and do not guess: the choice is the person's. Report the two commands the answer names — `pnpm josh run:carry --resume "<invocation>" --owner "$PPID"` to carry that budget on, or `pnpm josh run:carry --end` and begin again to discard it. The `--owner` belongs to the resume as much as to the begin: adopt without it and the record declares no owner, so `busy` degrades to `standing` for every parent after |
|
|
180
|
+
| `mismatch` | A record is here for a **different** invocation — a run that never reached `--end`. **Stop; do not open a lane.** Resuming into it would spend that run's `--max` and its hours. End it deliberately, with `pnpm josh run:carry --end`, once you know that run is over |
|
|
181
|
+
| `expired` | The 8-hour whole-run bound is spent. **Where a `--cut` handed the record off it is this run's own bound**, so this is the verdict on standard output and the run ends: report it and stop, and clear the record with `pnpm josh run:carry --end` once it is genuinely over. Where nothing handed it off it is printed on standard error ahead of a `began` instead — a person typing the keyword again over a spent record is starting a new run, and the record is replaced. A `--resume` over a spent record answers `expired` and adopts nothing |
|
|
182
|
+
| `unreadable` | Report what it printed and **stop before opening a lane**. A budget that cannot be carried is a run that restarts it at the next cut, which is the whole defect |
|
|
183
|
+
| `unknown` | The same — the repository's git directory could not be read, so nothing was established |
|
|
184
|
+
|
|
185
|
+
**The record is the parent loop's, and a lane never touches it.** The parent is what reads GitHub to
|
|
186
|
+
verify a child merged (`backlogrun-child.md` → "Each child runs in a delegated unit"), so it is also what
|
|
187
|
+
counts that merge — one sequential loop writing one record, with no two lanes writing it at once. A
|
|
188
|
+
delegated unit is briefed with its child and nothing about the invocation's budget. **`--begin` claims
|
|
189
|
+
the record exclusively and names the owning process, so a second parent is answered `busy`** rather
|
|
190
|
+
than counting into a budget somebody else is spending.
|
|
191
|
+
|
|
192
|
+
**Count into the record rather than into your head** — `--merged 1 --owner "$PPID"` at every child's
|
|
193
|
+
merge, `--filed 1 --owner "$PPID"` at every Issue this run files, and `--cut --owner "$PPID"`
|
|
194
|
+
immediately before the cut. Every counter is an increment and the command owns the sum, because a run
|
|
195
|
+
sending a total would be sending arithmetic done in its head. **`--owner "$PPID"` is not optional on a
|
|
196
|
+
count**: a count that does not name the record's owning process is refused, so a session whose record a
|
|
197
|
+
successor took over cannot advance a budget that is no longer its own.
|
|
198
|
+
|
|
199
|
+
**`--cut` hands the record off, and so does `run:wake` for a dead owner** (joshuafolkken/kit#2437): the
|
|
200
|
+
next `--begin` naming the same invocation answers `resumed` — **even while the cutting process is still
|
|
201
|
+
running**, so a cut is handed to exactly one successor rather than stalling every resume with `busy`.
|
|
202
|
+
|
|
203
|
+
**So `--cut` is the session's last write to the record**: count everything the session has, then cut.
|
|
204
|
+
A `--merged` or `--filed` issued after the `--cut` is **refused**, so the hand-off is protected rather
|
|
205
|
+
than silently spent.
|
|
206
|
+
|
|
207
|
+
**`backlog:budget` is then fed from the record, never from a count kept in the conversation:**
|
|
208
|
+
`--started` takes the record's `started_at` and `--merged` its `merged`. That one substitution is what
|
|
209
|
+
makes `--max` and the 8-hour whole-run bound count **across** cuts, as one invocation's worth. **The
|
|
210
|
+
10-filings-per-run ceiling is counted the same way**, from `filed`. **`--idle` is the one budget that
|
|
211
|
+
is not carried**, and a cut can only reach a watch that opened while this run's own children were
|
|
212
|
+
still merging — the one shape where the two overlap. A resumed session then states its resume moment
|
|
213
|
+
as `--active` and the watch begins again at its full budget, bounded by the 8 hours as everything
|
|
214
|
+
else is: "The cost check is not asked during a watch" below.
|
|
215
|
+
|
|
216
|
+
**How many cuts the run crossed is named in the completion report**, read from the record's `cuts`. A
|
|
217
|
+
run reporting only what it merged would hide that it spanned four sessions.
|
|
218
|
+
|
|
219
|
+
**End the record when the run ends** — `pnpm josh run:carry --end`, **after the final report and never
|
|
220
|
+
batched with it**: `run:report` scopes by the record `--end` removes (joshuafolkken/kit#2393). The next
|
|
221
|
+
`backlogrun` then begins its own budget rather than resuming a spent one. **Where the run ends by _stopping_ rather than finishing** — `backlog:budget` or `epic:next`
|
|
222
|
+
answered `stop` (a parked backlog, an unreadable listing, the maximum, the whole-run bound), or the
|
|
223
|
+
consecutive-failure
|
|
224
|
+
guard tripped — **end it with `pnpm josh run:carry --end --stopped "<one-line reason>"` instead**. That
|
|
225
|
+
pushes one ⏸️ confirmation as it clears the record, so a person learns the run halted even when the
|
|
226
|
+
session was cut and this parent headless (joshuafolkken/kit#2136); the reason is the stop verdict's, in
|
|
227
|
+
the session language. A clean completion takes the bare `--end` and stays silent, having its own report;
|
|
228
|
+
a parked _child_ is pushed by the child that parked it (`backlogrun-park.md`). Because `--end` removes
|
|
229
|
+
the record, a re-run's second `--end` finds nothing and never re-sends that confirmation —
|
|
230
|
+
`backlogrun-progress.md` →
|
|
231
|
+
"Progress while the run is quiet" is the single source of the pull-versus-push split.
|
|
232
|
+
|
|
233
|
+
**The record widens nothing.** It carries a budget and nothing else: `auto-ok` is still applied only
|
|
234
|
+
by a person, so a cut adds no rule about which issues may be offered. **The pool itself may have
|
|
235
|
+
grown across the cut** — an issue the first session filed, and `epic:bundle` placed under an already
|
|
236
|
+
opted-in epic, is offered to the resumed one — and that is "What one invocation approves" rather than
|
|
237
|
+
anything the record did. The ceiling on it is counted across cuts too, from the record's `filed`.
|
|
238
|
+
|
|
239
|
+
**Nothing waits for a person any more — `pnpm josh run:wake` supervises the driver**. After a cut or
|
|
240
|
+
dead-owner recovery, it adopts the carry record and runs `backlog:drive` itself. The driver dispatches,
|
|
241
|
+
collects, watches and reports without starting a parent AI session. Only a returned branch that needs
|
|
242
|
+
judgment starts an AI session, with the branch result and resume flags in its prompt.
|
|
243
|
+
|
|
244
|
+
**Start it in the same turn as `--begin`, and stop it in the same turn as `--end`:**
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
pnpm josh run:wake --start # alias: josh rw ; right after `run:carry --begin`
|
|
248
|
+
pnpm josh run:wake --stop # in the same turn as `run:carry --end`
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**It reads the same record this section already keeps.** A handed-off carry record, or one whose owner
|
|
252
|
+
died, starts the driver. The supervisor adopts that record before the driver counts a merge; a live
|
|
253
|
+
owner prevents a second driver from taking it over. On `none`, `expired` or `unreadable` it stops. The
|
|
254
|
+
8-hour whole-run bound therefore still comes from the carry record. **A new authorization is still a
|
|
255
|
+
person's**: the supervisor spends the declared budget and never declares another.
|
|
256
|
+
|
|
257
|
+
**What may be run is untouched.** The driver takes named issues from the invocation and pool issues
|
|
258
|
+
from the existing offer command. The supervisor writes no `auto-ok` label. A judgment session receives
|
|
259
|
+
the original invocation plus the driver's reason and resume state.
|
|
260
|
+
For a named epic, the driver hands off `epic #N` with the original invocation. The judgment session
|
|
261
|
+
follows the named epic procedure and dispatches its children; the epic root is never launched as a
|
|
262
|
+
standalone `fullrun` child. Once every child has merged or parked, record the root with
|
|
263
|
+
`pnpm josh run:carry --done <E> --owner "$PPID"` before continuing the invocation. This removes it
|
|
264
|
+
from the carry record's remaining named list, so the next driver pass can advance. The named prefix
|
|
265
|
+
also consults the carried maximum and whole-run bound
|
|
266
|
+
before each launch, and a failed named issue skips the remaining named prefix.
|
|
267
|
+
|
|
268
|
+
**A failure is visible rather than silent.** A judgment wake that never claims the carry record is retried, and
|
|
269
|
+
once the retries are spent the supervisor stops and sends a `warning` Telegram; a carry record that
|
|
270
|
+
expired or cannot be read ends it the same way. `none` — the run having finished — and a person's own
|
|
271
|
+
`--stop` stay silent. Everything the supervisor starts writes to one log file per repository, named by
|
|
272
|
+
`--list` and by every warning, so a silent exit stays diagnosable.
|
|
273
|
+
|
|
274
|
+
**A person keeps control of it.** `pnpm josh run:wake --list` names the running supervisor and
|
|
275
|
+
`--stop` ends it; the full contract, what it launches and why that is a constant rather than a
|
|
276
|
+
setting are `docs/josh-commands.md` → "`josh run:wake`".
|
|
277
|
+
|
|
278
|
+
**Every unattended role runs with the provider selected from the invoking CLI and its own profile.**
|
|
279
|
+
Codex sessions use OpenAI; Claude Code sessions use Anthropic. Anthropic uses scheduler
|
|
280
|
+
`claude-opus-5-5`, worker `claude-opus-5-5` and reviewer `claude-opus-5-5`; OpenAI uses `gpt-6-sol`,
|
|
281
|
+
with role efforts `medium`/`medium`/`high` (scheduler / worker / reviewer) for both. Role overrides
|
|
282
|
+
resolve before launch; model overrides apply only to Claude Code, effort overrides to either provider,
|
|
283
|
+
and legacy `JOSH_LANE_*` values to the worker only. Invalid configuration, a missing or conflicting
|
|
284
|
+
session marker, or a missing, outdated or unauthenticated CLI refuses without fallback, promotion or
|
|
285
|
+
worker retry. `run:wake --list`, `lane:list`, the review brief and each launch
|
|
286
|
+
log expose the resolved provider, role, model and effort.
|
|
287
|
+
`docs/josh-commands.md` → "`josh lane:dispatch`" and `backlogrun-child.md` → "Each child runs in a
|
|
288
|
+
delegated unit" are the single sources.
|
|
289
|
+
|
|
290
|
+
**It relays progress from the existing report record.** The driver keeps the same `run:merge` event
|
|
291
|
+
stream and `run:report` finish path; `pnpm josh run:wake --list` relays the latest line from that
|
|
292
|
+
record. Telegram notifications retain their existing generation points (→ "It goes to the session only").
|
|
293
|
+
|
|
294
|
+
**The completion report names how many sessions were woken beside the record's `cuts`** — one wake per
|
|
295
|
+
cut is the invariant, and what counts is a carry record actually claimed, never a process started.
|
|
296
|
+
|
|
297
|
+
**The reading is scoped to `backlogrun`.** A `fullrun` cut still waits for a person's keystroke,
|
|
298
|
+
because it declares no budget of the kind this section leans on — it ends at one issue and has
|
|
299
|
+
nothing to carry.
|
|
300
|
+
|
|
301
|
+
## The plan, before the first child starts
|
|
302
|
+
|
|
303
|
+
**A `backlogrun` reports its plan before it starts anything.** Nothing is dispatched, no lane is
|
|
304
|
+
opened and no issue is picked up until the plan has been reported and the decision pass below has
|
|
305
|
+
run (joshuafolkken/kit#1652).
|
|
306
|
+
|
|
307
|
+
**The plan is one command's output, not an assembly of several:**
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
pnpm josh backlog:plan # alias: josh blp
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**It renders the same classified pool `backlog:next` answers from**, so **the plan cannot promise an
|
|
314
|
+
order the run does not take**. It is a separate command rather than a flag because `backlog:next`'s
|
|
315
|
+
standard output is one bare token per line and a plan printed there would break the loop below. Its
|
|
316
|
+
four sections are:
|
|
317
|
+
|
|
318
|
+
- **Ready now** — the runnable children, grouped by repository. **The grouping is the parallelism**,
|
|
319
|
+
not a presentational choice: a lane is per repository, so the bundles are how wide this run can go.
|
|
320
|
+
- **Waiting** — every withheld child, each naming **what it is waiting on**: the blocking issue
|
|
321
|
+
numbers, a run that already has it, or that it is ready but past the offer this ask could make.
|
|
322
|
+
- **Waiting on a person** — the `needs-decision` children, which is the next subsection's input.
|
|
323
|
+
- **Out of scope** — every open issue the backlog will **not** run, with the reason, so "not opted in"
|
|
324
|
+
is distinguished from "not reached yet".
|
|
325
|
+
|
|
326
|
+
**Report all four to the person, in the session language, before the first child starts.** Epic
|
|
327
|
+
children are enumerated individually rather than summarized under their root. A `⚠` about a truncated
|
|
328
|
+
listing is reported with them: the plan is then partial, and saying so is what keeps it from reading as
|
|
329
|
+
complete.
|
|
330
|
+
|
|
331
|
+
### Resolve what the plan can resolve, before starting
|
|
332
|
+
|
|
333
|
+
**Every `needs-decision` issue the plan listed is settled in one pass at the start, rather than one
|
|
334
|
+
stop at a time.** The point is to spend a person's attention once, up front, instead of interrupting
|
|
335
|
+
an unattended run over and over.
|
|
336
|
+
|
|
337
|
+
- **Decide everything decidable from the issue itself.** Read the issue's body **and its comments**
|
|
338
|
+
(`SKILL.md` → §2g), and where the answer is already there, record it as an Issue comment and
|
|
339
|
+
**remove the label** — `CLAUDE.md` → "Decision autonomy" already makes that Tier A, and a child
|
|
340
|
+
whose decision is recorded while its label still stands is parked for no reason. **Read every one
|
|
341
|
+
of them in one call** — `pnpm josh issue:read <N> <N> …`, the numbers the plan just listed under
|
|
342
|
+
"Waiting on a person" — rather than a `gh api` pair per issue. This pass is where a parent reads the
|
|
343
|
+
most issues in a row, and a parent's cost grows as n²/2 in its own request count
|
|
344
|
+
(joshuafolkken/kit#1567), so a turn removed here is worth more than a turn removed inside a child.
|
|
345
|
+
- **Never measure in order to decide.** A question needing a benchmark, a profile, or a run of the
|
|
346
|
+
thing itself is not settled here: it stays labelled and the plan says so. This pass is a cheap
|
|
347
|
+
read, not a research task, and turning it into one would put the whole backlog behind it.
|
|
348
|
+
- **Label what you find.** An issue that turns out to need a person's judgement has `needs-decision`
|
|
349
|
+
applied — the same label a parked child gets, applied the way `backlogrun-park.md` → "park and continue"
|
|
350
|
+
applies it. **The next plan then classifies it by reading the label alone**, never by reading the
|
|
351
|
+
body again, so the cost of this pass falls on every subsequent ask instead of repeating.
|
|
352
|
+
- **Then start the loop.** Whatever is still labelled is reported as parked and left standing; the
|
|
353
|
+
run does not wait on it.
|
|
354
|
+
|
|
355
|
+
**`needs-decision` is the one workflow label a run may apply, and it is neither `auto-ok` nor
|
|
356
|
+
`needs-human-review`.** Those two widen or withhold what may be *executed* and stay a person's alone
|
|
357
|
+
(this file, `SKILL.md` → §2z). This one records only that a person's answer is needed, which is a
|
|
358
|
+
finding rather than an authorization — which is why a run parks with it and a person clears it.
|
|
359
|
+
|
|
360
|
+
## The loop
|
|
361
|
+
|
|
362
|
+
**The detached `run:wake` supervisor runs `backlog:drive`** after the carry record is handed off.
|
|
363
|
+
Its driver keeps the loop below running without a parent AI turn. A returned judgment branch includes
|
|
364
|
+
the first-line verdict, affected issue and `resume:` flags in the AI prompt; `stop` reports and ends
|
|
365
|
+
inside the driver. This uses the same command and decisions as the former parent-launched wait.
|
|
366
|
+
|
|
367
|
+
**The loop's head is one command — `pnpm josh backlog:offer`** (joshuafolkken/kit#2162). It runs
|
|
368
|
+
`backlog:next`, maps its answer to the budget word the table below fixes, runs `backlog:budget`, and
|
|
369
|
+
returns the verdict with the issues to start. It stays both halves' contract source: what an answer
|
|
370
|
+
*means* changes here.
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
offer=$(pnpm josh backlog:offer --started "$started" --active "$active") # alias: josh blo
|
|
374
|
+
offer=$(pnpm josh backlog:offer --started "$started" --active "$active" --exclude 1630,1631) # after #1630, #1631 merged
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**The first line of standard output is the budget verdict; on `run`, the issue numbers to start
|
|
378
|
+
follow, one per line.** `backlog:offer` forwards `--exclude` and `--repo` to `backlog:next` and
|
|
379
|
+
`--started` / `--active` / `--merged` / `--running` / `--max` / `--idle` to `backlog:budget`, computes
|
|
380
|
+
`--answer` itself, and carries the consecutive-retry count on the last stderr line (`retries: <n>`) and
|
|
381
|
+
in `--json`. **The verdict table is "The two budgets" below; the answer-to-word mapping it applies is
|
|
382
|
+
this section's table.**
|
|
383
|
+
|
|
384
|
+
**`backlog:next`'s output contract is `docs/josh-commands.md` → "`josh backlog:next`", and four parts
|
|
385
|
+
of it decide how the mapping is written:**
|
|
386
|
+
|
|
387
|
+
1. **Standard output is one token per line, and everything else is standard error** — so `answers`
|
|
388
|
+
holds something a loop can branch on.
|
|
389
|
+
2. **The tokens are bare issue numbers, scoped to the repository the command runs in.** A runnable
|
|
390
|
+
child in *another* repository is reported on standard error with its repository and checkout, and
|
|
391
|
+
is never a token; this repository having no candidate of its own is answered `wait`. **So
|
|
392
|
+
`backlogrun` takes no `owner/repo#N` token.** A qualified token was implemented and withdrawn,
|
|
393
|
+
because `--exclude` parses bare integers and feeding one back produces a usage error rather than
|
|
394
|
+
an exclusion (joshuafolkken/kit#1630). Report the other repository's candidates in the run summary
|
|
395
|
+
and leave them to a session running there (`backlogrun-lanes.md` → "Concurrency").
|
|
396
|
+
3. **The verdict words are `wait`, `stop`, `retry`, `error` and `none`** — `none` is `epic:next`'s
|
|
397
|
+
`complete` under this command's spelling, and there is no `complete` here. **`retry` is the one
|
|
398
|
+
with no `epic:next` counterpart**: it says GitHub did not answer, which is a statement about the
|
|
399
|
+
connection and not about the graph (joshuafolkken/kit#1663).
|
|
400
|
+
4. **Exit code 0 covers all five verdicts, and 1 means the listing could not be read** — no answer at
|
|
401
|
+
all. **`error` cannot be told apart by exit code, so read the token rather than the status.**
|
|
402
|
+
|
|
403
|
+
**What the answer means is this table's; whether the run may act on it is `pnpm josh backlog:budget`'s**
|
|
404
|
+
(joshuafolkken/kit#1632). The right-hand column ends in the word each answer is handed to that command
|
|
405
|
+
as. Nothing here decides an ending on its own — the two budgets and every termination live in the next
|
|
406
|
+
subsection.
|
|
407
|
+
|
|
408
|
+
| Answer | What to do | Budget answer |
|
|
409
|
+
| --- | --- | --- |
|
|
410
|
+
| One or more issue numbers | Start each one as a child, up to the free lanes — `backlogrun-lanes.md` → "Lanes" and "Each child runs in a delegated unit", unchanged. Then **ask the command again**, with the merged numbers added to `--exclude` | `candidates` |
|
|
411
|
+
| `wait`, with something of this run's own still in flight | Everything opted in is blocked or already running, so waiting can still change the answer. **Ask the command again on the wake the progress watcher's exit delivers** — the parent starts no sleep of its own, and the interval is a floor on the re-ask rather than a clock (`backlogrun-progress.md` → "Waiting, and never waiting forever" and "The parent keeps no clock of its own") | `blocked` |
|
|
412
|
+
| `wait` this checkout can never resolve — the only candidates the command reported on standard error are in other repositories, and this run has nothing of its own in flight | Report those candidates with their checkouts. **Waiting cannot resolve them, but a person opting a new issue in here still can**, so the ending is the idle watch's rather than this row's | `exhausted` |
|
|
413
|
+
| `stop` | Nothing can proceed without a person. Report the parked issues and finish | `parked` |
|
|
414
|
+
| `retry`, on fewer than three consecutive asks | GitHub did not answer, so the graph was never read. Sleep the polling interval and **ask the command again** — **this is one of the states with no watcher-delivered wake**, because the outage that produced `retry` stops the watcher reading too and a declined watcher does not exit (`backlogrun-progress.md` → "The wake exists only while something is in flight"). This is the one answer re-asking is allowed on, and the count is consecutive: any other answer resets it to zero | `blocked` |
|
|
415
|
+
| `retry` for a third consecutive time | The outage is not a hiccup. Report what the command printed on standard error and finish | `unreadable` |
|
|
416
|
+
| `error` | The graph could not be resolved — report what the command printed on standard error and finish. **Never re-ask hoping for a different answer**, and never fall back to picking an issue by hand: that would be the run choosing its own membership | `unreadable` |
|
|
417
|
+
| `none` | Nothing opted in is left | `exhausted` |
|
|
418
|
+
| Exit 1, empty standard output | The listing could not be read. Report it and finish — **it is not `none`**, and reading it as one would report an empty backlog that was never seen | `unreadable` |
|
|
419
|
+
|
|
420
|
+
**Re-asking on `retry` is not the exception to the `error` rule** (joshuafolkken/kit#1663): `error`
|
|
421
|
+
forbids a run answering its own question, while `retry` means the command never got an answer to read,
|
|
422
|
+
so asking again is the same question rather than a second opinion. **Three consecutive `retry` answers
|
|
423
|
+
end the run**, and any other answer resets the count to zero, so `backlog:budget` is told `blocked`
|
|
424
|
+
while retries remain and `unreadable` on the third.
|
|
425
|
+
|
|
426
|
+
**Feed every issue this run has merged back through `--exclude`.** GitHub applies `closes #N`
|
|
427
|
+
asynchronously, so a just-merged issue can still read as open on the next ask and be offered a second
|
|
428
|
+
time. The flag takes a comma-separated list and may be repeated; it drops the issue from every bucket
|
|
429
|
+
rather than only from the offer.
|
|
430
|
+
|
|
431
|
+
**A short offer is not proof the backlog is empty.** The standalone half of the pool is capped at the
|
|
432
|
+
same five rows the `🗒 Next issues` display shows, so a sixth opted-in issue simply appears on the
|
|
433
|
+
next ask. An epic's children are not capped that way — they come through the epic's own graph.
|
|
434
|
+
|
|
435
|
+
**The epic side is found server-side by the `epic` label.** An epic that never received the label is
|
|
436
|
+
invisible to the listing, so nothing knows it tracks anything at all (joshuafolkken/kit#1633). This is
|
|
437
|
+
a known limit of the listing, recorded rather than worked around; do not assert the opposite anywhere.
|
|
438
|
+
|
|
439
|
+
**A child is offered on its own `auto-ok` unless the epic tracking it is opted in**
|
|
440
|
+
(joshuafolkken/kit#1668). An epic that **is** opted in owns its children entirely — it sequences them,
|
|
441
|
+
so offering one beside it would hand the same issue over twice; ordering survives the standalone route
|
|
442
|
+
on the children's own `blocked-by` relations, which `--ordered` records.
|
|
443
|
+
|
|
444
|
+
**An order between two epics holds too** (joshuafolkken/kit#1943). A `blocked-by` relation whose
|
|
445
|
+
blocker sits in another opted-in epic — or is an opted-in standalone issue — makes the child wait on
|
|
446
|
+
time, so one `backlogrun` runs both epics in that order without the person sequencing the commands. A
|
|
447
|
+
blocker outside the opted-in backlog, or one inside it that itself waits on a person, makes the child
|
|
448
|
+
wait on a person instead, and a cycle across epics
|
|
449
|
+
answers `error`. The table is `docs/josh-commands.md` → "`josh epic:next`".
|
|
450
|
+
|
|
451
|
+
**New work is picked up without restarting anything.** The command re-derives its pool from GitHub
|
|
452
|
+
labels on every ask, so an issue filed and opted in while the run is going is offered on the next
|
|
453
|
+
iteration.
|
|
454
|
+
|
|
455
|
+
### The two budgets
|
|
456
|
+
|
|
457
|
+
**A `backlogrun` may declare how long it will watch an empty backlog and how many issues it may
|
|
458
|
+
take** (joshuafolkken/kit#1632). Both are written on the keyword, and **the idle watch is on by
|
|
459
|
+
default while the maximum is not** (joshuafolkken/kit#1676):
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
backlogrun # watches for 30 minutes after the backlog empties
|
|
463
|
+
backlogrun --idle 0 # finishes the moment the backlog empties
|
|
464
|
+
backlogrun --idle 0 --max 5
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
| Budget | Written | Default | What it does |
|
|
468
|
+
| --- | --- | --- | --- |
|
|
469
|
+
| Idle watch | `--idle <minutes>` | **30 minutes** | After the candidates run out, keep polling this long for a new one. A candidate that appears restarts the watch from that moment |
|
|
470
|
+
| Maximum issues | `--max <count>` | unlimited | How many issues this invocation may take. On reaching it the run reports and finishes |
|
|
471
|
+
|
|
472
|
+
**`--idle 0` is how the watch is turned off, and it is the only way** (joshuafolkken/kit#1676):
|
|
473
|
+
`backlogrun --idle 0` finishes at the first empty backlog, exactly as a bare `backlogrun` did before.
|
|
474
|
+
|
|
475
|
+
**Why 30 minutes** (single source `scripts/backlog/backlog-budget.ts` → `DEFAULT_IDLE_MINUTES`): it is
|
|
476
|
+
about the length of one child (12–28 minutes), so a run that has emptied its backlog waits roughly as
|
|
477
|
+
long as one more issue would have taken. **A watch is polled every 5 minutes, not at the loop's
|
|
478
|
+
60-second interval** — it is waiting on a person, on human timescales, and the reason `backlog:budget`
|
|
479
|
+
prints names the interval so the loop reads it rather than remembering it.
|
|
480
|
+
|
|
481
|
+
**Why an idle watch is safe.** To become a candidate an issue needs `auto-ok`, which only a person
|
|
482
|
+
applies — except an issue this run filed and bundled under an already opted-in epic, which is admitted
|
|
483
|
+
("What one invocation approves") and bounded by the brake there, never the watch. No issue nobody
|
|
484
|
+
opted in is ever picked up during a watch.
|
|
485
|
+
|
|
486
|
+
**`backlog:offer` asks `backlog:budget` for you on every iteration** — it maps `backlog:next`'s answer
|
|
487
|
+
to the word the table above fixes and hands it over, so the loop makes the one call and reads back the
|
|
488
|
+
verdict:
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
offer=$(pnpm josh backlog:offer --started "$started" --active "$active" \
|
|
492
|
+
--merged <count> --running <count> --retries <count> [--idle <minutes>] [--max <count>])
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
**`--active` is required of every ask, because the watch is on unless it was turned off** — an
|
|
496
|
+
invocation whose watch is on and that carries no `--active` is **refused** by `backlog:budget`, so an
|
|
497
|
+
emptiness nobody watched cannot be reported as an ordinary `stop`. Only `--idle 0` excuses it.
|
|
498
|
+
**`--running` also decides `wait` and `--retries` decides `retry`** — the two context branches the
|
|
499
|
+
table above carries, now applied inside the command from the counts the loop already tracks.
|
|
500
|
+
|
|
501
|
+
| Verdict | What the loop does |
|
|
502
|
+
| --- | --- |
|
|
503
|
+
| `run` | Start what `backlog:next` offered, up to the free lanes. The reason names how many more the maximum still allows; start no more than that |
|
|
504
|
+
| `watch` | Ask both commands again — at the 5-minute idle poll while the backlog is empty **and** nothing of this run's is in flight, and at the 60-second polling interval in every other case (a blocked backlog, a drain, or a watch that opened while children were still merging). *Whether the parent keeps that interval as a clock of its own* is the in-flight test: with nothing in flight the watcher declines for the whole watch and never exits, so the parent sleeps the interval itself; with something in flight the wake is the watcher's exit and the interval is only a floor on the re-ask (`backlogrun-progress.md` → "The wake exists only while something is in flight"). **Nothing is held while watching** — the working tree's hold and each drained lane were released at the last child's merge, so a watching run blocks no other run |
|
|
505
|
+
| `stop` | Report and finish. The reason it printed **is** the termination reason the completion report carries |
|
|
506
|
+
|
|
507
|
+
**At the drain the retrospective fires before this watch, not after it** (joshuafolkken/kit#2335):
|
|
508
|
+
`backlog:offer` marks the drain on the event stream and `run:step` fires the retrospective there, so the
|
|
509
|
+
watch that follows picks up its `auto-ok` filings. `retrospective.md` → "When it fires" is the single
|
|
510
|
+
source, read when `run:step` prints the step.
|
|
511
|
+
|
|
512
|
+
`--started` is when the invocation began; `--active` is when it last had work — the most recent ask
|
|
513
|
+
that was **not** `exhausted`, and in a resumed session the moment it picked the run up. **Refreshing
|
|
514
|
+
`--active` restarts the idle watch**, so an issue opted in mid-watch is picked up and the watch begins
|
|
515
|
+
again at its full budget. Both are ISO-8601 timestamps (`date -u +%FT%TZ`), and `--idle` without
|
|
516
|
+
`--active` is refused. `--merged` is what has merged and `--running` what is still in a lane; **both
|
|
517
|
+
count against the maximum**. **No ending abandons a lane**: whatever would have ended the run answers
|
|
518
|
+
`watch` while `--running` is above zero, so the lanes drain and their merges reach the report. The full
|
|
519
|
+
contract is `docs/josh-commands.md` → "`josh backlog:budget`".
|
|
520
|
+
|
|
521
|
+
**The completion report names three things the budgets make meaningful**: how many issues this run
|
|
522
|
+
took, how many of them were picked up during an idle watch, and the termination reason — quoted from
|
|
523
|
+
what `backlog:budget` printed rather than paraphrased.
|
|
524
|
+
|
|
525
|
+
### The cost check is not asked during a watch
|
|
526
|
+
|
|
527
|
+
**A watch does not count towards the session cut** (joshuafolkken/kit#1676). The hand-off check —
|
|
528
|
+
`pnpm josh cost --cut`, `backlogrun-progress.md` → "The hand-off" — is asked **at a child's merge**, and a
|
|
529
|
+
watch has no merges, so a run that is only watching never reaches one. That is a decision rather than
|
|
530
|
+
an omission: a watch holds nothing (the working tree's hold and every lane were released at the last
|
|
531
|
+
child's merge), its cost is bounded before it starts (`--idle N` is at most `N / 5` asks), and when the
|
|
532
|
+
watch picks something up the run has work again and the check is asked at that child's merge in the
|
|
533
|
+
ordinary way.
|
|
534
|
+
|
|
535
|
+
**So every cut is taken at a merge, which is what lets a resumed session state its own `--active`**: a
|
|
536
|
+
woken session picks the run up seconds after the merge the cut was taken at. The one shape that puts a
|
|
537
|
+
cut inside a watch — the backlog answering `exhausted` while this run's own children are still
|
|
538
|
+
merging — is the same, because the woken session has just merged a child.
|
|
539
|
+
|
|
540
|
+
**The 8-hour whole-run bound is untouched and still outranks all of this** — it is measured from the
|
|
541
|
+
record's `started_at` across every cut, so a run cannot watch its way past it in 30-minute pieces.
|
|
542
|
+
|
|
543
|
+
### Where the run stops
|
|
544
|
+
|
|
545
|
+
Termination is decided by what the loop is told, never by a judgement that enough has been done:
|
|
546
|
+
|
|
547
|
+
- **`--only` ends the run once the named list is done** — there is no pool and no idle watch to fall
|
|
548
|
+
through to, so the run reports and finishes; it never enters the pool loop at all.
|
|
549
|
+
- **`pnpm josh backlog:budget` answering `stop`** — the single decision, covering an idle watch
|
|
550
|
+
running out, the backlog emptying with the watch turned off, the maximum being reached, a parked
|
|
551
|
+
backlog, an unreadable listing, and the whole-run bound.
|
|
552
|
+
- **The whole-run 8-hour bound is unchanged and outranks both budgets**, and the idle watch lives
|
|
553
|
+
inside it: `backlogrun-progress.md` → "Waiting, and never waiting forever" is still where the figure is stated,
|
|
554
|
+
and `backlog:budget` is what applies it, so a run at the bound stops with candidates in hand and a
|
|
555
|
+
watch still open.
|
|
556
|
+
- **Every one of those budgets is counted across this run's own session cuts**, from the record
|
|
557
|
+
`pnpm josh run:carry` keeps rather than from a count held in the current session — "The session cut
|
|
558
|
+
is inside the invocation" above. A resumed run that started its budget over would stop 8 hours after
|
|
559
|
+
the _last_ cut instead of after the invocation, which is no bound at all.
|
|
560
|
+
- **The guards in `backlogrun.md` → "Guards"** apply unchanged, counted over the whole `backlogrun`
|
|
561
|
+
rather than per epic: children per run, Issues filed per run, and consecutive child failures. The
|
|
562
|
+
maximum above is a person's declaration of scale and does not replace any of them — whichever binds
|
|
563
|
+
first ends the run.
|
|
564
|
+
- **A `needs-human-review` child stops the whole run** before its commit — `SKILL.md` → §2z, which is
|
|
565
|
+
the single source, and `backlogrun-park.md` → "`needs-human-review` — the one stop that is not a park" for
|
|
566
|
+
what happens to its lane.
|
|
567
|
+
- **The hand-off check** — `pnpm josh cost --cut` at every child's merge, and the lane
|
|
568
|
+
hand-over that follows an `over` — is `backlogrun-progress.md` → "The hand-off", unchanged. It is
|
|
569
|
+
**not** asked during an idle watch: "The cost check is not asked during a watch" above is why.
|
|
570
|
+
- **Parking is not stopping.** A child that needs a decision, and a delegated unit that stopped
|
|
571
|
+
without reporting, are **parked** and the run continues (`backlogrun-park.md` → "park and
|
|
572
|
+
continue"); only the consecutive-failure guard above can turn repeated parks into a stop.
|
|
573
|
+
|
|
574
|
+
## What runs once per session, not once per issue
|
|
575
|
+
|
|
576
|
+
All of these are this file's, and are reached here in the same order and for the same reasons:
|
|
577
|
+
|
|
578
|
+
| Step | Where it is defined |
|
|
579
|
+
| --- | --- |
|
|
580
|
+
| `git switch main && git pull`, then `pnpm josh latest:scope`, then `pnpm josh lane:prune` — in the primary checkout, before the first lane opens | `backlogrun-lanes.md` → "Once per repository, before the first lane opens" |
|
|
581
|
+
| `josh latest` on `required` only, asked once at the first child and never in a lane | `backlogrun-child.md` → "`josh latest` runs once per session, not once per child" |
|
|
582
|
+
| `pnpm josh run:hold <N>`'s preflight check, before each child that is not in a lane | `backlogrun-child.md` → "Preflight" |
|
|
583
|
+
| `pnpm josh run:progress --wait` in the background, `--mark` at every real report | `backlogrun-progress.md` → "Progress while the run is quiet" |
|
|
584
|
+
| `pnpm josh release:scope` once, after the last issue has merged and the last lane is closed | `followup-reference.md` → "When `pnpm josh release` runs" |
|
|
585
|
+
|
|
586
|
+
**Two more run once per session and are this file's own, not this file's**:
|
|
587
|
+
`pnpm josh run:carry --begin "<the invocation, single-spaced>" --owner "$PPID"` before the plan and
|
|
588
|
+
`pnpm josh run:carry --end` when the run finishes, and beside each of them
|
|
589
|
+
`pnpm josh run:wake --start` and `pnpm josh run:wake --stop` — the supervisor that continues the run
|
|
590
|
+
across a cut. Both pairs are "The session cut is inside the invocation" above.
|
|
591
|
+
|
|
592
|
+
**Record the invocation in the form the supervisor can rebuild: one space between tokens, and a plain
|
|
593
|
+
integer for each budget value** — `backlogrun --max 3`, never `backlogrun --max 03`. What the
|
|
594
|
+
supervisor hands the next session is composed from constants and the validated integers rather than
|
|
595
|
+
copied out of the record, and it refuses to wake on a record its own rebuild would rewrite, because the
|
|
596
|
+
woken session hands that text straight back to `run:carry --begin` to be compared character for
|
|
597
|
+
character. A record written some other way is not lost quietly — the first cut ends the run with a
|
|
598
|
+
`warning` Telegram — but it ends the run, so write the canonical form rather than the keystrokes
|
|
599
|
+
(joshuafolkken/kit#1719).
|
|
600
|
+
|
|
601
|
+
**`pnpm josh epic:audit` is not run.** There is no epic to audit — the run began from the backlog, the
|
|
602
|
+
same reason this file skips it when it began from a bare Issue. The dependency graph the loop acts
|
|
603
|
+
on is still audited in effect, because `backlog:next` reuses `epic:next`'s own read and classify and
|
|
604
|
+
answers `error` rather than guessing when it cannot resolve one.
|