diff --git a/docs/workstreams.md b/docs/workstreams.md index 7665850..d74f403 100644 --- a/docs/workstreams.md +++ b/docs/workstreams.md @@ -87,11 +87,12 @@ Codex handles the request only under an existing acceptance-criteria task with m ## Delivery waves -1. Codex completes OAuth core, TASK-004 API foundations, and TASK-005 repository/ref selection. -2. After TASK-005's reviewed contract commit, Claude builds TASK-006 in a separate worktree while Codex builds TASK-009 history/diff contracts. -3. After both are reviewed, Claude builds TASK-007 while Codex builds TASK-010 work-item contracts and integrates TASK-006. -4. After TASK-010's reviewed contract commit, Claude builds TASK-008 while Codex verifies merged history/navigation behavior. -5. Codex performs final integration and all repository-wide gates. +1. Claude may immediately build TASK-006A from freeze commit `0929282` while Codex builds TASK-002A and TASK-002B. +2. Codex completes TASK-004 API foundations and TASK-005 repository/ref selection; TASK-006A is reviewed and integrated independently. +3. After TASK-005's reviewed contract commit, Claude builds the remaining TASK-006 UI in a separate worktree while Codex builds TASK-009 history/diff contracts. +4. After both are reviewed, Claude builds TASK-007 while Codex builds TASK-010 work-item contracts and integrates TASK-006. +5. After TASK-010's reviewed contract commit, Claude builds TASK-008 while Codex verifies merged history/navigation behavior. +6. Codex performs final integration and all repository-wide gates. ## Cross-review diff --git a/prompts/claude-task-006a.md b/prompts/claude-task-006a.md new file mode 100644 index 0000000..0c71675 --- /dev/null +++ b/prompts/claude-task-006a.md @@ -0,0 +1,18 @@ +# Claude kickoff: TASK-006A + +Work only on TASK-006A in a separate worktree and a `claude/` branch created from the Codex assignment commit containing this prompt. The shared domain contract is frozen at commit `0929282`; verify that the relevant domain files have not changed since that commit. + +Read completely, in order: + +1. `AGENTS.md` +2. `CLAUDE.md` +3. `docs/product.md` +4. `docs/architecture.md` +5. `docs/collaboration.md` +6. `docs/workstreams.md` +7. `tasks/003-repository-browser-foundation.md` +8. `tasks/006a-code-content-classifier.md` + +You are the implementer for this task and Codex is the reviewer. Your only writable paths are the three paths listed in TASK-006A. Do not edit Gradle, domain, data, Android resources, manifests, navigation, other tasks, or other feature packages. + +Implement the smallest pure Kotlin classifier satisfying every acceptance criterion. Run all required checks, inspect the actual diff, update only TASK-006A evidence/review sections, commit on a `claude/` branch, and hand off the exact commit to Codex. If the frozen contracts are insufficient, stop and submit the structured shared-contract request from `docs/workstreams.md`; do not modify shared files. diff --git a/tasks/006-code-browser.md b/tasks/006-code-browser.md index 7d71578..2b426c3 100644 --- a/tasks/006-code-browser.md +++ b/tasks/006-code-browser.md @@ -1,6 +1,6 @@ # TASK-006: Browse trees and source code by ref -Status: planned — depends on TASK-005 +Status: planned — depends on TASK-005 and TASK-006A Owner: Claude Reviewer: Codex diff --git a/tasks/006a-code-content-classifier.md b/tasks/006a-code-content-classifier.md new file mode 100644 index 0000000..4e43c81 --- /dev/null +++ b/tasks/006a-code-content-classifier.md @@ -0,0 +1,57 @@ +# TASK-006A: Classify source content safely + +Status: ready — shared domain contract frozen at commit `0929282` +Owner: Claude +Reviewer: Codex + +## Outcome + +Classify already-loaded repository content into bounded text, binary, Git LFS pointer, unsupported encoding, or oversized states so the future code viewer never blindly decodes or renders arbitrary bytes. + +## Contract freeze + +- Shared domain contract commit: `0929282`. +- Claude starts from the later Codex assignment commit that adds this task and prompt; no shared domain file may differ from `0929282` without an approved contract change. +- Input contracts: `SourceContent`, `SourceFile`, `RepositoryPath`, and `RepositoryRef` from TASK-003. +- This task must not change the frozen domain contracts. Required changes use the request format in `docs/workstreams.md`. + +## Writable paths + +- `app/src/main/java/com/ubisam/ubgitea/feature/codebrowser/content/` +- `app/src/test/java/com/ubisam/ubgitea/feature/codebrowser/content/` +- `tasks/006a-code-content-classifier.md` evidence and review sections only + +## Acceptance criteria + +- [ ] Classification results are immutable and distinguish text, binary, Git LFS pointer, unsupported encoding, and oversized content. +- [ ] Maximum input bytes, rendered characters, and rendered lines are constructor-injected positive limits. +- [ ] Oversized input is rejected before text decoding and exposes only safe metadata, not decoded content. +- [ ] Binary detection includes NUL bytes and does not convert arbitrary bytes to replacement characters. +- [ ] Text decoding uses a strict UTF-8 decoder that reports malformed or unmappable input. +- [ ] A Git LFS pointer is recognized only from its canonical version line and required object ID/size fields within configured bounds. +- [ ] Rendered text is explicitly marked truncated when character or line limits are exceeded. +- [ ] No Android, network, persistence, token, logging, or write-operation dependency appears in the package. +- [ ] Tests cover empty/ASCII/Korean text, CRLF, malformed UTF-8, NUL/binary, valid and malformed LFS pointers, exact/over byte limits, line limits, character limits, and defensive immutability. + +## Security and privacy + +- Test fixtures must contain only synthetic public content. +- Classification errors must not include source content in messages. +- The classifier does not persist content or place it on the clipboard. + +## Required checks + +```text +./gradlew assembleDebug +./gradlew testDebugUnitTest +./gradlew lintDebug +./gradlew testDebugUnitTest --tests "com.ubisam.ubgitea.feature.codebrowser.content.*" +``` + +## Handoff + +Claude must provide the exact branch/commit, changed paths, acceptance-criteria evidence, check results, open findings, and a request for Codex review. No integration or shared-file edit is authorized by this task. + +## Evidence + +Pending Claude implementation.