agentpace 0.9.2__tar.gz

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.
Files changed (99) hide show
  1. agentpace-0.9.2/.gitattributes +4 -0
  2. agentpace-0.9.2/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. agentpace-0.9.2/.github/ISSUE_TEMPLATE/ingest-found-nothing.yml +41 -0
  4. agentpace-0.9.2/.github/ISSUE_TEMPLATE/remove-my-rows.yml +19 -0
  5. agentpace-0.9.2/.github/dependabot.yml +6 -0
  6. agentpace-0.9.2/.github/pull_request_template.md +15 -0
  7. agentpace-0.9.2/.github/workflows/ci.yml +72 -0
  8. agentpace-0.9.2/.github/workflows/publish.yml +33 -0
  9. agentpace-0.9.2/.github/workflows/validate-data.yml +41 -0
  10. agentpace-0.9.2/.gitignore +9 -0
  11. agentpace-0.9.2/CHANGELOG.md +344 -0
  12. agentpace-0.9.2/CITATION.cff +17 -0
  13. agentpace-0.9.2/CODE_OF_CONDUCT.md +83 -0
  14. agentpace-0.9.2/CONTRIBUTING.md +63 -0
  15. agentpace-0.9.2/LICENSE +21 -0
  16. agentpace-0.9.2/PKG-INFO +324 -0
  17. agentpace-0.9.2/README.md +297 -0
  18. agentpace-0.9.2/SECURITY.md +17 -0
  19. agentpace-0.9.2/data/LICENSE +121 -0
  20. agentpace-0.9.2/data/README.md +55 -0
  21. agentpace-0.9.2/data/runs/4546788e7930eccd-2026-W40-2026-W45.jsonl +3219 -0
  22. agentpace-0.9.2/data/runs/4546788e7930eccd-2026-W44-2026-W45.jsonl +211 -0
  23. agentpace-0.9.2/docs/.nojekyll +0 -0
  24. agentpace-0.9.2/docs/DESIGN.md +508 -0
  25. agentpace-0.9.2/docs/assets/backtest-coverage.svg +71 -0
  26. agentpace-0.9.2/docs/assets/hero.webp +0 -0
  27. agentpace-0.9.2/docs/assets/run-ranges.svg +61 -0
  28. agentpace-0.9.2/docs/assets/social-preview.png +0 -0
  29. agentpace-0.9.2/docs/backtest.json +1464 -0
  30. agentpace-0.9.2/docs/backtest.md +270 -0
  31. agentpace-0.9.2/docs/cli.md +316 -0
  32. agentpace-0.9.2/docs/index.html +443 -0
  33. agentpace-0.9.2/docs/releasing.md +154 -0
  34. agentpace-0.9.2/docs/robots.txt +4 -0
  35. agentpace-0.9.2/docs/sitemap.xml +6 -0
  36. agentpace-0.9.2/docs/verify-adapter.md +84 -0
  37. agentpace-0.9.2/examples/plan.json +11 -0
  38. agentpace-0.9.2/examples/quote-plan.json +12 -0
  39. agentpace-0.9.2/pyproject.toml +81 -0
  40. agentpace-0.9.2/schema/run.schema.json +100 -0
  41. agentpace-0.9.2/schema/turn.schema.json +30 -0
  42. agentpace-0.9.2/skills/agentpace/SKILL.md +79 -0
  43. agentpace-0.9.2/skills/agentpace/assets/portable-prompt.md +31 -0
  44. agentpace-0.9.2/skills/agentpace/references/method.md +17 -0
  45. agentpace-0.9.2/skills/pace-estimate/SKILL.md +31 -0
  46. agentpace-0.9.2/skills/pace-log/SKILL.md +32 -0
  47. agentpace-0.9.2/skills/pace-share/SKILL.md +20 -0
  48. agentpace-0.9.2/src/agentpace/__init__.py +3 -0
  49. agentpace-0.9.2/src/agentpace/__main__.py +8 -0
  50. agentpace-0.9.2/src/agentpace/adapters/__init__.py +31 -0
  51. agentpace-0.9.2/src/agentpace/adapters/base.py +74 -0
  52. agentpace-0.9.2/src/agentpace/adapters/claude_code.py +265 -0
  53. agentpace-0.9.2/src/agentpace/adapters/cline.py +449 -0
  54. agentpace-0.9.2/src/agentpace/adapters/codex.py +293 -0
  55. agentpace-0.9.2/src/agentpace/adapters/gemini_cli.py +332 -0
  56. agentpace-0.9.2/src/agentpace/adapters/opencode.py +397 -0
  57. agentpace-0.9.2/src/agentpace/backtest.py +801 -0
  58. agentpace-0.9.2/src/agentpace/cache.py +115 -0
  59. agentpace-0.9.2/src/agentpace/charts.py +191 -0
  60. agentpace-0.9.2/src/agentpace/claims.py +164 -0
  61. agentpace-0.9.2/src/agentpace/classify.py +54 -0
  62. agentpace-0.9.2/src/agentpace/cli.py +754 -0
  63. agentpace-0.9.2/src/agentpace/estimate.py +694 -0
  64. agentpace-0.9.2/src/agentpace/forecasts.py +284 -0
  65. agentpace-0.9.2/src/agentpace/ingest.py +337 -0
  66. agentpace-0.9.2/src/agentpace/paths.py +62 -0
  67. agentpace-0.9.2/src/agentpace/pseudonym.py +51 -0
  68. agentpace-0.9.2/src/agentpace/py.typed +0 -0
  69. agentpace-0.9.2/src/agentpace/render.py +152 -0
  70. agentpace-0.9.2/src/agentpace/report.py +502 -0
  71. agentpace-0.9.2/src/agentpace/schema.py +131 -0
  72. agentpace-0.9.2/src/agentpace/share.py +130 -0
  73. agentpace-0.9.2/src/agentpace/site.py +133 -0
  74. agentpace-0.9.2/src/agentpace/turns.py +282 -0
  75. agentpace-0.9.2/src/agentpace/validate.py +115 -0
  76. agentpace-0.9.2/tests/__init__.py +0 -0
  77. agentpace-0.9.2/tests/fixtures/__init__.py +1 -0
  78. agentpace-0.9.2/tests/fixtures/cline_tasks.py +199 -0
  79. agentpace-0.9.2/tests/fixtures/gemini_cli.py +256 -0
  80. agentpace-0.9.2/tests/fixtures/opencode.py +243 -0
  81. agentpace-0.9.2/tests/synthetic.py +187 -0
  82. agentpace-0.9.2/tests/test_backtest.py +685 -0
  83. agentpace-0.9.2/tests/test_claims.py +155 -0
  84. agentpace-0.9.2/tests/test_classify.py +54 -0
  85. agentpace-0.9.2/tests/test_cli.py +490 -0
  86. agentpace-0.9.2/tests/test_cline.py +401 -0
  87. agentpace-0.9.2/tests/test_codex.py +414 -0
  88. agentpace-0.9.2/tests/test_docs.py +74 -0
  89. agentpace-0.9.2/tests/test_estimate.py +447 -0
  90. agentpace-0.9.2/tests/test_forecasts.py +383 -0
  91. agentpace-0.9.2/tests/test_gemini_cli.py +369 -0
  92. agentpace-0.9.2/tests/test_ingest.py +781 -0
  93. agentpace-0.9.2/tests/test_labels.py +287 -0
  94. agentpace-0.9.2/tests/test_opencode.py +394 -0
  95. agentpace-0.9.2/tests/test_schema.py +111 -0
  96. agentpace-0.9.2/tests/test_share_validate.py +401 -0
  97. agentpace-0.9.2/tests/test_site.py +198 -0
  98. agentpace-0.9.2/tests/test_skills.py +216 -0
  99. agentpace-0.9.2/tests/test_turns.py +307 -0
@@ -0,0 +1,4 @@
1
+ * text=auto eol=lf
2
+ *.jsonl text eol=lf
3
+ *.svg text eol=lf
4
+ *.png binary
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Report a privacy or security problem
4
+ url: https://github.com/mohamedzhioua/agentpace/security/advisories/new
5
+ about: Use this for anything sensitive. Please do not open a public issue.
@@ -0,0 +1,41 @@
1
+ name: Ingest found nothing
2
+ description: "`agentpace ingest` found no runs, or fewer than you expected."
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ **Never paste a transcript, a file path or a rows file here.** Issues are public. The summary below is all we need, and it holds no content.
9
+ - type: input
10
+ id: version
11
+ attributes:
12
+ label: Version
13
+ description: Output of `agentpace --version`.
14
+ placeholder: agentpace 0.1.0
15
+ validations:
16
+ required: true
17
+ - type: input
18
+ id: harness
19
+ attributes:
20
+ label: Harness and its version
21
+ placeholder: Claude Code 2.1
22
+ validations:
23
+ required: true
24
+ - type: dropdown
25
+ id: system
26
+ attributes:
27
+ label: Operating system
28
+ options:
29
+ - Linux
30
+ - macOS
31
+ - Windows
32
+ validations:
33
+ required: true
34
+ - type: textarea
35
+ id: summary
36
+ attributes:
37
+ label: Ingest summary
38
+ description: The counts `agentpace ingest` printed, from "files seen" to "store now holds".
39
+ render: text
40
+ validations:
41
+ required: true
@@ -0,0 +1,19 @@
1
+ name: Remove my rows
2
+ description: Ask for rows you contributed to be removed from the dataset.
3
+ body:
4
+ - type: markdown
5
+ attributes:
6
+ value: |
7
+ Please open this from the GitHub account that contributed the rows. Removal covers the current tree. Git history and copies others have made cannot be recalled.
8
+
9
+ **Never paste your `~/.agentpace/secret` file here.** Only the `contributor` hash is needed.
10
+
11
+ If the rows hold personal data, do not use this form. Report it privately through the security policy instead.
12
+ - type: input
13
+ id: contributor
14
+ attributes:
15
+ label: Contributor hash
16
+ description: The 16-character `contributor` value from your rows.
17
+ placeholder: 0123456789abcdef
18
+ validations:
19
+ required: true
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: monthly
@@ -0,0 +1,15 @@
1
+ <!-- Keep the section that fits and delete the other. -->
2
+
3
+ ## Contributing runs
4
+
5
+ - [ ] I read every row that `agentpace share --dry-run` printed.
6
+ - [ ] `agentpace validate data/runs` passes.
7
+ - [ ] This pull request adds or extends one file under `data/runs/` and touches nothing else.
8
+ - [ ] I dedicate these rows to the public domain under CC0-1.0.
9
+ - [ ] "Allow edits by maintainers" is on. The "Lint, types and published numbers" check stays red until the maintainer adds the regenerated numbers (see CONTRIBUTING.md).
10
+
11
+ ## Changing code
12
+
13
+ - [ ] Tests pass, and new behavior has a test.
14
+ - [ ] I ran `agentpace backtest`, `agentpace site` and `agentpace claims`, and committed what they produced.
15
+ - [ ] If this adds a harness, it has canary tests like those in `tests/test_ingest.py`.
@@ -0,0 +1,72 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ci-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ test:
17
+ name: Python ${{ matrix.python }} on ${{ matrix.os }}
18
+ runs-on: ${{ matrix.os }}
19
+ timeout-minutes: 10
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ include:
24
+ - { os: ubuntu-latest, python: "3.10" }
25
+ - { os: ubuntu-latest, python: "3.14" }
26
+ - { os: windows-latest, python: "3.12" }
27
+ steps:
28
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
29
+ with:
30
+ persist-credentials: false
31
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
32
+ with:
33
+ python-version: ${{ matrix.python }}
34
+ - name: Run tests
35
+ env:
36
+ PYTHONPATH: src
37
+ run: python -m unittest discover -s tests -t .
38
+
39
+ quality:
40
+ name: Lint, types and published numbers
41
+ runs-on: ubuntu-latest
42
+ timeout-minutes: 10
43
+ env:
44
+ PYTHONPATH: src
45
+ steps:
46
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
47
+ with:
48
+ persist-credentials: false
49
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
50
+ with:
51
+ python-version: "3.12"
52
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
53
+ - run: uvx ruff@0.17.4 check .
54
+ - run: uvx ruff@0.17.4 format --check .
55
+ - run: uvx mypy@2.4.1
56
+ - name: Check data
57
+ run: python -m agentpace validate
58
+ - name: Check backtest numbers
59
+ run: python -m agentpace backtest --check
60
+ - name: Check the site's embedded data
61
+ run: python -m agentpace site --check
62
+ - name: Check README claims
63
+ run: python -m agentpace claims --check
64
+ - name: The built package runs the README example
65
+ # Installs from the checkout, so the example plan must come from the wheel's _bundled
66
+ # folder. An empty home keeps any local data out of the output.
67
+ env:
68
+ PYTHONPATH: ""
69
+ AGENTPACE_HOME: ${{ runner.temp }}/agentpace-home
70
+ run: |
71
+ uvx --from . agentpace estimate --example > "$RUNNER_TEMP/example.txt"
72
+ python -I -c "import re, sys; want = re.search(r'<!-- claim:example_output -->\n(.*?)<!-- /claim -->', open('README.md', encoding='utf-8').read(), re.S).group(1).strip(); got = open(sys.argv[1], encoding='utf-8').read().strip(); sys.exit(0 if want == got else 'the installed --example output differs from the README')" "$RUNNER_TEMP/example.txt"
@@ -0,0 +1,33 @@
1
+ name: Publish
2
+
3
+ # Manual until the PyPI pending publisher exists, so a release cannot produce a failed run.
4
+ # Once it does: dispatch this on the latest tested tag, `gh workflow run publish.yml --ref vX.Y.Z`,
5
+ # confirm it passes, then restore `release: types: [published]`. docs/releasing.md has the steps.
6
+ on:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ publish:
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 10
16
+ # Trusted publishing: PyPI accepts this job's identity, so no token is stored anywhere.
17
+ environment: pypi
18
+ permissions:
19
+ contents: read
20
+ id-token: write
21
+ steps:
22
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
+ with:
24
+ persist-credentials: false
25
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
26
+ - name: Check the tag matches the version
27
+ env:
28
+ TAG: ${{ github.ref_name }}
29
+ run: |
30
+ version=$(sed -n 's/^__version__ = "\(.*\)"$/\1/p' src/agentpace/__init__.py)
31
+ test "v$version" = "$TAG"
32
+ - run: uv build
33
+ - run: uv publish
@@ -0,0 +1,41 @@
1
+ name: Validate data
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - "data/**"
7
+ - "schema/**"
8
+
9
+ # `pull_request` gives forks a read-only token and no secrets. Never switch this to
10
+ # `pull_request_target`: it would run with write access against untrusted changes.
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ validate:
16
+ runs-on: ubuntu-latest
17
+ timeout-minutes: 5
18
+ steps:
19
+ - name: Check out the validator from the base branch
20
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21
+ with:
22
+ ref: ${{ github.event.pull_request.base.sha }}
23
+ path: trusted
24
+ persist-credentials: false
25
+ - name: Check out the proposed data
26
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
27
+ with:
28
+ path: proposed
29
+ persist-credentials: false
30
+ - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
31
+ with:
32
+ python-version: "3.12"
33
+ # A pull request must not be able to weaken the check that judges it, so the base branch
34
+ # supplies the code. Contributed files are parsed, never executed.
35
+ - name: Validate rows
36
+ run: |
37
+ if [ -d trusted/src/agentpace ]; then
38
+ PYTHONPATH=trusted/src python -m agentpace validate proposed/data/runs
39
+ else
40
+ PYTHONPATH=proposed/src python -m agentpace validate proposed/data/runs
41
+ fi
@@ -0,0 +1,9 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ build/
5
+ dist/
6
+ *.egg-info/
7
+ .mypy_cache/
8
+ .ruff_cache/
9
+ .coverage
@@ -0,0 +1,344 @@
1
+ # Changelog
2
+
3
+ This project follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
4
+
5
+ ## Unreleased
6
+
7
+ ## 0.9.2 - 2026-11-08
8
+
9
+ ### Fixed
10
+
11
+ - The estimate output no longer says that waiting is outside the total. The session clock counts agent runs and the gaps between them, each gap up to the idle cap (900 s by default), so a wait on you shorter than the cap was always inside the plan total.
12
+ - The first line now reads `Plan total on the session clock: P50 …, P80 …, P90 …`.
13
+ - A new line, directly above the human part, states the cap rule. `Quoted:` stays on line 2.
14
+ - The human part line says `No allowance for it is added to the total above`. When `agentpace turns` has measured your waits, it adds that waits up to the idle cap already sit inside the session clock, so they must not be added to it.
15
+ - `score` describes a session's actual as "that session's span on its own clock: agent runs plus the gaps between them, each gap up to the idle cap". The ledger summary says the same.
16
+ - `--json` output is unchanged, and `human.included_in_total` stays `false`. `docs/cli.md` now defines it as meaning that no allowance for the human part is added to the total.
17
+ - The README, `docs/cli.md`, DESIGN (the `offset_s` row, which wrongly said long gaps were removed, and the estimator output paragraph), `data/README.md`, the `agentpace` and `pace-estimate` skill bodies, the method reference and the portable prompt are reworded to match. Skill frontmatters are unchanged.
18
+ - The `agentpace` skill body and the portable prompt now say never to name the difference between a quoted timeline and the range, and never to call it the human part. A smoke prompt had called it that.
19
+
20
+ ### Added
21
+
22
+ - README Limitations answers two questions from users:
23
+ - retries are not separated, because `retries` is an errored-tool-result proxy and no field that describes what happened in a run ever predicts a duration;
24
+ - forecasts pool by task kind, risk and model only, because repository size is not recorded.
25
+
26
+ No published number moved; the quantity's description was corrected.
27
+
28
+ ## 0.9.1 - 2026-11-08
29
+
30
+ ### Added
31
+
32
+ - `agentpace share --drop-session REF`, repeatable, leaves a whole session out of both the dry run and the written file. `REF` is a session or any run reference from `agentpace runs`; its session is used, as `score --session` does. Dropped rows are left out before the published-row check and the file name, so the name spans only the rows shared. stderr says `N rows from M dropped sessions left out.` in both modes. A `REF` whose session has no local row is refused with exit 2 and nothing is written, so a mistyped reference cannot share the session it meant to withhold. This is how the 2026-W46 data change will exclude named sessions.
33
+
34
+ ### Changed
35
+
36
+ - CONTRIBUTING and `docs/cli.md` say a contributor can withhold a session with `--drop-session`.
37
+
38
+ No published number moved.
39
+
40
+ ## 0.9.0 - 2026-11-08
41
+
42
+ ### Added
43
+
44
+ - `agentpace estimate --quoted TEXT` shows a timeline someone already gave on its own line, directly under the total: `Quoted: "3 months" (calendar time, as quoted; unverified, not converted)`. The quote is printed verbatim. It is never converted into agent time, compared with the range or turned into a ratio. `--json` output is unchanged.
45
+ - `estimate` says on stderr when rows from experimental adapters (Gemini CLI, OpenCode, Cline) in your local store take part in an estimate: `note: N of M rows come from experimental adapters (...); they take part in this estimate because they are in your local store. Pass --data to choose the rows.` It says nothing when `--data` chooses the rows. Nothing else in the output or a recorded forecast changes. The seed data holds no experimental rows.
46
+ - A worked example in the README Skills section, "Re-answer a quoted timeline", estimates `examples/quote-plan.json` (six agent tasks) with `--quoted "3 months"`. Its output sits between claim markers, so `agentpace claims --check` fails if it drifts from the data.
47
+
48
+ ### Changed
49
+
50
+ - `--quoted` no longer needs `--record`. With `--record` the quote is still stored with the forecast as before, and the stderr record line is unchanged.
51
+ - The `agentpace` skill passes a quoted timeline to the CLI verbatim with `--quoted` and relays the `Quoted:` line as printed, beside the range. Its description is unchanged.
52
+ - `docs/cli.md` documents the `Quoted:` line, the new `--quoted` behaviour and the experimental-rows note.
53
+
54
+ No published number moved.
55
+
56
+ ## 0.8.4 - 2026-11-08
57
+
58
+ ### Added
59
+
60
+ - `docs/releasing.md`, the maintainer's release runbook: the steps every release follows, the PyPI pending-publisher settings (project `agentpace`, owner `mohamedzhioua`, repository `agentpace`, workflow `publish.yml`, environment `pypi`), the first manual dispatch, a clean-venv check that the installed `agentpace estimate --example` matches the README, and the exact list of install lines, files and tests to switch after the first upload. agentpace is still not on PyPI.
61
+ - A `Changelog` URL in `pyproject.toml`'s project URLs.
62
+
63
+ ### Changed
64
+
65
+ - The three README images use absolute `raw.githubusercontent.com` URLs, so they can render on the PyPI project page as well as on GitHub. Alt text is unchanged.
66
+
67
+ ### Fixed
68
+
69
+ - The comment in `publish.yml` pointed the first dispatch at the v0.1.0 tag. It now says to dispatch on the latest tested tag with `gh workflow run publish.yml --ref vX.Y.Z`. The workflow still runs only when dispatched by hand, and its tag check is unchanged.
70
+
71
+ No published number moved.
72
+
73
+ ## 0.8.3 - 2026-11-08
74
+
75
+ ### Added
76
+
77
+ - `docs/verify-adapter.md`, the procedure for verifying an experimental adapter: throwaway sessions in a scratch folder, an ingest isolated with `AGENTPACE_HOME` and `--out`, a reconciliation of rows against hand-noted turns, what the pull request carries, how the experimental label is lifted, and why a data pull request with experimental rows stays red until the lift merges. It is the page the 0.8.1 `share` warning points to. CONTRIBUTING, the README setup rows for Gemini CLI, OpenCode and Cline, and the Limitations line link it.
78
+ - `docs/cli.md`, a command reference: every command and flag, the plan JSON format, every `--json` key, exit codes, what goes to stdout and stderr, the files under `AGENTPACE_HOME`, and why `runs` and `label last` cannot order sessions with no cached start. `tests/test_docs.py` fails if a command, an adapter or a `--json` key is missing from it.
79
+ - The site's navigation links the changelog and CONTRIBUTING.
80
+
81
+ ### Changed
82
+
83
+ - CONTRIBUTING step 5 and the pull request template say `agentpace validate data/runs`. Plain `validate` checks the bundled seed, not the contributor's file.
84
+ - CONTRIBUTING says what happens to a data pull request, naming the checks as they appear on it: "Validate data" must pass, and "Lint, types and published numbers" stays red until the maintainer adds a commit with the regenerated backtest, site and claims, a CHANGELOG entry listing every moved number, and a version bump. Contributors keep "Allow edits by maintainers" on.
85
+ - CONTRIBUTING no longer asks for a `DEFAULT_METHOD` edit when a new method wins. Selection is frozen at 2026-W45, a test fails CI on a flip, and a flip needs re-registration in CHANGELOG (DESIGN section 6).
86
+ - `/pace-log` names the `--source` choices, marks `gemini-cli`, `opencode` and `cline` experimental, and says to ask the user for a reference when `label last` refuses. The `agentpace` skill's limits name the three experimental adapters and no longer promise that results improve once a user ingests their own history, and CONTRIBUTING no longer says labels improve every estimate. Nothing measured either claim.
87
+ - The README's `validate` row says contributors pass `data/runs`.
88
+
89
+ No published number moved.
90
+
91
+ ## 0.8.2 - 2026-11-08
92
+
93
+ ### Fixed
94
+
95
+ - `agentpace runs` and `agentpace label last` ordered the sessions of a week by `batch`, which is a keyed hash, so "last" could be any session in that week. They now take each session's earliest start from the local ingest caches, read in memory at the default idle cap. No row gains a field. `runs` lists sessions without a cached start first within their week and says on stderr how many it could not place. `label last` labels the last run of the session with the latest cached start. It exits 2 rather than guessing when no session has a cached start, or when a session it cannot place has a row in that session's latest week or later.
96
+ - `agentpace label` holds the store lock while it reads the store, writes the labels file and rewrites the store, so a `SubagentStop` hook ingest can no longer lose a label or lose its own write. If another ingest holds the lock for 5 s, it exits 2: "another ingest is writing the store; try again".
97
+ - A plan or task `model` that is neither a string nor `null` (an object, a list, `true`, a number) is a clean error with exit 2, "model must be a string" or "task #N: model must be a string", instead of a Python traceback. `null` still means no model, at either level, as before: a task's `null` does not inherit the plan's `model`.
98
+ - `agentpace estimate <path>` with a path that is not a file exits 2 with "no plan file at that path" instead of a Python traceback.
99
+
100
+ ### Changed
101
+
102
+ - The first line of `agentpace estimate` reads "Total agent time, on the session clock" instead of "Total wall clock". The total was always agent time on the idle-capped session clock (DESIGN sections 3 and 5); only its name changes. The README example is regenerated, and the README and the `/pace-estimate` description say "ranges of agent time" and "agent-time ranges".
103
+ - `agentpace backtest` no longer says to update `DEFAULT_METHOD` when the winner differs. It says that selection is frozen at 2026-W45, that a pin test fails CI on a flip, and that a flip needs re-registration in CHANGELOG (DESIGN section 6).
104
+ - `agentpace validate --help` says the default is the seed data shipped with agentpace, and that contributors pass `data/runs`.
105
+
106
+ No published number moved.
107
+
108
+ ## 0.8.1 - 2026-11-08
109
+
110
+ The first release from the ruling for 0.9 (DESIGN section 11).
111
+
112
+ ### Fixed
113
+
114
+ - `agentpace share --write` no longer overwrites a contribution file. A second share of the same span used to replace `<contributor>-<first week>-<last week>.jsonl` with only the new rows, so rows already in it were lost. Now the file keeps its old bytes exactly and the new rows go after them. Rows already anywhere in `--out-dir` are still left out, so an appended row is never a duplicate. The command prints `added N rows to <path>, which already held M`, and a new file is reported with `wrote`, as before.
115
+ - `share` refuses, with exit 2, a file of that name that holds another contributor's rows, and leaves it unchanged. The dry run refuses it too, so the two modes agree.
116
+
117
+ ### Added
118
+
119
+ - The dry run says what `--write` would do: `--write would create <path>` or `--write would add them to <path>, which holds M rows`. Its stdout, the exact rows, is unchanged.
120
+ - `share` warns on stderr, in both modes, when rows from experimental adapters are in the share. It names the harnesses and says that `validate` rejects them, so a pull request with them stays red until a maintainer reconciles them by hand. The rows stay in the share. For these rows this replaces 0.8.0's "`share` output is unchanged".
121
+ - The commands `share --write` prints to submit start with `agentpace validate "<out-dir>"`.
122
+
123
+ ### Changed
124
+
125
+ - The README contribute steps say `agentpace validate data/runs`, because bare `agentpace validate` checks the seed data shipped with the package, and that `--write` adds or extends one file under `data/runs`. DESIGN section 7 describes the append.
126
+ - DESIGN section 11 records the ruling for 0.9.
127
+
128
+ No published number moved.
129
+
130
+ ## 0.8.0 - 2026-11-08
131
+
132
+ The Gemini CLI, OpenCode and Cline adapters ship as experimental, by the owner's decision. Each was built from the tool's source and is unverified on real sessions. No published row comes from any of them. Problems go in an issue (DESIGN section 11, ruling for 0.8.0).
133
+
134
+ ### Added
135
+
136
+ - An experimental Gemini CLI adapter (#29): `agentpace ingest --source gemini-cli` reads `~/.gemini/tmp/<project>/chats`, one agent turn per run and one session file per batch. It was built from the Gemini CLI source at `google-gemini/gemini-cli@62bab5b232c15b925d31e655ce844ab939c882b7` and is unverified on real sessions. DESIGN section 3 has the run definition and what is copied.
137
+ - An experimental OpenCode adapter, `--source opencode`. It reads OpenCode's SQLite history read-only, and one user message with the agent's replies to it is one run. It was built from the OpenCode source at `anomalyco/opencode@810c0eba1a7348036f8bdf61e6632d0c36c6876c` (tag `v1.19.5`) and is unverified on real sessions.
138
+ - An experimental Cline adapter, `agentpace ingest --source cline` (#31). It reads the task folders Cline keeps in VS Code's global storage (`saoudrizwan.claude-dev/tasks/<id>/ui_messages.json`). One agent turn is one run, from the message after the previous hand-back to the next `completion_result`, `followup` or `plan_mode_respond` ask. One task is one batch. Waits on a human approval are dropped from agent time. It was built from the upstream source at `cline/cline@94eecbb` (main) and `@7761370` (`legacy-extension`), because Cline could not be installed where it was written. It is unverified on real sessions, and its fixtures are synthetic. Tasks made by Cline's SDK bundle (`~/.cline/data/sessions`) are not read yet.
139
+ - `gemini-cli`, `opencode` and `cline` join the `harness` enum in the run schema. Additive: no existing row changes.
140
+ - `agentpace ingest` with one of these three sources prints a one-line note on stderr before its report, saying the adapter is experimental and where to report problems. The list is `agentpace.adapters.EXPERIMENTAL`. Claude Code and Codex print nothing new, and `share` output is unchanged.
141
+ - `agentpace validate` rejects rows from the experimental harnesses, so they cannot reach the published data unreviewed.
142
+
143
+ ### Changed
144
+
145
+ - Gemini Flash Lite models keep their own family (`gemini-3.1-flash-lite`) instead of folding into Flash.
146
+ - Dotted Claude model ids, such as `claude-sonnet-4.5` or `anthropic/claude-sonnet-4.5`, normalize to the dashed family `claude-sonnet-4-5` for every harness, instead of being cut to `claude-sonnet-4`. No published row has a dotted id.
147
+ - README and DESIGN label the three adapters experimental, shipped unverified by the owner's decision. Fable's earlier rule that they merge only after real-session verification is superseded for these three.
148
+
149
+ No published number moved.
150
+
151
+ ## 0.7.2 - 2026-11-08
152
+
153
+ ### Fixed
154
+
155
+ - README Privacy: the opening sentence said agentpace never reads or stores file paths or repo names. The rows you publish hold none, but the local cache on your machine keeps transcript paths and the project folder, the Codex working folder included, as DESIGN section 3 says. The sentence now states that boundary.
156
+ - Site: the dataset's structured data pointed its download at a folder page. It now points at the repository's zip archive, with `application/zip` as its format, and a test checks that the link ends in `.zip`.
157
+
158
+ ### Added
159
+
160
+ - `CODE_OF_CONDUCT.md`, the Contributor Covenant 2.1, with reports going through GitHub private vulnerability reporting as in `SECURITY.md`. CONTRIBUTING links it.
161
+ - A test checks that every value `agentpace claims` writes, when it appears in the README, appears only between claim markers. A harness name is exempt, because the README also uses it as a word.
162
+ - CONTRIBUTING links issue #2 as the standing call for a second contributor, and says that every number that comes from the data sits between claim markers.
163
+
164
+ No published number moved.
165
+
166
+ ## 0.7.1 - 2026-11-07
167
+
168
+ ### Fixed
169
+
170
+ - The project split no longer divides by zero when only one held-out project has completed runs. It then shows that project's row and leaves out the "without the largest project" sentence, because nothing would remain to score.
171
+ - DESIGN section 3's `Adapter` snippet now lists `version` and `default_path`, as the protocol in `adapters/base.py` does. The adapter issues point contributors at it.
172
+
173
+ ### Added
174
+
175
+ - CI installs the package from the checkout and checks that `agentpace estimate --example` prints exactly the README's example output, so the example plan must ship inside the wheel.
176
+ - A test pins the project ranking's last tie-break, the pseudonym.
177
+
178
+ No published number moved.
179
+
180
+ ## 0.7.0 - 2026-11-07
181
+
182
+ ### Added
183
+
184
+ - `agentpace estimate --example` estimates the example plan that now ships inside the package. The README and the site make it the whole Try it command, one line with no heredoc, so it works the same in PowerShell, and they show the plan beside the output. Giving both a plan and `--example`, or neither, is an error that says what to give.
185
+ - README: one sentence on why the answer is a range, and an "In your agent" block that installs the skills and gives a first question to ask.
186
+ - Site: a shorter title and meta description for search, a canonical link to its own address, structured data describing the tool and the dataset (no version and no figures, so nothing can drift), and `robots.txt` with a one-page `sitemap.xml`. The page still loads nothing from anywhere.
187
+
188
+ ### Changed
189
+
190
+ - The README opens with what agentpace is for: "Stop estimating agent work in human weeks." Try it now comes straight after the badges. The problem statement moved under its own heading, below the example output.
191
+ - A new hero illustration, "the guess and the stopwatch": a dashed, fading speech bubble holds a calendar shedding blank pages, and beside it two small cursor robots measure a solid stopwatch with a tape measure. The old one, a Gantt chart running out of an office, read as an office scene at README width. It has no words and no numbers. It was generated with Codex image generation, then resized and encoded as WebP. The social preview reuses it under the line "Stop estimating agent work in human weeks.", and the site gains `og:image:alt`.
192
+ - The package description and keywords match the GitHub description: Claude Code and Codex, not Claude Code only.
193
+
194
+ No published number moved.
195
+
196
+ ## 0.6.3 - 2026-11-07
197
+
198
+ ### Added
199
+
200
+ - The backtest's project split shows each held-out project on its own: harness, held-out sessions and runs, pinball against the global median, P80 coverage and width. Projects are numbered by rank, most held-out sessions first, and never named. A generated sentence gives each candidate's session-weighted pinball without the largest project. Today that project is a Codex one holding 137 of 212 held-out sessions, and without it the lowest candidate changes from `weighted` to `shrunk`. The split does not choose the method, so nothing ships differently.
201
+ - The README states the largest project's harness and share of held-out sessions, both claim-marked.
202
+
203
+ ### Changed
204
+
205
+ - When every held-out session is one run, as in the harness split, the report prints one table instead of two identical ones. "Where agentpace loses" still lists both weightings, so its count stays 20.
206
+
207
+ ### Notes
208
+
209
+ - No published number moved. `docs/backtest.json` only gained `splits.project.by_project` and `splits.project.without_largest`.
210
+ - CHANGELOG 0.6.0 counted the Codex project as 165 one-turn sessions, which is every row of it. The new table shows 137, its completed held-out sessions, because failed runs are not test rows.
211
+
212
+ ## 0.6.2 - 2026-11-07
213
+
214
+ ### Changed
215
+
216
+ - Waits measured by `agentpace turns` are never shared, in any form: not as records, not binned, not as weekly aggregates. A session's gaps are a timeline of one person's day, public commit times can pin it to the clock, and coarsening leaves sessions unique. The wait is shown only to the person it describes. New tests prove `share` cannot reach the turns file and `validate` rejects one placed among run rows. No behaviour changed.
217
+
218
+ ## 0.6.1 - 2026-11-07
219
+
220
+ ### Added
221
+
222
+ - DESIGN section 8 records the trigger evals. With only `skills/` installed and 9 prompts per run, the `agentpace` skill triggered on 6 of 6 questions about how long software work takes, and on none of 3 near misses, in Claude Code with Sonnet, Opus and Haiku. Codex CLI (gpt-6-sol) also loaded it on 6 of 6, and read it on one near miss (a git rebase's CPU time) before correctly answering without it.
223
+ - A hero illustration at the top of the README and the site: a Gantt chart so long it runs out the door, a crew of terminal cursors that has already stacked the finished work, and an empty chair at a separate review desk for the human part. It holds no words and no numbers, so it cannot carry an unchecked figure. Generated with Codex image generation, then resized and encoded as WebP (`docs/assets/hero.webp`).
224
+
225
+ ### Changed
226
+
227
+ - The social preview (`docs/assets/social-preview.png`) is the same illustration with the project name. The old one showed run counts from 0.1.0 that no longer matched the dataset.
228
+
229
+ ## 0.6.0 - 2026-11-07
230
+
231
+ ### Added
232
+
233
+ - Data: 211 Codex turns from the maintainer, 2026-W44 to W45, in `data/runs/4546788e7930eccd-2026-W44-2026-W45.jsonl`. They use the same contributor as the Claude Code rows, so the dataset is still one person's. 177 completed, 33 failed and 1 unknown. Every Codex exec session is one turn, all are classed `other` x `normal`, and the file holds no approval-check turns. The Claude Code rows are unchanged.
234
+ - **Numbers that moved.** The shipped method stays `shrunk`. Every README claim that changed, from 0.5.0 to 0.6.0:
235
+ - completed runs 3,206 to 3,383; sessions 82 to 293; projects 13 to 21; the largest project 71% to 67%; the three largest sessions 48% to 45%; one run in ten took more than 19 min to 20 min.
236
+ - task P80 coverage, per session, 78.5% (CI 72.7% to 84.2%) to 77.7% (CI 71.4% to 83.8%); per run 89.1% to 88.8%. Pinball 1047 (CI 830 to 1318) to 1047 (CI 831 to 1316). MAPE 511% to 494%, against the global median's 232% to 234%.
237
+ - weekly P80 per session 67% to 86%, now 66% to 86%; in 2026-W45, 72% to 66%.
238
+ - pinball gaps: global median +375 to +992, now +373 to +991; human guess +5725 to +7440, now +5725 to +7439.
239
+ - the project split's P80 coverage 77.8% to 88.9%. The split runs over both harnesses and gained one fold, 8 to 9 projects: the only Codex project with 30 or more rows. Its 165 one-turn sessions carry about two thirds of the session-weighted vote, and Codex rows are over-covered, so the rise is composition, not improvement.
240
+ - places where a baseline won, 9 to 20. The new entries come from the project split and from the leave-one-harness-out split, which now runs. Only its Codex-held-out fold runs: holding out Claude Code leaves 177 completed rows in training, under the 200-row floor. That fold forecasts Codex with no Codex row in training, and all 12 harness entries are that fold.
241
+ - the example estimate: total P80 6.0 h to 5.9 h, P90 9.1 h to 9.0 h; the docs task's P50 73 s to 72 s, P90 14 to 13 min and criticality 19% to 18%; the review task's criticality 81% to 82%; runs excluded as not completed 13 to 47.
242
+ - the portable prompt's `other` row: n 268 to 445, P50 9 to 8 min, P80 33 to 24 min, P90 53 to 43 min.
243
+ - The whole-session test is unchanged (56 sessions, P80 80%), because no Codex session has 5 runs.
244
+ - **Why Claude Code numbers moved at all.** Codex rows train every candidate. At the `kind` and `kind` x `risk` levels they join the `other` x `normal` cell, so the parent that sparse Claude `other` cells shrink toward shifted. On the selection folds, the losses moved from global 1272, kind 1480, backoff 1370, shrunk 1047, weighted 1050 to 1276, 1496, 1364, 1047 and 1044. `weighted` is now lowest, and `shrunk` stays shipped by the tie rule, inside the interval (-17 to +24).
245
+ - On Codex alone, on the selection folds, `shrunk` scored 1092 against the global median's 1240, with P80 coverage of 96%. Pooled, the rule would pick `global` (856, against 1078 for `shrunk`). That is printed in the report and not shipped.
246
+
247
+ ### Changed
248
+
249
+ - The run chart, the site and the README say "agent runs" rather than "subagent runs", and the Limitations section says two harnesses, one person. The site no longer says logging your own runs works with Claude Code subagents only.
250
+ - Backtest: selection, the time-split tables, the week-by-week table, the whole-session test and the locked holdout's headline now score Claude Code sessions only, the population the selection rule was frozen on. Rows from every harness still train the estimator. On the published rows, which are all Claude Code, every number is unchanged and `docs/backtest.json` only gains keys.
251
+ - **This was registered after seeing results, not before.** A local run with the maintainer's Codex rows pooled in had picked `global` over the shipped `shrunk`: 785 against 915 with every Codex turn, when the fixed-rounds baseline (774) would also have beaten the winner, and 856 against 1078 with approval checks skipped, where fixed-rounds (911) did not beat the winner. On Claude Code sessions alone `shrunk` held, at 1047 to 1050. Codex supplied most of the pooled vote because each Codex exec session is one turn, and `global` won on Codex only in the week no Codex row was in training.
252
+ - The pooled result is printed in `docs/backtest.md` under "Pooled, for the record", from its own random stream, and is never shipped.
253
+ - The locked holdout gains a per-harness table of every candidate at task level. Whether Codex is better served by another method is decided there, on weeks after 2026-W45, and nowhere else.
254
+ - Codex: turns run by `codex-auto-review`, Codex's automatic approval check on a command, are skipped and counted under `skipped runs`, instead of being stored as reviews. They take seconds, call no tool and are not work anyone plans. The adapter version moves to 2, so the next `ingest --source codex` reads Codex history again once. Claude Code rows and the published dataset are unchanged.
255
+
256
+ ## 0.5.0 - 2026-11-07
257
+
258
+ ### Added
259
+
260
+ - Backtest: a "By harness" section and a leave-one-harness-out split. Today the split prints "could not run (1 harness)", because the published rows are all Claude Code. The per-harness tables reuse the selection-fold forecasts, and the split draws its own streams, like the project split. No published number moved, and `docs/backtest.json` only gained keys.
261
+
262
+ - A Codex adapter: `agentpace ingest --source codex` reads `~/.codex/sessions`, one agent turn per run and one rollout file per batch, using the same idle cap and privacy rules as Claude Code. It copies only types, timestamps, ids, model, effort, counters and fixed-set flags, never prompts, commands, patches or tool output. Forked rollouts and upkeep sessions are skipped and counted. Review sessions and `codex-auto-review` turns count as reviews. Codex rows are not in the published dataset.
263
+ - `score --session` finds a session in any adapter's cache.
264
+ - Adapters return every run in a file, so a harness can keep several runs in one transcript, as Codex does with several turns. The ingest cache moves to format 3 to hold a list of runs per file, so the first ingest after upgrading reads every transcript again (minutes rather than seconds on a large history). Rows are byte-identical to before.
265
+ - Schema: `harness` accepts `codex`, ahead of the Codex adapter. The change is additive, so every existing row stays valid and unchanged. It merges alone first, because data pull requests are validated with the base branch's schema.
266
+
267
+ ## 0.4.0 - 2026-11-07
268
+
269
+ ### Added
270
+
271
+ - `agentpace score <id> --session <ref>` scores a recorded forecast against a session of your own ingested runs. The actual is agent active time on that session's clock, with idle gaps over the idle cap clipped and the human part outside it, the same quantity the backtest scores. A session scores only if the local ingest cache shows it started after the forecast was issued. Otherwise the score is refused, with no silent fallback. `--actual 2h` records a figure you attest, labeled as such. Scores are appended, and the latest per forecast wins.
272
+ - `agentpace score` with no id shows how your forecasts held up: the share of actuals within P50, P80 and P90, and pinball loss. For parsed quotes it shows how often the quoted timeline was closer than the P50, and the median quote-to-actual ratio. Rates need at least 5 scored forecasts. None of these numbers is published.
273
+ - `estimate --record` keeps each forecast in a local ledger, `~/.agentpace/forecasts.jsonl`, exactly as it was shown, with the time it was issued. The ledger is never shared and holds no file paths or data sources. `--quoted "3 weeks"` stores a timeline someone already gave beside it. An exact "<number> <unit>" quote is also stored in seconds by fixed calendar units (1 d = 86,400 s, 1 w = 7 d, 1 mo = 30 d), and anything else is kept as text only.
274
+
275
+ ## 0.3.0 - 2026-11-07
276
+
277
+ ### Added
278
+
279
+ - `agentpace turns` measures how long you wait between agent turns, from the timestamps of your own main Claude Code sessions. A gap runs from the agent's last record to the next prompt a person typed (`turnOrigin: human`). It prints uncapped P50/P80/P90 per human turn with the number of gaps and sessions, the share of gaps over an hour, and the median share of a session spent waiting on you. It is elapsed time, not effort.
280
+ - Only the record type, the timestamp, `turnOrigin` and a tool-result flag are read from each line.
281
+ - Records go to `~/.agentpace/turns.jsonl` under the new `schema/turn.schema.json`, and are never shared, never run rows and never in the dataset.
282
+ - Sessions without `turnOrigin` are skipped and counted.
283
+ - `estimate` reads those waits when they exist and states them in the human part line, from your history, per human turn, outside the total. `--turns` points at another file. JSON `human` gains `source`, `per_turn_p50`, `per_turn_p80`, `per_turn_p90`, `gaps` and `sessions` when measured.
284
+
285
+ ### Changed
286
+
287
+ - The `agentpace` skill passes a measured human part on without multiplying it by a guessed number of turns.
288
+
289
+ ## 0.2.1 - 2026-11-07
290
+
291
+ ### Added
292
+
293
+ - `estimate` prints the human part on its own line in every result: review, testing, decisions and waiting between agent turns are not measured, are not in the total, and must not be derived from agent time. JSON output gains `human` (`status`, `included_in_total`).
294
+ - Backtest: a `width80` metric, the median P80/P50 ratio, beside the existing P90/P50 `width`. It comes from the same forecasts with no new random draw, so no published number moves.
295
+
296
+ ### Changed
297
+
298
+ - The `agentpace` skill triggers on any question about how long software work will take, even when agents are not mentioned, and assumes agents do the implementation unless told otherwise. It gains a step for re-answering a timeline someone already quoted in days, weeks or months: the quote is shown beside the measured range as unverified and never converted by a constant.
299
+ - `/pace-estimate` passes the human-part line through verbatim, and says it is the explicit command while `agentpace` handles natural-language questions.
300
+ - README: a "Try it" command on the first screen, a support table, Install before the commands, a skills table that says what to say and what you get, commands split into Use and Maintain, a claim-marked backtest bottom line with the detail tables collapsed, an install step in the contribute block, and a manual install line for agents without Node.
301
+ - Each skill opens with when to use it and what it produces. `/pace-log` also triggers on recording or tracking runs.
302
+ - Site: the lede and reading notes are written into the page by `agentpace site`, so they show without JavaScript. The page gains a promise, a no-install Try-it block, link-preview tags and Try it and Install links.
303
+
304
+ ### Fixed
305
+
306
+ - The portable prompt no longer adds up P50s for the low end and P90s for the high end, which overstates the high end and ignores throughput. It now takes the larger of the critical chain and the total work over the agents running at once, then applies the published whole-session P80/P50 and P90/P50 ratios, and calls the result a rule of thumb.
307
+
308
+ ## 0.2.0 - 2026-11-07
309
+
310
+ ### Added
311
+
312
+ - Backtest: a week-by-week table for the shipped method, because pooled coverage hid weekly drift in both directions.
313
+ - Backtest: a locked forward holdout. Selection is frozen at weeks up to `2026-W45` (`SELECTION_LAST_WEEK`) and never re-runs on later weeks, which are scored in their own section once 20 sessions with 5+ runs exist.
314
+ - Backtest: 95% session-bootstrap intervals on the headline coverage and pinball numbers, on each baseline's pinball gap, and on the whole-session test, which now reports pinball loss too.
315
+ - Ingest: `agentpace ingest --hook`, an opt-in Claude Code `SubagentStop` hook that logs each session as its subagents finish. `/pace-log` shows the snippet, and nothing installs it.
316
+ - Ingest: a cache of parsed runs, so a second ingest reads only what changed (3 to 5 s instead of minutes), plus a store lock so a hook and a manual ingest never interleave.
317
+ - Schema: an optional `effort` field (`low`, `medium`, `high`, `xhigh`, `max`), captured from Claude Code metadata. It is not used to forecast.
318
+ - Data: 433 of the 3,219 seed rows gain `effort`, regenerated key for key from the transcripts. No other field changed, and no row was added or dropped.
319
+
320
+ ### Fixed
321
+
322
+ - An ingest made while an agent was still running stored a partial row that stayed in the store beside the completed run. Such runs are now held back until they finish. The published seed and the maintainer's local store were checked key by key against the transcripts, and neither holds one.
323
+ - The CLI no longer imports `urllib.request` and `http.client` indirectly through `xml.sax.saxutils`, so no network module loads at all.
324
+
325
+ ### Changed
326
+
327
+ - README, site and package description lead with the engineer's question, say up front who it fits (Claude Code subagent runs, one task is one run), and give a zero-install `uvx` quickstart.
328
+ - README: headline coverage and pinball now carry intervals, and the calibration wording states the weekly spread beside the pooled number.
329
+ - `docs/DESIGN.md`: drops the conformal-scaling promise with its reason, marks session weighting superseded, and records the idle-cap sensitivity results.
330
+
331
+ No published number changed. Every value in `docs/backtest.json` from 0.1.0 is unchanged, and the estimator is untouched.
332
+
333
+ ## 0.1.0 - 2026-11-07
334
+
335
+ ### Added
336
+
337
+ - Run schema, adapter interface and a Claude Code subagent adapter.
338
+ - Deterministic task classification from agent type, with user labels.
339
+ - Estimator for plans of tasks: P50, P80 and P90 per task and in total, the critical path and a learned effective-parallelism factor.
340
+ - Backtest with time and project holdouts, a contributor holdout that starts with a second contributor, four baselines, and a generated list of losses.
341
+ - Seed dataset of real runs from one contributor.
342
+ - `share`, which previews exact rows and writes a file, and `validate`, which CI runs on data pull requests.
343
+ - Static leaderboard page and four agent skills.
344
+ - `claims`, which ties every number in the README to the data.
@@ -0,0 +1,17 @@
1
+ cff-version: 1.2.0
2
+ message: If you use agentpace or its dataset, please cite it like this.
3
+ title: "agentpace: real run times for coding agents"
4
+ type: software
5
+ authors:
6
+ - family-names: Zhioua
7
+ given-names: Mohamed
8
+ repository-code: https://github.com/mohamedzhioua/agentpace
9
+ url: https://mohamedzhioua.github.io/agentpace/
10
+ license: MIT
11
+ version: 0.9.2
12
+ date-released: 2026-11-08
13
+ keywords:
14
+ - coding agents
15
+ - estimation
16
+ - forecasting
17
+ - open data