2026-07-21 04:22:12 +02:00
# Issue Core — External Tracker Connector
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
**A backend-agnostic connector to third-party issue trackers (Gitea/Forgejo, GitHub, …), not the fleet's internal work-origin or coordination substrate.**
2025-10-25 00:54:20 +02:00
## Purpose
2026-07-21 04:22:12 +02:00
**issue-core** is a standardized abstraction layer for talking to external issue-tracking backends (Gitea, GitHub, GitLab, local SQLite cache). Instead of each agent or automation implementing platform-specific APIs, they use one consistent CLI and Python interface — and, going forward, a durable **work-record UUID ↔ external issue id** mapping when a tracker projection is switched on.
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
### Fleet coordination vs external trackers
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
Internal fleet work is **not** originated here. Work records (workplans, tasks, intake, decisions, …) live as **repo files** (ADR-001) and are indexed by state-hub under the work-record types canon — see `the-custodian/canon/standards/work-record-types_v0.1.md` and `the-custodian/research/WorkOrchestrationArchitectureDraft.md` §4.2.
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
issue-core's role (founder-reviewed, 2026-07-20):
- **Connector** to external issue-tracking systems when collaboration requires them
- **Mapping** between internal work-record UUIDs and external issue ids (design: `docs/uuid-external-id-mapping.md` )
- **Two-way boundary sync** when a third-party tracker is actually in use
- **Zero load** on the internal loop until an external integration is switched on
External trackers remain useful for:
- **Human / open-source collaboration** on GitHub, Forgejo, Jira, etc.
- **Communication** via comments when the counterparty lives in that UI
- **Visibility** for people who only watch the tracker, not the fleet hub
- **Optional projection** of a work record outward (not birth of the work record)
For agent coordination *inside* the Coulomb fleet, use work records + state-hub, not Forgejo as the default task board. See `INTENT.md` and `SCOPE.md` .
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
## Current Status
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
**Production-ready core with manual setup** (v1.0)
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
✅ **Fully Implemented:**
- Complete CRUD operations (issues, labels, users, milestones, comments)
- Gitea backend (production-ready with full API integration)
- Local SQLite backend (offline work with sync capability)
- CLI with JSON output for machine parsing
- Python API for programmatic access
- Comprehensive filtering and search
- Basic synchronization between backends
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
⚠️ **Current Limitations:**
- Manual backend configuration required (one-time setup per project)
- No auto-detection from git remotes (coming in v1.1)
- Basic conflict resolution (manual intervention for complex cases)
- Hardcoded user context (agents need external identity management)
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
## Quick Start
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
### Installation
2025-10-25 00:54:20 +02:00
```bash
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
cd capabilities/issue-core
pip install -e . # CLI only
pip install -e ".[api]" # CLI + REST ingestion server
2025-10-25 00:54:20 +02:00
```
2026-07-21 04:22:12 +02:00
### REST Server (intentional external issues)
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
2026-07-21 04:22:12 +02:00
issue-core exposes `POST /issues/` for **authenticated clients that deliberately
create external tracker issues**. This is not the primary fleet path for
originating work (work records start as repo files). activity-core's
`IssueSink` may call this only when an external issue is intentional policy —
not as an always-on landing zone for internal findings.
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
```bash
export ISSUE_CORE_API_KEY="$(python -c 'import secrets; print(secrets.token_urlsafe(32))')"
issue serve --host 0.0.0.0 --port 8765
```
Clients authenticate with `Authorization: Bearer <key>` or `X-API-Key: <key>` .
See `SCOPE.md` "TaskSpec payload" for the request schema, or visit
`http://<host>:<port>/docs` once the server is running for live OpenAPI docs.
2025-12-17 19:32:37 +01:00
### Configuration (One-Time Setup)
**For Gitea-backed projects:**
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
# Set your Gitea token
export GITEA_API_TOKEN="your-token-here"
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Configure backend
issue backend add myproject gitea
# Prompts for: URL, owner, repo (reads token from environment)
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Set as default
issue backend set-default myproject
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Verify
issue backend test myproject
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
**For local/offline work:**
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
issue backend add local-work local
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
# Prompts for: database path (.issue-core/issues.db)
2025-12-17 19:32:37 +01:00
issue backend set-default local-work
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
### Basic Usage
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
# List issues (JSON output for agents)
issue list --format=json
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Create issue
issue create "Implement user authentication" \
--label=feature --label=priority:high
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Update state
issue edit 42 --state=in_progress --assignee=agent-coder
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Add comment
issue comment 42 "Implementation complete, tests passing"
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Close issue
issue close 42 --comment="Ready for review"
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
## Agent Integration
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
**Prefer work records + state-hub for fleet task lifecycle.** Use issue-core when
an agent must operate on an **external tracker** (project a task, update a
Forgejo/GitHub issue, sync comments at the boundary).
See ** [AGENT_INTEGRATION.md ](AGENT_INTEGRATION.md )** for:
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
- Programmatic Python API usage
2026-07-21 04:22:12 +02:00
- Multi-agent patterns **against tracker backends** (not as the fleet board)
- Label-based filters and state machine workflows on external issues
- Comment-based communication when the counterparty is in the tracker UI
2025-12-17 19:32:37 +01:00
- Workarounds for current limitations
- Performance optimization tips
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
Quick example:
```python
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
from issue_core.backends.gitea import GiteaBackend
from issue_core.core.interfaces import IssueFilter
2025-12-17 19:32:37 +01:00
# Initialize
backend = GiteaBackend()
backend.connect(config)
# Query issues for agent
issues = backend.list_issues(IssueFilter(
state='open',
labels=['bug', 'priority:critical'],
assignee='agent-coder'
))
# Process each issue
for issue in issues:
# Agent implements fix
result = agent.fix_bug(issue)
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
# Report back
issue.state = IssueState.CLOSED
backend.update_issue(issue)
2025-10-25 00:54:20 +02:00
```
## Architecture
2025-12-17 19:32:37 +01:00
### Facade Pattern with Plugin Backends
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
┌─────────────────────────────────────┐
│ CLI Layer (Click) │
│ issue list | create | edit │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ Core Domain Models │
│ (Issue, Label, User, etc.) │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ Backend Interface (ABC) │
│ IssueBackend, SyncableBackend │
└──────────────┬──────────────────────┘
│
┌───────┴────────┐
│ │
┌──────▼─────┐ ┌──────▼──────┐
│ Local │ │ Gitea │
│ (SQLite) │ │ (REST API) │
└────────────┘ └─────────────┘
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
**Key Design Principles:**
- Backend-agnostic core models
- Plugin architecture for easy backend addition
- Type-safe interfaces with comprehensive testing
- Sync support for offline/online workflows
### Supported Backends
| Backend | Status | Features |
|---------|--------|----------|
| **Gitea** | ✅ Production | Full API, rate limiting, state mapping |
| **Local SQLite** | ✅ Production | Offline work, fast queries, sync support |
| **GitHub** | 🚧 Planned (v1.1) | Full API integration |
| **GitLab** | 🚧 Planned (v1.2) | Full API integration |
## Use Cases
2026-07-21 04:22:12 +02:00
### 1. External tracker ops (when a backend is in use)
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
Agents or humans work issues that already live in Gitea/GitHub (e.g. OSS
inbound, customer Jira, or an intentional projection):
2025-10-25 00:54:20 +02:00
```bash
2026-07-21 04:22:12 +02:00
# List open external issues for a label
issue list --label=needs-implementation --format=json
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
# Claim and update state on the tracker
issue edit 42 --assignee=agent-coder --state=in_progress
issue comment 42 "Implementation complete, tests passing"
issue close 42 --comment="Ready for review"
```
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
Fleet-internal task claim/execute should use workplan task status in the repo
+ state-hub, not Forgejo by default.
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
### 2. Human collaboration through a tracker UI
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
When the counterparty only uses GitHub/Gitea, project or update the external
issue and keep comments there. Mapping design (UUID ↔ external id) will tie
that projection back to the work record — see `docs/uuid-external-id-mapping.md` .
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
### 3. Offline development with sync
2025-12-17 19:32:37 +01:00
Work offline with local backend, sync when online:
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
# Setup local backup
issue backend add backup local
issue sync pull gitea-production backup
# Work offline
issue backend set-default backup
2026-07-21 04:22:12 +02:00
issue create "Offline tracker note" --label=offline
2025-12-17 19:32:37 +01:00
# Sync back
issue sync push backup gitea-production
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
## CLI Commands Reference
### Issue Operations
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
issue list [--state STATE] [--label LABEL] [--assignee USER] [--format FORMAT]
issue show ISSUE_NUMBER [--comments] [--format FORMAT]
issue create TITLE [--description DESC] [--label LABEL] [--assignee USER]
issue edit ISSUE_NUMBER [--title TITLE] [--state STATE] [--add-label LABEL]
issue close ISSUE_NUMBER [--comment COMMENT]
issue reopen ISSUE_NUMBER [--comment COMMENT]
issue comment ISSUE_NUMBER BODY
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
### Backend Management
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
issue backend list
issue backend add NAME TYPE
issue backend remove NAME
issue backend test NAME
issue backend set-default NAME
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
### Synchronization
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
issue sync status
issue sync pull SOURCE TARGET [--dry-run] [--force]
issue sync push SOURCE TARGET
issue sync bidirectional BACKEND1 BACKEND2
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
## Development
### Testing
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
# Install with dev dependencies
make install-dev
# Run all tests (109 tests, 61% coverage)
make test
# Run with coverage report
make test-cov
# Run only unit tests
make test-unit
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
### Code Quality
2025-10-25 00:54:20 +02:00
```bash
2025-12-17 19:32:37 +01:00
# Run linter
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
make issue-core-lint
2025-12-17 19:32:37 +01:00
# Format code
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
black issue_core/ tests/
2025-12-17 19:32:37 +01:00
# Type check
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
mypy issue_core/
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
### Project Structure
```
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
issue-core/
├── issue_core/
2025-12-17 19:32:37 +01:00
│ ├── core/ # Domain models and interfaces
│ │ ├── models.py # Issue, Label, User, etc.
│ │ └── interfaces.py # IssueBackend, SyncableBackend
│ ├── backends/
│ │ ├── gitea/ # Gitea backend implementation
│ │ └── local/ # SQLite backend implementation
│ └── cli/ # Click-based CLI
│ ├── commands.py # Issue operations
│ ├── backend_commands.py
│ └── sync_commands.py
├── tests/ # 109 tests, comprehensive coverage
├── examples/ # Agent integration examples
├── AGENT_INTEGRATION.md # Agent coordination guide
├── CLAUDE.md # Development guide for Claude Code
└── ROADMAP.md # Future enhancements
2025-10-25 00:54:20 +02:00
```
2025-12-17 19:32:37 +01:00
## Documentation
2026-07-21 04:22:12 +02:00
- **[INTENT.md ](INTENT.md )** — why issue-core exists (connector, not landing zone)
- **[SCOPE.md ](SCOPE.md )** — in/out of scope and integration boundaries
- **[docs/uuid-external-id-mapping.md ](docs/uuid-external-id-mapping.md )** — mapping design (not implemented yet)
- **[AGENT_INTEGRATION.md ](AGENT_INTEGRATION.md )** — programmatic API for tracker backends
- **[ROADMAP.md ](ROADMAP.md )** — feature trajectory (connector-aligned)
- Work-record canon: `the-custodian/canon/standards/work-record-types_v0.1.md`
- Architecture §4.2: `the-custodian/research/WorkOrchestrationArchitectureDraft.md`
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
## Roadmap (summary)
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
### Connector alignment (docs — ISSUE-WP-0004)
- INTENT / SCOPE / README framing as external connector
- UUID ↔ external-id mapping design
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
### v1.1 - Auto-Configuration
2025-12-17 19:32:37 +01:00
- Automatic git remote detection
- Environment-variable-only setup
- Per-repository configuration files
- `issue config detect` command
2026-07-21 04:22:12 +02:00
### Mapping + boundary sync (stage-3 work-record architecture)
- Persist work-record UUID ↔ backend issue id
- Optional two-way sync when a tracker is switched on
- No load when integrations are off
2025-12-17 19:32:37 +01:00
2026-07-21 04:22:12 +02:00
### Further backends / agent helpers
- GitHub, GitLab, Jira backends
- Claiming helpers for external issues
- Webhooks for tracker-side events
2025-12-17 19:32:37 +01:00
## Comparison with Platform CLIs
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
| Feature | Issue Core | gh (GitHub) | glab (GitLab) |
2025-12-17 19:32:37 +01:00
|---------|--------------|-------------|---------------|
| Multi-backend support | ✅ Yes | ❌ GitHub only | ❌ GitLab only |
| Offline capability | ✅ Local SQLite | ❌ No | ❌ No |
| Agent-friendly API | ✅ Python + JSON | ⚠️ CLI only | ⚠️ CLI only |
| Consistent interface | ✅ Same across all | ❌ Platform-specific | ❌ Platform-specific |
| Backend sync | ✅ Yes | ❌ No | ❌ No |
| Auto-configuration | 🚧 Coming v1.1 | ✅ Yes | ✅ Yes |
2025-10-25 00:54:20 +02:00
## Contributing
feat: rename to issue-core and add task ingestion endpoint
Renames the package, distribution, CLI alias, Makefile targets, and
working directory from issue-facade to issue-core, signalling its
role as the authoritative task lifecycle manager for the Coulomb org
(peer to activity-core, rules-core, project-core).
Adds POST /issues/ ingestion endpoint for activity-core's IssueSink,
under a new optional [api] extra. The endpoint is served by `issue
serve`, authenticates via the ISSUE_CORE_API_KEY env var (Bearer or
X-API-Key header), and routes the TaskSpec payload to the configured
default backend with full traceability metadata embedded in
sync_metadata.
- T01: Python package issue_tracker -> issue_core, dir rename
- T02: registered in state hub under custodian domain
- T03: INTENT.md (what it is, what it isn't, how it fits)
- T04: SCOPE.md (in/out-of-scope, integration boundaries)
- T05: POST /issues/ via FastAPI + Uvicorn, 9 unit tests
- T06: docs/nats-task-ingestion.md design stub
Closes ISSC-WP-0001.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 05:16:27 +02:00
The Issue Core is designed to be extensible:
2025-12-17 19:32:37 +01:00
**To add a new backend:**
1. Implement the `IssueBackend` interface (see `core/interfaces.py` )
2. Handle platform-specific API details in your backend
3. Map platform models to/from core domain models
4. Add comprehensive tests
5. Register in `BackendFactory`
**Backend implementation checklist:**
- [ ] All CRUD operations (issues, labels, users, milestones, comments)
- [ ] State mapping to/from platform-specific states
- [ ] Error handling and rate limiting
- [ ] Sync support (if applicable)
- [ ] Integration tests with mock API
- [ ] Documentation
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
See existing backends (Gitea, Local) as reference implementations.
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
## Why "Facade" / connector?
2025-10-25 00:54:20 +02:00
2026-07-21 04:22:12 +02:00
The **Facade Pattern** still describes the *implementation* style:
2025-12-17 19:32:37 +01:00
> *"Provide a unified interface to a set of interfaces in a subsystem."*
> — Gang of Four, Design Patterns
2026-07-21 04:22:12 +02:00
Instead of agents learning different APIs for GitHub (`gh` ), GitLab (`glab` ), Gitea, JIRA, etc., they use one consistent interface. The facade does not replace issue trackers — and it does **not** replace work records as the origin of fleet work. It connects the fleet to trackers at the boundary.
2025-12-17 19:32:37 +01:00
## License
2025-10-25 00:54:20 +02:00
2025-12-17 19:32:37 +01:00
MIT License - See LICENSE file