diff --git a/README.md b/README.md index bc16dcb..95d466b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

- Version + Version Python License PyPI @@ -23,11 +23,11 @@ ## AI Cost Tracking -![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.1.290-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green) -![AI Cost](https://img.shields.io/badge/AI%20Cost-$8.75-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-141.7h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fx--ai%2Fgrok--code--fast--1-lightgrey) +![PyPI](https://img.shields.io/badge/pypi-costs-blue) ![Version](https://img.shields.io/badge/version-2.1.291-blue) ![Python](https://img.shields.io/badge/python-3.9+-blue) ![License](https://img.shields.io/badge/license-Apache--2.0-green) +![AI Cost](https://img.shields.io/badge/AI%20Cost-$1.26-orange) ![Human Time](https://img.shields.io/badge/Human%20Time-142.9h-blue) ![Model](https://img.shields.io/badge/Model-openrouter%2Fx--ai%2Fgrok--code--fast--1-lightgrey) -- 🤖 **LLM usage:** $8.7470 (397 commits) -- 👤 **Human dev:** ~$14166 (141.7h @ $100/h, 30min dedup) +- 🤖 **LLM usage:** $1.2644 (406 commits) +- 👤 **Human dev:** ~$14287 (142.9h @ $100/h, 30min dedup) Generated on 2026-08-10 using [openrouter/x-ai/grok-code-fast-1](https://openrouter.ai/x-ai/grok-code-fast-1) diff --git a/TODO.md b/TODO.md index 99c0bcd..3bcce70 100644 --- a/TODO.md +++ b/TODO.md @@ -55,6 +55,9 @@ version transition after a stale tag so post-publication metadata delivery does not select a duplicate patch. State: `DONE / PUBLICATION`; classification: `BUG / application`. +- [ ] Deliver [ticket-019](project/ticket-019/README.md): publish the merged + boundary repair as Goal 2.1.291 and verify a fresh public-index install. + State: `IN_PROGRESS / EDIT`; classification: `SERVICE / integration`. - [ ] After governance bootstrap, execute the sequential phases defined in [the refactoring plan](docs/GOAL_KORU_SUBACTOR_REFACTORING_PLAN.md), with one narrowly scoped ticket active at a time. @@ -62,9 +65,10 @@ > Current workflow state: `ticket-001 DONE`; `ticket-002 DONE`; > `ticket-003 DONE`; `ticket-004 DONE`; `ticket-005 DONE`; > `ticket-006 DONE`; `ticket-007 DONE`; `ticket-009 DONE`. -> `ticket-010 DONE`; `ticket-011 DONE`; `ticket-012 IN_PROGRESS`; +> `ticket-010 DONE`; `ticket-011 DONE`; `ticket-012 DONE`; > `ticket-013 DONE`; `ticket-014 CANCELLED`; `ticket-015 DONE`; -> `ticket-016 DONE`; `ticket-017 DONE`; `ticket-018 DONE`. +> `ticket-016 DONE`; `ticket-017 DONE`; `ticket-018 DONE`; +> `ticket-019 IN_PROGRESS`. > **Recently shipped (manual note):** `goal all [PATHS...]` monorepo sweep — > runs `goal -a` in every git repo with uncommitted changes under the given diff --git a/VERSION b/VERSION index 713c4e6..b6d69f4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.290 +2.1.291 diff --git a/goal/__init__.py b/goal/__init__.py index 1916637..96a0067 100644 --- a/goal/__init__.py +++ b/goal/__init__.py @@ -1,3 +1,3 @@ """Goal - Automated git push with smart commit messages, changelog updates, and version tagging.""" -__version__ = "2.1.290" +__version__ = "2.1.291" diff --git a/project/TICKETS.md b/project/TICKETS.md index b72f99c..3078806 100644 --- a/project/TICKETS.md +++ b/project/TICKETS.md @@ -24,4 +24,5 @@ This file indexes governance tickets without taking ownership of | **ticket-016** | [`README.md`](./ticket-016/README.md) | [`preprompt.md`](./ticket-016/preprompt.md) | - | [`ai-codex.md`](./ticket-016/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-016/ai-codex-logs.txt) | [`changelog.md`](./ticket-016/changelog.md) | | **ticket-017** | [`README.md`](./ticket-017/README.md) | [`preprompt.md`](./ticket-017/preprompt.md) | - | [`ai-codex.md`](./ticket-017/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-017/ai-codex-logs.txt) | [`changelog.md`](./ticket-017/changelog.md) | | **ticket-018** | [`README.md`](./ticket-018/README.md) | [`preprompt.md`](./ticket-018/preprompt.md) | - | [`ai-codex.md`](./ticket-018/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-018/ai-codex-logs.txt) | [`changelog.md`](./ticket-018/changelog.md) | +| **ticket-019** | [`README.md`](./ticket-019/README.md) | [`preprompt.md`](./ticket-019/preprompt.md) | - | [`ai-codex.md`](./ticket-019/ai-codex.md) | [`ai-codex-logs.txt`](./ticket-019/ai-codex-logs.txt) | [`changelog.md`](./ticket-019/changelog.md) | diff --git a/project/ticket-019/README.md b/project/ticket-019/README.md new file mode 100644 index 0000000..cc2afcd --- /dev/null +++ b/project/ticket-019/README.md @@ -0,0 +1,60 @@ +# Ticket 019: Publish Goal 2.1.291 + +- **ID**: ticket-019 +- **Owner**: unresolved:human +- **Status**: IN_PROGRESS +- **Workflow state**: EDIT +- **Created**: 2026-08-10 +- **Work classification**: `SERVICE / integration` + +## Goal and scope + +Publish the ticket-018 post-release boundary repair as Goal 2.1.291. The +release must use Goal's evidence-based version decision, synchronize every +managed version carrier and derived lock/readme metadata, pass the complete +test and build gates, merge through exact-head validation, and be installed +from the public PyPI index before it is considered complete. + +## Acceptance criteria + +- [x] AC-01: `goal check-versions` selects `normal-bump -> 2.1.291` from the + PyPI 2.1.290 baseline and the committed ticket-018 package source. +- [x] AC-02: `VERSION`, `pyproject.toml`, `goal/__init__.py`, `uv.lock`, and + `README.md` consistently describe 2.1.291. +- [x] AC-03: The full Python suite and package build pass from the synchronized + release tree. +- [ ] AC-04: The release PR passes Python 3.12/3.13 CI and exact-head validator + approval before merge. +- [ ] AC-05: Goal 2.1.291 is visible on PyPI and imports as 2.1.291 in a fresh + environment installed only from the public index. + +## Session authorization + +The user explicitly requested autonomous continuation, testing, publication, +dependency refresh and downstream Goal updates. This bounded release executes +that authorization without another confirmation. Registry credentials remain +environment-owned and are used only by the governed publish command. + +## Boundary + +Only atomic release metadata, build evidence, this ticket and the ticket index +may change. No application source, runtime dependency constraint, governance +policy, GitHub workflow or downstream dirty repository is modified here. + +## Validation evidence + +- Initial decision: `normal-bump -> 2.1.291` from the PyPI 2.1.290 baseline. +- Post-sync decision: `already-bumped -> 2.1.291`; all three managed carriers + are on target and `uv.lock`/`README.md` are synchronized. +- Full Python suite: `510 passed, 2 skipped`. +- Build produced `goal-2.1.291-py3-none-any.whl` and + `goal-2.1.291.tar.gz`. +- Governance limits an S delivery to five implementation files, so generated + release notes were removed from this atomic version-carrier slice. A + dependent publication-evidence slice will add the changelog after PyPI + verification; version, manifest, lock and badge metadata stay indivisible. + +## Participants + +- Human participant: unresolved; no user-* file was created. +- Agent participant: [ai-codex.md](ai-codex.md) diff --git a/project/ticket-019/ai-codex-logs.txt b/project/ticket-019/ai-codex-logs.txt new file mode 100644 index 0000000..e6e64bc --- /dev/null +++ b/project/ticket-019/ai-codex-logs.txt @@ -0,0 +1,10 @@ +- 2026-08-10: Started the bounded Goal 2.1.291 release ticket on accepted base + `c8ac6ef28e0e491b305b9d4f0d129116823c4100` under the user's autonomous + test and publication authorization. +- 2026-08-10: Goal selected normal-bump 2.1.290 -> 2.1.291; post-sync + validation selected already-bumped -> 2.1.291. +- 2026-08-10: Full suite passed (510 passed, 2 skipped); Python build produced + the 2.1.291 wheel and sdist. +- 2026-08-10: Governance rejected six implementation files under S and the + schema disallowed M. Removed only generated top-level release notes from this + slice; a dependent post-publication evidence slice will own that metadata. diff --git a/project/ticket-019/ai-codex.md b/project/ticket-019/ai-codex.md new file mode 100644 index 0000000..315f04f --- /dev/null +++ b/project/ticket-019/ai-codex.md @@ -0,0 +1,25 @@ +--- +participant-id: agent:codex +participant: codex +role: agent +ticket: ticket-019 +--- +# Participant: codex (AI agent) + +## Understanding + +Ticket-018 is merged and PyPI still exposes 2.1.290. Goal now correctly sees +the two post-transition package-source files and selects one patch release. + +## Execution plan + +1. Record the version decision and synchronize the 2.1.291 release carriers. +2. Run the full suite, build wheel/sdist, and pass fresh-base governance. +3. Deliver through a PR with Python 3.12/3.13 CI and exact-head validation. +4. Publish from clean merged main and verify a fresh public-index install. + +## Blockers + +- None inside the recorded intent; proceed autonomously. +- A registry or immutable-version conflict aborts publication rather than + replacing an existing artifact. diff --git a/project/ticket-019/changelog.md b/project/ticket-019/changelog.md new file mode 100644 index 0000000..d935638 --- /dev/null +++ b/project/ticket-019/changelog.md @@ -0,0 +1,13 @@ +# Ticket Changelog (ticket-019) + +## [0.1.0] - 2026-08-10 + +- Initialized the bounded release ticket after ticket-018 application and + closure PRs passed protected delivery. +- No human participant identity or content was generated. +- Goal selected `normal-bump -> 2.1.291` from the public 2.1.290 baseline and + synchronized every approved release carrier. +- Full tests passed (510 passed, 2 skipped); wheel and sdist builds succeeded. +- Kept the release at the accepted S limit by moving generated release notes + to a dependent publication-evidence slice; the five synchronized + version/manifest/lock/badge files remain atomic. diff --git a/project/ticket-019/intent.json b/project/ticket-019/intent.json new file mode 100644 index 0000000..af67ea6 --- /dev/null +++ b/project/ticket-019/intent.json @@ -0,0 +1,106 @@ +{ + "schema": "new-project.intent/v3", + "ticket": "ticket-019", + "summary": "Publish Goal 2.1.291", + "workstream": "integration", + "classification": { + "kind": "SERVICE", + "priority": "P1", + "origin": "requested" + }, + "allowedPaths": [ + "VERSION", + "README.md", + "pyproject.toml", + "uv.lock", + "goal/__init__.py", + "project/ticket-019/**", + "project/TICKETS.md", + "TODO.md" + ], + "forbiddenPaths": ["project/ticket-*/user-*.md"], + "stacks": ["python"], + "dependsOn": ["ticket-018"], + "conflictsWith": [], + "integrationTicket": null, + "delivery": { + "acceptedBaseSha": "c8ac6ef28e0e491b305b9d4f0d129116823c4100", + "targetBranch": "main", + "outcome": "Goal 2.1.291 is atomically versioned, protected, published and verified from the public registry", + "nonGoals": [ + "No application source changes", + "No dependency constraint changes", + "No governance or CI policy changes", + "No writes to dirty downstream repositories" + ], + "complexity": "S", + "estimatedMinutes": 30, + "budgets": { + "maxImplementationFiles": 5, + "maxAffectedComponents": 1, + "maxPublicInterfaceChanges": 0, + "maxRuntimeDependencies": 0 + }, + "architecture": { + "status": "accepted", + "decision": "Apply Goal's normal patch decision as one synchronized release transition, protect it through exact-head PR validation, then publish only from clean main", + "components": [ + { + "name": "release-metadata", + "paths": [ + "VERSION", + "README.md", + "pyproject.toml", + "uv.lock", + "goal/__init__.py" + ] + } + ], + "responsibilityChanges": false, + "interfaceChanges": [], + "dataChanges": [], + "ui": { + "impact": "none", + "states": [], + "evidence": [] + }, + "rollback": "Do not publish or merge the release when version, build, CI or exact-head evidence disagrees" + }, + "runtimeDependencies": [], + "validation": [ + { + "criterion": "AC-01", + "commands": [".venv/bin/goal check-versions"], + "evidence": "Decision is normal-bump from PyPI 2.1.290 to 2.1.291" + }, + { + "criterion": "AC-02", + "commands": [".venv/bin/goal check-versions"], + "evidence": "All managed carriers and derived files agree on 2.1.291" + }, + { + "criterion": "AC-03", + "commands": [ + ".venv/bin/python -m pytest tests -q", + ".venv/bin/python -m build" + ], + "evidence": "Complete suite and wheel/sdist build pass" + }, + { + "criterion": "AC-04", + "commands": [ + "./project/governance-check.sh --base c8ac6ef28e0e491b305b9d4f0d129116823c4100" + ], + "evidence": "Governance, target CI and external exact-head validation pass" + }, + { + "criterion": "AC-05", + "commands": [ + "python -m pip install --index-url https://pypi.org/simple goal==2.1.291", + "goal --version" + ], + "evidence": "Fresh public-index installation reports Goal 2.1.291" + } + ] + } +} diff --git a/project/ticket-019/preprompt.md b/project/ticket-019/preprompt.md new file mode 100644 index 0000000..1bdaa5d --- /dev/null +++ b/project/ticket-019/preprompt.md @@ -0,0 +1,9 @@ +# Preprompt: ticket-019 + +Publish the already merged ticket-018 package-source repair as Goal 2.1.291. +Use the version baseline and committed-source evidence reported by Goal. Keep +all release carriers synchronized, validate the exact PR head externally, and +publish only after the protected merge reaches a clean `main` checkout. + +Do not change application source, dependencies, governance, CI, or downstream +repositories. Do not create a human participant file or infer human identity. diff --git a/pyproject.toml b/pyproject.toml index 4862be1..d183c41 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "goal" -version = "2.1.290" +version = "2.1.291" description = "Goal - Automated git push with enterprise-grade commit intelligence, smart conventional commit generation based on deep code analysis, and interactive release workflow management." readme = "README.md" authors = [ diff --git a/uv.lock b/uv.lock index 42aae0a..692c74e 100644 --- a/uv.lock +++ b/uv.lock @@ -771,7 +771,7 @@ wheels = [ [[package]] name = "goal" -version = "2.1.290" +version = "2.1.291" source = { editable = "." } dependencies = [ { name = "click" },