feat(agileplus): consolidate docs tree + consume shared traceability-core (git dep)#754
Conversation
Merge parallel spec roots into docs/specs/{eco,crates}, fold 32 meta.json
files into spec.md frontmatter, archive JSON under docs/_archive/, and
record the layout in ADR-0003/0004 with redirect stubs at legacy paths.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wire traceability-core via git dep (not vendored), re-export lifecycle, governance, and IntentGraph from agileplus-domain, and switch phenoShared path deps to git for reproducible builds. Co-authored-by: Cursor <cursoragent@cursor.com>
Add feature labels migration, StoragePort label queries, StdioTransport Debug, plane mock persistence, contract-test fixes, and small domain/test repairs so the workspace compiles and the majority of tests pass. Co-authored-by: Cursor <cursoragent@cursor.com>
|
Skipping CodeAnt AI review — this PR changes more than 100 files, which usually means a migration, codemod, or vendored drop. Line-level review on diffs this large produces duplicate findings on the same rewrite pattern and drowns out anything that actually matters. If you still want a review, comment |
|
Warning Review limit reached
More reviews will be available in 15 minutes and 26 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more credits in the billing tab to continue. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits. 🚦 How do rate limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (30)
📝 WalkthroughWalkthroughIntroduces the complete ChangesDashboard Routes, Domain Refactoring, and Tooling Hardening
Sequence Diagram(s)sequenceDiagram
participant Browser
participant DashboardRouter as router()
participant Handler
participant DashboardStore as SharedState
participant Disk as Evidence/Config on Disk
Browser->>DashboardRouter: GET /dashboard (HTMX or full)
DashboardRouter->>Handler: dashboard_page / kanban_board
Handler->>DashboardStore: read features, health
DashboardStore-->>Handler: project views
Handler-->>Browser: HTML or HTMX partial
Browser->>DashboardRouter: GET /api/health
DashboardRouter->>Handler: health_json
Handler->>Handler: health::run_health_checks()
Handler->>DashboardStore: update health state
DashboardStore-->>Handler: updated HealthStatus
Handler-->>Browser: JSON
Browser->>DashboardRouter: GET /api/stream (SSE)
DashboardRouter->>Handler: sse_stream
Handler-->>Browser: SSE events (heartbeat, feature_updated, health_changed)
Browser->>DashboardRouter: POST /api/services/restart
DashboardRouter->>Handler: restart_service
Handler->>Handler: validate allowlist + template
Handler->>Disk: spawn generate-evidence.sh or restart command
Disk-->>Handler: process started
Handler-->>Browser: JSON status
Browser->>DashboardRouter: POST /api/settings/plane
DashboardRouter->>Handler: save_plane_settings
Handler->>Disk: Config::load() then config.save()
Disk-->>Handler: persisted
Handler-->>Browser: success HTML
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: Cursor Bugbot is still in progress after the 8-minute wait (no
<!-- BUGBOT_REVIEW -->comment yet), and this PR exceeds the low-risk approval threshold (git-pinned shared spine, domain/storage trait changes, SQLite migration). Human review is required; no non-author reviewers are configured in CODEOWNERS.Sent by Cursor Approval Agent: Pull Request Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_507e17aa-992a-4477-83bb-8f26aa9472f6) |
| phenotype-string = { path = "../phenoShared/crates/phenotype-string" } | ||
| phenotype-test-infra = { path = "../phenoShared/crates/phenotype-test-infra" } | ||
| phenotype-event-bus = { path = "../phenoShared/crates/phenotype-event-bus" } | ||
| phenotype-error-core = { git = "https://github.com/KooshaPari/phenoShared", branch = "main" } |
There was a problem hiding this comment.
CRITICAL: Unpinned git dependencies (only branch = "main"/"master" set, no tag/rev). Builds are non-deterministic — any push to the main/master branch of phenoShared or phenotype-pm-core silently changes agileplus-domain semantics. This is a known cargo footgun: cargo will re-fetch the branch on every build, and CI/local builds can disagree. Pin to a specific tag or rev (and ideally record the Cargo.lock commit), or vendor.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| /// | ||
| /// Delegates to the shared `phenotype-string` crate so every consumer repo | ||
| /// (AgilePlus, Tracera, teamcomm, ...) uses identical slug rules. | ||
| /// Simple slugify: lowercase, ASCII alphanumeric + hyphens, trimmed. |
There was a problem hiding this comment.
WARNING: The new inlined slugify is not equivalent to the prior phenotype_string::slugify it replaced. It only keeps is_ascii_alphanumeric() plus -; any non-ASCII (e.g. accented chars, CJK, emoji) is collapsed to -. This silently changes slugs for non-ASCII titles vs. other consumers (Tracera, teamcomm) that still use the shared crate — git log shows that ADR-0005 explicitly cites cross-repo consistency as the motivation. Either restore the shared dependency or document the divergence clearly.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| async fn get_feature_by_slug(&self, slug: &str) -> Result<Option<Feature>, DomainError>; | ||
| async fn get_feature_by_id(&self, id: i64) -> Result<Option<Feature>, DomainError>; | ||
| async fn update_feature_state(&self, id: i64, state: FeatureState) -> Result<(), DomainError>; | ||
| async fn update_feature(&self, feature: &Feature) -> Result<(), DomainError>; |
There was a problem hiding this comment.
CRITICAL: Adding required methods (update_feature, list_features_by_label) to the public StoragePort trait is a SemVer-breaking change for any out-of-tree implementer (e.g. downstream repos in the Phenotype org that implement StoragePort). Same applies to the 5 default-implemented MVP hooks added right after — defaults are fine for forward compatibility, but the two non-defaulted methods break every existing impl. Provide default unimplemented!()/error bodies (or version the trait) and document the bump.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| async fn update_feature(&self, feature: &Feature) -> Result<(), DomainError>; | ||
| async fn list_features_by_state( | ||
| &self, | ||
| state: FeatureState, |
There was a problem hiding this comment.
WARNING: New list_features_by_label(&str) does not specify whether the match is exact, case-sensitive, or normalized. Combined with the SQLite impl below (LIKE '%"label"%'), a label "foo" will also match "foobar" and any label containing a JSON-escaped quote will misbehave. Document the contract (exact, case-sensitive, trimmed) on the trait method, and add a test that fails for the substring-match case.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| async fn get_wp_dependencies(&self, wp_id: i64) -> Result<Vec<WpDependency>, DomainError>; | ||
| async fn get_ready_wps(&self, feature_id: i64) -> Result<Vec<WorkPackage>, DomainError>; | ||
|
|
||
| // --- MVP: story-scoped work packages --- |
There was a problem hiding this comment.
SUGGESTION: Five new MVP trait methods all default to Err(DomainError::NotImplemented). Confirm DomainError::NotImplemented is already defined (it is referenced but the diff does not show its declaration) and that it implements the right error kind — Default-style unimplemented hooks are useful, but if a method is genuinely required for the new workflow, leaving it as a default panics-or-errors at runtime rather than failing the build.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| @@ -0,0 +1,5 @@ | |||
| -- UP | |||
| ALTER TABLE features ADD COLUMN labels TEXT NOT NULL DEFAULT '[]'; | |||
|
|
|||
There was a problem hiding this comment.
SUGGESTION: New labels column has no supporting index. list_features_by_label is likely a hot query (label-driven dashboards) and a full scan on features won't scale. Either add a generated column for primary label or use a join table feature_labels(feature_id, label) with a unique index on (label, feature_id).
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| 'Intent','Plan','Feature','Story','Task', | ||
| 'Spec','Commit','Test','PR','Bug','Artifact' | ||
| ) THEN RAISE(ABORT, 'Invalid node_type: ' || NEW.node_type) | ||
| ) THEN RAISE(ABORT, 'Invalid node_type') |
There was a problem hiding this comment.
WARNING: Regressed the error message: RAISE(ABORT, 'Invalid status') no longer includes the offending value. Debugging a constraint violation now requires the user to re-run the insert to see what they typed. Restore the previous 'Invalid status: ' || NEW.status form (and similarly for node_type at line 85 and relationship_type at line 109). Note: SQLite triggers have a documented quirk where NEW.column in a RAISE text can be NULL for the offending row under some conditions, but that's a known issue, not a reason to drop the field entirely.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| features::update_feature_state(&conn, id, state) | ||
| } | ||
|
|
||
| async fn update_feature(&self, feature: &Feature) -> Result<(), DomainError> { |
There was a problem hiding this comment.
CRITICAL: The diff adds update_feature and list_features_by_label to impl StoragePort for SqliteStorageAdapter in lib.rs, AND a separate file crates/agileplus-sqlite/src/lib/storage_port.rs is modified in the same PR to add the same two methods to the same impl for the same type. This produces duplicate impl blocks for SqliteStorageAdapter, which is a hard compile error. Either remove the duplicate impl from lib/storage_port.rs (and ideally rm the dead file or convert it to a re-export) or remove from lib.rs. Cannot merge as-is.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| } | ||
| async fn create_project(&self, _: &Project) -> Result<i64, DomainError> { | ||
| unimplemented!() | ||
| panic!("MemStore stub: create_project not used in list_tests") |
There was a problem hiding this comment.
SUGGESTION: Replacing unimplemented!() with panic!(... is a regression in test ergonomics — unimplemented!() produces a clear "not yet implemented" panic; the new message is informative but now any call to these methods on the test MemStore will hard-panic the test binary with a process abort (vs. unwind in unimplemented!()). Consider using todo!() (which documents intent) or returning Err(DomainError::NotImplemented) so the test binary can report and continue.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
|
|
||
| #[cfg(test)] | ||
| mod mock; | ||
| pub mod mock; |
There was a problem hiding this comment.
SUGGESTION: InMemoryPlaneClient is now publicly exported (good for the public test surface) but the fields issues, created, updated were made pub-in-module-only by removing pub and adding Mutex. The original pub fields were used by tests to inspect state. Confirm this isn't a regression for downstream test code that asserted on .issues directly. If needed, add pub fn issues(&self) -> MutexGuard<'_, ...> accessors.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Code Review SummaryStatus: 15 Issues Found | Recommendation: Request Changes — a probable non-exhaustive match compile error in Overview
Issue Details (click to expand)CRITICAL
WARNING
SUGGESTION
Other Observations (not in diff)Items found while reading context that are outside the diff hunks and cannot receive inline comments:
Files Reviewed (29 files with Rust changes, 170 docs/move renames)Rust source files:
The remaining ~165 files are pure file-rename paths (content unchanged, no review comments issued) for the docs tree consolidation. Recommendation: Request changes. Two new blockers since the previous review: (1) Fix these issues in Kilo Cloud Previous Review Summary (commit ac9c394)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit ac9c394)Status: 13 Issues Found | Recommendation: Request Changes — must-fix items include a probable duplicate-impl compile error and a SemVer-breaking trait change. Overview
Issue Details (click to expand)CRITICAL
WARNING
SUGGESTION
Other Observations (not in diff)Items found while reading context that are outside the diff hunks and cannot receive inline comments:
Files Reviewed (29 files)
Pure file-rename paths (content unchanged, no review comments issued) are not enumerated individually. Recommendation: Request changes. The duplicate Reviewed by minimax-m3 · 1,452,152 tokens |
…ion@v2 - agileplus-domain/error.rs: InvalidClaim was matched twice (dead arm under -D warnings broke Core Build). Folded the claim-bound note into the single reachable arm. - deny.yml: taiki-e/install-action was pinned to a nonexistent SHA; cargo-deny never ran. Pin to @v2. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (git-pinned shared dependency, breaking StoragePort changes, SQLite migration, and broad domain/docs refactor). Cursor Bugbot is not running on this PR; human review is required and no non-author CODEOWNERS are configured for reviewer assignment.
Sent by Cursor Approval Agent: Pull Request Approver
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/port refactors, SQLite migration). Cursor Bugbot is absent on the current commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
| // (InvalidClaim is claim-bound: a precondition failure, same shape | ||
| // as a bad argument — so it projects to ValidationError too.) | ||
| DomainError::Validation(_) | ||
| | DomainError::FeatureNotInModuleScope { .. } |
There was a problem hiding this comment.
CRITICAL: The DomainError::InvalidClaim(_) => Self::ValidationError arm was removed from the match but InvalidClaim is still a variant of DomainError (no changes to the enum definition appear in this diff). This produces a non-exhaustive match compile error (E0004). Either add the arm back or fold InvalidClaim into the Validation(_) arm explicitly:
| | DomainError::FeatureNotInModuleScope { .. } | |
| DomainError::Validation(_) | |
| | DomainError::InvalidClaim(_) | |
| | DomainError::FeatureNotInModuleScope { .. } | |
| | DomainError::InvalidTransition { .. } |
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
| BuiltinPolicy, Evidence, EvidenceRequirement, EvidenceType, GovernanceContract, | ||
| GovernanceRule, PolicyCheck, PolicyDefinition, PolicyDomain, PolicyRule, | ||
| }; | ||
| pub use traceability_core::intent_graph::{ |
There was a problem hiding this comment.
CRITICAL: Status as NodeStatus is a SemVer-breaking rename. The old agileplus_domain::Status (the intent-graph enum with variants Draft, Active, Completed, Deprecated, Rejected, Open, InProgress, Blocked, Deferred, Cancelled) no longer exists at the crate root. Any downstream consumer that imported agileplus_domain::Status expecting the intent-graph enum will fail to compile. The previous intent_graph.rs re-exported Status directly from this module. This must be accompanied by a major version bump, or — preferably — a dual re-export pub use traceability_core::intent_graph::Status; kept alongside Status as NodeStatus to preserve the old path.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_b76db55b-e63c-42ca-ae8c-55907babe8ea) |
Fix all clippy::uninlined_format_args, unused imports, dead_code fields, redundant closures, doc-comment lint, identical-if-blocks, and related warnings across 30+ crates. Also add tokio `process` feature to agileplus-pipeline Cargo.toml. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add phenotype-traceability Python package with hatchling build system, ruff lint config, and empty __init__.py. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add buf v2 config pointing at proto/ directory with DEFAULT lint and FILE breaking-change rules. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/port refactors, SQLite migration). Cursor Bugbot is absent on the current commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Removes phenotype-error-core, anyhow, agileplus-validate, uuid, and regex from the zero-dependency domain crate: - ErrorCode: local minimal mirror enum in error.rs (5 used variants); agileplus-application remaps it onto the canonical wire enum. - anyhow: config loader returns Result<_, DomainError>. - agileplus-validate: inlined name_required/slug_format into validate.rs. - uuid: edge ids via chrono timestamp + atomic counter. - regex: node-id validation via manual char checks. traceability-core and async-trait remain (large cross-crate changes). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The 5 truly-removable deps (phenotype-error-core, anyhow, agileplus-validate, uuid, regex) were dropped from agileplus-domain. The remaining two are infeasible to remove per the task guardrail: - traceability-core is the org single-source-of-truth PM library; inlining its ~1.6k LOC would fork the SSOT and re-introduce transitive deps. - async-trait backs the domain's hexagonal port traits across ~15 downstream crates (dyn-compatible async). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
rust/deny.toml contained non-schema keys ([workspace], [abis], workspace=true, only-warn=[], multi-license) that made `cargo deny check -c rust/deny.toml` (rust-audit job) fail with unexpected-keys deserialization errors. Replaced with a valid config mirroring the root deny.toml; unknown-git=allow permits the phenoShared / phenotype-pm-core git dependencies. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/port refactors, SQLite migration). Cursor Bugbot did not complete on the current commit (still pending after the 8-minute wait); human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migration). Cursor Bugbot is absent on the current commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_a7242359-da8d-4f81-b6a7-78b1fea868c4) |
cargo-deny rejects packages that set both `license` (SPDX) and `license-file` simultaneously. Drop `license-file = "LICENSE"` and keep the canonical `license = "MIT OR Apache-2.0"` SPDX expression. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…es to all agileplus.v1 protos buf lint DEFAULT ruleset requires JAVA_PACKAGE on every proto file. agents, common, core, and integrations were missing the three Java options that work_items.proto already had. Add: option java_package = "com.phenotype.agileplus.v1"; option java_outer_classname = "<File>Proto"; option java_multiple_files = true; Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migration). Cursor Bugbot check was absent so its signal was skipped; human review is required and no non-author reviewers are available to assign.
Sent by Cursor Approval Agent: Pull Request Approver
…E0592) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…es/ module + fix retired typo routes.rs (2819-line monolith) and routes/ (split module dir from main's consolidation) both survived the superset-merge, causing E0761 ambiguous module + fmt/clippy/build failures. main's routes/ split is canonical (declared via 'pub mod routes;' -> routes/mod.rs) and a content superset; the monolith is removed. No content lost. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain refactors, and SQLite/event behavior changes). Cursor Bugbot check was absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured in CODEOWNERS.
Sent by Cursor Approval Agent: Pull Request Approver
…s_shippable, deduplicate credential store - crates/agileplus-domain/src/lib.rs: reorder mod declarations (traceability before validate) to match rustfmt alphabetical expectation; fixes Format Check failure in Core Workspace Quality and Rust Quality jobs - crates/agileplus-api/tests/api_integration.rs: add missing trace_ids field to WorkPackage initializer; fixes E0063 compile error in Rust Coverage job - crates/agileplus-domain/src/domain/cycle.rs: restore CycleWithFeatures:: is_shippable() method (removed in prior dedup commit); add missing FeatureState import; improve guard to require non-empty feature list (FR-C07) - crates/agileplus-domain/src/credentials.rs: move create_credential_store above tests module (rustfmt canonical position; was accidentally duplicated then truncated); fixes rustfmt diff in Core Workspace Quality - crates/agileplus-domain/src/config.rs: add AppConfig::load_with_env_overrides constructor for API_PORT / DATABASE_PATH / AGILEPLUS_API_KEY env var support Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain refactors, and SQLite/event behavior changes). Cursor Bugbot check was absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured in CODEOWNERS.
Sent by Cursor Approval Agent: Pull Request Approver
…cle.rs format - Rename GovernanceSummary → GovernanceStatus in stubs.rs with canonical fields (all_gates_passed, total_rules, passed_rules, outstanding) matching agileplus-agents/proto/agileplus/v1/common.proto - Update lib.rs test to use GovernanceStatus with canonical field names - Fix cycle.rs is_shippable method-chaining format per rustfmt Traceability: FR-AGP-011 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/storage refactors, SQLite migration). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
…ce tests - TraceRef gains entity_id: Uuid field and TraceRef::new() constructor - All struct literal callsites updated with entity_id + linked_at fields - acceptance_traceability_integration_test imports corrected to hexagonal paths Traceability: FR-AGP-011 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/storage refactors, SQLite migration). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain refactors, and SQLite migration). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured in CODEOWNERS.
Sent by Cursor Approval Agent: Pull Request Approver
Satisfies end-of-file-fixer pre-commit hook. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migration). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
- Vitest/Playwright: install from web/package.json (includes react) instead of bare npm install vitest; set working-directory to web - BDD: switch npx cucumber to npx cucumber-js (new @cucumber/cucumber CLI) with graceful skip when no .feature files exist Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migration). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured in CODEOWNERS.
Sent by Cursor Approval Agent: Pull Request Approver
….proto The canonical proto defines `message BacklogItem` without the Proto suffix. Align stubs.rs struct name and lib.rs test references. Traceability: FR-AGP-011 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migration across 61 files). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
…re-commit trailing newlines; add test deps to package.json
- intent.rs:556: collapse } else { if } -> } else if
- version.rs:16: VersionArgs::default() -> VersionArgs (unit struct)
- sync_plane_contract.rs:15: format!('{}</p>', name) -> format!('{name}</p>')
- eco-003/004/005 spec.md: remove trailing blank lines (pre-commit EOF fix)
- 026_feature_labels.sql: split UP comment to two lines (pre-commit formatter)
- package.json: add vitest, @playwright/test, testing-library devDeps
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain refactors, and SQLite migration). Cursor Bugbot is absent on this commit so its signal was skipped; human review is required and no non-author reviewers are configured.
Sent by Cursor Approval Agent: Pull Request Approver
…ght without config - Add vitest, @vitest/coverage-v8, @testing-library/react/user-event/jest-dom, jsdom, @playwright/test to web/package.json devDependencies - Playwright job skips gracefully when no playwright.config.ts exists Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, multi-crate domain refactors, SQLite migrations). Cursor Bugbot did not run on this PR; human review is required and no non-author reviewers are configured in CODEOWNERS.
Sent by Cursor Approval Agent: Pull Request Approver
The tests module precedes main() by convention; suppress the lint rather than restructure the file. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migrations). Cursor Bugbot check was not present; human review is required. Requested KooshaPari as reviewer.
Sent by Cursor Approval Agent: Pull Request Approver
runtime.rs:97 had the same default_constructed_unit_structs lint as version.rs. Replace VersionArgs::default() with VersionArgs (direct construction). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
There was a problem hiding this comment.
Risk: medium. Not approving: this PR exceeds the low-risk threshold (traceability-core git dependency, domain/StoragePort refactors, SQLite migrations). Cursor Bugbot was not present on this commit; human review is required. Requested KooshaPari as reviewer.
Sent by Cursor Approval Agent: Pull Request Approver






User description
What's added
specs/+kitty-specs/→ onedocs/tree (docs/specs/,docs/adr/,_archive/meta-json/); meta.json folded toward frontmatter. 158 moves, content preserved.agileplus-domainnow consumestraceability-corevia GIT dep onphenotype-pm-core(no vendored copy) — one model across AgilePlus + Tracera.Verification
docs/specs/eco/eco-003-.../spec.md.Commits (2026-06-16)
🤖 Generated with Claude Code
Note
High Risk
Unresolved merge conflicts across the lockfile, workspace manifests, and CI block compilation; plus dependency-graph and slugify/validation behavior changes in domain that can break consumers once merged.
Overview
This PR pins the shared PM spine by wiring
traceability-corefromphenotype-pm-core(git rev) and tightensagileplus-domaintoward a zero-dependency crate: localvalidatehelpers, a localErrorCodemirror, and CI allowlists that permit onlytraceability-core+async-trait(droppingphenotype-error-core,agileplus-validate,regex,uuidfrom domain).AppErrormapping is updated to project domain errors onto the canonical wireErrorCode.Supply chain & CI adds
.cargo/audit.tomlacknowledgingRUSTSEC-2023-0071, commitsCargo.lock(with.gitignoredocumenting why), hardens Codecov (OIDC,fail_ci_if_error: true), switches commitlint to.commitlintrc.jsonwithcommitDepth: 1, and adjusts Rust extra jobs (prebuiltcargo-machete/ semver /typos-cli, stricter extras withoutcontinue-on-error).Product surface adds a large
agileplus-dashboardroutes.rs(HTMX + JSON for kanban, health, agents, evidence, settings, SSE, work-packages/epics-stories JSON). Smaller domain/API tweaks includeCycleWithFeatures::is_shippable,SyncMapping::increment_conflict, feature labels via migration026, and event pagination aligningafter_sequencewith strictsequence > from.Critical: the diff still contains unresolved
<<<<<<< HEADmerge conflicts inCargo.toml,Cargo.lock, workflows,buf.yaml,agileplus-domain/cli/worklog, and others—the tree will not build until those are resolved and one side of the dependency/workspace graph is chosen.Reviewed by Cursor Bugbot for commit b598342. Configure here.
Note
Consolidate docs tree into docs/ and consume traceability-core as a git dependency
kitty-specs/andspecs/intodocs/specs/, journey markdown fromdocs/operations/journeys/intodocs/journeys/, and trace JSON archives intodocs/_archive/traces-json/; adds a consolidation script that mergesmeta.jsonfrontmatter intospec.mdfiles and folds trace JSON into journey frontmatter.phenotype-error-core,phenotype-string,regex,uuid, and related dependencies inagileplus-domainwith a pinned git dependency ontraceability-core(KooshaPari/phenotype-pm-corerevd5ceb308); governance, intent graph, and lifecycle types are re-exported fromtraceability_corevia lib.rs.labelscolumn to thefeaturestable via migration 026, persists and queries labels throughcreate_feature,update_feature, and a newlist_features_by_labelfunction, and surfaces both throughStoragePortandContentStoragePort.CycleWithFeatures::is_shippable(),SyncMapping::increment_conflict(),AppConfig::load_with_env_overridesreturningDomainError, and a localErrorCodeenum replacing the external dependency.Cargo.lockto the repository and updates CI's dependency allowlist to permittraceability-coreandasync-trait.slugifyin builder.rs now uses a local ASCII-only kebab-case algorithm that may produce different slugs than the previousphenotype_string::slugify.📊 Macroscope summarized d214337. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted
🗂️ Filtered Issues
No issues evaluated.
CodeAnt-AI Description
Add dashboard pages and APIs while tightening core data handling
What Changed
Impact
✅ Clearer dashboard navigation✅ Fewer repeated events in activity feeds✅ Fewer event save conflicts✅ Easier feature labeling and filtering💡 Usage Guide
Checking Your Pull Request
Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.
Talking to CodeAnt AI
Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:
This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.
Example
Preserve Org Learnings with CodeAnt
You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:
This helps CodeAnt AI learn and adapt to your team's coding style and standards.
Example
Retrigger review
Ask CodeAnt AI to review the PR again, by typing:
Check Your Repository Health
To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.