| tracker |
| kind |
api_key |
project_slug |
active_states |
terminal_states |
github |
$GITHUB_TOKEN |
aevatarAI/aevatar |
|
Done |
Closed |
Cancelled |
Canceled |
Duplicate |
|
|
| polling |
|
| workspace |
| root |
$SYMPHONY_WORKSPACE_ROOT |
|
| git |
| user_name |
email |
eanzhao |
yiqi.zhao@aelf.io |
|
| hooks |
| after_create |
before_run |
after_run |
timeout_ms |
gh auth setup-git --hostname github.com --force
gh repo clone aevatarAI/aevatar . -- --depth=1
|
set -euo pipefail
gh auth setup-git --hostname github.com --force
git fetch origin
DEFAULT_BRANCH="${SYMPHONY_DEFAULT_BRANCH:-dev}"
BRANCH_PATTERN="*_issue-${SYMPHONY_ISSUE_NUMBER}-symphony"
EXISTING_REMOTE="$(git for-each-ref --format='%(refname:short)' "refs/remotes/origin/${BRANCH_PATTERN}" | head -n1 || true)"
EXISTING_LOCAL="$(git for-each-ref --format='%(refname:short)' "refs/heads/${BRANCH_PATTERN}" | head -n1 || true)"
if [ -n "$EXISTING_REMOTE" ]; then
BRANCH="${EXISTING_REMOTE#origin/}"
git checkout "$BRANCH"
git pull origin "$BRANCH"
elif [ -n "$EXISTING_LOCAL" ]; then
BRANCH="$EXISTING_LOCAL"
git checkout "$BRANCH"
else
BRANCH="chore/$(date +%F)_issue-${SYMPHONY_ISSUE_NUMBER}-symphony"
git checkout "$DEFAULT_BRANCH"
git pull origin "$DEFAULT_BRANCH"
git checkout -b "$BRANCH" "origin/$DEFAULT_BRANCH"
fi
dotnet restore aevatar.slnx --nologo
|
echo "Symphony finished ${SYMPHONY_ISSUE_IDENTIFIER}"
|
1200000 |
|
| agent |
| default |
max_concurrent_agents |
max_turns |
max_retry_backoff_ms |
auto_merge |
require_label |
codex |
1 |
20 |
300000 |
false |
symphony |
|
| agents |
| codex |
| command |
approval_policy |
thread_sandbox |
network_access |
turn_timeout_ms |
read_timeout_ms |
stall_timeout_ms |
codex app-server |
never |
workspace-write |
true |
3600000 |
10000 |
600000 |
|
|
| server |
|
You are working on Aevatar issue {{ issue.identifier }}: {{ issue.title }}.
Read AGENTS.md and CLAUDE.md before making changes. If they conflict, follow AGENTS.md.
- Default branch: dev
- Main solution: aevatar.slnx
- .NET SDK: 10.0.103
- Main workflow host: src/workflow/Aevatar.Workflow.Host.Api
- Mainnet host: src/Aevatar.Mainnet.Host.Api
- Frontend app: apps/aevatar-console-web using pnpm
- Do not introduce or document services on ports 5000 or 5050
Highest-Priority Repo Rules
- Keep strict layering: Domain / Application / Infrastructure / Host
- Keep CQRS, projection, actor, and read-model boundaries intact
- Do not add process-local runtime state registries or generic query/reply shortcuts
- Use strong typing for stable business semantics; do not push clear semantics into generic bags
- Delete dead code instead of preserving compatibility shells
- Identifier: {{ issue.identifier }}
- State: {{ issue.state }}
- URL: {{ issue.url }}
{% if issue.description %}
{{ issue.description }}
{% endif %}
{% if attempt %}
This is continuation attempt {{ attempt }}. Resume from the current workspace state and do not redo completed work.
{% endif %}
- If the issue has label todo, move it to in-progress before coding:
gh issue edit {{ issue.identifier }} --repo aevatarAI/aevatar --remove-label todo --add-label in-progress
- Work on the branch already checked out by the hook:
git branch --show-current
Do not create a different branch name manually.
- Stay inside the issue scope. Do not fix unrelated problems. If you find one, create a separate issue.
- Use one persistent issue comment as a workpad with marker ## Symphony Workpad.
- After implementation and verification, push the current branch and create or update a PR.
- When ready for handoff, move the issue to human-review:
- from in-progress: remove in-progress, add human-review
- from rework: remove rework, add human-review
- If blocked, update the workpad with the blocker, leave a concise explanation, and move the issue to human-review.
MARKER="## Symphony Workpad"
COMMENT_ID="$(gh api repos/aevatarAI/aevatar/issues/{{ issue.identifier | remove: "#" }}/comments --jq ".[] | select(.body | startswith(\"$MARKER\")) | .id" | head -n1)"
if [ -z "$COMMENT_ID" ]; then
gh issue comment {{ issue.identifier }} --repo aevatarAI/aevatar --body "$MARKER
- [ ] Understand issue
- [ ] Implement change
- [ ] Verify
- [ ] Prepare PR / handoff"
COMMENT_ID="$(gh api repos/aevatarAI/aevatar/issues/{{ issue.identifier | remove: "#" }}/comments --jq ".[] | select(.body | startswith(\"$MARKER\")) | .id" | head -n1)"
fi
Update the existing workpad comment instead of creating new progress comments:
gh api repos/aevatarAI/aevatar/issues/comments/$COMMENT_ID -X PATCH -f body="$MARKER
- [x] Understand issue
- [ ] Implement change
- [ ] Verify
- [ ] Prepare PR / handoff
Current focus: ..."
Verification Expectations
Run the smallest relevant validation set that honestly covers your changes:
- Default backend validation: dotnet build aevatar.slnx --nologo
- Run targeted tests for touched projects, for example:
dotnet test test/<RelevantProject>.Tests/<RelevantProject>.Tests.csproj --nologo
- If you touch apps/aevatar-console-web, run:
pnpm --dir apps/aevatar-console-web lint
- If you change workflow, projection, query/read-model, or architecture-sensitive code, run the relevant guard scripts from AGENTS.md
Do not claim tests passed unless you actually ran them.
Use the current checked-out branch for push and PR creation:
BRANCH="$(git branch --show-current)"
git push -u origin "$BRANCH"
PR="$(gh pr list --repo aevatarAI/aevatar --head "$BRANCH" --json number --jq '.[0].number')"
if [ -z "$PR" ]; then
gh pr create \
--repo aevatarAI/aevatar \
--base dev \
--head "$BRANCH" \
--title "{{ issue.identifier }}: {{ issue.title }}" \
--body "Closes {{ issue.identifier }}"
fi
- Requested work is implemented
- Relevant validation ran
- Changes are committed and pushed
- PR exists or was updated
- Issue label moved to human-review
Once those are done, stop. Do not keep polishing beyond the issue scope.