fix(session): correct field names and data types in Session.as_cli_dict() for spec compliance #3461
No reviewers
Labels
No labels
auto/needs-reevaluation
controller-managed
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Bounty
$100
Bounty
$1000
Bounty
$10000
Bounty
$20
Bounty
$2000
Bounty
$250
Bounty
$50
Bounty
$500
Bounty
$5000
Bounty
$750
MoSCoW
Could have
MoSCoW
Must have
MoSCoW
Should have
Needs Feedback
Points
1
Points
13
Points
2
Points
21
Points
3
Points
34
Points
5
Points
55
Points
8
Points
88
Priority
Backlog
Priority
CI Blocker
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
State
Completed
State
Duplicate
State
In Progress
State
In Review
State
Paused
State
Unverified
State
Verified
State
Wont Do
Type
Automation
Type
Bug
Type
Discussion
Type
Documentation
Type
Epic
Type
Feature
Type
Legendary
Type
Refactor
Type
Support
Type
Task
Type
Testing
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
cleveragents/cleveragents-core!3461
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "bugfix/session-show-as-cli-dict-field-names"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Fixes issue #3440:
agents session showJSON output uses wrong field names and wrong data types forrecent_messagesandlinked_plans.Problem
Session.as_cli_dict()returned incorrect field names and data structures throughout, breaking spec compliance for theagents session showJSON output:session_idid(insidesession_summary)actor_nameactor(insidesession_summary)message_countmessages(insidesession_summary)created_atcreated(insidesession_summary)updated_atupdated(insidesession_summary)namespace(present)session_summaryautomationfield insession_summaryrecent_messages[].contentrecent_messages[].textlinked_plan_ids(flatlist[str])linked_plans(list of{plan_id, phase, state}objects)estimated_costasfloatestimated_costas formatted string e.g."$0.0184"Solution
Architectural decision: Added
LinkedPlanvalue object to the Session domain model to store plan phase and state alongside the plan ID. This is the cleanest approach — the domain model owns its data.Changes:
session.py: AddedLinkedPlanvalue object withplan_id,phase,statefields; addedautomationfield toSession; rewroteas_cli_dict()to produce spec-compliant output withsession_summarywrapper, correct field names,textkey inrecent_messages,linked_plansas objects, andestimated_costas formatted stringsession.py(CLI): Updated rich output to use spec-compliant labels (ID:,Automation:) and renderlinked_plansas a table with Plan ID / Phase / State columns__init__.py: ExportLinkedPlanfrom domain models coreconsolidated_domain_models.feature: Updated tests to assert new spec-compliant field names; added new scenarios forautomation,linked_plans, andestimated_costformatsession_model_steps.py: Added step definitions for new assertionsQuality Gates
nox -s lint— passesnox -s typecheck— 0 errors, 0 warningsnox -s unit_tests— behave-parallel hangs in local environment (pre-existing infrastructure issue, not caused by this change — verified by testing without changes)Closes #3440
Automated by CleverAgents Bot
Supervisor: Implementation | Agent: ca-issue-worker
PR #3461 Review —
fix(session): correct field names and data types in Session.as_cli_dict() for spec complianceReview Focus: specification-compliance, behavior-correctness, api-consistency
Linked Issue: #3440 (UAT:
agents session showJSON output uses wrong field names)✅ What Looks Good
Specification Compliance: The rewritten
as_cli_dict()correctly produces the spec-required structure withsession_summarywrapper, renamed fields (id,actor,messages,created,updated),automationfield,textkey inrecent_messages,linked_plansas objects, andestimated_costas formatted string. This directly addresses all 9 violations listed in #3440.Architectural Decision: Adding
LinkedPlanas a value object in the domain model is the right approach — it keeps the domain model as the owner of its data rather than requiring service-layer lookups at display time.Commit Message: ✅ Follows Conventional Changelog format exactly as specified in the issue metadata.
ISSUES CLOSED Footer: ✅ Present (
ISSUES CLOSED: #3440).PR Description: ✅ Thorough, well-structured, includes
Closes #3440.No Forbidden Patterns: ✅ No
# type: ignore, imports at top of file, proper type annotations throughout.LinkedPlanModel: Clean Pydantic BaseModel with properFielddescriptors,str_strip_whitespace, andvalidate_assignment.__init__.pyExport:LinkedPlancorrectly added to both the import block and__all__list, maintaining alphabetical ordering.⚠️ Issues Requiring Attention
1. [API-CONSISTENCY] Dual Representation Creates Consistency Risk —
linked_plan_idsvslinked_planssrc/cleveragents/domain/models/core/session.py—Sessionmodel fieldsSessionmodel now has bothlinked_plan_ids: list[str]andlinked_plans: list[LinkedPlan]. The existinglink_plan()method (which is the primary API for linking plans) only appends tolinked_plan_ids— it does not create a correspondingLinkedPlanentry. This means after callinglink_plan("some-ulid"), theas_cli_dict()method will fall through to the fallback path and emit{"plan_id": "some-ulid", "phase": "", "state": ""}with empty strings.link_plan()(the existing API) will produce degraded output. The two lists can drift out of sync with no validation preventing it.link_plan()to accept optionalphase/stateparameters and populate both lists, or (c) documenting the intended migration path clearly. At minimum, thelink_plan()docstring should note that it only populateslinked_plan_idsand thatlinked_plansmust be populated separately for full spec-compliant output.2. [BEHAVIOR] Fallback Uses Empty Strings Instead of Explicit "Unknown"
src/cleveragents/domain/models/core/session.py—as_cli_dict(), theelif self.linked_plan_ids:branch{"plan_id": pid, "phase": "", "state": ""}. Empty strings are ambiguous — they could mean "not set", "unknown", or "intentionally blank". The spec example shows actual values like"execute"and"complete"."unknown"instead of""for the fallback phase/state values, which is more explicit and less likely to confuse downstream consumers.3. [SPEC-COMPLIANCE] Missing ULID Validation on
LinkedPlan.plan_idsrc/cleveragents/domain/models/core/session.py—LinkedPlanclassLinkedPlan.plan_idis declared asstrwithoutpattern=ULID_PATTERNvalidation, whileSession.session_idandSessionMessage.message_idboth enforce the ULID pattern. This is inconsistent — plan IDs should be ULIDs per the spec.pattern=ULID_PATTERNto theplan_idfield for consistency with the rest of the codebase.4. [PROCESS] PR Missing Milestone and Labels
Type/label. Issue #3440 is in milestone v3.7.0 and has labelType/Bug. This PR has neither a milestone nor any labels.v3.7.0and add labelType/Bug.5. [BEHAVIOR]
estimated_costFormat Precisionsrc/cleveragents/domain/models/core/session.py—as_cli_dict(),f"${cost:.4f}""$0.0184"(4 decimals). This works for the example, but for larger costs like$12.50, it would produce"$12.5000". For very small costs like$0.000001, it would produce"$0.0000"(losing precision). This is a minor concern but worth considering whether a dynamic precision or minimum significant digits approach would be more appropriate.6. [API-CONSISTENCY]
as_export_dict()Not Updatedsrc/cleveragents/domain/models/core/session.py—as_export_dict()linked_plan_ids(flat list) andestimated_costas a raw float. While the export format may intentionally differ from the CLI display format (export is for data interchange, CLI is for human/machine display), this creates two different serialization contracts for the same model. Theas_export_dict()docstring doesn't mention this distinction.as_export_dict()docstring to prevent future confusion.📋 Summary
The core implementation is solid and correctly addresses the spec compliance issues. The main concerns are around the dual-representation consistency risk and missing PR metadata. Items #1 (dual representation) and #4 (missing milestone/labels) should be addressed before merge.
Automated by CleverAgents Bot
Reviewer: Code Quality | Agent: ca-pr-self-reviewer
agents session showJSON output uses wrong field names and wrong data types for recent_messages and linked_plans #3440