# UBGitea current status and development roadmap Last updated: 2026-08-25 Reviewed handoff package commit: `57d1c09` Claude activation ref: `handoff/task-006a-ready` Active branch: `codex/repository-browser-foundation` ## Completed and verified ### Project foundation - Android application ID `com.ubisam.ubgitea`; Android 9/API 28 minimum. - Kotlin, Jetpack Compose, Material 3, API 36 target, JDK 17. - Immutable repository/branch/tree/file/commit domain contracts and read-only use-case boundaries. ### Authentication and repository list - Production Gitea default: `https://gitea.ubisampaju.synology.me`. - OAuth 2.0 Authorization Code with fresh PKCE S256 and state per attempt. - Credentials are entered only in the system browser; no WebView and no client secret. - Exact verified HTTPS App Link callback at `/ubisampaju/oauth/callback`. - One-time pending transaction consumption, callback expiry/state validation, login cancellation, and failure recovery. - Android Keystore AES-GCM token protection, backup exclusion, redacted token representation, and logout deletion. - Authenticated `/api/v1/user` identity check followed by bounded, paginated, ID-deduplicated `/api/v1/user/repos` loading. - Korean signed-out, browser-waiting/cancel, loading, content, empty, offline, permission, authentication-expired, callback-error, and server-error states. - Repository rows display owner/name, visibility, optional description, and default branch. ### Evidence - Implementation commit: `a4451e9`. - Device E2E closure commit: `fc9d78a`. - Product owner verified real account login and internal repository list on the target device. - Debug build, 57 unit tests, Android lint, diff check, and sensitive-pattern scan passed. - Final independent review reported no unresolved P0/P1. - Hosted `assetlinks.json` is external infrastructure; the user-owned workspace copy remains untracked and must not be committed. ## Immediate serial handoff Claude may implement `TASK-006A` only from immutable Git tag `handoff/task-006a-ready`. The tag must resolve to a commit containing this status, task scope, prompt, mailbox rules, and review closure. - Outcome: classify already-loaded source bytes as bounded text, binary, Git LFS pointer, unsupported encoding, or oversized content. - Writable scope: only the paths listed in `tasks/006a-code-content-classifier.md`. - Why it can start now: it is pure Kotlin, uses frozen TASK-003 domain inputs, and does not depend on unfinished HTTP or navigation work. - Required handback: exact commit/diff, acceptance checklist, focused and repository-wide check results, known limitations, and a request for Codex read-only review. - Claude must stop after TASK-006A. TASK-006 UI is not authorized until Codex freezes TASK-004/005 contracts. ## Remaining delivery sequence | Order | Task and owner | What will be developed | Implementation approach and exit gate | |---|---|---|---| | 1 | TASK-006A — Claude | Safe source-content classifier | Pure Kotlin strict UTF-8 decoding, byte/character/line limits, binary and canonical LFS detection; focused tests plus build/test/lint; Codex review. | | 2 | TASK-004 remainder — Codex | Branch, tag, tree, file, and commit read-only Gitea APIs | Add endpoint DTOs and domain mapping, safe per-component URL encoding, typed failures, bounded pagination, fake-transport tests; Claude review. | | 3 | TASK-005 remainder — Codex | Repository selection and branch/tag list | Compose/ViewModel unidirectional state, selected repository/ref, refresh/retry/dedupe, Korean accessible states, navigation contract; device check and Claude review; record contract-freeze commit. | | 4 | TASK-006 — Claude | Tree navigation and source viewer | Consume frozen APIs and TASK-006A classifier; keep repository/ref/path visible; bounded rendering and explicit fallbacks; Compose/presentation tests; Codex review/integration. | | 5 | TASK-009 — Codex | Commit-history, changed-file, diff, and comparison contracts | Immutable typed contracts, independent ref encoding, pagination and truncation bounds, representative JSON/failure tests; Claude review and freeze. | | 6 | TASK-007 — Claude | Commit history and change viewer | Paginated history, commit metadata/files, rename/delete states, bounded patches and comparisons; accessible Compose tests; Codex integration. | | 7 | TASK-010 — Codex | Pull-request, issue, review, and comment contracts | Separate immutable DTO/domain models, nullable/deleted-author handling, typed failures, read-only endpoints and fake tests; Claude review and freeze. | | 8 | TASK-008 — Claude | Pull-request and issue read-only UI | Distinct PR/issue models and lists/details/comments, pagination/retry/accessibility states; Codex integration. | | 9 | Future accepted task — Codex | Notifications, organizations, release hardening | Create acceptance-criteria tasks first; add read-only APIs/UI, final device regression, signing/release evidence and secret scan. | ## Rules for every next task - Never implement without an acceptance-criteria task. - Work serially: one writer, one working tree, one bounded task. - Do not edit shared domain/data/navigation/Gradle/manifest files from a Claude-owned feature task; ask Codex through the mailbox. - Do not contact production from automated tests. - Preserve read-only product behavior; no create/edit/merge/delete/admin endpoint. - Run task-focused tests, full unit tests, debug build, lint, diff check, and sensitive-pattern scan. - Append the feature, design, checks, review resolutions, limitations, and next owner to `docs/development-log.md`.