Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions .agents/roles.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Use these model tiers when assigning work to another LLM.
| Tier | Use | Default model |
| --- | --- | --- |
| `Primary` | Planning, implementation, architecture decisions, final integration, failed-check triage | Strongest available Codex/GPT coding model |
| `SDD Gate` | Design analysis and final diff review | `gpt-5.6-sol` with `xhigh` reasoning |
| `SDD Gate` | Design analysis and final diff review | `gpt-6-astra` with `medium` reasoning |
Comment thread
opficdev marked this conversation as resolved.
| `Lightweight` | Read-only review, checklist validation, log summarization, documentation draft, first-pass architecture preflight | `gpt-5.3-codex-spark`, unavailable 시 `gpt-5.6-luna`와 `high` 추론 |
| `Fast` | Low-risk text cleanup, simple file presence checks, short summaries | Pinned fast model from the configured custom agent TOML when a Fast role is defined |

Expand All @@ -46,21 +46,21 @@ Default role-to-model and execution assignment:
| GitHub/CI Analyst | `github_ci_analyst` | `Lightweight` | CI root cause requires code or workflow changes, or review comments conflict |
| Documentation Writer | `documentation_writer` | `Lightweight` | Text must explain complex architecture, release risk, CI root cause, or PR scope tradeoffs |

Project-scoped custom agents live in `.codex/agents/`. Their TOML files pin the concrete model and sandbox for spawned sessions; this table is the canonical role-to-agent routing map. `Designer` and `Code Reviewer` are Sol-only SDD gates; the other custom roles retain the existing Spark-first routing.
Project-scoped custom agents live in `.codex/agents/`. Their TOML files pin the concrete model and sandbox for spawned sessions; this table is the canonical role-to-agent routing map. `Designer` and `Code Reviewer` are Astra-only SDD gates; the other custom roles retain the existing Spark-first routing.

Do not assign `Lightweight` as the only model for production Swift implementation, target dependency changes, DI assembly, repository/service contract changes, Firebase or SDK placement, Widget data-flow changes, StorePattern responsibility changes, commits, pushes, PR creation, or final integration.

### Model dispatch requirements

- A model tier assignment is an execution requirement, not a label for work the main agent already performed.
- `Primary` roles belong to the active main agent and must not be delegated to a sub-agent that uses or inherits the active `Primary` model.
- Every sub-agent created through this role workflow must use the configured `SDD Gate`, `Lightweight`, or `Fast` model that is different from the active `Primary` model. The exact `designer` and `code_reviewer` custom agent dispatches are the only exception when the active `Primary` also uses their required Sol model.
- Every sub-agent created through this role workflow must use the configured `SDD Gate`, `Lightweight`, or `Fast` model that is different from the active `Primary` model. The exact `designer` and `code_reviewer` custom agent dispatches are the only exception when the active `Primary` also uses their required Astra model.
- When a role is assigned to `SDD Gate`, `Lightweight`, or `Fast`, the main agent must dispatch the configured custom agent from the routing table before using its result.
- A sub-agent that inherits the active `Primary` model does not satisfy an `SDD Gate`, `Lightweight`, or `Fast` assignment. The Sol exception applies only to the exact `designer` and `code_reviewer` custom agent dispatches; it does not permit an inherited or generic sub-agent.
- A sub-agent that inherits the active `Primary` model does not satisfy an `SDD Gate`, `Lightweight`, or `Fast` assignment. The Astra exception applies only to the exact `designer` and `code_reviewer` custom agent dispatches; it does not permit an inherited or generic sub-agent.
- Do not satisfy an `SDD Gate`, `Lightweight`, or `Fast` role by completing the role directly in `Primary` and describing it as delegated work.
- A generic sub-agent spawn that does not load the configured custom agent TOML does not satisfy an `SDD Gate`, `Lightweight`, or `Fast` role execution.
- If the custom agent cannot be loaded or the dispatch surface cannot select that custom agent, stop before dispatch and report which role cannot run.
- `Designer` and `Code Reviewer` must use only `gpt-5.6-sol` with `xhigh` reasoning. If the connected side-task surface cannot select Sol after an exact `task_name` retry, stop the SDD gate; do not use a fallback.
- `Designer` and `Code Reviewer` must use only `gpt-6-astra` with `medium` reasoning. If the connected side-task surface cannot select Astra after an exact `task_name` retry, stop the SDD gate; do not use a fallback.
- A configured `gpt-5.3-codex-spark` model is unavailable only when the connected side-task surface cannot select it after an exact `task_name` retry. In that case, dispatch the matching `*_luna` custom role with `gpt-5.6-luna` and `high` reasoning effort. Do not select another fallback model.
- If the assigned model is available but current tool policy requires explicit user permission before dispatch, missing permission is not fallback. Stop and ask for permission before continuing the required role.
- `Primary` must integrate and verify delegated output, but must not skip the delegated role when the workflow requires it and the assigned model is available.
Expand Down Expand Up @@ -233,7 +233,7 @@ Output:

## Designer

Designer is the `gpt-5.6-sol` and `xhigh` SDD gate for non-trivial work.
Designer is the `gpt-6-astra` and `medium` SDD gate for non-trivial work.

May:

Expand All @@ -245,7 +245,7 @@ Must not:

- Edit files, stage changes, commit, push, or change GitHub state.
- Approve its own result on behalf of the user.
- Select a fallback model when Sol is unavailable.
- Select a fallback model when Astra is unavailable.

Output:

Expand Down Expand Up @@ -344,7 +344,7 @@ Output:

## Code Reviewer

Code Reviewer is the `gpt-5.6-sol` and `xhigh` read-only final-diff SDD gate.
Code Reviewer is the `gpt-6-astra` and `medium` read-only final-diff SDD gate.

May:

Expand Down
14 changes: 7 additions & 7 deletions .agents/rules/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Read this file before work that changes any of these areas:

- Module boundaries or file ownership across `Application/*`, `Libraries/*`, and `Widget/*` targets.
- Swift imports or Tuist target dependencies.
- DI assembler wiring or same-layer dependency injection.
- DI graph wiring or same-layer dependency injection.
- Repository, service, store, or use case contracts.
- Firebase, social login, network, link metadata, notification, or WidgetKit dependency placement.
- Widget snapshot, App Group, or widget deep-link data flow.
Expand Down Expand Up @@ -110,7 +110,7 @@ flowchart TD

```mermaid
flowchart TD
App["App\nComposition root\nApp lifecycle\nAssembler wiring"]
App["App\nComposition root\nApp lifecycle\nCradle graph wiring"]
Presentation["Presentation\nSwiftUI views\nViewModels\nCoordinators\nUI state"]
Domain["Domain\nEntities\nRepository protocols\nUse cases"]
Data["Data\nRepository implementations\nDTOs\nMappers\nService/store protocols"]
Expand Down Expand Up @@ -160,15 +160,15 @@ flowchart TD
| Layer | Owns | Allowed direction | Ask before |
| --- | --- | --- | --- |
| `ThirdParty` | external package declarations, product linkage, marker sources | No DevLog target dependency; may be depended on by any target | Adding DevLog feature, service, adapter, or layer dependency; changing package versions or products outside the requested scope |
| `Core` | DI primitives, logger, shared value/query types, display options, activity kinds, lightweight widget bridge values | No DevLog layer dependency; `ThirdParty` when needed | Moving domain entities into Core |
| `Core` | logger, shared value/query types, display options, activity kinds, lightweight widget bridge values | No DevLog layer dependency; `ThirdParty` when needed | Moving domain entities into Core |
Comment thread
opficdev marked this conversation as resolved.
| `Domain` | entities, repository protocols, use cases | Core, `ThirdParty` when needed | Adding Data, Infra, Persistence, Presentation, App, or Widget UI dependency |
| `Data` | repository implementations, DTOs, mappers, data protocols, widget repository/updater/sync contracts | Domain, Core, `ThirdParty` when needed | Adding WidgetKit, storage, WidgetCore snapshot model/factory usage, or platform implementation details; moving concrete widget handlers into Data |
| `Infra` | application infrastructure service implementations for social login, network, metadata, and messaging | Data, Core, `ThirdParty` when needed | Adding any Domain dependency or SDK service contract coupling |
| `Persistence` | local stores, image cache, non-widget app persistence | Data, Core, `ThirdParty` when needed | Adding WidgetCore, WidgetKit reload, Widget, widget snapshot generation, or widget bridge ownership |
| `Presentation` | UI, view models, coordinators, presentation state, narrow presentation-scoped platform side effects | Domain, Core, `ThirdParty` when needed | Adding Data, Infra, Persistence, or App dependency; expanding platform service ownership beyond UI-side effects |
| `MarkdownRenderer` | public SwiftUI renderer and reference value, internal WebKit bridge, renderer resources, TypeScript Tooling, renderer tests | system frameworks, `ThirdParty` when needed | Adding a DevLog application layer dependency, exposing WebKit bridge types, adding another Presentation importer, or re-exporting the module |
| `Widget` | app-side widget bridge, sync bus implementation, sync/session handlers, snapshot generation/persistence orchestration, WidgetKit reload bridge, widget assembler | Data, Core, WidgetCore, `ThirdParty` when needed | Adding Domain, Infra, Persistence, Presentation, or App dependency |
| `App` | composition root, lifecycle, assembler wiring, app target ownership for widget extension embedding | Concrete app layers, `ThirdParty` for framework linking | Moving feature logic into App |
| `Widget` | app-side widget bridge, sync bus implementation, sync/session handlers, snapshot generation/persistence orchestration, WidgetKit reload bridge, provider graph | Data, Core, WidgetCore, `ThirdParty` when needed | Adding Domain, Infra, Persistence, Presentation, or App dependency |
| `App` | composition root, lifecycle, Cradle graph wiring, app target ownership for widget extension embedding | Concrete app layers, `ThirdParty` for framework linking | Moving feature logic into App |
| `WidgetCore` | widget snapshot models, factories, app-group keys/defaults store, deep links, pure snapshot logic | Core, `ThirdParty` when needed | Adding Domain, Data, Infra, Persistence, Presentation, App, or Widget dependency |
| `WidgetExtension` | WidgetKit rendering and timeline plumbing | WidgetCore, `ThirdParty` when needed | Calling app/domain services directly |

Expand All @@ -179,7 +179,7 @@ flowchart TD
- `EntryTests` validates `Entry` through `Application/Presentation/Entry/Tests/**/*.swift`.
- `HomeTab`, `TodayTab`, `NotificationTab`, and `ProfileTab` remain tab-specific feature targets and each target owns the `Domain` references it needs.
- `PresentationShared` owns shared Todo, Search, Loading UI, and presentation contracts.
- `App` owns composition root, lifecycle, and assembler wiring. It must not take ownership of presentation feature or root flows.
- `App` owns composition root, lifecycle, and Cradle graph wiring. It must not take ownership of presentation feature or root flows.

## MarkdownRenderer module boundary

Expand All @@ -194,7 +194,7 @@ flowchart TD

Do not inject dependencies between types that belong to the same layer.

This rule covers initializer injection, stored-property injection, environment injection, and resolving same-layer types through `DIContainer`.
This rule covers initializer injection, stored-property injection, environment injection, and resolving same-layer types through a runtime resolver.

The only allowed exception is a SwiftUI `View` file in `Application/Presentation` receiving same-layer presentation objects such as a ViewModel, Coordinator, or Store for UI composition.

Expand Down
4 changes: 2 additions & 2 deletions .agents/rules/project-workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ This reference holds DevLog-specific working rules that should live with the pro
## Layer-internal dependency injection

- Do not inject dependencies between types that belong to the same layer.
- This includes initializer injection, stored-property injection, environment injection, and resolving same-layer types through `DIContainer`.
- This includes initializer injection, stored-property injection, environment injection, and resolving same-layer types through a runtime resolver.
- The only allowed exception is a SwiftUI `View` file in `Application/Presentation` receiving same-layer presentation objects such as a ViewModel, Coordinator, or Store for UI composition.
- The exception does not apply to non-View files in Presentation, and does not apply to Core, Domain, Data, Infra, Persistence, Widget, App, WidgetCore, or WidgetExtension.

Expand Down Expand Up @@ -100,7 +100,7 @@ This reference holds DevLog-specific working rules that should live with the pro

- Widget UI should consume snapshot data, not app/domain services.
- `WidgetCore` should stay free of Domain, Data, Infra, Persistence, Presentation, and App dependencies unless the user explicitly approves a boundary change.
- `Widget` owns the app-side widget bridge: sync event bus implementation, sync event handlers, session sync handler, auth-session sync provider, snapshot generation/persistence orchestration, WidgetKit reload bridge, and `WidgetAssembler`.
- `Widget` owns the app-side widget bridge: sync event bus implementation, sync event handlers, session sync handler, auth-session sync provider, snapshot generation/persistence orchestration, WidgetKit reload bridge, and provider graph.
- `Data` owns widget-related contracts and repository implementations, including `WidgetSyncEventBus`, `WidgetSnapshotUpdater`, and `WidgetTodoSnapshotRepository`. Data should not own concrete widget handlers, WidgetCore snapshot model/factory usage, or WidgetKit reload behavior.
- `Persistence` owns local persistence, user defaults, image store, and non-widget app persistence.
- Prefer an app-driven snapshot flow: app/runtime event, Widget sync handler, Data snapshot input fetch, Widget snapshot update, App Group storage through WidgetCore contracts, WidgetExtension rendering.
Expand Down
12 changes: 6 additions & 6 deletions .agents/workflows.md
Original file line number Diff line number Diff line change
Expand Up @@ -335,11 +335,11 @@ test -f .codex/agents/designer.toml
test ! -e .codex/agents/designer_luna.toml
test ! -e .codex/agents/code_reviewer_luna.toml
rg -qx 'name = "designer"' .codex/agents/designer.toml
rg -qx 'model = "gpt-5.6-sol"' .codex/agents/designer.toml
rg -qx 'model_reasoning_effort = "xhigh"' .codex/agents/designer.toml
rg -qx 'model = "gpt-6-astra"' .codex/agents/designer.toml
rg -qx 'model_reasoning_effort = "medium"' .codex/agents/designer.toml
rg -qx 'name = "code_reviewer"' .codex/agents/code_reviewer.toml
rg -qx 'model = "gpt-5.6-sol"' .codex/agents/code_reviewer.toml
rg -qx 'model_reasoning_effort = "xhigh"' .codex/agents/code_reviewer.toml
rg -qx 'model = "gpt-6-astra"' .codex/agents/code_reviewer.toml
rg -qx 'model_reasoning_effort = "medium"' .codex/agents/code_reviewer.toml
```

If only Markdown workflow files and agent TOML files changed, no iOS build is required.
Expand Down Expand Up @@ -409,7 +409,7 @@ Include the selected workflow name in the task packet `Source` or `Goal` field s
- Current owner: repository workflow documentation
- Architecture risk: none
- Required roles: Planner, Designer, Implementer, Code Reviewer, Verification Runner
- Model assignment: Planner=Primary, Designer=designer (SDD Gate, `gpt-5.6-sol`, `xhigh`), Implementer=Primary, Code Reviewer=code_reviewer (SDD Gate, `gpt-5.6-sol`, `xhigh`), Verification Runner=verification_runner (Lightweight)
- Model assignment: Planner=Primary, Designer=designer (SDD Gate, `gpt-6-astra`, `medium`), Implementer=Primary, Code Reviewer=code_reviewer (SDD Gate, `gpt-6-astra`, `medium`), Verification Runner=verification_runner (Lightweight)
- Custom agent `task_name`: Designer=`designer`, Code Reviewer=`code_reviewer`, Verification Runner=`verification_runner`
- Result recipient: `Primary` of the current main task
- Execution authority: app or Simulator=not allowed / external writes=not allowed / CI or PR actions=not allowed
Expand All @@ -432,7 +432,7 @@ Include the selected workflow name in the task packet `Source` or `Goal` field s
- Current owner: <layer and target identified by Planner>
- Architecture risk: none / possible / confirmed
- Required roles: GitHub/CI Analyst, Planner, Designer, Implementer, Code Reviewer, Verification Runner
- Model assignment: GitHub/CI Analyst=github_ci_analyst (Lightweight), Planner=Primary, Designer=designer (SDD Gate, `gpt-5.6-sol`, `xhigh`), Implementer=Primary, Code Reviewer=code_reviewer (SDD Gate, `gpt-5.6-sol`, `xhigh`), Verification Runner=verification_runner (Lightweight)
- Model assignment: GitHub/CI Analyst=github_ci_analyst (Lightweight), Planner=Primary, Designer=designer (SDD Gate, `gpt-6-astra`, `medium`), Implementer=Primary, Code Reviewer=code_reviewer (SDD Gate, `gpt-6-astra`, `medium`), Verification Runner=verification_runner (Lightweight)
- Custom agent `task_name`: GitHub/CI Analyst=`github_ci_analyst`, Designer=`designer`, Code Reviewer=`code_reviewer`, Verification Runner=`verification_runner`
- Result recipient: `Primary` of the current main task
- Execution authority: app or Simulator=not allowed / external writes=only user-authorized reply or resolution / CI or PR actions=inspection only
Expand Down
4 changes: 2 additions & 2 deletions .codex/agents/code_reviewer.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "code_reviewer"
description = "Read-only DevLog code reviewer focused on correctness, regressions, scope drift, and missing verification."
model = "gpt-5.6-sol"
model_reasoning_effort = "xhigh"
model = "gpt-6-astra"
model_reasoning_effort = "medium"
sandbox_mode = "read-only"
developer_instructions = """
Read AGENTS.md and .agents/roles.md before reviewing.
Expand Down
4 changes: 2 additions & 2 deletions .codex/agents/designer.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "designer"
description = "Read-only DevLog SDD gate for Design Brief analysis, Spec acceptance criteria, verification, and minimum commit units."
model = "gpt-5.6-sol"
model_reasoning_effort = "xhigh"
model = "gpt-6-astra"
model_reasoning_effort = "medium"
sandbox_mode = "read-only"
developer_instructions = """
Read AGENTS.md and .agents/roles.md before analysis.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
env:
WORKSPACE: DevLog.xcworkspace
SCHEME: App
XCODE_VERSION: "26.3"
XCODE_VERSION: "26.5"
MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }}
MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}

Expand Down
28 changes: 0 additions & 28 deletions Application/App/Sources/App/Assembler/AppAssembler.swift

This file was deleted.

32 changes: 0 additions & 32 deletions Application/App/Sources/App/Assembler/AppLayerAssembler.swift

This file was deleted.

Loading
Loading