Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
9a78808
docs(telemetry): frame deterministic token measurement, release 1
blafourcade Oct 9, 2026
6992ffc
docs(telemetry): plan deterministic token measurement in nine phases
blafourcade Oct 9, 2026
f077c12
refactor(telemetry)!: remove the previous telemetry
blafourcade Oct 9, 2026
da23cff
feat(telemetry): count each billed Claude Code call once
blafourcade Oct 9, 2026
a80242c
feat(telemetry): store usage in a local ledger, one record per call
blafourcade Oct 9, 2026
9be2a8f
feat(telemetry): declare the task a branch or session works on
blafourcade Oct 9, 2026
165c7c0
feat(aidd-telemetry): ask for the task once per branch, before any token
blafourcade Oct 9, 2026
cbc2ceb
feat(telemetry): report usage on eight axes, attributed by declaration
blafourcade Oct 9, 2026
a53833d
fix(telemetry): keep a reused branch name's earlier work on its task
blafourcade Oct 9, 2026
8f9a757
feat(telemetry): opt in, opt out and forget, leaving no trace of the old
blafourcade Oct 9, 2026
2486849
feat(telemetry): add init and usage skills and the usage contract
blafourcade Oct 9, 2026
e6b0461
test(telemetry): drive the whole journey on the built binary
blafourcade Oct 9, 2026
b2b732e
docs(telemetry): record the real-history oracle, equal on every day
blafourcade Oct 9, 2026
1b728cb
fix(telemetry): resolve the release 1 review findings
blafourcade Oct 10, 2026
1e993d5
docs(telemetry): record the mutation proofs of every phase
blafourcade Oct 10, 2026
a060ce2
fix(telemetry): consent is read live from the clone, never lifted by id
blafourcade Oct 10, 2026
a674c72
fix(telemetry): say so when a typed declaration is not understood
blafourcade Oct 10, 2026
8c806e9
fix(telemetry): ingest repairs a month that holds a torn line
blafourcade Oct 10, 2026
3fe31e0
fix(telemetry): read the branch config inside the bindings lock
blafourcade Oct 10, 2026
4871e4c
fix(telemetry): each lock names itself when it times out
blafourcade Oct 10, 2026
3270983
fix(telemetry): show the total axis row once
blafourcade Oct 10, 2026
8b4fa29
fix(telemetry): word consent as the clone's git config everywhere
blafourcade Oct 10, 2026
334677e
docs(telemetry): drop the run journal words and record fix round 2
blafourcade Oct 10, 2026
b8fa39d
test(telemetry): pin the clone consent rules against surviving mutants
blafourcade Oct 10, 2026
57bccd2
fix(telemetry): off withdraws what the clone's deleted directories we…
blafourcade Oct 10, 2026
309f739
docs(telemetry): re-run the round 2 mutations at the final head
blafourcade Oct 10, 2026
a9e0ad3
fix(telemetry): store a call only if its clone consented at that time
blafourcade Oct 10, 2026
1729f2e
fix(telemetry): say how to send a mistyped declaration as a prompt
blafourcade Oct 10, 2026
a802585
docs(telemetry): record fix round 3 and reword a stale target line
blafourcade Oct 10, 2026
952e887
docs(telemetry): source the per-OS identity notes and correct round 3
blafourcade Oct 10, 2026
d67ed04
docs(aidd-telemetry): say that forget also ends measurement
blafourcade Oct 10, 2026
61de25c
feat(aidd-telemetry): ask only where an interval is open for the clone
blafourcade Oct 10, 2026
e56fd95
feat(cli): store a call only if its clone consented at that time
blafourcade Oct 10, 2026
6df4622
docs(telemetry): the consent rule, and fix round 4
blafourcade Oct 10, 2026
e73e695
docs(telemetry): record the round 4 mutation score and survivors
blafourcade Oct 10, 2026
85061b5
fix(cli): a damaged log, a copy, a clone out of reach stay safe
blafourcade Oct 10, 2026
e3f2235
test(cli): let the journey prove a call right after on is stored
blafourcade Oct 10, 2026
cbd9fb7
docs(telemetry): record the fix round 5 mutations
blafourcade Oct 10, 2026
1304e56
docs(telemetry): mark the plan implemented, the presence probe open
blafourcade Oct 10, 2026
e62e717
test(cli): smoke off before forget, which now unsets the key
blafourcade Oct 10, 2026
645d614
fix(cli): word no-consent as no consent at that time, fix the contract
blafourcade Oct 10, 2026
46867bc
fix(telemetry): a torn last line of the consent log is not damage
blafourcade Oct 10, 2026
9fd376d
fix(telemetry): bound the bindings lock wait for the hook's declaration
blafourcade Oct 10, 2026
0e7e0b9
docs(telemetry): date the oracle method, record the fix round 6 mutat…
blafourcade Oct 10, 2026
886c10f
fix(telemetry): pass windows, codeql and the runtime mutation floor
blafourcade Oct 10, 2026
8f67769
fix(telemetry): tell a birth from the change time to the nanosecond
blafourcade Oct 10, 2026
c4927e5
test(telemetry): run the integration tier on windows
blafourcade Oct 10, 2026
20ddfaa
test(telemetry): root the erasure sandbox at the native real path
blafourcade Oct 10, 2026
2c7c412
fix(telemetry): keep a birth equal to the change time as a birth
blafourcade Oct 11, 2026
59c48af
fix(telemetry): off closes the interval its key names at its path
blafourcade Oct 11, 2026
ca115d6
ci(telemetry): probe the session id join against the real tool
blafourcade Oct 11, 2026
9e23acc
docs(telemetry): supersede the old plans, record the latest proofs
blafourcade Oct 11, 2026
24b51a8
ci(telemetry): judge CLAUDE_PID as the hook uses it, isolate the probe
blafourcade Oct 11, 2026
91ef08d
docs(telemetry): the hook's parent is not Claude on linux
blafourcade Oct 11, 2026
b6f6201
test(cli): a flat cursor agent keeps a dot inside its name
blafourcade Oct 11, 2026
53614d7
fix(telemetry): ask only where a person sees the hook's message
blafourcade Oct 12, 2026
dbe9460
docs(telemetry): record the vs code deviation and the presence rule
blafourcade Oct 12, 2026
81ed6b7
docs(telemetry): say where it asks in one table
blafourcade Oct 12, 2026
713648a
refactor(telemetry): ingest reads every tool through one reader each
blafourcade Oct 12, 2026
84b7dd6
feat(telemetry): status shows the clone's state, task only declares
blafourcade Oct 12, 2026
179f030
fix(telemetry): a typed declaration needs a name or --none
blafourcade Oct 12, 2026
54c800d
Merge origin/next into feat/telemetry-deterministic-tokens
blafourcade Oct 12, 2026
34ec67f
docs(telemetry): name status where commands are listed, say how to ad…
blafourcade Oct 12, 2026
3ffa3c2
test(cli): smoke the status command
blafourcade Oct 12, 2026
705de46
fix(telemetry): ask and confirm in one line, one way
blafourcade Oct 12, 2026
90ad2b0
perf(telemetry): do not read transcripts no consent can cover
blafourcade Oct 12, 2026
dc3473c
docs(telemetry): record the proofs of the unread transcripts
blafourcade Oct 12, 2026
2ea4e3a
test(telemetry): nothing is read while no clone opted in
blafourcade Oct 12, 2026
3db7554
Merge origin/next into feat/telemetry-deterministic-tokens
blafourcade Oct 12, 2026
e45195b
Merge origin/next into feat/telemetry-deterministic-tokens
blafourcade Oct 12, 2026
48a1796
test(telemetry): pin what decides which transcripts are read
blafourcade Oct 12, 2026
5394515
test(cli): pin the telemetry help to its golden, and its failures
blafourcade Oct 12, 2026
c8492f6
fix(telemetry): say why nothing is read, and pin reading after a late on
blafourcade Oct 12, 2026
8480cf6
Merge origin/next into feat/telemetry-deterministic-tokens
blafourcade Oct 12, 2026
81b2091
Merge origin/next into feat/telemetry-deterministic-tokens
blafourcade Oct 12, 2026
422357e
feat(telemetry): report by the agent that ran
blafourcade Oct 14, 2026
cd74983
Merge origin/next into feat/telemetry-deterministic-tokens
blafourcade Oct 14, 2026
de3b0ff
docs(telemetry): a README to follow, in four steps and two tables
blafourcade Oct 14, 2026
a7715aa
docs(telemetry): one owner per fact, diagrams and tables over prose
blafourcade Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
{
"name": "aidd-telemetry",
"source": "./plugins/aidd-telemetry",
"description": "Measurement: journals every session so a unit of work can be tied to what it cost. The hooks record on plain node; its three skills reach the `aidd` CLI to turn it on, answer and check.",
"description": "Measurement: counts the tokens of Claude Code sessions per task, ticket, model and day, locally. The hooks ask for a task on plain node; its two skills reach the `aidd` CLI to turn it on and answer.",
"strict": true,
"metadata": {
"recommended": false
Expand Down
79 changes: 17 additions & 62 deletions .github/workflows/cli-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ jobs:
id: filter
run: |
set -euo pipefail
# The scope the jobs below actually exercise. The telemetry plugin's own prose is
# excluded because validate.yml already asserts it on every push and pull request.
# The scope the jobs below actually exercise.
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
BASE="${{ github.event.pull_request.base.sha }}"
HEAD="${{ github.event.pull_request.head.sha }}"
Expand All @@ -71,17 +70,15 @@ jobs:
cli/*|kanban/*|scripts/__tests__/*|README.md)
relevant=true
;;
# The identifier-join probe, and the hook predicates it judges the real tool by.
scripts/probe-identifier-join.cjs|plugins/aidd-telemetry/hooks/*)
relevant=true
;;
# This file: a change to how the suite runs matches nothing else here, so the
# workflow deciding whether the suite passes would land unverified.
.github/workflows/cli-ci.yml)
relevant=true
;;
plugins/aidd-telemetry/*)
case "$f" in
*.md) ;; # prose only, covered by validate.yml instead
*) relevant=true ;;
esac
;;
esac
[[ "$relevant" == "true" ]] && break
done < <(git diff --name-only "$BASE" "$HEAD")
Expand Down Expand Up @@ -412,19 +409,17 @@ jobs:
restore-keys: pnpm-${{ runner.os }}-
- run: cd cli && pnpm install --frozen-lockfile
- run: cd cli && pnpm build
# The probe drives the real tool, so the real tool has to be here. No credentials are
# needed: it points Claude Code at a dead address, and the session id is minted first.
# The check drives the real tool, so the real tool has to be here. No credentials are needed.
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code # floats on purpose, declared in scripts/__tests__/workflows-pin-global-installs.test.js
# Everything in this layer joins on the identifier a hook receives being the one the
# export carries, and a tool update can break it with nothing else turning red. Exit 2
# means the probe could not form an opinion, rather than blaming the tool.
- name: Probe the identifier join
run: node scripts/probe-identifier-join.cjs
# The golden snapshots pin what a claude build contains; only the host can say it loads.
# Its `plugin validate` exits 0 either way, so the script reads the verdict from its text.
- name: Claude Code accepts the translated marketplace
run: node scripts/check-claude-accepts-build.cjs
# One session id in the hook's payload, its environment and the transcript: what the
# telemetry joins on. Against a dead API, so it spends nothing.
- name: Claude Code keeps the session id join
run: node scripts/probe-identifier-join.cjs

cli-jscpd:
name: cli / JSCPD (duplication)
Expand Down Expand Up @@ -489,38 +484,9 @@ jobs:
with:
node-version: "22"

# The WRITE path, on the platform where a home directory, a line ending and an absolute
# path all resolve differently. It runs before the CLI is built on purpose: recording is
# supposed to need nothing installed, and this is where that claim is exercised.
- name: Chain - allow measurement, with nothing installed
run: |
# Written directly rather than through a command: the switch is a file the hooks
# read fresh at every write, so no binary has to exist for it to work.
mkdir -p .aidd
node -e "require('fs').writeFileSync('.aidd/config.json', JSON.stringify({ telemetry: { enabled: true } }, null, 2) + '\n');"
- name: Chain - journal a captured payload
run: |
# The fixture's cwd came off whatever machine captured it: rewritten so getRepoRoot
# resolves a repository that exists here.
node -e "const p=require('./scripts/__tests__/fixtures/claude-code-session-start.json'); p.cwd=process.cwd(); require('fs').writeFileSync('payload.json', JSON.stringify(p));"
node plugins/aidd-telemetry/hooks/journal.cjs session-start < payload.json
node plugins/aidd-telemetry/hooks/journal.cjs turn-end < payload.json
# `telemetry check` fails on `sessionFound: false`, and nothing in this chain places a
# transcript for the session just journalled. Copied from a local-cost fixture with its
# session id rewritten, under `$HOME` β€” which is what the read path itself resolves
# first, and which Git Bash sets on this runner.
- name: Chain - place the transcript where claude keeps it
run: |
node -e "const fs=require('fs'),os=require('os'),path=require('path');const homeDir=process.env.HOME||os.homedir();const sessionId='ffde6fda-14a8-4b32-8110-be1f1d13eebf';const src='cli/tests/fixtures/local-cost/.claude/projects/fake-project/22222222-2222-4222-8222-222222222222.jsonl';const dir=path.join(homeDir,'.claude','projects','fake-project');fs.mkdirSync(dir,{recursive:true});const content=fs.readFileSync(src,'utf8').split('22222222-2222-4222-8222-222222222222').join(sessionId);fs.writeFileSync(path.join(dir,sessionId+'.jsonl'),content);"
- name: Chain - the journal stays private and git add -A still works
run: |
git add -A
git status --porcelain >/dev/null

# Wrapped: a suite writing into this repository's own .git/hooks passes every assertion
# and destroys an install nothing can restore. The suite reads YAML through the root
# devDependencies, so the install has to precede it β€” and the chain steps above stay
# ahead of any install on purpose.
# devDependencies, so the install has to precede it.
- run: pnpm install --frozen-lockfile
- run: cd cli && pnpm install --frozen-lockfile
- name: Plugin suite
Expand Down Expand Up @@ -554,21 +520,13 @@ jobs:
pnpm build
pnpm pack --pack-destination ./dist
npm install -g ./dist/ai-driven-dev-cli-*.tgz --force
# The exact command `02-check`'s own markdown names, not a script beside it. Failing
# `aidd --version` means the CLI could not be resolved on the PATH.
- name: Chain - diagnose, through the command every skill's own markdown names
run: |
aidd --version
# A gated run judges nothing and exits 0, so the one row the chain exists to make
# true is asserted separately: the transcript placed for the session was read.
aidd telemetry check | tee telemetry-check.out
grep -E "tool files readable +ok" telemetry-check.out
# Failing `aidd --version` means the CLI could not be resolved on the PATH.
- name: Chain - the installed CLI resolves
run: aidd --version
- run: cd cli && pnpm test:unit
- run: cd cli && pnpm test:integration
- run: cd cli && pnpm test:arch
# Every e2e but the two named below. `telemetry-commit-trailer.e2e.test.ts` is why the
# step matters most: it is the only thing proving the `prepare-commit-msg` hook is
# reachable by the shell Git for Windows ships, which a backslash path is not.
# Every e2e but the one named below.
- name: cli e2e
# `--max-workers=2`, and only here. Vitest transforms modules on its own main thread
# while every worker calls back into it, and that call has a fixed 60 s timeout no
Expand All @@ -578,11 +536,8 @@ jobs:
run: |
cd cli
pnpm exec vitest run --project=e2e --max-workers=2 \
--exclude "tests/e2e/persona.e2e.test.ts" \
--exclude "tests/e2e/telemetry-multi-tool.e2e.test.ts"
# persona.e2e.test.ts needs /usr/bin/expect, which windows-latest does not carry;
# telemetry-multi-tool.e2e.test.ts relies on a shebang, and Windows resolves an
# executable by PATHEXT.
--exclude "tests/e2e/persona.e2e.test.ts"
# persona.e2e.test.ts needs /usr/bin/expect, which windows-latest does not carry.

# Fan-in: every job above either ran and passed, or was skipped because `changes` found
# nothing relevant. The one check the branch rulesets require β€” without it a pull request
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ jobs:
run: pnpm exec lefthook run pre-commit --all-files --force

# The generator hooks `git add` their output and never fail on drift, so a stale
# CATALOG.md, prompts doc or README count passes the step above in silence. Against
# CATALOG.md or README count passes the step above in silence. Against
# HEAD, not the index: the generators already staged, so a plain `git diff` is empty.
- name: Fail if a generated file drifted from what pre-commit regenerated
run: |
if ! git diff --exit-code HEAD -- 'plugins/*/CATALOG.md' docs/prompts-documentation.md README.md; then
if ! git diff --exit-code HEAD -- 'plugins/*/CATALOG.md' README.md; then
echo "::error::A generated file is stale. Run 'pnpm exec lefthook run pre-commit --all-files --force' locally and commit the result."
exit 1
fi
13 changes: 2 additions & 11 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,11 @@ coverage/

# AIDD CLI's own local state (install manifest, auth): machine-local, never
# part of the project's own tracked content. config.json is the exception:
# it is the committed telemetry switch (see .aidd/config.json and
# aidd_docs/tasks/2026_08/2026_08_20_telemetry-export-enable/phase-1.md),
# tracked so a fresh clone inherits the project's decision.
# it is the committed project switch (see .aidd/config.json), tracked so a
# fresh clone inherits the project's decision.
.aidd/*
!.aidd/config.json

# AIDD run-journal records: where they land once .aidd/config.json turns
# telemetry on (see plugins/aidd-telemetry/hooks/journal.js) - this
# directory being committed is a location, not a permission. The records it
# holds never are.
aidd_docs/runs/*
!aidd_docs/runs/.gitkeep
!aidd_docs/runs/README.md

# SpecStory captures (may contain transcripts / secrets)
.specstory/

Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ Unify **engineering teams** around **standardized workflows** and **shared best
🧱 **IDE agnostic** Β· πŸ—οΈ **Legacy systems** Β· 🌱 **Token-optimized** Β· πŸ‡«πŸ‡· **Made in France**

<p>
<!--counts:start--><kbd>9 plugins</kbd> Β· <kbd>52 skills</kbd> Β· <kbd>2 agents</kbd><!--counts:end-->
<!--counts:start--><kbd>9 plugins</kbd> Β· <kbd>51 skills</kbd> Β· <kbd>2 agents</kbd><!--counts:end-->
</p>

[![Open Source](https://img.shields.io/badge/Open_Source-Yes-yellow?logo=open-source-initiative&logoColor=white)](https://opensource.org/)
Expand Down Expand Up @@ -315,9 +315,9 @@ UI / UX design β€” smoke-test only, not ready for use.

### πŸ“ˆ [aidd-telemetry](plugins/aidd-telemetry/README.md) πŸ§ͺ

`3 skills` Β· **beta**
`2 skills` Β· **beta**

Answers what a piece of work cost β€” tokens, models, and which skill spent them. The switch is git-tracked, so it applies to everyone who clones; opt out per person with `AIDD_TELEMETRY=0`. Nothing leaves your machine.
Counts the tokens of Claude Code sessions per task, ticket, model and day. Opt-in, and local to your machine.

</td>
<td width="33%" valign="top">
Expand Down
4 changes: 2 additions & 2 deletions aidd_docs/memory/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ flowchart LR
| Concern decides placement, not existence | a missing capability goes to the plugin whose concern owns it; the caller delegates |
| A skill is a router | `SKILL.md` dispatches to actions or protocols; the only place a capability is addressed by name |
| Recipe skills discover providers at runtime | by description matching. Only agent permission lists and orchestration references name a provider |
| Observation is its own layer | `aidd-telemetry` journals what a session did; it never reads or writes application source |
| Observation is its own layer | `aidd-telemetry` counts what a session consumed, from the task a person declared; it never reads or writes application source |
| A launcher runs an external binary, never embeds it | `kanban` broke that and was unwired. Detail in the CLI bank |

The concern-to-plugin taxonomy is canonical in [`docs/ARCHITECTURE.md`](../../docs/ARCHITECTURE.md).
Expand All @@ -42,4 +42,4 @@ The concern-to-plugin taxonomy is canonical in [`docs/ARCHITECTURE.md`](../../do

- 9 plugins ship, 3 off the curated install path: `aidd-ui` is alpha, `aidd-telemetry` beta and opt-in, `aidd-qa` new and unproven outside this repository.
- A skill never links outside itself: the tree ships both flat and as a marketplace, so no relative path survives both.
- Bundled hooks run Node. No `node` on `PATH`, no memory refresh and no run journal.
- Bundled hooks run Node. No `node` on `PATH`, no memory refresh and no question about the task.
2 changes: 1 addition & 1 deletion aidd_docs/memory/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ The `aidd` binary, built from `cli/` and published to npm as `@ai-driven-dev/cli
## Commands

- Eleven groups: `setup`, `framework`, `translate`, `plugin`, `marketplace`, `auth`, `sync`, `update`, `doctor`, `clean`, `telemetry`.
- `telemetry` counts the tokens of Claude Code sessions locally: [usage contract](../product/usage-contract.md).
- No list here. The surface moves; `aidd --help` is the only reading that stays true.
- `telemetry`'s sink, run journal, record shapes, report axes and per-tool declarations: [`cli/aidd_docs/memory/telemetry.md`](../../cli/aidd_docs/memory/telemetry.md).

## Interface

Expand Down
1 change: 0 additions & 1 deletion aidd_docs/memory/codebase-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ flowchart TD
| Binary | `cli/src/cli.ts` β†’ `dist/cli.js`, bin name `aidd` |
| Workflow | `plugins/<plugin>/skills/<NN>-<name>/SKILL.md` |
| Memory refresh | `plugins/aidd-context/hooks/update_memory.js`, on `SessionStart` |
| Run journal | `plugins/aidd-telemetry/hooks/journal.cjs`, on `SessionStart`, `Stop`, `PostToolUse` |

## Packages

Expand Down
2 changes: 1 addition & 1 deletion aidd_docs/memory/coding-assertions.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Never state in a commit message or a report anything not just observed in output
| 1 | `pnpm exec lefthook run pre-commit` | JSON and YAML validity, `scripts/` tests, skill frontmatter and argument hints, cross-plugin orthogonality and router coherence (`scripts/check-architecture-rules.js`), context imports and reference form, markdown links, the paths the prose names and a sentence written in two documents (`scripts/check-doc-duplication.js`); `cli` lint, architecture, typecheck and type honesty when `cli/` changed. `cli` knip and the full `cli` suite are pre-push, not pre-commit β€” see below |
| 2 | `pnpm exec commitlint --edit` | the message against `commitlint.config.cjs` |

Same hook regenerates each plugin's `CATALOG.md`, the README counts and `docs/prompts-documentation.md`, and stages them.
Same hook regenerates each plugin's `CATALOG.md`, and the README counts, and stages them.

Every `cli` job is globbed on `cli/**`. A change under `kanban/` alone fires no local job; run `cd kanban && pnpm test` by hand. CI does cover it β€” `cli-ci.yml`'s `kanban-checks`, see `deployment.md`.

Expand Down
2 changes: 1 addition & 1 deletion aidd_docs/memory/deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Where the project runs and how it ships: CI/CD, environments, and release.
| Workflow | Runs |
| --- | --- |
| `ci.yml` | commitlint on pull requests and on `main`'s tip, plus the PR title itself β€” the subject a squash merge uses β€” then release-please on `main` and the release jobs |
| `cli-ci.yml` | the `cli` and `kanban` gates β€” job list in the CLI bank. No `paths:` filter, deliberately: it runs on every push and pull request, and a `changes` job decides in bash whether the rest has anything to do β€” `cli/**`, `kanban/**`, `scripts/__tests__/**`, `README.md`, the workflow file itself, and `plugins/aidd-telemetry/**` except its `*.md` prose. Mutations skip only for a same-repository numeric `promote/next-to-main-*` snapshot whose `cli / gate` passed in a successful `next` push and whose PR merge tree equals that snapshot with `main` already its ancestor; the resulting `main` push reuses it only for that exact two-parent promotion merge when its tree, associated merged PR, and source snapshot all match. Missing, failed, unreadable, or mismatched Git/API proof keeps normal mutation scopes. All non-mutation checks still run on the current PR merge ref or `main` commit. |
| `cli-ci.yml` | the `cli` and `kanban` gates β€” job list in the CLI bank. No `paths:` filter, deliberately: it runs on every push and pull request, and a `changes` job decides in bash whether the rest has anything to do β€” `cli/**`, `kanban/**`, `scripts/__tests__/**`, `README.md`, the workflow file itself. Mutations skip only for a same-repository numeric `promote/next-to-main-*` snapshot whose `cli / gate` passed in a successful `next` push and whose PR merge tree equals that snapshot with `main` already its ancestor; the resulting `main` push reuses it only for that exact two-parent promotion merge when its tree, associated merged PR, and source snapshot all match. Missing, failed, unreadable, or mismatched Git/API proof keeps normal mutation scopes. All non-mutation checks still run on the current PR merge ref or `main` commit. |
| `validate.yml` | plugin and marketplace manifests against their schemas, plus the whole pre-commit over the whole tree |
| `codeql.yml` | code scanning |
| `promote.yml` | opens the `next` to `main` promote PR, merge auto-merge |
Expand Down
Loading
Loading