Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
178a93b
test: prune dead-subject tests and give the unit suite a shape
hugocool Sep 8, 2026
9da72cb
test: fold the one- and two-test fragments into their subjects
hugocool Sep 8, 2026
962a21e
docs(tests): file the ticket for bringing test docs in line with the …
hugocool Sep 8, 2026
aa850b0
docs(tests): bring the test docs in line with the September prune
hugocool Sep 8, 2026
923fbc2
docs(tests): correct two claims in the README
hugocool Sep 8, 2026
f9ad03d
docs(specs): test-suite composability -- retire the legacy agent, the…
hugocool Sep 8, 2026
0b80fe8
docs(specs): revise the composability design on five spike results
hugocool Sep 8, 2026
31e88b5
docs(plans): retire the legacy timeboxing agent -- nine tasks, sends …
hugocool Sep 9, 2026
6ba482f
test(slack): no path may address timeboxing_agent on the runtime
hugocool Sep 9, 2026
c54d91a
fix(slack): a timeboxing handoff never reaches the AutoGen runtime
hugocool Sep 9, 2026
d179931
fix(slack): a timeboxing handoff never reaches the AutoGen runtime
hugocool Sep 9, 2026
98b8492
feat(slack): a legacy card button says the flow is retired
hugocool Sep 9, 2026
42d9eb2
feat(timeboxing): a planner that keeps asking for another turn is sto…
hugocool Sep 9, 2026
67489cd
refactor: retire TimeboxingFlowAgent and the 34 modules only it reached
hugocool Sep 9, 2026
2d7f3a1
test: rewire the two live tests that borrowed a helper from retired code
hugocool Sep 9, 2026
8efbfbf
fix: coverage-diff root is required, adapters.calendar.models is dead…
hugocool Sep 9, 2026
6f93212
refactor(slack): drop the constraint store only the legacy agent wrote
hugocool Sep 9, 2026
68604d5
test: a test reaches its subject honestly, or the allowlist says why
hugocool Sep 9, 2026
c38bf3f
docs: the timeboxing README/AGENTS/root docs stop describing deleted …
hugocool Sep 9, 2026
99fb7db
docs: record the legacy-agent retirement and its two spec deviations
hugocool Sep 9, 2026
e508bde
fix: the last three legacy buttons, four false doc claims, and the ho…
hugocool Sep 9, 2026
155cf43
Merge pull request #444 from hugocool:chore/retire-legacy-timeboxing-…
hugolytics Sep 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -253,3 +253,6 @@ data/memory.db*
# demo stack supervisor: pids, git sha and source fingerprints of the
# processes this checkout started. Machine-local by definition.
.demo/

# written beside taxonomy.py when scripts/dev/tests runs; machine-local
scripts/dev/tests/per_test.json
14 changes: 14 additions & 0 deletions CALENDAR_QUERY_LOCATIONS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Google Calendar MCP Query Locations - Complete Inventory

> **Superseded (2026-09).** This document calls `CalendarHaunter`
> (`src/fateforger/agents/admonisher/calendar.py`) production. Nothing has
> constructed it since haunting moved to `fateforger/haunt/` — see
> `src/fateforger/haunt/README.md` for the current reminder/reconciliation
> orchestration and `src/fateforger/haunt/reconcile.py` for the calendar
> access it uses instead. `admonisher/base.py` and `admonisher/calendar.py`
> have no caller in `src/` or `scripts/`; their tests were removed in the
> 2026-09 test-suite prune (`tests/README.md`, "What's out of `tests/unit/`").
> `McpCalendarClient` (`fateforger.agents.timeboxing.mcp_clients`) is also
> gone now — it left with the legacy timeboxing agent on 2026-09-09;
> `src/tmbx/calendar/` (`port.py`, `gcal.py`, `fake.py`) is the calendar port
> on the surviving path. Everything below is left as written, as a record of
> what was true then — it is not a guide to the current architecture.

## 🎯 Summary

You have Google Calendar MCP integration in **3 locations**, with the **CalendarHaunter** being the most mature production-ready implementation.
Expand Down
14 changes: 14 additions & 0 deletions MIGRATION_ARCHIVE_TO_CALENDAR_HAUNTER.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Migration Guide: Archive to CalendarHaunter

> **Superseded (2026-09).** This guide recommends migrating *to*
> `CalendarHaunter` (`src/fateforger/agents/admonisher/calendar.py`).
> `CalendarHaunter` is itself dead: nothing has constructed it since
> haunting moved to `fateforger/haunt/`. Migrate to that package instead —
> `src/fateforger/haunt/reconcile.py` and `src/fateforger/haunt/service.py`
> are where calendar reconciliation and reminder orchestration live now. The
> `CalendarHaunter` tests were removed in the 2026-09 test-suite prune
> (`tests/README.md`, "What's out of `tests/unit/`"). `McpCalendarClient`
> (`fateforger.agents.timeboxing.mcp_clients`) is also gone now — it left
> with the legacy timeboxing agent on 2026-09-09; `src/tmbx/calendar/`
> (`port.py`, `gcal.py`, `fake.py`) is the calendar port on the surviving
> path. Everything below is left as written, as a record of what was true
> then.

If you have code using the old `CalendarMcpClient` from the archive, here's how to migrate to the mature `CalendarHaunter` implementation.

---
Expand Down
91 changes: 40 additions & 51 deletions docs/architecture/agents.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,66 +2,55 @@
title: Agents
---

## TimeboxingFlowAgent
> **Retired (2026-09-09).** `TimeboxingFlowAgent` (`agents/timeboxing/agent.py`),
> `ConstraintRetriever` (`agents/timeboxing/constraint_retriever.py`), and the
> Notion-backed `ConstraintExtractorAgent` are deleted with the coordinator
> that owned them — `refactor: retire TimeboxingFlowAgent and the 34 modules
> only it reached` (commit `67489cd`). The sections below described those
> three; see `docs/indices/agents_timeboxing.md` for the file-by-file
> retirement note. What follows is the three components that actually plan
> and write a day now.

## Adaptive timeboxing kernel

Artifact-led planning-session orchestration: the Stage 1 elicitation loop
(coverage matrix, arithmetic gate, three judges) plus the newer
artifact-led session state (`session_contracts.py`, `readiness.py`,
`required_blocks.py`, `day_frame.py`, `feedback.py`). The kernel decides
what a planning turn does but takes timezone, calendar, and constraint-store
access as ports; it is driven from the Slack host, which supplies those
ports and does the actual Slack routing.

Primary day-planning agent that runs the GraphFlow timeboxing workflow and coordinates:
- Stage-gated planning for day schedule drafts (typed JSON contexts per stage)
- Patch-based refinement (`TimeboxPatcher`)
- Constraint extraction + persistence (background, non-blocking)

Code: `src/fateforger/agents/timeboxing/agent.py`
Code:
- `src/fateforger/agents/timeboxing/adaptive_timeboxing.py`
- `src/fateforger/slack_bot/timeboxing_host.py` (the host that supplies the kernel's ports and calls it per Stage 1 turn)

Related docs:

- `docs/indices/agents_timeboxing.md`
- `docs/architecture/timeboxing_refactor.md`
- `docs/architecture/constraint-flow.md`
- `docs/architecture/proposal_object_contract.md`
- `docs/superpowers/specs/2026-09-05-stage1-elicitation-loop-design.md`

## ConstraintExtractorAgent (Notion-backed)
## Harness planner (DeepSeek)

Extractor agent that turns user preference corrections into a deterministic constraint record and
upserts it into Notion for durable future reuse.

- Output schema: `ConstraintExtractionOutput` (JSON, structured)
- Persistence: `NotionConstraintStore.upsert_constraint(...)` + `TB Constraint Events` audit log
- Timeboxing agents can call the tool `extract_and_upsert_constraint` (Agent-as-Tool under the hood).
- Notion access is via the constraint-memory MCP server (`scripts/constraint_mcp_server.py`).
Host-owned context boundary for adaptive planning turns: refreshes the
constraint and calendar read models for the locked day and hands one
complete brief to a fresh harness run. Reads durable constraints via
`kg_constraint_client.py`, the read-only client onto the standalone memory
server's own store (`data/memory.db`), speaking the `DurableConstraintStore`
protocol `durable_constraint_store.py` defines.

Code:
- `src/fateforger/agents/timeboxing/notion_constraint_extractor.py`
- `src/fateforger/adapters/notion/timeboxing_preferences.py`

## ConstraintRetriever
- `src/fateforger/slack_bot/deepseek_timebox_planner.py`
- `src/fateforger/agents/timeboxing/kg_constraint_client.py`
- `src/fateforger/agents/timeboxing/durable_constraint_store.py`

Gap-driven retriever for durable constraints that:
- derives a small query plan from stage + day context (gaps/blocks/immovables)
- uses `constraint_query_types` to select relevant `type_id`s
- then queries constraints via `constraint_query_constraints` with those `type_id`s
## tmbx server (calendar writes)

Code:
- `src/fateforger/agents/timeboxing/constraint_retriever.py`
- `src/fateforger/agents/timeboxing/mcp_clients.py`
- `src/fateforger/agents/timeboxing/agent.py`
MCP server exposing the level 1 timebox tools (`plan_read`, `plan_apply`,
`plan_commit`, `plan_undo`, `plan_history`) that read and write the day's
Google Calendar events. A write path can refuse (reported as a normal JSON
result with a `"reason"` code, never raised as an exception) rather than
silently applying a stale or conflicting patch.

## (Next) ConstraintRetriever Improvements
Code: `src/tmbx/server.py`

Planned improvements:
- loads global/profile constraints first (high precedence)
- then queries only what is needed for remaining planning gaps ("degrees of freedom")
- uses structured Notion properties (no embeddings requirement)

Status: partially implemented; tracked in `lattice_ticket.md`.

## SlackBot Router + Review

Slack-facing routing + constraint review UI:
- Extracted constraints can be reviewed and accepted/declined via a Slack modal.
- Current implementation updates the local SQLite-backed constraint statuses.
- Proposal interactions should follow the shared contract in
`docs/architecture/proposal_object_contract.md`:
UI actions and NL replies must converge to the same typed intent + submit path.

Code:
- `src/fateforger/slack_bot/handlers.py`
- `src/fateforger/slack_bot/constraint_review.py`
Related docs: `src/tmbx/` module docstrings; `tickets/` entries under `tmbx`.
8 changes: 8 additions & 0 deletions docs/architecture/timeboxing_refactor.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ title: Timeboxing Refactor

# Timeboxing Refactor

> **Superseded (2026-09-09).** This page describes `TimeboxingFlowAgent`'s
> coordinator + stage-gating design, retired with the agent itself (commit
> `67489cd`); every code pointer below except `mcp_clients.py` names a
> deleted file. Of the tests listed below only
> `tests/e2e/test_slack_timebox_command.py` survives. See
> `docs/architecture/agents.md` for the live components and
> `docs/indices/agents_timeboxing.md` for the retirement note and file index.

This page summarizes the “prompt-splitting + typed stage contexts + background constraints” refactor for timeboxing.

For the detailed repo-level report, see `TIMEBOXING_REFACTOR_REPORT.md`.
Expand Down
Loading