Files
qzl d060962a5f feat(agent): redesign project_cli with module/method/input protocol
- Replace command/subcommand/args with module/method/input envelope
- Calendar handler uses discriminated union (mode) for read operations
- Strict Pydantic models with extra='forbid' for all calendar methods
- Worker max_iters=7, router prompt simplified (removed project_cli_defaults)
- Skill index cards + per-action files for progressive disclosure
- Frontend/AG-UI aligned to module/method dispatch
- Protocol docs updated to module/method/input contract

WIP: action cards need envelope fix, 2 tests need update, memory
handler needs Pydantic models.
2026-04-24 13:24:13 +08:00

174 lines
5.7 KiB
Markdown

# Decision Log: Single CLI + Progressive Skill Disclosure Redesign
## Accepted Decisions
### D1. Keep one executable tool
Accepted.
Reason:
- lower tool-selection complexity
- lower repeated schema exposure cost
- consistent with the original valid direction of the CLI refactor
### D2. Replace `command/subcommand/args` with `module/method/input`
Accepted.
Reason:
- keeps one tool while removing ambiguous CLI-history semantics
- aligns the worker-facing protocol with business intent
- reduces repeated failure from action guessing
- keeps skill files decoupled from the executable tool contract
### D2.1 Remove `skill` from `project_cli`
Accepted.
Reason:
- skill files are guidance, not transport
- project_cli should execute by business module and method only
- error messages and validation should remain tool-native and not point back into skill docs
### D2.2 Use strong typed calendar read inputs
Accepted.
Reason:
- `date: str` plus manual parsing is glue code and too easy to misuse
- Pydantic `date`, timezone-aware `datetime`, and `UUID` give stricter and clearer validation
- `calendar.read` can cover day/range/event reads with one module-scoped method while still keeping input modes explicit
### D3. Keep progressive disclosure through skill files
Accepted.
Reason:
- allows the model to load only current-scenario knowledge
- avoids injecting every action definition into every model call
- fits AgentScope skill usage better than giant tool schemas
### D4. Split skill knowledge into index + action cards
Accepted.
Reason:
- real progressive disclosure needs smaller files, not only a long `SKILL.md`
- action-scoped files are easier for the worker to read and apply correctly
### D5. Set worker `max_iters=7`
Accepted.
Reason:
- current default 10 is too high for repeated invalid action discovery
- 7 preserves room for complex tasks without keeping the current waste level
### D6. Keep worker temperature unchanged
Accepted.
Reason:
- explicit user requirement
- this task focuses on protocol clarity and token efficiency, not generation-style tuning
### D7. Remove semantic reliance on worker `context_messages`
Accepted.
Reason:
- current runtime does not feed those messages into worker execution
- keeping the config active on worker is misleading and complicates reasoning about cost
## Rejected Decisions
### R1. Re-split into many domain tools
Rejected.
Reason:
- increases tool schema size
- increases selection ambiguity
- pushes the design back toward the old high-token path
### R2. Keep old CLI shape and only improve skill writing
Rejected.
Reason:
- failure came from structural action ambiguity, not only poor wording
- `read` remains overloaded even with better prose
### R3. Keep broad legacy input compatibility
Rejected.
Reason:
- old aliases teach the model that guessing is acceptable
- compatibility paths increase parser complexity and maintenance burden
- the repository is still early enough to tighten the protocol cleanly
### R4. Add duplicate-failure circuit breaker now
Rejected for this task.
Reason:
- user explicitly wants to keep some exploration room while refining skills
- this redesign should first fix the protocol itself
## Open Questions To Resolve During Implementation
1. Should router output add all optional execution hint fields in one step or phase them in gradually?
2. Should `worker.config.context_messages` be removed from schema entirely or retained as ignored/deprecated for one migration cycle?
3. Should `calendar` action files be separate files under `actions/` or a single file with stable sections and `ranges` reads?
4. Should action validation errors include `suggested_alternative_actions` for every validation failure or only for selected known-confusion cases?
5. Should `archive` become an explicit calendar action now, or remain represented via `update_event.patch.status = archived` until there is a dedicated route and UI contract?
6. ~~Frontend/live integration assertions still need migration from `skill/action` to `module/method`~~ Resolved 2026-04-24: assertions migrated and integration tests passing.
## Session 2026-04-24: Integration Test Debugging
### D8. Tool schema `input` must be required, not optional
Accepted.
Root cause of `project_cli` repeatedly receiving `input: {}`:
- `input: dict[str, Any] | None = None` generated a tool schema with `input` as optional, nullable, and `additionalProperties: true`
- Small models (qwen3.5-flash) interpret this as "input can be anything, including empty object"
- The tool schema has higher priority than skill file content in the model's attention
- Fix: changed to `input: dict[str, Any]` (required, no default, no nullable)
### D9. Router must not resolve time or suggest tool args
Accepted.
Previous router prompt included instructions for:
- Including `project_cli_defaults` in `context_summary`
- Standardizing time values to project_cli input format
- Resolving relative dates via `system_time_local`
This violated the router/worker responsibility split:
- Router: intent extraction + context summary + requires_tool evidence
- Worker: tool selection + time resolution via skill + ENV section + tool execution
Fix: removed all `project_cli_defaults` and time-resolution instructions from router prompt.
Time resolution is now the sole responsibility of worker + skill file, using `system_time_local` from ENV section as the single time source.
### D10. Skill files should reference ENV section variable names explicitly
Accepted.
Instead of abstract instructions like "resolve dates using system_time_local", skill files should directly reference `system_time_local` and `timezone_effective` from `USER_CONTEXT_JSON` in the ENV section, with concrete examples showing how to extract values.