Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .agents/skills/release/scripts/verify-release.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
#
# Usage: verify-release.sh <version|vVERSION> e.g. verify-release.sh 0.1.1
#
# Smoke test runs the entry point with no args (currently side-effect-free).
# If the entry point ever gains required args/interaction, adjust step 3.
# Smoke test uses --version without a task and checks the installed version.
set -euo pipefail

PACKAGE="nanoPyCodeAgent"
Expand Down Expand Up @@ -63,11 +62,12 @@ printf 'OK: GitHub Release %s has wheel + sdist\n' "$tag"
# --default-index (not --index): --index only *adds* an index, and uv's
# first-index strategy would stop at a locally configured mirror that has the
# package but not the new version yet. --refresh: uv's cached simple-index
# metadata can be stale right after a publish. </dev/null: the entry point
# reads stdin; EOF makes it exit immediately instead of hanging interactively.
# metadata can be stale right after a publish. --version exits before task input
# or credential validation; empty stdin without it is a command-line error.
log "Smoke-testing uvx ${PACKAGE}@${version}"
deadline=$(( $(date +%s) + POLL_TIMEOUT ))
until uvx --refresh --default-index "$PYPI_INDEX" --from "${PACKAGE}@${version}" "$PACKAGE" >/dev/null 2>&1 </dev/null; do
until reported_version="$(uvx --refresh --default-index "$PYPI_INDEX" --from "${PACKAGE}@${version}" "$PACKAGE" --version 2>/dev/null </dev/null)" \
&& [[ "$reported_version" == "${PACKAGE} ${version}" ]]; do
(( $(date +%s) >= deadline )) && fail "uvx smoke test failed for ${PACKAGE}@${version} after ${POLL_TIMEOUT}s"
printf 'uvx not ready (index propagation?); retrying in %ss...\n' "$POLL_INTERVAL"; sleep "$POLL_INTERVAL"
done
Expand Down
75 changes: 0 additions & 75 deletions docs/changelogs/0.8.x.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,81 +4,6 @@ All notable changes in the **0.8.x** release series are documented here.

## [Unreleased]

### Added
- Standardize Harbor runs through a recorded working-tree wheel, a shared
SHA256-verified APT cache, and task-revision-specific dependency preflight.
Add a QEMU Alpine SSH profile and an install-only check before model spend;
preserve setup failures separately from scored results and test the workflow
contracts in CI.
- Add an opt-in Harbor `RetryingVerifier` that retries a timed-out Linux test
script up to three total attempts at the task's native timeout, reusing the
existing agent output. Preserve attempt logs, clear stale rewards, and stop
timed-out test sessions before retrying. Completed scores, including zero,
and non-timeout errors are not retried.
- Estimate model-call costs from token usage when a provider reports tokens
but no per-request cost, starting with the DeepSeek official
Anthropic-compatible endpoint. The estimate uses a static DeepSeek price
list, is marked `kind: estimated` so it stays distinct from a
provider-reported or reconciled cost, and is only used after a real
provider-reported cost is absent. DeepSeek exposes no cost or generation
endpoint, so the existing OpenRouter reconciliation cannot resolve it.
- Configure per-reply generation budgets through `--max-tokens` or
`ANTHROPIC_MAX_TOKENS`, including the user settings file and Harbor adapter.
Record the effective limit in startup output, Event Journals, and ATIF
trajectories while retaining compatibility with older journals.
- Add a wall-clock time budget to headless runs through
`--time-budget-seconds` and the Harbor adapter `time_budget_seconds` kwarg.
Tell the model how much time and how many replies remain, and start
finalization guidance when either reserve is reached (10 replies or the
larger of 180 seconds and 15% of the time budget). On POSIX main threads,
interrupt in-flight model/tool work at the deadline, constrain retry waits,
and limit subsequent cost reconciliation to 30 seconds before saving the
trajectory. Budget exhaustion has a distinct `time_budget_exhausted` outcome.
Append the reminder to the tail of the
conversation so the system prompt stays fixed and provider prefix caching
keeps working, and record each injected reminder as an `input.injected`
event projected into ATIF. Record the budget in startup output, Event
Journals, and ATIF. New Event Journals use schema v4, with v1-v3 replay still
supported.

### Fixed
- Preserve estimated-cost classification and subtotals in ATIF and Harbor
summaries, while allowing generation billing lookups to replace estimates.
- Reject unresolved QEMU task revisions selected through local paths or
datasets, accept install-only mode from JSON configuration, and preserve
archived verifier attempts when Harbor filters downloaded logs.
- Retry the Harbor adapter's system-dependency installation a bounded number
of times when the package index returns a transient HTTP 404, instead of
failing agent setup immediately. Non-404 failures and the final attempt still
propagate.
- Terminate a timed-out or interrupted bash command's process group on POSIX
and other members of its session on Linux, including GNU `timeout` children
in separate groups. Close output pipes without draining detached children
and bound direct-child reaping. Preserve background services when their
launching command finishes normally.
- Return correctable tool errors for missing or incorrectly typed arguments and
unknown tool names, allowing the model to retry within the existing turn
budget. Keep previews safe, reject incomplete argument JSON yielded by the
SDK, and preserve rejected inputs and error results in Journals and ATIF.
- Stop explicitly when a model response reaches `max_tokens`, reporting
`response_truncated` in Event Journals and ATIF trajectories instead of task
completion. Preserve partial output, usage, and cost accounting; skip tools
from the truncated reply and keep subsequent interactive requests valid.
New journals use schema v2, with v1 replay still supported.
- Recover interrupted model response streams. Retry response-body read errors,
read timeouts, and remote protocol errors up to twice (1s, 2s) before
committing a reply to history or running any of its tools, handling both the
`httpx` and `httpx2` transport families. Record each attempt as a Journal v3
`model.failed` event, project it as an incomplete ATIF step, and mark token
and cost totals as partial when usage is missing.

### Changed
- Increase the default per-reply generation limit from 8192 to 32768 tokens.
- Moved detailed CLI and configuration guidance out of the bilingual READMEs
into dedicated English and Chinese user references, keeping the READMEs
concise while documenting task input, options, exit statuses, trajectories,
Event Journals, supported settings, defaults, precedence, and empty values.

## [0.8.0] - 2026-09-04

### Added
Expand Down
81 changes: 81 additions & 0 deletions docs/changelogs/0.9.x.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Changelog — 0.9.x

All notable changes in the **0.9.x** release series are documented here.

## [Unreleased]

## [0.9.0] - 2026-10-05

### Added
- Standardize Harbor runs through a recorded working-tree wheel, a shared
SHA256-verified APT cache, and task-revision-specific dependency preflight.
Add a QEMU Alpine SSH profile and an install-only check before model spend;
preserve setup failures separately from scored results and test the workflow
contracts in CI.
- Add an opt-in Harbor `RetryingVerifier` that retries a timed-out Linux test
script up to three total attempts at the task's native timeout, reusing the
existing agent output. Preserve attempt logs, clear stale rewards, and stop
timed-out test sessions before retrying. Completed scores, including zero,
and non-timeout errors are not retried.
- Estimate model-call costs from token usage when a provider reports tokens
but no per-request cost, starting with the DeepSeek official
Anthropic-compatible endpoint. The estimate uses a static DeepSeek price
list, is marked `kind: estimated` so it stays distinct from a
provider-reported or reconciled cost, and is only used after a real
provider-reported cost is absent. DeepSeek exposes no cost or generation
endpoint, so the existing OpenRouter reconciliation cannot resolve it.
- Configure per-reply generation budgets through `--max-tokens` or
`ANTHROPIC_MAX_TOKENS`, including the user settings file and Harbor adapter.
Record the effective limit in startup output, Event Journals, and ATIF
trajectories while retaining compatibility with older journals.
- Add a wall-clock time budget to headless runs through
`--time-budget-seconds` and the Harbor adapter `time_budget_seconds` kwarg.
Tell the model how much time and how many replies remain, and start
finalization guidance when either reserve is reached (10 replies or the
larger of 180 seconds and 15% of the time budget). On POSIX main threads,
interrupt in-flight model/tool work at the deadline, constrain retry waits,
and limit subsequent cost reconciliation to 30 seconds before saving the
trajectory. Budget exhaustion has a distinct `time_budget_exhausted` outcome.
Append the reminder to the tail of the
conversation so the system prompt stays fixed and provider prefix caching
keeps working, and record each injected reminder as an `input.injected`
event projected into ATIF. Record the budget in startup output, Event
Journals, and ATIF. New Event Journals use schema v4, with v1-v3 replay still
supported.

### Fixed
- Preserve estimated-cost classification and subtotals in ATIF and Harbor
summaries, while allowing generation billing lookups to replace estimates.
- Reject unresolved QEMU task revisions selected through local paths or
datasets, accept install-only mode from JSON configuration, and preserve
archived verifier attempts when Harbor filters downloaded logs.
- Retry the Harbor adapter's system-dependency installation a bounded number
of times when the package index returns a transient HTTP 404, instead of
failing agent setup immediately. Non-404 failures and the final attempt still
propagate.
- Terminate a timed-out or interrupted bash command's process group on POSIX
and other members of its session on Linux, including GNU `timeout` children
in separate groups. Close output pipes without draining detached children
and bound direct-child reaping. Preserve background services when their
launching command finishes normally.
- Return correctable tool errors for missing or incorrectly typed arguments and
unknown tool names, allowing the model to retry within the existing turn
budget. Keep previews safe, reject incomplete argument JSON yielded by the
SDK, and preserve rejected inputs and error results in Journals and ATIF.
- Stop explicitly when a model response reaches `max_tokens`, reporting
`response_truncated` in Event Journals and ATIF trajectories instead of task
completion. Preserve partial output, usage, and cost accounting; skip tools
from the truncated reply and keep subsequent interactive requests valid.
- Recover interrupted model response streams. Retry response-body read errors,
read timeouts, and remote protocol errors up to twice (1s, 2s) before
committing a reply to history or running any of its tools, handling both the
`httpx` and `httpx2` transport families. Record each attempt as a Journal
`model.failed` event, project it as an incomplete ATIF step, and mark token
and cost totals as partial when usage is missing.

### Changed
- Increase the default per-reply generation limit from 8192 to 32768 tokens.
- Moved detailed CLI and configuration guidance out of the bilingual READMEs
into dedicated English and Chinese user references, keeping the READMEs
concise while documenting task input, options, exit statuses, trajectories,
Event Journals, supported settings, defaults, precedence, and empty values.
3 changes: 3 additions & 0 deletions docs/changelogs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ Changelogs for nanoPyCodeAgent, organized one file per `X.Y.x` release series

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/).

Current release series: [0.9.x](0.9.x.md). Previous release series:
[0.8.x](0.8.x.md).
7 changes: 6 additions & 1 deletion docs/dev_notes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ series (e.g. `0.1.x.md`).

Notes are bilingual, split by language:

- [`zh-CN/`](zh-CN/) — **hand-written Chinese source** (source of truth)
- [`zh-CN/`](zh-CN/) — **Chinese source** (source of truth)
- [`en/`](en/) — **English, generated from the Chinese source** (do not edit by hand)

These are free-form notes — insights, takeaways, and design decisions gathered
Expand All @@ -16,3 +16,8 @@ The date in a `## X.Y.Z - YYYY.MM.DD` section heading is the **release date**
of that version (the same date as the git tag and the changelog entry). While
the version is unreleased, keep the literal `YYYY.MM.DD` placeholder — it is
filled in by the release process.

Current release series: **0.9.x** ([Chinese source](zh-CN/0.9.x.md),
[English version](en/0.9.x.md)). The **0.8.x** notes retain the development
record for v0.8.0 ([Chinese source](zh-CN/0.8.x.md),
[English version](en/0.8.x.md)).
Loading
Loading