Skip to content

Promote main → prod (c9e645d) - #501

Merged
thedancingdeveloper merged 8 commits into
prodfrom
main
Sep 1, 2026
Merged

Promote main → prod (c9e645d)#501
thedancingdeveloper merged 8 commits into
prodfrom
main

Conversation

@thedancingdeveloper

Copy link
Copy Markdown
Contributor

Promotion: main → prod

This PR was opened by the promote workflow after its approval gate.

  • source:
  • target before promotion:
  • ancestry: fast-forward only
  • required source checks: ,
  • verified dev deployment receipt:

Merge only after the target branch checks and normal review policy
pass. The subsequent stage must be dispatched separately; no workflow
in this repository pushes a protected branch or deploys production as
a side effect of this PR.

thedancingdeveloper and others added 8 commits September 1, 2026 10:34
The New-session button's inline SVG carries only a viewBox, so on desktop
it fell back to the 300x150 replaced-element default and ballooned the
button, dominating the sessions header. Add a top-level `.sessions-new-icon`
sizing rule (the phone media block already restated this; the two are kept
in sync).

Fixes #489

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7eWQbHi8HyLyhaRA2piEn
History shipped the raw session log verbatim into a <pre>, so replays were
a wall of ANSI escape codes, cursor moves and spinner carriage returns
instead of readable output. Add `toReadableTranscript` (strips OSC/CSI and
short escapes, resolves in-place CR/backspace redraws to their final frame,
drops stray control bytes) and route both live and archived replays through
it. Update the replay note copy and its assertion.

Fixes #490

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7eWQbHi8HyLyhaRA2piEn
…raming

Prepare the public tree as an open-source project that documents only its
current state:

- Move completed design/workplan records (COMPARE, DEMO_SITE_PLAN,
  FORGE_FRONTEND_DESIGN, IMPORT-PLAYBOOK, VOICE_POC, VOICE_DELIVERY, the
  M0-M14 ROADMAP) out of the tree; they survive in the operator's
  git-ignored docs/local/. ROADMAP.md is rewritten as a short current-state
  roadmap (designed-but-unbuilt, pending cleanup, deliberate deferrals).
- Remove opensource.md. With no released users there is no compatibility
  contract to publish; the legacy MYDEVENV2_* names become pending
  housekeeping (ROADMAP.md) instead of documented aliases, and CONTRIBUTING
  now forbids adding new ones.
- Trim delivery narration from DESIGN.md, SCHEMA.md, ENGINE.md,
  USER_GUIDE.md, CUSTOMISATION.md and DEPLOYMENT.md: revision/date
  preambles, milestone (M-number) and revision (r-number) references, the
  stale buildless-GUI layer entry, and the dated open-questions log (now
  "Standing decisions").
- Scrub *.sprooty.com and other estate hostnames from tracked files
  (ci.yml comment, capacitor.config.ts, smoke_merged_stack.sh usage,
  identity.py docstring, test_connect.py fixtures); the
  test_public_delivery.py denylist keeps enforcing the rule.
- Drop scripts/pin_estate_image.py (orphaned; its consumer lives in the
  private ops repository) and its test.
- Add AI_POLICY.md: this stack is written by AI agents for AI-forward
  developers, and what that means for use, contribution and maintenance.

Verified: uv run pytest (1296 passed, 25 skipped), mypy, ruff,
scripts/check_docs.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0161etTkUPyRoUXnHQ8xgKUu
…n sweep (#491)

Make session history cover live sessions and stop it growing unbounded:

- `GET /api/history/search` gains `include_live` (default true): on top of the
  archived FTS hits, each running session's scrollback is scanned on-demand
  (last `history_live_scan_bytes`, ANSI-stripped, same AND-of-terms match) and
  appended with `live: true`. Zero DB writes; the combined list is held to
  `limit`. `SearchResult` gains a `live` flag (archived rows default false).
- `GET /api/history/{id}/log` gains `strip_ansi` (default false) so an agent
  can read plain text; the byte counters still describe the raw tail window.
- `history_retention_days` config (default 30, 0 = forever) + a daily
  retention sweeper mirroring the assistant-log sweeper, bounding both
  `history.db` and `session-logs/`. `history_live_scan_bytes` (default 256 KiB)
  tunes the live scan.

Tests: pure unit tests for the live-scan helpers (query_tokens, live_match,
truncate_chars) + integration tests for live-before-exit search and strip_ansi.
Docs: ENGINE.md config table and history API section.

Refs #491

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7eWQbHi8HyLyhaRA2piEn
…, list (#491)

Agents could not reach any session history: the engine adapter is metadata-only
and there were no history read ops. Add three, generated onto MCP/CLI/REST from
the registry (scope=read, no reason):

- session.search_output (mcp session_search_output, cli `session search`) —
  full-text over session output, live sessions included by default; each hit
  carries `live`.
- session.log_tail (`session log`) — the tail of one session's output log,
  ANSI-stripped by default; works for live sessions too.
- session.history_list (`session history`) — the archived-session listing.

Static GET paths with the id as a query field (the house convention — the
registry has no path params). Each result carries the FR-E9 `engine` field:
no engine, or an unreachable one, sets it and returns an empty view rather than
an error that reads as "no history". Engine client gains history_sessions /
search_history / history_log plus their dataclasses; the "six things" narrative
becomes nine.

Tests: parity SCRIPT + stand-in engine history routes (CLI/REST/MCP agree);
unit tests for mapping, query-param forwarding, missing-log, and the
no-engine / dead-engine degrade paths. Docs: AGENT_GUIDE history-search section.

Refs #491

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7eWQbHi8HyLyhaRA2piEn
… hits (#491)

History search was archive-only, so a running session's output could not be
found even though its rows already appear in the list (#477). Pass
`include_live=true` to the search endpoint, add the `live` flag to
`HistorySearchResult`, badge a live hit "Live" in the results, and retire the
"not yet in the search index" caveat — it now says running sessions are
searched too. Pin the result date hard-right so the badge groups with the name.

Tests: a live hit badges and the search carries include_live=true; the caveat
assertion updated.

Refs #491

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7eWQbHi8HyLyhaRA2piEn
Push runs to dev/main/prod previously kept one CI and one build run per
commit, because cancelling was unsafe: ci.yml classified a push by
before..sha, so a cancelled run's files were checked by nothing, ever (two
escapes reached dev that way), and a cancelled build left no sha- image.

Make cancellation safe instead of avoiding it: a push now classifies as a
change to everything, so a replacing run fully covers a superseded one, and
ci.yml, build.yml and codeql.yml switch to newest-wins per ref
(cancel-in-progress: true). The ref stays in every group so dev/main/prod —
the same commit after a fast-forward release — never evict each other, and
PRs group by their own merge ref. e2e.yml keeps queueing: two stacks would
race the same loopback port.

The cost accepted: a docs-only push now runs the full matrix (docs.yml
remains the cheap path-filtered gate), and only the newest commit of a merge
burst gets images — which is the commit anything would deploy.

tests/test_deploy.py pins the pairing: newest-wins keying and
classify-everything-on-push must move together.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0161etTkUPyRoUXnHQ8xgKUu
Bump the canonical product version 0.3.1 -> 0.4.0 across the gated manifests
(pyproject, src/vogt/__init__.py, web + mobile package.json,
build.yml VOGT_PRODUCT_VERSION), the CI version gate, deploy manifests,
docs image-tag references, uv.lock, and the version contract test.

Add the 0.4.0 CHANGELOG entry: session history searchable by agents via
MCP/API/GUI + retention (#491), readable history replay (#490), New-session
button size (#489), terminal lag/flood recovery (#466), promotion CI on the
REST API (#460), and the voice-sidecar security bump (#459); plus the
open-source public-tree preparation.

check_product_version.py 0.4.0 passes; test_product_version green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7eWQbHi8HyLyhaRA2piEn
@thedancingdeveloper
thedancingdeveloper merged commit 874f55f into prod Sep 1, 2026
33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant