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>
This commit is contained in:
2026-05-17 05:16:27 +02:00
parent 99ea1fbc45
commit b605d970e3
38 changed files with 1324 additions and 361 deletions

View File

@@ -1,6 +1,6 @@
# Capability Bootstrap System
**How coding agents discover and integrate the issue-facade capability.**
**How coding agents discover and integrate the issue-core capability.**
## Design Philosophy
@@ -44,7 +44,7 @@ Comprehensive guide for coding agents:
- Error handling
- Examples
**Injected into:** `.claude/capabilities/issue-facade.md` in main project
**Injected into:** `.claude/capabilities/issue-core.md` in main project
### 3. Integration Automation
@@ -61,7 +61,7 @@ Interactive script that:
```bash
make integrate
# or
cd capabilities/issue-facade && ./.capability/integrate.sh
cd capabilities/issue-core && ./.capability/integrate.sh
```
### 4. Integration Checklist
@@ -81,7 +81,7 @@ Step-by-step checklist for humans integrating the capability:
```
Main Project Setup
├── 1. Human runs: cd capabilities/issue-facade && make integrate
├── 1. Human runs: cd capabilities/issue-core && make integrate
├── 2. Script installs capability
├── 3. Script configures backend (prompts for credentials)
├── 4. Script copies agent-context.md → .claude/capabilities/
@@ -101,13 +101,13 @@ Main Project Setup
Agent Workflow
├── 1. Agent receives task involving issues
├── 2. Agent checks .claude/capabilities/ for relevant docs
├── 3. Agent finds issue-facade.md with comprehensive guide
├── 3. Agent finds issue-core.md with comprehensive guide
├── 4. Agent uses Python API or CLI as documented
└── 5. Agent avoids direct API calls (warned in docs)
```
**Key Files Agent Reads:**
- `.claude/capabilities/issue-facade.md` - Complete usage guide
- `.claude/capabilities/issue-core.md` - Complete usage guide
- `.claude/context/capabilities.md` - High-level capability list
- `.claude/commands/use-issues.md` - Slash command for context injection
@@ -116,18 +116,18 @@ Agent Workflow
```
project-root/
├── capabilities/
│ └── issue-facade/ # Capability code
│ └── issue-core/ # Capability code
│ ├── CAPABILITY-issue-tracking.yaml # Machine-readable metadata
│ ├── .capability/
│ │ ├── agent-context.md # Agent guide (source)
│ │ ├── integrate.sh # Integration script
│ │ └── README.md # This file
│ ├── issue_tracker/ # Python package
│ ├── issue_core/ # Python package
│ └── ...
├── .claude/ # Claude Code configuration
│ ├── capabilities/ # Capability docs for agents
│ │ └── issue-facade.md # Agent guide (copy)
│ │ └── issue-core.md # Agent guide (copy)
│ │
│ ├── commands/ # Slash commands
│ │ └── use-issues.md # /use-issues command
@@ -135,7 +135,7 @@ project-root/
│ └── context/ # Always-available context
│ └── capabilities.md # List of all capabilities
└── .issue-facade/ # Capability config (gitignored)
└── .issue-core/ # Capability config (gitignored)
├── config.json # Backend configuration
└── issues.db # Local cache/backup
```
@@ -150,13 +150,13 @@ import os
from pathlib import Path
def has_issue_capability(project_root: Path) -> bool:
"""Check if issue-facade capability is available."""
capability_guide = project_root / ".claude/capabilities/issue-facade.md"
"""Check if issue-core capability is available."""
capability_guide = project_root / ".claude/capabilities/issue-core.md"
return capability_guide.exists()
if has_issue_capability(Path.cwd()):
# Use capability
from issue_tracker.backends.gitea import GiteaBackend
from issue_core.backends.gitea import GiteaBackend
backend = GiteaBackend()
else:
# Fall back or prompt human
@@ -173,15 +173,15 @@ def get_capability_docs(capability_name: str) -> str:
return None
# Agent can read and understand the guide
docs = get_capability_docs("issue-facade")
docs = get_capability_docs("issue-core")
# Parse docs for API usage patterns...
```
**3. Use the API as documented:**
```python
# Example from agent-context.md
from issue_tracker.backends.gitea import GiteaBackend
from issue_tracker.core.interfaces import IssueFilter
from issue_core.backends.gitea import GiteaBackend
from issue_core.core.interfaces import IssueFilter
backend = GiteaBackend()
backend.connect(config)
@@ -204,8 +204,8 @@ response = requests.post(
**Good (Uses capability):**
```python
# ✅ Uses capability
from issue_tracker.backends.gitea import GiteaBackend
from issue_tracker.core.models import Issue, IssueState
from issue_core.backends.gitea import GiteaBackend
from issue_core.core.models import Issue, IssueState
from datetime import datetime, timezone
backend = GiteaBackend()
@@ -302,7 +302,7 @@ make integrate
make discover-capabilities
# Output:
# Found capabilities:
# - issue-facade (v1.0.0) - Issue tracking coordination
# - issue-core (v1.0.0) - Issue tracking coordination
# - ... (other capabilities)
# Auto-integrate all
@@ -318,7 +318,7 @@ Capabilities have priority scores (0-100) indicating importance:
- **50-69 (Medium):** Use when available
- **Below 50 (Low):** Optional convenience
**issue-facade priority: 95 (Critical)**
**issue-core priority: 95 (Critical)**
Agents should check priority when deciding whether to use a capability or fall back to alternatives.
@@ -367,7 +367,7 @@ Agents should check priority when deciding whether to use a capability or fall b
## FAQ
**Q: Why not just document "use issue-facade" in README?**
**Q: Why not just document "use issue-core" in README?**
A: Agents often skip general docs. Putting it in `.claude/capabilities/` makes it part of their working context.
**Q: What if agent bypasses capability anyway?**
@@ -405,10 +405,10 @@ response = requests.post(gitea_url + "/issues", ...)
**With capability (properly integrated):**
```python
# Agent checks .claude/capabilities/issue-facade.md
# Agent checks .claude/capabilities/issue-core.md
# Reads: "Use this API, don't use direct requests"
# Agent follows documented pattern:
from issue_tracker.backends.gitea import GiteaBackend
from issue_core.backends.gitea import GiteaBackend
backend = GiteaBackend()
backend.connect(config)
backend.create_issue(issue)