RepoAgents는 외부 시스템에 바로 반영하면 안 되는 publish 동작을 .ai-repoagents/sync/ 아래의 tracker-agnostic staging 영역에 남깁니다.
다음 상황에서 sync artifact를 사용합니다.
- tracker가 의도적으로 오프라인일 때
- comment나 PR 적용 전에 사람 handoff가 필요할 때
- 외부 쓰기 제안을 결정적으로 로컬에서 검토하고 싶을 때
.ai-repoagents/sync/
<tracker>/
issue-<id>/
<timestamp>-<action>.json
<timestamp>-<action>.md
현재 내장 writer:
local-filelocal-markdown
현재 내장 apply helper:
local-filelocal-markdown
구현 메모:
- 내장 sync apply 동작은 src/repoagents/sync_artifacts.py의
SyncActionRegistry로 등록됩니다 - tracker별 handler는 CLI 계약을 바꾸지 않고 action-level effect와 bundle resolver를 추가할 수 있습니다
계약 규칙:
<tracker>는local-markdown같은 filesystem-safe 정규화 이름을 사용issue-<id>는 issue 단위로 staged action을 묶음- 파일명은 UTC timestamp 기준이라 lexicographic sort가 곧 시간순 정렬
- JSON 파일은 machine-oriented metadata payload
- Markdown 파일은 YAML frontmatter와 본문을 가진 human-oriented proposal
정규화 스키마 필드:
artifact_role:comment-proposal,branch-proposal,pr-proposal같은 provider-neutral 역할issue_key:issue:1같은 정규화된 issue referencebundle_key: 관련 handoff artifact를 묶는 안정적인 grouping keyrefs:head,base같은 정규화된 branch/base referencelinks:self,metadata_artifact같은 provider-neutral artifact link
staged artifact 목록 보기:
uv run repoagents sync ls
uv run repoagents sync ls --issue 1
uv run repoagents sync ls --tracker local-file --action comment
uv run repoagents sync ls --tracker local-markdown --action pr-body
uv run repoagents sync ls --format jsonartifact 하나 열기:
uv run repoagents sync show local-markdown/issue-1/20260308T010101000001Z-comment.md
uv run repoagents sync show 20260308T010101000001Z-comment.md
uv run repoagents sync show /absolute/path/to/file --rawpending artifact 하나 적용:
uv run repoagents sync apply local-markdown/issue-1/20260308T010101000001Z-comment.md
uv run repoagents sync apply --issue 1 --tracker local-file --action comment --latest
uv run repoagents sync apply --issue 1 --tracker local-markdown --action comment --latest
uv run repoagents sync apply --issue 1 --tracker local-markdown --action pr-body --latest --bundle
uv run repoagents sync ls --scope applied --issue 1applied manifest 무결성 검사와 repair:
uv run repoagents sync check --issue 1
uv run repoagents sync repair --issue 1 --dry-run
uv run repoagents sync repair --issue 1
uv run repoagents sync audit --format alllocal_markdown과 local_file에서 staged artifact는 대체로 다음 publish proposal에 대응합니다.
comment.md: issue comment proposalbranch.json: branch 생성 proposalpr.json: PR metadata proposalpr-body.md: PR body proposallabels.json: label suggestion proposal
CLI inventory의 action은 파일명에 있는 action segment를 사용합니다. 실제 tracker 동작 이름은 YAML 또는 JSON metadata 안에서 다르게 보일 수 있습니다.
파싱된 artifact는 정규화 metadata block도 함께 제공하므로, downstream tooling이 branch_name, metadata_path 같은 tracker별 필드명을 직접 알 필요가 없습니다.
local_markdown의 경우:
commentartifact는 source Markdown issue frontmatter에repoagentscomment entry를 추가합니다labelsartifact는 source Markdown issue frontmatter의 label 목록에 staged label을 merge합니다branch,pr,pr-bodyartifact는.ai-repoagents/sync-applied/아래의 handled handoff bundle로 archive합니다repoagents sync apply --bundle은 관련된branch,pr,pr-bodyhandoff set을 함께 해석해서 archive합니다
local_file의 경우:
commentartifact는 sourceissues.json에repoagentscomment entry를 추가합니다labelsartifact는 sourceissues.json의 label 목록에 staged label을 merge합니다branch,pr,pr-bodyartifact는.ai-repoagents/sync-applied/아래의 handled handoff bundle로 archive합니다repoagents sync apply --bundle은 관련된branch,pr,pr-bodyhandoff set을 함께 해석해서 archive합니다
모든 apply 동작은 다음 파일을 기록하거나 갱신합니다.
.ai-repoagents/sync-applied/<tracker>/issue-<id>/manifest.json
manifest entry는 이제 더 풍부한 handoff linkage를 포함합니다.
entry_key: source artifact path 기반의 안정적인 manifest entry idarchived_relative_path:.ai-repoagents/sync-applied/아래의 provider-neutral archive pathhandoff.group_key: bundle 또는 singleton grouping keyhandoff.group_size,handoff.group_index: 같은 handoff group 안에서의 크기와 순서handoff.related_entry_keys,handoff.related_source_paths: 같은 handoff set에 속한 sibling artifact 링크
--keep-source를 쓰지 않으면 source artifact는 .ai-repoagents/sync/에서 이동됩니다.
repoagents dashboard도 applied manifest를 읽어서 모든 export 형식에 Sync handoffs, Sync retention, Reports를 함께 렌더링합니다.
- HTML:
manifest.json, archived artifact, normalized link target으로 바로 이동 가능한 link와 issue별 retention posture card - JSON:
sync_handoffs[]와 함께 prunable group 수, bytes, integrity state, age/size 데이터를 담은sync_retention - Markdown: 운영자 handoff나 incident 메모에 바로 옮길 수 있는 요약과 retention rollup
- Reports:
.ai-repoagents/reports/아래에 있는sync-audit.*,cleanup-preview.*,cleanup-result.*export가 있으면 dashboard에서 바로 열 수 있음
특히 Sync audit card에는 export된 report에서 끌어온 applied manifest integrity detail도 함께 표시합니다.
- 전체 integrity report 수
- finding이 있는 issue 수와 clean issue 수
missing_manifest,duplicate_entry_key같은 top finding count- 영향받은 issue id sample
sync audit export가 cleanup preview/result를 이미 연결하고 있으면 dashboard report card끼리도 서로 교차 참조합니다.
Sync audit는 관련 cleanup report card로 링크됩니다Cleanup preview,Cleanup result는Sync audit에서 참조되고 있음을 함께 보여줍니다
Sync audit card는 integrity finding code를 운영자용 hint로도 번역합니다. 예를 들면:
missing_manifest:repoagents sync repair --dry-run으로 manifest state 재구성duplicate_entry_key:repoagents sync repair --dry-run으로 duplicate entry canonicalizeorphan_archive_file: cleanup 전에 orphan archive 검토 및 편입
cleanup report card에는 freshness metadata도 함께 표시합니다.
- dashboard render 시점과 report
generated_at을 비교한fresh,aging,stale,future상태 3d 2h같은 사람이 읽기 쉬운 age- 같은
freshness,age필드가 dashboard JSON/Markdown export에도 포함됨
linked cleanup export가 audit snapshot과 다른 issue_filter로 생성된 경우, dashboard Sync audit card는 mismatch warning도 함께 노출합니다.
- mismatch count가 report metric에 포함됩니다
- warning 문자열이 HTML, JSON, Markdown export의 report detail에도 함께 기록됩니다
Reports summary metric도 이제 cleanup preview/result export의 freshness를 집계해서 보여줍니다.
- HTML dashboard에 현재
fresh,aging,stalecount를 담은Cleanup freshnessmetric이 추가됩니다 - 같은 집계가 dashboard JSON/Markdown snapshot에도 포함됩니다
cleanup export뿐 아니라 전체 report 집합에 대한 freshness aggregate도 함께 계산합니다.
- HTML
Reportsmetric row에 전체 export를 대상으로 한Report freshnesscard가 추가됩니다 - 같은 전체 report freshness aggregate가 dashboard JSON/Markdown snapshot에도 포함됩니다
aging report는 별도 counter로도 분리되어 표시됩니다.
- HTML dashboard에
Aging reports카드가 추가됩니다 - 같은 aging report count가 dashboard JSON/Markdown snapshot에도 포함됩니다
future-dated report도 별도 counter로 분리되어 표시됩니다.
- HTML dashboard에
Future reports카드가 추가됩니다 - 같은 future report count가 dashboard JSON/Markdown snapshot에도 포함됩니다
freshness를 계산할 수 없는 report는 운영 경고로 따로 표시됩니다.
- count가 0이 아닐 때 HTML dashboard에
Unknown freshness reports카드가 조건부로 표시됩니다 - 같은 unknown report count가 dashboard JSON/Markdown snapshot에도 포함됩니다
cleanup 전용 aging report도 별도 counter로 분리되어 표시됩니다.
- cleanup export가 있을 때 HTML dashboard에
Cleanup aging reports카드가 추가됩니다 - 같은 cleanup aging report count가 dashboard JSON/Markdown snapshot에도 포함됩니다
cleanup 전용 future report도 별도 counter로 분리되어 표시됩니다.
- cleanup export가 있을 때 HTML dashboard에
Cleanup future reports카드가 추가됩니다 - 같은 cleanup future report count가 dashboard JSON/Markdown snapshot에도 포함됩니다
freshness를 계산할 수 없는 cleanup report는 별도 경고로 표시됩니다.
- count가 0이 아닐 때 HTML dashboard에
Cleanup unknown freshness reports카드가 조건부로 표시됩니다 - 같은 cleanup unknown report count가 dashboard JSON/Markdown snapshot에도 포함됩니다
전체 Report freshness와 cleanup 전용 Cleanup freshness aggregate에는 severity도 함께 붙습니다.
- freshness metadata 누락이나 stale report가 있으면
issues - aging 또는 future report만 있으면
attention - freshness가 현재 상태이거나 report가 아직 없으면
clean
stale cleanup export는 별도 summary card로도 분리되어 표시됩니다.
- HTML
Reportsmetric row에Stale cleanup reports카드가 추가됩니다 - 같은 stale cleanup count가 dashboard JSON/Markdown snapshot에도 포함됩니다
dashboard hero banner도 최종 severity, title, reason을 그대로 반영해서, operator가 상세 Reports card를 읽기 전에 상단에서 report health posture를 바로 확인할 수 있습니다. 이 dashboard 전용 severity에는 raw export policy drift도 함께 반영되어, freshness count 자체는 깨끗해도 embedded policy mismatch가 있으면 hero가 attention으로 올라갈 수 있습니다.
repoagents doctor도 이제 실제 dashboard.report_freshness_policy threshold를 함께 보여주고, stale/unknown report가 오래 issues로 올라가지 않도록 너무 느슨하게 잡혀 있으면 경고를 출력하며, raw sync-audit.json / cleanup-*.json export의 embedded policy summary가 현재 config와 다를 때도 따로 경고합니다. 여기에 더해 threshold posture와 embedded-policy drift를 합친 Report policy health 요약도 같이 출력합니다. alignment check는 이제 sync audit / clean --report와 같은 related-report detail block 형태로 drift warning과 remediation을 보여줍니다.
repoagents doctor --format all은 같은 operator health snapshot을 .ai-repoagents/reports/doctor.json과 .ai-repoagents/reports/doctor.md로 export해서, CI나 handoff automation이 terminal scraping 없이도 같은 진단 결과를 읽을 수 있게 합니다.
repoagents status도 같은 report-health snapshot을 재사용해서, 저장된 run state와 함께 현재 report freshness severity, reason, cleanup report posture, active policy summary, 그리고 합성된 policy_health 요약을 바로 보여줍니다. raw report export가 더 오래된 embedded policy summary를 들고 있으면 policy_warning 라인 뒤에 related-report detail block을 붙여서 파일별 drift summary와 remediation guidance를 같은 형태로 보여줍니다.
repoagents status --format all은 filter된 run selection, report-health state, policy-alignment detail, persisted run metadata를 포함한 JSON/Markdown status snapshot을 .ai-repoagents/reports/status.json과 .ai-repoagents/reports/status.md에 export합니다.
repoagents sync audit도 이제 CLI summary에서 linked cleanup policy drift count를 같이 출력하고, repoagents clean --report도 export path 옆에 linked sync-audit drift count를 함께 보여줘서 raw JSON을 열기 전에 cross-report drift를 바로 볼 수 있습니다. remediation guidance까지 바로 보고 싶다면 두 명령 모두 --show-remediation을 붙이면 되고, linked issue-filter mismatch warning까지 같은 자리에서 보고 싶다면 --show-mismatches를 추가하면 됩니다. 두 플래그를 함께 켜면 mismatch warning, policy drift warning, remediation guidance가 하나의 related-report detail block으로 묶여 출력됩니다.
dashboard export는 이제 policy.report_freshness_policy metadata와 렌더링된 summary string도 함께 포함해서, downstream automation이나 공유된 snapshot만으로도 현재 severity가 어떤 threshold에서 계산됐는지 바로 확인할 수 있습니다.
각 report entry도 이제 같은 policy context를 자기 detail payload와 HTML card에 직접 포함해서, operator가 특정 report card를 읽을 때 전역 metadata row로 다시 올라가지 않아도 threshold를 바로 확인할 수 있습니다.
dashboard는 이제 각 report card의 raw policy.summary와 현재 config를 직접 비교해서, 오래된 export가 현재 threshold와 어긋나면 Policy drift reports로 드러냅니다. per-report card에서도 live policy summary와 embedded policy summary, 그리고 doctor/status와 같은 remediation guidance를 함께 보여줘서, raw report를 다시 생성해야 하는지 바로 판단할 수 있습니다.
dashboard Markdown snapshot도 이제 CLI의 related-report detail block을 따라갑니다. report entry는 기존 details= 요약을 유지하면서도, linked mismatch warning이나 related-report policy drift가 있으면 related_report_details block을 추가하고, drift가 있을 때는 같은 remediation guidance도 함께 적습니다.
HTML dashboard도 이제 같은 semantics를 Cross references 패널에서 직접 보여줍니다. 단순한 related note list 대신 mismatches와 policy drifts 섹션으로 나눠서 보여주고, policy drift가 있으면 같은 remediation guidance도 바로 아래에 붙습니다.
dashboard JSON export에도 이제 각 report entry에 related_report_detail_summary 문자열이 들어갑니다. 같은 block semantics를 평문으로 담아서, downstream tool이 구조화 배열을 다시 조립하지 않아도 warning/remediation 묶음을 바로 보여줄 수 있습니다.
이제 raw sync-audit.json / cleanup-*.json export 자체에도 같은 remediation guidance가 직접 들어갑니다.
- 관련 report의
policy_alignmentblock에remediation이 포함됩니다 - related report drift summary entry에도
remediation이 포함됩니다 - raw export의
related_reportsblock에도 같은 mismatch / policy drift / remediation 묶음을 평문으로 담은detail_summary필드가 추가됩니다 - Markdown export에도
policy_remediation/remediation줄이 들어가서 JSON을 열지 않아도 바로 대응할 수 있습니다
dashboard의 Cross references panel도 이제 related report의 policy drift note를 함께 보여줍니다. linked cleanup export나 sync audit export가 더 오래된 embedded policy로 렌더링됐으면, raw report JSON만 열지 않아도 card 안에서 바로 mismatch를 볼 수 있습니다.
유용한 명령:
uv run repoagents dashboard
uv run repoagents dashboard --format all
uv run repoagents clean --sync-applied --dry-run
uv run repoagents clean --sync-applied --dry-run --report --report-format all원래 staged 파일이 이미 .ai-repoagents/sync/에서 이동된 경우에도 dashboard는 self, metadata_artifact 같은 normalized link를 applied archive 기준으로 다시 연결합니다.
Sync retention snapshot은 cleanup.sync_applied_keep_groups_per_issue를 기준으로 각 applied issue archive를 다음처럼 분류합니다.
stable: 무결성 finding이 없고 현재 keep limit 아래에서 지울 group이 없음prunable: 무결성은 깨끗하지만 오래된 handoff group이 하나 이상 정리 대상임repair-needed: manifest integrity finding이 있어서sync repair또는 수동 점검 후에 retention을 진행해야 함
각 retention entry는 다음을 함께 보여줍니다.
- 전체/보존/정리 대상 handoff group 수
- kept/prunable bytes
- newest group age, oldest group age, oldest prunable group age
branch,pr또는comment같은 grouped action sample
repoagents clean --sync-applied는 manifest-aware하게 동작합니다.
- retention 계산 단위는 개별 entry가 아니라
handoff.group_key입니다 cleanup.sync_applied_keep_groups_per_issue를 넘는 오래된 group은 함께 정리됩니다- orphan archive 파일과 dangling manifest entry는 보수적으로 제거됩니다
--report를 같이 주면 cleanup도 .ai-repoagents/reports/cleanup-preview.json|md 또는 .ai-repoagents/reports/cleanup-result.json|md를 export합니다.
- JSON: action list, affected issue, manifest replacement count
- Markdown: 운영자용 cleanup 요약
repoagents sync check와 repoagents sync repair는 retention이 아니라 무결성에 집중합니다.
sync check는 깨진 manifest, duplicateentry_key, dangling archive reference, handoff linkage mismatch, orphan archive file을 보고합니다sync repair는 살아 있는 entry를 canonicalize하고, 빠진 metadata를 복구하고, handoff linkage를 다시 계산하고, orphan archive를manifest.json에 편입합니다
repoagents sync audit는 .ai-repoagents/reports/ 아래에 통합 report를 export합니다.
- JSON: pending staged inventory, applied manifest integrity finding, retention summary를 한 payload에 담음
- Markdown: handoff나 async review에 바로 붙일 수 있는 운영자 요약
- Cross-links: matching
cleanup-preview.*,cleanup-result.*export가 있으면 sync audit snapshot에서 함께 요약하고 연결함 - Mismatch warnings: 다른
issue_filter로 생성된 cleanup export는 별도 warning으로 보고해서 정상 매치처럼 보이지 않게 함 - Policy metadata: raw sync audit / cleanup report는 이제 active
report_freshness_policythreshold를 JSON/Markdown output 안에 직접 포함함 - Cross-linked policy drift: raw sync audit entry는 linked cleanup export의
policy_alignment를 담고, raw cleanup report도 같은 contract로 최신 sync audit export를 역참조함 - 종료 코드: applied manifest integrity issue가 있으면
1, 아니면0