@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,600 @@
|
|
|
1
|
+
# `backlogrun` — progress, the hand-off, resume and waiting
|
|
2
|
+
|
|
3
|
+
**Read this file in full before the progress watcher starts** (`pnpm josh run:progress --wait`) and
|
|
4
|
+
before the hand-off check at a child's merge (`pnpm josh cost --cut`). It is a point-of-use
|
|
5
|
+
document, never an entry read: the entry procedure is `backlogrun.md`, which points here at those
|
|
6
|
+
steps (joshuafolkken/kit#2010). This file is the single source of the heartbeat, the session hand-off
|
|
7
|
+
and cut/resume, waiting without waiting forever, and the end-of-run summary and propagate.
|
|
8
|
+
|
|
9
|
+
After a carry hand-off, the detached `run:wake` supervisor runs the deterministic `backlog:drive`
|
|
10
|
+
loop. References below to a parent's mechanical polling and lane collection describe work now done
|
|
11
|
+
by that supervisor; an AI parent is started only for a driver branch that requires judgment.
|
|
12
|
+
|
|
13
|
+
## Progress while the run is quiet
|
|
14
|
+
|
|
15
|
+
**Start the progress step before step 1 of the loop, and do it without being asked.**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pnpm josh run:progress --wait --output <the transcript path of each delegated unit> # in the background
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**`--wait` waits one silence interval out, prints one line and exits — and the exit is what makes the
|
|
22
|
+
line arrive.** A harness that delivers a background command's output *when that command exits* — Claude
|
|
23
|
+
Code is one — relays nothing from a watcher that never exits; the long-running form (no `--wait`) is
|
|
24
|
+
right only where output is streamed. The parent changes no value on the line. **Every interval is three
|
|
25
|
+
moves and no fourth:**
|
|
26
|
+
|
|
27
|
+
1. Start `pnpm josh run:progress --wait --output <transcript paths>` **in the background**.
|
|
28
|
+
2. When it exits, **present what it printed as-is** — the command prints the five labelled lines and the
|
|
29
|
+
next report time itself.
|
|
30
|
+
3. **In that same turn, start the next one.** The interval is measured from the last report.
|
|
31
|
+
|
|
32
|
+
**`pnpm josh run:watcher:guard` detects a missed restart** (joshuafolkken/kit#2113): it refuses when
|
|
33
|
+
lane children are in-flight but the watcher's life record has gone stale. **It is wired into
|
|
34
|
+
`pretool-guard`, the one `PreToolUse` hook** (joshuafolkken/kit#2353), so the next tool call is refused
|
|
35
|
+
until the watcher is restarted — once per run, so the `pnpm josh run:progress --wait` that fixes it is
|
|
36
|
+
not blocked.
|
|
37
|
+
|
|
38
|
+
**`run:progress` prints the five labelled lines itself now (joshuafolkken/kit#2026); present them
|
|
39
|
+
as-is.** It emits the observation instant (`at`, local first and UTC beside it), the elapsed figures
|
|
40
|
+
(`quiet` and `unchanged`), the children in flight, the run state (`lanes`, `load`, `record`), and the
|
|
41
|
+
scheduled `next`, each behind its own label and on its own line — so relay the output verbatim and
|
|
42
|
+
round, rephrase or re-label nothing. How each field reads when it has nothing to report (`record
|
|
43
|
+
unread`, `no in-progress child yet`, `lanes none`, an absent `next`) is fixed by the command's own unit
|
|
44
|
+
tests. **A value said that way is still an observation, never a state**: `record unread` means no
|
|
45
|
+
`--output` path was given, not *not stalled*; `lanes none` is *no lane is open*, not *nothing is
|
|
46
|
+
running*; and the `next` line is a schedule — the time *if the silence continues*, superseded when a
|
|
47
|
+
real report resets the clock through `--mark`.
|
|
48
|
+
|
|
49
|
+
**It exits only when it has a line to hand over**, or when `--hours` runs out having never gone quiet
|
|
50
|
+
for a whole interval (that exit says so on standard error). **Nothing in flight keeps it waiting**, or
|
|
51
|
+
step 3 would make it a poll.
|
|
52
|
+
|
|
53
|
+
**`--mark` at every real report.** Whenever this loop reports something of its own — a child merged,
|
|
54
|
+
parked, a stop — run `pnpm josh run:progress --mark` in the same turn to restart the silence clock, so a
|
|
55
|
+
heartbeat does not land immediately behind a real report. The clock is silence, never a timer
|
|
56
|
+
(`docs/josh-commands.md` → "`josh run:progress`").
|
|
57
|
+
|
|
58
|
+
**Do not keep a progress clock of your own** — the hook refuses the arm rather than asking. A `Bash`
|
|
59
|
+
call that only sleeps adds a second clock nobody reconciles, so `scripts/rules/early-heartbeat.ts` →
|
|
60
|
+
`decide` refuses a sleep-only `Bash` call on three tests — a timer it already allowed is still live, the
|
|
61
|
+
report it would produce would land before the interval is up, or the wait runs longer than the interval
|
|
62
|
+
— so **a single correctly-spaced arm is allowed**. It is still not the way to report; the step above
|
|
63
|
+
prints without arming anything, and `--wait` is not a wait timer.
|
|
64
|
+
|
|
65
|
+
**The default interval is twenty minutes, overridable — by the person, not the run.**
|
|
66
|
+
`JOSH_PROGRESS_INTERVAL_MINUTES` moves both sides (the guard reads it through the watcher's reader);
|
|
67
|
+
`josh` → `progress_interval_minutes` in `package.json` sits one step below the variable, so a cadence
|
|
68
|
+
set once holds on every machine and cloud session. **`--interval` moves the watcher alone** — a hook
|
|
69
|
+
has no command line — so it makes the watcher quieter than the floor, never the guard stricter. Twenty
|
|
70
|
+
rather than ten because a child measures 20–46 minutes.
|
|
71
|
+
|
|
72
|
+
**An explicit ask is not a heartbeat, and it is exempt by construction** — what is refused is arming a
|
|
73
|
+
*timer*, and a person asking "how is it going" arrives with no timer in front of it.
|
|
74
|
+
**Every unscheduled progress statement is answered by `pnpm josh run:progress --once`** — presented in
|
|
75
|
+
the same five field lines, the reply to an explicit ask and the note just after a run starts alike.
|
|
76
|
+
**Never write a clock time the command did not print** (not an approximation, not a placeholder — where
|
|
77
|
+
a field is missing, say so). **`--once` records the report**, so no `--mark` beside it. **A live timer
|
|
78
|
+
is counted from the record the guard writes when it allows one**, never from the machine's `sleep`
|
|
79
|
+
processes.
|
|
80
|
+
|
|
81
|
+
**Every report opens with the time the observation was taken** — not only how long it has been quiet: an
|
|
82
|
+
absolute instant, `at YYYY-MM-DD HH:MM±HH:MM / YYYY-MM-DDTHH:MMZ`. A relative figure means something
|
|
83
|
+
only while the reports keep coming, and unattended execution is made of the events that break that — a
|
|
84
|
+
suspend, a rate limit, a restart. **The date is part of it**, and **the local clock leads with UTC
|
|
85
|
+
beside it and the offset that ties them** (the line is relayed to other machines and read in cloud
|
|
86
|
+
sessions). **It is added, never substituted for the elapsed figure**, and **the presented line needs no
|
|
87
|
+
stamp computed for it** — the command prints the `at` stamp and the `next` field.
|
|
88
|
+
|
|
89
|
+
**The line carries observations, never "still running", and nothing in it is a verification result** —
|
|
90
|
+
no gate, CI or check rollup, because the command reads none of them.
|
|
91
|
+
|
|
92
|
+
**The invariant is a tier, not a mechanism** (joshuafolkken/kit#2156, joshuafolkken/kit#2207). Three
|
|
93
|
+
tiers say how much of a person's attention a signal takes: **interrupt** reaches for it now (a Telegram),
|
|
94
|
+
**ambient** is seen without being asked for, and **requested** is read only when a person types for it.
|
|
95
|
+
**The heartbeat sits at the ambient tier, and stays there across a `backlogrun` session cut — never
|
|
96
|
+
promoted to interrupt, never demoted to requested.**
|
|
97
|
+
|
|
98
|
+
**The report surface belongs to the run, not to the session** (joshuafolkken/kit#2207). The run's
|
|
99
|
+
session-facing events — a plan posted, a child launched, a PR opened, a review round, a park, a cut, a
|
|
100
|
+
stop, a merge — are appended to one ordered stream keyed to the run's identity (`pnpm josh run:event`),
|
|
101
|
+
which survives the cut because it is the run's and not any one session's. **Every session is a writer;
|
|
102
|
+
the reader is a script in a pane of the person's own, never a conversation** (#2492):
|
|
103
|
+
`pnpm josh run:event --watch` prints each event the moment it lands, in the session language, and the
|
|
104
|
+
`heartbeat` events say the run is alive when quiet. A relaying session re-read its whole history per
|
|
105
|
+
event, so **no session relays the stream** — name the watch command once, at the first cut or when
|
|
106
|
+
asked. **It is the same reader before and after the cut**: a cut moves who executes, never where the
|
|
107
|
+
stream lives.
|
|
108
|
+
|
|
109
|
+
**Interrupt is withheld on purpose**: no Telegram, because `confirmation` and `completion` are what
|
|
110
|
+
interrupt a person, and a line every fifteen minutes is the fatigue that stops them being
|
|
111
|
+
read. **`pnpm josh run:wake --list` is the requested tier** — the last-event read of the stream the
|
|
112
|
+
watch pane reads, for a person who types for one line rather than watching. **`tail -F` on the
|
|
113
|
+
raw stream file is a recovery path, not the ambient surface** — the watch pane is how progress is seen
|
|
114
|
+
without asking, and the raw `tail` is the fallback when the pane has stopped, named for that role in
|
|
115
|
+
`--list`'s own output.
|
|
116
|
+
|
|
117
|
+
**A stop is an interrupt, and only a stop** (joshuafolkken/kit#2136). The heartbeat says a run is still
|
|
118
|
+
going; a run that has _stopped_ — every remaining child blocked behind a parked one, the backlog drained
|
|
119
|
+
of anything runnable, the failure streak tripped — is the event the ambient tier was hiding, because
|
|
120
|
+
after a cut "quiet" and "stopped" look identical until a person reads for it. So the terminal stop is
|
|
121
|
+
pushed to the interrupt tier: `pnpm josh run:carry --end --stopped "<reason>"` sends one ⏸️ confirmation
|
|
122
|
+
as it ends the record, and because the record is gone by the second `--end` the same stop never notifies
|
|
123
|
+
twice. A parked child is pushed by the child itself, which records the park and sends its own
|
|
124
|
+
`confirmation` before it stops (`backlogrun-park.md`). **Nothing new carries either one** — both ride the
|
|
125
|
+
existing notification types and the record the watcher already keeps.
|
|
126
|
+
|
|
127
|
+
**A heartbeat is emitted from the moment a run has started, even before any child carries
|
|
128
|
+
`in-progress`** — "a run has started" is read from a mechanical record (a registered lane, a held work
|
|
129
|
+
tree, or a carried budget), and the line names that stage as an observed fact (`no in-progress child
|
|
130
|
+
yet`). **Only a checkout with no run recorded at all stays silent**, which keeps an ordinary
|
|
131
|
+
conversational session outside the heartbeat.
|
|
132
|
+
|
|
133
|
+
**The scope is every implementing run, not this command alone.** `fullrun`, `halfrun` and `backlogrun`
|
|
134
|
+
start the same watcher under the same rules, and this section is the single source for all four; `kickoff`
|
|
135
|
+
starts none. **`halfrun` is included** because the trigger is silence rather than command identity — it
|
|
136
|
+
still implements, runs the whole gate, both review rounds and `pnpm josh test:e2e`, most of the 20–46
|
|
137
|
+
minutes.
|
|
138
|
+
|
|
139
|
+
**One watcher per run, and the outermost invocation is the one that starts it.** A `fullrun` running as
|
|
140
|
+
a `backlogrun` named issue or an `backlogrun` child starts none: the brief names the invocation it descends
|
|
141
|
+
from. `backlogrun` starts one for the whole batch. **A dispatched lane child is refused a watcher by its
|
|
142
|
+
`JOSH_LANE_CHILD` mark** — it still runs `--mark` for the parent's clock, but every reporting form
|
|
143
|
+
(`--wait`, `--once`, the default watch) exits at once with a notice, so a child that misreads the prose
|
|
144
|
+
is harmless.
|
|
145
|
+
|
|
146
|
+
**In a single-issue run it starts immediately after `pnpm josh run:hold` succeeds** — the hold is itself
|
|
147
|
+
the record that says the run has started. **It is started in the target repository's checkout, and
|
|
148
|
+
`--mark` is run there too** — a cross-repository run is implemented in that repository's checkout, and a
|
|
149
|
+
watcher started in the session's own tree would read the wrong `in-progress` listing.
|
|
150
|
+
|
|
151
|
+
**What counts as a real report when the run has one issue.** A `fullrun` has exactly one child, so the
|
|
152
|
+
unit is **any turn that puts a progress statement in front of the person** — four of them, `--mark` run
|
|
153
|
+
in the same turn as each: **the Step 0 work summary, the pull request opening, each review round's
|
|
154
|
+
verdict, and any `confirmation` / `failure` / `completion` notification or stop.** **A tool result only
|
|
155
|
+
you read is not one** — a gate run, a `gh` read, an edit — and marking on those would hide the silence
|
|
156
|
+
the interval measures.
|
|
157
|
+
|
|
158
|
+
**On a quiet tick the turn is the relayed line plus at most two lines of the run's own prose**, saying
|
|
159
|
+
only what changed stage and what is being waited on. **A tick is quiet when none of the real reports
|
|
160
|
+
happened since the last one**; a gate that went green, a review round, a file edited, a poll answering
|
|
161
|
+
`wait` are the run working, not a report. **No table, no re-listing of children, no restating of the
|
|
162
|
+
plan** — `epic:next`, the epic body and the progress comment hold all three. **A real report is not
|
|
163
|
+
bounded by that**: `--mark` restarts the clock, so a merge, a park or a stop is where the run may be
|
|
164
|
+
long.
|
|
165
|
+
|
|
166
|
+
**`--output` is omitted in a single-issue run, and `record` reads `unread`** — there is no delegated
|
|
167
|
+
unit to name (a batch's unit changes every issue), so a fixed path would age a finished unit's file;
|
|
168
|
+
`unread` is the command's defined answer for "no path was given".
|
|
169
|
+
|
|
170
|
+
**A run that merges needs no teardown; a run that stops has to end the reporting itself.** The issue
|
|
171
|
+
leaves the `in-progress` listing at the merge, so whatever is waiting prints nothing and `--hours` ends
|
|
172
|
+
it. **A stop keeps that label on purpose** — so **no further `--wait` is started** after the stop
|
|
173
|
+
notification, and any long-running watcher still in the background is stopped in the same turn. That
|
|
174
|
+
covers `halfrun`'s stop before commit, a `needs-human-review` stop, a split or prerequisite stop, and
|
|
175
|
+
a `backlogrun` named issue's failure stop.
|
|
176
|
+
|
|
177
|
+
### Running a named epic's children
|
|
178
|
+
|
|
179
|
+
`josh epic:next <E> --repo <this repository> --lanes` prints **one issue number per line** on standard
|
|
180
|
+
output — as many as that repository has free lanes — or, when there is no child to run, the verdict as a
|
|
181
|
+
single token. Everything else goes to standard error. Without `--lanes` the answer is a single token
|
|
182
|
+
either way.
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
answers=$(pnpm josh epic:next 858 --repo joshuafolkken/kit --lanes)
|
|
186
|
+
# one issue number per line, up to the number of free lanes; a verdict token when there is none
|
|
187
|
+
answers=$(pnpm josh epic:next 858 909 --repo joshuafolkken/kit --lanes)
|
|
188
|
+
# every named epic, merged into the same pool — "Several epics in one run" above
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**`--lanes` is the form to use.** A lane's branch is `<N>-lane`, which `pnpm josh git` commits from, so
|
|
192
|
+
a child handed a lane runs the whole `fullrun` procedure inside it. Read a line per child, and treat a
|
|
193
|
+
single non-numeric line as the verdict.
|
|
194
|
+
|
|
195
|
+
1. Run the command above.
|
|
196
|
+
2. **One or more numbers** — where the child runs in this session's own checkout, its `fullrun` claim
|
|
197
|
+
`pnpm josh run:hold <N>` **now runs the preflight check itself** and is obeyed: `reclaim` is
|
|
198
|
+
recovered and `run:hold` asked again, `park` parks this child and returns to step 1, `unknown` stops
|
|
199
|
+
the session, `resume` starts the child on the branch that is there with the whole verification gate
|
|
200
|
+
re-run, and `hold` starts it. **In a lane the check is skipped**, and `lane:open`'s own answer
|
|
201
|
+
replaces it. **Everything from here on is per child**:
|
|
202
|
+
with several in flight each is confirmed, counted and closed on its own, and step 1 is asked again
|
|
203
|
+
once a lane comes free rather than once the last child returns. Either way the child runs as
|
|
204
|
+
`fullrun #<N>` does, **in a delegated unit where one is available** (`pnpm josh delegate epic-child`
|
|
205
|
+
→ `delegate`) and **in this session's own context where none is**, **except that `josh latest` is
|
|
206
|
+
not run** and **no progress watcher is started**. `git switch main && git pull` runs per child in
|
|
207
|
+
whichever context implements it, **and again in this session afterwards** when the child was
|
|
208
|
+
delegated. **In a lane the child cannot run it at all**, so it is the parent's, immediately before
|
|
209
|
+
that lane's `lane:open`.
|
|
210
|
+
|
|
211
|
+
**Start the unit without blocking on it — `pnpm josh lane:dispatch <N>` when the child runs in a
|
|
212
|
+
lane — and in the same turn start `pnpm josh lane:await <N...>` in the background** (joshuafolkken/kit#2113).
|
|
213
|
+
`lane:await` watches local process presence and exits when any named child confirms-complete,
|
|
214
|
+
waking the parent at the actual completion rather than at the next heartbeat interval. **The
|
|
215
|
+
re-confirm delay and poll interval are the command's, not the agent's** — pass only the issue
|
|
216
|
+
numbers.
|
|
217
|
+
|
|
218
|
+
**A `lane:await` wake is a confirmed-gone process, so classify the ending at once — do not wait out
|
|
219
|
+
the silent-unit window** (joshuafolkken/kit#2277). `lane:await` exits only after the child's process
|
|
220
|
+
has disappeared and stayed gone across its re-confirm delay, which is the definitive end signal; a
|
|
221
|
+
child that died reaching the API wrote its last line — an `API Error` — just before it went, so a
|
|
222
|
+
`run:liveness` poll would read that fresh output as `alive` and sit for the whole 30-minute silent-unit
|
|
223
|
+
window before it ever said `stopped` (the measured 402-/52-minute waits). So on a `lane:await` wake go
|
|
224
|
+
straight to `pnpm josh run:merge <N> --output <path>` — the composite reads the child's **exit
|
|
225
|
+
record**, decisive whether the child merged, died on an outage, or abandoned mid-implementation
|
|
226
|
+
("Running a named epic's children" reads its tokens). An outage child is re-dispatched in the same run
|
|
227
|
+
and a run of them trips the environment guard; nothing waits for a person.
|
|
228
|
+
|
|
229
|
+
**`run:liveness` stays the fallback for a lane no `lane:await` is watching** — a handed-over lane a
|
|
230
|
+
resumed session polls ("Picking the lanes up in the fresh session"). Ask
|
|
231
|
+
`pnpm josh run:liveness <N> --output <path> --process <what `pgrep -laf "(fullrun|run-ship-cli\.ts .*) #<N>$"` found>` where
|
|
232
|
+
that file has been unchanged for the silent-unit window; on `stopped` its own advice routes the child
|
|
233
|
+
through the same `run:merge --output` classification. **The flag is what you saw, never what kind of
|
|
234
|
+
child it is.**
|
|
235
|
+
|
|
236
|
+
When the unit reports back, **confirm the child from GitHub before believing it**:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
pnpm josh issue:state <N> # a child in this repository
|
|
240
|
+
pnpm josh issue:state <N> --repo <owner/repo> # a child in another one
|
|
241
|
+
# state: CLOSED
|
|
242
|
+
# labels: (none)
|
|
243
|
+
# human_review: no
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**`--repo` is not optional for a cross-repository child.** Without it the read resolves `<N>` against
|
|
247
|
+
the repository this session runs in.
|
|
248
|
+
|
|
249
|
+
`state: CLOSED` is the only answer that means the child finished. **Read the `human_review:` and
|
|
250
|
+
`labels:` lines before calling anything else a failure** — three outcomes look alike from here, which
|
|
251
|
+
is why one command prints all of them. **A non-zero exit is not `OPEN`**: the command exits non-zero
|
|
252
|
+
without a state when the number resolves to nothing (`does not resolve`) or the read failed (`could
|
|
253
|
+
not read`, a rate limit or expired auth). Re-read before deciding.
|
|
254
|
+
|
|
255
|
+
- **Open, carrying `needs-decision`** — the unit **parked** it. Not a failure: leave the label on, do
|
|
256
|
+
**not** count it against the consecutive-failure guard, and go back to step 1.
|
|
257
|
+
- **Open, and `human_review: yes`** — the child **stopped before its commit**, the run's own ending
|
|
258
|
+
(§2z). **`Open` is part of the test** — a CLOSED child carrying the label finished and merged.
|
|
259
|
+
**Read that line, not the `labels:` one**: GitHub keeps the spelling a label was created with, so
|
|
260
|
+
matching the lowercase string by eye drops the child into the failure branch below. Leave
|
|
261
|
+
`in-progress` **on**, do not park it, do not count it, and do **not** go back to step 1. Finish the
|
|
262
|
+
session and report. **Do not send a second `confirmation` Telegram** — the unit already sent one.
|
|
263
|
+
Where the child ran in this session's own context, that first notification is yours to send.
|
|
264
|
+
- **Open, without `needs-decision`** — it failed. Remove the stale `in-progress` here (Tier A), count
|
|
265
|
+
it against the consecutive-failure guard, and **park it**. Parking is what stops the next
|
|
266
|
+
`epic:next` from handing the same child straight back.
|
|
267
|
+
|
|
268
|
+
**Never ask `epic:next` in place of this read.** A child that did not finish still carries
|
|
269
|
+
`in-progress`, which `epic:next` classifies as waiting on time — the loop would poll to the 90-minute
|
|
270
|
+
stale window and learn nothing.
|
|
271
|
+
|
|
272
|
+
**A merge is one event, and one call of the parent's — `pnpm josh run:merge <N>`**
|
|
273
|
+
(joshuafolkken/kit#2024). What was a reading turn and an acting turn is one composite command: it
|
|
274
|
+
confirms the child from GitHub, does the post-merge steps, folds in the hand-off check, and prints
|
|
275
|
+
the next child number — or a control verdict — for the parent to read. Pass the merged child's
|
|
276
|
+
number and the offer's source — `--epic <E> --repo <owner/repo>` for a named epic,
|
|
277
|
+
nothing for the opted-in backlog — with `--owner "$PPID"` so it counts into the carry record under
|
|
278
|
+
the ownership guard.
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
next=$(pnpm josh run:merge <N> --epic <E> --repo <owner/repo> --owner "$PPID" --output <path>)
|
|
282
|
+
# a child number (or several, one per free lane) to run next, or a verdict token
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Pass `--output <path>` — the child's transcript** (joshuafolkken/kit#2240). It is what lets the
|
|
286
|
+
composite tell an API-outage ending apart from a genuine child failure: without it an OPEN, unparked
|
|
287
|
+
child is a plain failure as before, so the flag is how the outage split is turned on.
|
|
288
|
+
|
|
289
|
+
**What the one call does is decided by what the child turned out to be** — read from its GitHub state
|
|
290
|
+
(and, for the failed case alone, its exit record), never from a log: a **merged** child (CLOSED) is
|
|
291
|
+
counted into the carry record (which resets the failure streak), then `pnpm josh ms`,
|
|
292
|
+
`pnpm josh lane:close <N>`, and the counters mirrored onto the epic comment; a **parked** child (OPEN,
|
|
293
|
+
`needs-decision` or `already-done`) is left alone and not counted; an **outage** child (OPEN, neither
|
|
294
|
+
label, but the exit record shows it could not reach the API) has its stale `in-progress` dropped, is
|
|
295
|
+
**not** parked and **not** counted against the consecutive-failure guard, and stays re-dispatchable
|
|
296
|
+
(joshuafolkken/kit#2240); a **failed** child (OPEN, neither label, not an outage) has its stale
|
|
297
|
+
`in-progress` dropped, is parked with `needs-decision`, and is counted against the consecutive-failure
|
|
298
|
+
guard. **A turn whose whole content is one read, or one two-line progress report, is the shape this
|
|
299
|
+
collapses.**
|
|
300
|
+
|
|
301
|
+
**Beyond the offer `epic:next` prints** (`run` becomes numbers; `wait` / `stop` / `complete` /
|
|
302
|
+
`error` pass through), the composite adds six verdict tokens: `over` — the merge crossed the budget,
|
|
303
|
+
so hand the lanes over and take the cut ("The hand-off" below); `human-review` — the child stopped
|
|
304
|
+
before its commit, the run's own ending (SKILL.md → §2z), so stop; `stop` — the consecutive-failure
|
|
305
|
+
guard tripped; `environment` — the consecutive-**outage** guard tripped, so the API is down and the
|
|
306
|
+
run stops as an environment failure rather than the children's (joshuafolkken/kit#2240); `resumed` —
|
|
307
|
+
an unadopted cut was relaunched; `lane:await <N>` it again (joshuafolkken/kit#2484); and `retry` — the child's state could not be read, so re-read it.
|
|
308
|
+
|
|
309
|
+
**The counters are the carry record's, and the epic progress comment is generated from it** (see "The
|
|
310
|
+
counters live in the record" below). **The hand-off check is folded into the merge branch of the one
|
|
311
|
+
call** — `pnpm josh cost --cut`, run after `pnpm josh ms`; `under` offers the next child,
|
|
312
|
+
`over` prints `over` so the parent hands its lanes over and takes the cut ("The hand-off" below), and
|
|
313
|
+
a session that cannot measure is read as `over`. **Never read the condition off `pnpm josh delegate
|
|
314
|
+
epic-child`** — a static policy lookup that answers `delegate` everywhere, so a gate built on it never
|
|
315
|
+
fires.
|
|
316
|
+
3. **`wait`** — go back to step 1. **With something of this run's own in flight, that happens on the
|
|
317
|
+
wake the progress watcher's exit delivers** and the parent starts no sleep of its own; the 60 s
|
|
318
|
+
figure bounds how soon the ask may be repeated. **With nothing in flight the watcher declines and
|
|
319
|
+
never exits, so the parent keeps the interval** — the case for "another repository has work but this
|
|
320
|
+
one does not", and for a cross-repository publish wait. The table in "The wake exists only while
|
|
321
|
+
something is in flight" below decides which.
|
|
322
|
+
4. **`stop`** — report the parked children and finish.
|
|
323
|
+
5. **`complete`** — post the epic summary and finish.
|
|
324
|
+
6. **Exit code 1** — `epic:next` refused a cyclic or contradictory graph, or could not read a child.
|
|
325
|
+
Report and finish.
|
|
326
|
+
|
|
327
|
+
## After a named epic completes
|
|
328
|
+
|
|
329
|
+
**When a named epic's children are all processed — merged or parked — the run advances to the next
|
|
330
|
+
named item, and then drains the opted-in backlog** (unless `--only`, which stops after the named
|
|
331
|
+
list). A completed epic is one step of the invocation, never its end: `backlogrun` owns the whole
|
|
332
|
+
opted-in pool, so it goes on to whatever the plan and `backlog:next` offer next. A named item that is
|
|
333
|
+
a bare, non-epic Issue reaches the same point when it merges without a prerequisite or a split turning
|
|
334
|
+
up ("Nothing found means no epic"). The epic's own completion summary is sent by the session standing
|
|
335
|
+
in the repository that owns it ("Who sends the summary, and who propagates" below).
|
|
336
|
+
|
|
337
|
+
## The hand-off — one session does not have to run the whole batch
|
|
338
|
+
|
|
339
|
+
**A session pays for every child it has already run, on every later turn**, because every turn re-reads
|
|
340
|
+
the accumulated preamble. **So the run reads the marginal cost off a line rather than feeling for it** —
|
|
341
|
+
at **every** child's merge, and crossing it **hands the session off to a fresh one, carrying the budget
|
|
342
|
+
with it** (`backlogrun-steps.md` → "The session cut is inside the invocation"). The cut is where a `backlogrun` spans several
|
|
343
|
+
sessions; it is not a stop.
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
pnpm josh cost --cut
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
It prints `over` or `under` on standard output and the measured figure on standard error. `over` means
|
|
350
|
+
the next turn of this session costs more than the threshold in billed input, and the number is passed
|
|
351
|
+
explicitly so a run cannot drift it by remembering it wrong.
|
|
352
|
+
|
|
353
|
+
**135,000 is shared by the scheduler entry, scheduler hand-off and lane worker implementation cut.**
|
|
354
|
+
The value is `CONTEXT_CUT_THRESHOLD` in `scripts/cost-runtime/context-cut-threshold.ts`; `cost --cut`,
|
|
355
|
+
`run:merge` and `run_cut.IMPLEMENTATION_CONTEXT_THRESHOLD` all read it rather than carrying separate
|
|
356
|
+
numbers. The output ceiling and the entry-read figure are a separate 150,000, not this threshold.
|
|
357
|
+
|
|
358
|
+
### The check is asked at every merge, and delegation does not excuse it
|
|
359
|
+
|
|
360
|
+
**A delegating parent reaches the threshold too**, because most of its billed input is conversation
|
|
361
|
+
history rather than resident preamble, and the cost is not linear — n requests bill about n²/2, so a
|
|
362
|
+
condition that delays the first cut multiplies a cost rather than deferring it. **So there is no
|
|
363
|
+
condition: `pnpm josh cost --cut` is asked after every child's merge**, delegated or not.
|
|
364
|
+
**Never wire the question to `pnpm josh delegate epic-child`** — a static policy lookup answering
|
|
365
|
+
`delegate` on every machine forever, so a gate built on it never fires.
|
|
366
|
+
|
|
367
|
+
`over` and `under` are not the only answers: the command **exits 1 with empty standard output** when
|
|
368
|
+
there is no transcript, or no request in it. **Neither is `under`.** Reading "could not measure" as
|
|
369
|
+
"still cheap" is the same mistake as reading an unreadable comment listing as "no findings" — report that
|
|
370
|
+
the check could not answer, and take `over`'s branch at that child.
|
|
371
|
+
|
|
372
|
+
### When to ask, and what to do
|
|
373
|
+
|
|
374
|
+
**Ask once per child, immediately after its merge and `pnpm josh ms`** — never mid-child. That is the
|
|
375
|
+
only moment where **this** child's work is all written down: the PR is merged, the working tree is clean
|
|
376
|
+
on the default branch, and the epic's state on GitHub is complete.
|
|
377
|
+
|
|
378
|
+
### The lane child reuses this measurement mid-implementation
|
|
379
|
+
|
|
380
|
+
**The same `pnpm josh cost --over` measurement bounds a lane child's context _during_ implementation, not
|
|
381
|
+
only the parent's between children** — the pre-gate cut fires only once implementation is done, so it
|
|
382
|
+
never caps the thinking a child accumulates while implementing. The child measures its own per-request
|
|
383
|
+
context with **this command** at the shared `CONTEXT_CUT_THRESHOLD`, 135_000, and cuts with
|
|
384
|
+
`pnpm josh run:cut --impl <N> --handoff <path>`. **The measurement and threshold are single-sourced**:
|
|
385
|
+
`cost_verdict.per_request_cost` is what both seams compare, and `cost --cut` selects the same constant
|
|
386
|
+
for both. The boundary and the resume: `pre-gate-cut.md` → "The implementation-phase cut".
|
|
387
|
+
|
|
388
|
+
**A merge is not by itself a safe seam, because another lane may still be running.** The reference to
|
|
389
|
+
where each unit writes lives in the lane, so a session that never dispatched the child can poll it and
|
|
390
|
+
the pool is handed over instead of drained. **Read the lanes rather than judging them:**
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
pnpm josh lane:list # `none`, or one line per lane with its state and its recorded output path
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Every lane in flight is handed over, and the last column is what makes that possible.**
|
|
397
|
+
`pnpm josh lane:output <N>` prints the same path on its own, so the next session polls a lane it never
|
|
398
|
+
opened with two:
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
unit_output=$(pnpm josh lane:output <N>) &&
|
|
402
|
+
pnpm josh run:liveness <N> --output "$unit_output" --process alive
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**`--process` carries what `pgrep` found, and with a dispatched child that is the whole answer.** Run
|
|
406
|
+
`pgrep -laf "(fullrun|run-ship-cli\.ts .*) #<N>$"` first and pass `alive` where it found the child and `none` where it did not
|
|
407
|
+
— **never `alive` because the child was dispatched.** The child's command line holds no path, so a
|
|
408
|
+
`pgrep` on the lane's directory never matches a live child; the trace is the deciding input, because a
|
|
409
|
+
log that has stopped moving is a session thinking rather than one that died.
|
|
410
|
+
|
|
411
|
+
**The `&&` is load-bearing.** A lane that records nothing prints `none` and exits non-zero; substituted
|
|
412
|
+
straight into `--output`, that `none` is a relative path and `run:liveness` answers `undetermined` for
|
|
413
|
+
ever.
|
|
414
|
+
|
|
415
|
+
- **`under`** — go back to step 1 of the loop and run the next child.
|
|
416
|
+
- **`over`** — **the run hands its lanes over and takes the cut at once.** Open no new lane and take no
|
|
417
|
+
new child. Confirm every lane still in flight records an output path — one missing is filled in with
|
|
418
|
+
`pnpm josh lane:output <N> <path>` — then take one of the next two bullets in the same turn. **There
|
|
419
|
+
is no waiting here at all**: nothing has to finish, because nothing is being abandoned. The child is
|
|
420
|
+
an operating-system process of its own (`pnpm josh lane:dispatch`), so the lanes keep running.
|
|
421
|
+
- **A lane nobody could poll** — `unreadable`, or `open` with no recorded path and none that can be
|
|
422
|
+
supplied — **and the cut does not happen.** Name that lane in the progress comment and go back to
|
|
423
|
+
step 1 of the loop; the reading is asked again at the next merge.
|
|
424
|
+
- **Every in-flight lane records a path** — **record the cut and hand the session off.** `backlogrun`
|
|
425
|
+
declares a budget — `--max`, `--idle` and the 8-hour bound — so the cut is an execution detail: count
|
|
426
|
+
everything the session has, then run `pnpm josh run:carry --cut --owner "$PPID"`. **Unless it answers
|
|
427
|
+
`capped`** (below), `pnpm josh run:wake` then starts the next session, which polls the still-running
|
|
428
|
+
lanes from `lane:list`. Post the progress comment naming **every lane in flight and the path each
|
|
429
|
+
records**, name `pnpm josh run:event --watch` for a pane, and end the turn — nothing is relayed (#2492).
|
|
430
|
+
`backlogrun-steps.md` → "The session cut is inside the invocation" is the single source of the
|
|
431
|
+
carry; this reading is only where the cut is *taken*.
|
|
432
|
+
- **`capped`** — the invocation has taken its `MAX_CUTS` cuts (joshuafolkken/kit#2346), so `--cut`
|
|
433
|
+
refused and left the record un-handed-off. **Do not `run:wake` or hand off**: a wake over it recovers
|
|
434
|
+
as a crashed owner into a fresh cold session — the churn the cap prevents. Carry **this** session on
|
|
435
|
+
uncut and re-ask at the next merge.
|
|
436
|
+
|
|
437
|
+
**The hand-over is what makes the cut reachable, and the drain it replaced cost the pool.** `epic:next
|
|
438
|
+
--lanes` keeps the seats full, so a cut gated on an idle pool that merely happened would read `over` at
|
|
439
|
+
every merge and cut at none. Recording the path removes that cost.
|
|
440
|
+
|
|
441
|
+
**A lane is handed over only where the next session can actually poll it.** A lane whose state is
|
|
442
|
+
`open` **and** whose recorded path is not `-` is handed over. A **`stranded`** lane has no work tree and
|
|
443
|
+
so no running child — `pnpm josh lane:prune` closes it. An **`unreadable`** one cannot be told apart
|
|
444
|
+
from a running child, and an `open` lane recording **no path** is the same: **the cut does not happen**,
|
|
445
|
+
the lane is named in the epic progress comment, and the run goes back to step 1. **Never assume idle** —
|
|
446
|
+
a wrong cut abandons a child, a missed cut only costs tokens.
|
|
447
|
+
|
|
448
|
+
**The hand-off report belongs to the stop, not to the reading.** For the one reading that does not stop —
|
|
449
|
+
an `unreadable` lane, or an `open` one recording no path — the run goes back to step 1 and writes no
|
|
450
|
+
hand-off report; the epic progress comment is the record. `report-format.md` → "区切りの報告" states it
|
|
451
|
+
from the format's side.
|
|
452
|
+
|
|
453
|
+
**This is not a failure and not a park.** No child needs a decision; the run is either handing its lanes
|
|
454
|
+
on or standing at the seam. `needs-decision` is not applied, nothing is stashed, and no Issue is filed.
|
|
455
|
+
|
|
456
|
+
### Picking the lanes up in the fresh session
|
|
457
|
+
|
|
458
|
+
**The resumed session does not start a child again, and does not open a lane that is already open.** Its
|
|
459
|
+
first reading is `pnpm josh lane:list`: every line with a recorded path is a child that was handed over,
|
|
460
|
+
polled exactly as the session that dispatched it polled it (the two-line form above, same answer table
|
|
461
|
+
and same two-`undetermined`-in-a-row rule). **The `--process` argument is the one thing that changes** —
|
|
462
|
+
a fresh session did not start those processes, so it reports `none` unless it has looked itself.
|
|
463
|
+
**`pnpm josh lane:open <N>` re-attaches to a lane whose branch is already pushed**, which a handed-over
|
|
464
|
+
lane needs when its child has to be finished by hand.
|
|
465
|
+
|
|
466
|
+
**Restart the progress watcher by name** — `pnpm josh run:progress --wait --output <handed-over paths>`
|
|
467
|
+
in the background, in the same turn as that first `lane:list`. The cut session's watcher exited with it,
|
|
468
|
+
and the wired `run:watcher:guard` stops a resume that skips this (joshuafolkken/kit#2353).
|
|
469
|
+
|
|
470
|
+
### A carried-over merge does not stand in front of the next lane
|
|
471
|
+
|
|
472
|
+
**A carried-over child finishes in its own detached unit, and the resumed parent does not stand in front
|
|
473
|
+
of its merge.** A lane handed over at the cut is still running its own `fullrun` — the foreground
|
|
474
|
+
`pnpm josh followup` and the CI wait included — in a process of its own (background-commands.md →
|
|
475
|
+
"`pnpm josh followup` — foreground": foreground is *within the unit*, the background from the parent).
|
|
476
|
+
**So the parent never runs a carried-over child's `followup` itself**: it polls the handed-over lane and
|
|
477
|
+
opens new work beside it, rather than finishing carried-over merges one after another before a single
|
|
478
|
+
new lane opens. **The reads and the dispatches go out together, in one turn** — `pnpm josh lane:list`,
|
|
479
|
+
`pnpm josh run:liveness`, `epic:next --lanes`, and opening a lane for a child it offers take none of each
|
|
480
|
+
other's results (the turn-batching rule this file states for a merge event, applied at the resume).
|
|
481
|
+
**Independence is the offer command's answer**: a new child `blocked-by` a carried-over Issue is
|
|
482
|
+
withheld, one that is not is dispatched into a free lane beside it. **A carried-over child that did not
|
|
483
|
+
survive the cut is re-dispatched, never adopted** — `pnpm josh lane:open <N>` then
|
|
484
|
+
`pnpm josh lane:dispatch <N>`, never picked up into the parent's own context.
|
|
485
|
+
|
|
486
|
+
### The counters live in the record
|
|
487
|
+
|
|
488
|
+
**The single source of the run's counters is the carry record (`pnpm josh run:carry`), and the epic
|
|
489
|
+
progress comment is generated from it** (joshuafolkken/kit#2024) — children run, Issues filed,
|
|
490
|
+
**consecutive failures**, and the time the run started, held in one place rather than counted twice.
|
|
491
|
+
`pnpm josh run:merge` writes the merge into the record and mirrors the counters onto the epic comment at
|
|
492
|
+
every child's merge, so the human-readable comment and the guard the run reads can never disagree. **The
|
|
493
|
+
consecutive-failure count is the one that matters** — it is what the stopped-unit section leans on to
|
|
494
|
+
notice the environment is at fault, and a merge resets it; lost, a run keeps feeding children into a
|
|
495
|
+
broken environment and never reaches three. **The record survives a session cut and a compaction
|
|
496
|
+
alike** — that is what it is for — so the counters a run's own guards rest on are never taken by the
|
|
497
|
+
moment the context is dropped. **This is not what "Nothing is carried in the conversation" denies**:
|
|
498
|
+
that is about the state a *next session* needs, all of it on GitHub, while the record is about *this*
|
|
499
|
+
run's own guards.
|
|
500
|
+
|
|
501
|
+
### What carries over, and where it lives
|
|
502
|
+
|
|
503
|
+
**Nothing is carried in the conversation.** Everything the next session needs it reads back:
|
|
504
|
+
|
|
505
|
+
| What the next session needs | Where it reads it |
|
|
506
|
+
| --- | --- |
|
|
507
|
+
| Which children remain, and which is runnable | `pnpm josh epic:next <E>` |
|
|
508
|
+
| The order and the dependencies | the epic body |
|
|
509
|
+
| What each remaining child is | the child Issue body |
|
|
510
|
+
| What already merged | the epic's task list, and the closed children |
|
|
511
|
+
|
|
512
|
+
That is the same state a resumed run has always used, which is why the hand-off needs no new mechanism.
|
|
513
|
+
**A planned hand-off is strictly more certain than an interruption**: an interruption can land mid-child
|
|
514
|
+
with a dirty tree and a stale `in-progress` label, and this cannot, because it is only taken when a child
|
|
515
|
+
has just closed.
|
|
516
|
+
|
|
517
|
+
**A resumed session is a new session**, so it asks `pnpm josh latest:scope` once before its first child.
|
|
518
|
+
|
|
519
|
+
## Waiting, and never waiting forever
|
|
520
|
+
|
|
521
|
+
| Setting | Value | Why |
|
|
522
|
+
| --- | --- | --- |
|
|
523
|
+
| Polling interval | 60 s | **A floor between two asks, never a clock the parent sets.** It bounds a re-ask made while the parent is *already awake*; what wakes it is "The parent keeps no clock of its own" below. |
|
|
524
|
+
| `backlogrun` idle-watch poll | 5 min | Not the interval above, and a floor in the same sense. What a watch waits on happens on human timescales, and every ask bills the parent session's whole history. |
|
|
525
|
+
| Silent delegated unit | 30 min | Not the child's duration — the time its output has gone **unchanged**. A working unit rewrites its transcript continuously. Past it, run the traces above and book a stopped unit as a failure. |
|
|
526
|
+
| Stale `in-progress` | 90 min | Longer than any single child has taken; past it, the other session is gone. |
|
|
527
|
+
| Publish wait | 10 min | `josh propagate`'s own budget. A failed publish never appears. |
|
|
528
|
+
| Whole run | 8 h | An unattended run that has not finished overnight needs a person, not more waiting. |
|
|
529
|
+
|
|
530
|
+
Each timeout **ends the wait and reports** — none is retried indefinitely. A stale child's label is
|
|
531
|
+
removed first, so the next poll can offer it. **A graph that has deadlocked on a cycle is not this loop's
|
|
532
|
+
to untangle**: `epic:next` detects it and exits with an error.
|
|
533
|
+
|
|
534
|
+
### The parent keeps no clock of its own — the watcher's exit is the wake
|
|
535
|
+
|
|
536
|
+
**After hand-off, the supervisor's driver owns the mechanical clock.** `backlog:drive` polls lane
|
|
537
|
+
completion and the backlog inside the detached process, without waking an AI parent. The historical
|
|
538
|
+
parent-turn instructions below apply only while an AI session is handling a returned judgment branch;
|
|
539
|
+
they do not schedule the supervisor's normal loop. `run:progress --wait` remains the source of human
|
|
540
|
+
heartbeat lines, and `run:report` remains the final report source.
|
|
541
|
+
|
|
542
|
+
**The numbers above are floors between asks, not a timer the parent sets.** A parent that sets one spends
|
|
543
|
+
a turn per tick at the point its context is largest — the exact cost `run:progress` was built to remove.
|
|
544
|
+
The watcher took the *reporting* out of the parent; the parent must not go on keeping the clock anyway,
|
|
545
|
+
or the two run side by side and the run pays for both.
|
|
546
|
+
|
|
547
|
+
The driver checks lane completion every five seconds and makes a new backlog offer no sooner than one
|
|
548
|
+
minute after the previous offer, except after collecting a child. These waits cost no AI turns.
|
|
549
|
+
The progress watcher keeps reporting on its own interval; a judgment session may still receive its
|
|
550
|
+
exit as a prompt to act. The bounds above continue to apply to both processes.
|
|
551
|
+
|
|
552
|
+
#### The wake exists only while something is in flight
|
|
553
|
+
|
|
554
|
+
`run:progress --wait` prints only when it has a human-facing line. With no child in flight it may
|
|
555
|
+
decline; the driver still polls for new work and enforces the idle and whole-run bounds. A GitHub
|
|
556
|
+
listing failure stays a retry or unreadable answer from the offer command, never an empty backlog.
|
|
557
|
+
|
|
558
|
+
`epic:next` does not report when a label was applied, so read that from the issue's timeline:
|
|
559
|
+
|
|
560
|
+
```bash
|
|
561
|
+
gh api "repos/{owner}/{repo}/issues/<N>/timeline" \
|
|
562
|
+
--jq '[.[] | select(.event == "labeled" and .label.name == "in-progress") | .created_at] | last'
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
An empty answer means the label predates what the timeline returns, which is itself past the window —
|
|
566
|
+
treat it as stale.
|
|
567
|
+
|
|
568
|
+
Waiting is decided by `epic:next`'s classification, never by reading labels:
|
|
569
|
+
|
|
570
|
+
| `epic:next` says | `backlogrun` does |
|
|
571
|
+
| --- | --- |
|
|
572
|
+
| Something is runnable | Run it |
|
|
573
|
+
| Nothing runnable, something resolves on its own | **Wait** |
|
|
574
|
+
| Nothing runnable, nothing resolves on its own, children remain | **Stop and report the parked children** |
|
|
575
|
+
| No open child | Post the epic summary and finish |
|
|
576
|
+
|
|
577
|
+
The distinction is not academic. When kit's child has closed and app-kit's child is waiting for the
|
|
578
|
+
release to publish, there is no runnable child, nothing carries `in-progress` and nothing carries
|
|
579
|
+
`needs-decision` — a label-based reading calls that "done" and stops, in the one moment it must wait.
|
|
580
|
+
|
|
581
|
+
## Who sends the summary, and who propagates
|
|
582
|
+
|
|
583
|
+
With several sessions on one epic, **exactly one does the end-of-epic work: the session standing in the
|
|
584
|
+
repository that owns the epic.** It sends the epic completion summary and runs `josh propagate`, which
|
|
585
|
+
itself refuses to run outside the supplier repository. Every other session finishes quietly once its own
|
|
586
|
+
repository has no children left.
|
|
587
|
+
|
|
588
|
+
Per-child completion notifications are unchanged: `pnpm josh followup` sends one each. Send an epic
|
|
589
|
+
**start** notification when the run begins, and an epic **completion** summary at the end. **Do not
|
|
590
|
+
compose that summary by hand — `pnpm josh run:report` generates it from this invocation's events**
|
|
591
|
+
(joshuafolkken/kit#2249, scoped in #2393): it renders what merged, what parked and why, and what was cut,
|
|
592
|
+
reusing `format_event`, closing with the release tail below. Its output is the Telegram body too — pass it to
|
|
593
|
+
`pnpm josh notify --body-file` so the summary a session shows and the message off-screen are one text
|
|
594
|
+
from one generator.
|
|
595
|
+
|
|
596
|
+
**That same session asks `pnpm josh release:scope` once, after the last child has merged** — in the
|
|
597
|
+
primary checkout, after the last lane is closed, and never once per child. `followup-reference.md` →
|
|
598
|
+
"When `pnpm josh release` runs" is the single source for the position and the three answers. `run:report`
|
|
599
|
+
appends that answer as the summary's closing line: on `required` the request and the exact command, on
|
|
600
|
+
`unknown` the word `unknown`, never rounded to `skip`.
|