Goal conversion, category dialog, cycle band — and the celilo_contract 2.0 migration #73

Closed
forgejo-admin wants to merge 3 commits from fix-e2e-seed-unique into main

Long-running branch, now 348 commits ahead of main. Opening it so the work is reviewable rather than sitting in a dirty tree.

Two distinct things in here

1. Feature work (peba's). Goal conversion (goal-conversion.ts, goals.ts, appRouter.ts, updateTasks.ts), AddCategoryDialog → CategoryDialog, a new FuelGauge, GoalBar and LunarCycleProgressBand rework, cycle-dates helpers, useLunarPhase changes, new e2e specs for category-edit and goal-conversion, new unit tests for cycle-band and goal-conversion, plus openspec slice-driven schemas and the .beads / .pi agent wiring.

2. celilo_contract 2.0 migration — this one needs a careful read.

celilo-mgr runs CLI 5.1.0, which retired celilo_contract 1.0, so this module is currently undeployable: any deploy fails at on_install with Unsupported celilo_contract version '1.0'. Supported: 2.0.

The bump was not safe on its own. on_install minted an authentik API token and returned it for celilo to persist as the module secret smoketest_bot_token. Contract 2.0 retires exactly that channel — the value is persisted nowhere and the deploy still reports success. A blanket bump would have shipped precisely the silent loss the retirement exists to surface.

The correct port here was deletion, not secrets.set:

  • nothing reads the secret — health-check.ts, smoke-handler.ts and scripts/smoke/authentik-token.ts each document why an authentik API token cannot drive the smoke path, which authenticates by OIDC login
  • the name was never declared in the manifest, so there was nothing to persist it against

The mint and its log line are kept; removing those is a behavioural change beyond this migration.

The test now asserts the hook returns {}, and that assertion is proven to fail: re-introducing the assignment turns 11 pass into 10 pass / 1 fail.

Gates on the module: typecheck:hooks 0, test:hooks 69 pass / 0 fail, lint 0.

Not included

.beads.gate.lock is left uncommitted — it is a transient lock, not source.

After merge

manifest.yml is at 1.4.3 with contract 2.0. Publishing needs a site build, because site/dist is gitignored and the module ships its built site — which is also why lunacycle currently reads ERROR on the fleet (no built site at /var/celilo/modules/lunacycle/site/dist).

Part of the fleet-wide migration: celilo#1419, bead ce-h2w0.

Long-running branch, now 348 commits ahead of `main`. Opening it so the work is reviewable rather than sitting in a dirty tree. ## Two distinct things in here **1. Feature work (peba's).** Goal conversion (`goal-conversion.ts`, `goals.ts`, `appRouter.ts`, `updateTasks.ts`), `AddCategoryDialog` → `CategoryDialog`, a new `FuelGauge`, `GoalBar` and `LunarCycleProgressBand` rework, `cycle-dates` helpers, `useLunarPhase` changes, new e2e specs for category-edit and goal-conversion, new unit tests for cycle-band and goal-conversion, plus openspec slice-driven schemas and the `.beads` / `.pi` agent wiring. **2. `celilo_contract` 2.0 migration — this one needs a careful read.** celilo-mgr runs CLI 5.1.0, which retired `celilo_contract` 1.0, so this module is currently **undeployable**: any deploy fails at `on_install` with `Unsupported celilo_contract version '1.0'. Supported: 2.0`. The bump was **not** safe on its own. `on_install` minted an authentik API token and **returned it** for celilo to persist as the module secret `smoketest_bot_token`. Contract 2.0 retires exactly that channel — the value is persisted nowhere and the deploy still reports success. A blanket bump would have shipped precisely the silent loss the retirement exists to surface. The correct port here was **deletion, not `secrets.set`**: - nothing reads the secret — `health-check.ts`, `smoke-handler.ts` and `scripts/smoke/authentik-token.ts` each document why an authentik API token cannot drive the smoke path, which authenticates by OIDC login - the name was never declared in the manifest, so there was nothing to persist it against The mint and its log line are kept; removing those is a behavioural change beyond this migration. The test now asserts the hook returns `{}`, and that assertion is **proven to fail**: re-introducing the assignment turns 11 pass into 10 pass / 1 fail. Gates on the module: `typecheck:hooks` 0, `test:hooks` 69 pass / 0 fail, `lint` 0. ## Not included `.beads.gate.lock` is left uncommitted — it is a transient lock, not source. ## After merge `manifest.yml` is at 1.4.3 with contract 2.0. Publishing needs a site build, because `site/dist` is gitignored and the module ships its built site — which is also why lunacycle currently reads ERROR on the fleet (`no built site at /var/celilo/modules/lunacycle/site/dist`). Part of the fleet-wide migration: celilo#1419, bead `ce-h2w0`.
celilo-mgr runs CLI 5.1.0, which retired celilo_contract 1.0, so this module
was undeployable: any deploy failed at on_install with 'Unsupported
celilo_contract version 1.0. Supported: 2.0'.

The bump was NOT safe on its own. on_install minted an authentik API token and
returned it as a hook output, relying on celilo to persist it as the module
secret `smoketest_bot_token`. Contract 2.0 retires exactly that channel: the
value is persisted nowhere and the deploy still reports success, which is the
silent loss the retirement exists to surface.

The correct port here is deletion, not `secrets.set`. Nothing reads the
secret: health-check.ts, smoke-handler.ts and scripts/smoke/authentik-token.ts
each document why an authentik API token cannot drive the smoke path, which
authenticates by OIDC login instead. The name was never declared in the
manifest either, so there was nothing to persist it against.

The mint and its log line are kept — they provision the bot in authentik, and
removing that is a behavioural change beyond this migration.

The test asserts the hook returns {}. Verified it can fail: re-introducing the
assignment turns 11 pass into 10 pass / 1 fail.

Gates: typecheck:hooks 0, test:hooks 69 pass / 0 fail, lint 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat: goal conversion, category dialog, cycle band, and the celilo/agent wiring
Some checks failed
pr-validate / validate (pull_request) Failing after 51s
775951bcbc
Work in progress on fix-e2e-seed-unique, committed so it can be reviewed as a
PR rather than living in a dirty tree.

Server: goal-conversion.ts plus goals/appRouter/updateTasks changes.
Web: AddCategoryDialog becomes CategoryDialog, new FuelGauge, CategorySection
and Template updates, GoalBar and LunarCycleProgressBand rework, cycle-dates
helpers, useLunarPhase changes.
Shared: lunarPhase changes.
Tests: new e2e specs for category-edit and goal-conversion, new unit tests for
cycle-band and goal-conversion, plus updates across the existing e2e and unit
suites.
Tooling: openspec slice-driven schemas and templates, AGENTS.md, .beads
identity and the .pi gc-hooks extension, with .gitignore updated to keep the
rest of the beads/dolt state out.

Committed by crew-builder at peba's request; the design and code are peba's.
`.beads.gate.lock` deliberately left uncommitted — it is a transient lock.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chore: add the changeset for the goal-conversion work
All checks were successful
pr-validate / validate (pull_request) Successful in 42s
680e4504c2
lunacycle is version_source: changeset, so a PR that changes shipped app
behaviour needs one — the release workflow stamps manifest.yml#version from
it. Keyed by module id per .changeset/README.md, not the bunx changeset CLI.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Owner

Closing as superseded. The feature code (goal conversion, CategoryDialog, FuelGauge, cycle band) is already on main via 690074b, and the celilo_contract 2.0 migration landed in #74. The only branch-unique content is agent wiring (.beads, .pi, AGENTS.md, CLAUDE.md additions), which can go in a small PR from main if wanted.

Closing as superseded. The feature code (goal conversion, CategoryDialog, FuelGauge, cycle band) is already on `main` via `690074b`, and the celilo_contract 2.0 migration landed in #74. The only branch-unique content is agent wiring (`.beads`, `.pi`, `AGENTS.md`, `CLAUDE.md` additions), which can go in a small PR from `main` if wanted.
forgejo-admin closed this pull request 2026-09-27 07:31:56 +00:00
All checks were successful
pr-validate / validate (pull_request) Successful in 42s

Pull request closed

Sign in to join this conversation.
No description provided.