feat(issue-tracker): BOARD.html 리디자인 — agent-harness 대시보드 디자인/레이아웃 채택 - #3
Merged
Conversation
가독성이 낮던 라이트 SVG 보드를 agent-harness director 대시보드의 시각 언어로 교체: 다크 테마, div 카드(168×74) + SVG 베지어 엣지, 상태별 CSS 변수 팔레트(테두리/배경/글로우), in-progress 펄스 + 토큰바, ELIGIBLE 블루 글로우, 헤더 바(진행도 done/total·라이브 카운트·팔레트 칩 필터·줌 컨트롤), 드릴 스타일 디테일 패널, 푸터 엣지 범례. 의존성은 이제 좌→우로 흐른다(blocker가 왼쪽): 레이어링·교차 최소화·셸프 팩킹은 추상 (slot, layer) 단위 그대로 두고 최종 pos 방출에서만 전치 — 교차 수는 축 교환에 불변이므로 결과 보존. 트리아지/상태 체계는 그대로: 9개 시각 상태, ELIGIBLE 계산, block/spawned/relates 엣지 종류, 에픽 박스+콜랩스, done 기본 숨김. 활성 블록 엣지는 blocker가 작업 중이면 초록(진행 중인 크리티컬 패스), 아니면 앰버. 빈 보드(티켓 0개) 렌더가 max() 빈 시퀀스로 죽던 것 가드 — Pages 워크플로가 첫 티켓 등록 전에 스케줄 렌더를 돌리는 실제 경로. 검증: mock-gh 데모 보드 13티켓 Playwright 스크린샷(기본/디테일/에픽 콜랩스, 콘솔 에러 0), tests/issue-tracker 90 assertions green.
…s에 상시 배포 agent-harness가 Linear 원격 보드를 다루는 방식(오케스트레이터가 매 틱 폴링 → board.json 원자 스냅샷 → 대시보드가 읽기 전용 렌더)의 GitHub 등가물: 이슈 이벤트 + cron 안전망(서브이슈/의존성 엣지 변경은 issues 웹훅을 안 쏨) + workflow_dispatch로 러너에서 board-map.sh --write를 실행해 BOARD.html을 Pages로 배포하는 복사용 워크플로 템플릿을 references/에 동봉, SKILL.md에 설치법 문서화. 비공개 저장소의 Pages는 Free/Pro에서 공개라는 경고를 템플릿 헤더에 명시; 플러그인 체크아웃은 PLUGIN_REPO/PLUGIN_REF로 핀.
같은 페이로드를 상태 컬럼으로 피벗한 칸반 뷰를 graph ↔ kanban 헤더 토글로 동봉 — 별도 렌더 파일 없이 BOARD.html 하나로 두 뷰 제공(Pages 배포도 동일). 컬럼은 해피패스 순서(ready → in-progress → in-review) + 일시정지/터미널 상태(빈 컬럼은 코어 4개만 유지), ready 컬럼은 ELIGIBLE 카드가 상단으로 떠오르고 헤더에 eligible 카운트 표기. 카드는 그래프와 동일한 상태 팔레트 (in-progress 펄스 포함), 클릭 → 동일 디테일 패널, 상태 칩 필터·ELIGIBLE only·done 기본 숨김이 두 뷰에 똑같이 적용. 에픽 콜랩스는 그래프 전용. 검증: mock-gh 데모 13티켓 Playwright — 칸반 기본/디테일 스크린샷, graph 라운드트립 후 카드 가시성 확인, 콘솔 에러 0; 테스트 스위트 green.
…ed 가시화 3rd-party 리뷰(Codex)에서 나온 실제 버그 3건을 before/after 렌더로 재현·수정: 1. 붕괴된 에픽으로 리라우트되는 필터-off 엣지 누수 (render 엣지 루프): resolve() 전에 원본 양끝을 hiddenBy로 먼저 검사 — done 필터로 숨긴 자식의 엣지가 붕괴 에픽 카드로 되살아나던 것 차단. (누수 1→0 확인) 2. 붕괴된 in-progress 에픽의 색이 유휴 블로커 자식의 의존성 엣지에 번짐 (edgeClass): resolve(e.from) 대신 실제 블로커 nodeById[e.from]로 판정 — block-live(초록) 오분류를 block-wait(앰버)로 교정. (초록→앰버 확인) 3. 칸반이 8개 상태만 하드코딩해 conflict/untracked 티켓이 증발 (KB_STATES): GitHub이 SSOT라 머신 밖 상태가 스냅샷에 실림 — 스냅샷에 존재하는 상태를 컬럼으로 동적 편입. 두 상태에 전용 팔레트(conflict=핑크 2px 경보, untracked=옐로 대시)·배지·칩 클래스 부여해 그래프에서도 회색 waiting으로 위장하지 않게. (board-map.sh CLASS 매핑 동반) 부수 개선: 엣지 범례를 kanban 뷰에서 숨김(칸반엔 엣지가 없음). 검증: tests/issue-tracker 그린 · Playwright로 13티켓/빈보드/XSS-타이틀/ conflict·untracked/붕괴 엣지 누수·색상 각각 재현, 콘솔 에러 0.
SSFSKIM
added a commit
that referenced
this pull request
Jul 10, 2026
Two-tier trust (review #1, human design call): developer feedback — the server-resolved role snapshot in TRIAGE_TRUSTED_ROLES (default admin), or a stripped .env #TRIAGE_DEV_CODE body prefix — is read as instruction (R1/R4 waived: dev ideas can be born ready-for-agent, labeled source:dev-feedback); user feedback keeps the conservative gate, residual risk explicitly accepted in the Decision Log. The dev code is stripped before the body reaches the prompt or ticket so it never leaks into a public issue. The rest of the review, all fixed: - #2 R2 requires a REAL file citation (path-shaped after :line strip; unknown:12 no longer counts) - #3 R3 scans risk SYMBOLS (assertStudentAccess, supabaseAdmin, RLS, generate-plan layout fns, past_exam_problems, SUPABASE_SERVICE_ROLE_KEY) in addition to paths - #4 claim issues a lease token; writeback is lease-conditional (late writeback after reclaim throws instead of clobbering); reclaim window validated at config load; second idempotency check right before registerTicket - #5 findExisting fails closed on gh search errors - #6 ticket body temp files: mkdtemp dir, mode 0600, removed in finally - #7 TRIAGE_ENABLED checked before config parsing - #8 spec drift fixed (feedback-dispatch.ts references, two-kill-switches) p86 DDL note gains triage_lease UUID. New src/trust.ts. 91 tests green, tsc clean.
This was referenced Jul 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
가독성이 낮던 라이트 SVG 보드를 agent-harness director 대시보드의 시각
언어로 교체: 다크 테마, div 카드(168×74) + SVG 베지어 엣지, 상태별 CSS
변수 팔레트(테두리/배경/글로우), in-progress 펄스 + 토큰바, ELIGIBLE 블루
글로우, 헤더 바(진행도 done/total·라이브 카운트·팔레트 칩 필터·줌 컨트롤),
드릴 스타일 디테일 패널, 푸터 엣지 범례.
의존성은 이제 좌→우로 흐른다(blocker가 왼쪽): 레이어링·교차 최소화·셸프
팩킹은 추상 (slot, layer) 단위 그대로 두고 최종 pos 방출에서만 전치 —
교차 수는 축 교환에 불변이므로 결과 보존. 트리아지/상태 체계는 그대로:
9개 시각 상태, ELIGIBLE 계산, block/spawned/relates 엣지 종류, 에픽
박스+콜랩스, done 기본 숨김. 활성 블록 엣지는 blocker가 작업 중이면
초록(진행 중인 크리티컬 패스), 아니면 앰버.
빈 보드(티켓 0개) 렌더가 max() 빈 시퀀스로 죽던 것 가드 — Pages 워크플로가
첫 티켓 등록 전에 스케줄 렌더를 돌리는 실제 경로.
검증: mock-gh 데모 보드 13티켓 Playwright 스크린샷(기본/디테일/에픽 콜랩스,
콘솔 에러 0), tests/issue-tracker 90 assertions green.