feat: Initial project structure

- FastAPI backend with routers (webhook, issues, config)
- Services: JIRA, Bitbucket, LLM, Embeddings
- Docker Compose with PostgreSQL, Redis, Qdrant
- Documentation (technical + executive) in PT and EN
- .env.example with all required variables

Developed by OpenClaw AI Assistant
This commit is contained in:
Ricel Leite 2026-02-18 13:33:43 -03:00
parent 7ce20cd530
commit f0fe5a7538
22 changed files with 4679 additions and 2 deletions

39
.env.example Normal file
View File

@ -0,0 +1,39 @@
# Server
JIRA_URL=https://gojira.tsacorp.com
JIRA_TOKEN=your_jira_token
JIRA_WEBHOOK_SECRET=random_secret_for_webhook_validation
BITBUCKET_URL=https://bitbucket.tsacorp.com
BITBUCKET_TOKEN=your_bitbucket_token
# LLM (Production - Azure OpenAI)
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com
AZURE_OPENAI_KEY=your_azure_key
AZURE_OPENAI_MODEL=gpt-4o
AZURE_OPENAI_EMBEDDING_MODEL=text-embedding-3-large
# LLM (Development - OpenRouter Free)
OPENROUTER_API_KEY=your_openrouter_key
OPENROUTER_MODEL=meta-llama/llama-3.3-70b-instruct:free
# Use Azure (production) or OpenRouter (development)
LLM_PROVIDER=openrouter
# Database
DATABASE_URL=postgresql://aci:aci@localhost:5432/aci_fixer
# For development with SQLite:
# DATABASE_URL=sqlite:///./aci_fixer.db
# Redis
REDIS_URL=redis://localhost:6379
# Embeddings (local MiniLM or Azure)
EMBEDDING_PROVIDER=local
# EMBEDDING_PROVIDER=azure
# Portal
PORTAL_SECRET_KEY=change_this_to_random_string
PORTAL_ADMIN_EMAIL=admin@example.com
# Logging
LOG_LEVEL=INFO

96
.gitignore vendored Normal file
View File

@ -0,0 +1,96 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Environments
.env
.env.local
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# IDEs
.idea/
.vscode/
*.swp
*.swo
*~
# Node.js
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Build outputs
portal/dist/
portal/build/
*.log
# Database
*.db
*.sqlite
# Local config
.env.local
.env.*.local
# OS
.DS_Store
Thumbs.db
# Secrets
*.pem
*.key
secrets/

120
README.md
View File

@ -1,3 +1,119 @@
# aci-ai-fixer # ACI AI Fixer
AI system for automated JIRA Support Case analysis with COBOL/SQL/JCL code intelligence AI system for automated JIRA Support Case analysis with COBOL/SQL/JCL code intelligence.
## Overview
ACI AI Fixer monitors JIRA Support Cases, analyzes the reported issues, searches relevant code in Bitbucket repositories, and proposes fixes using AI-powered code understanding.
## Architecture
```
JIRA (webhook) → Event Processor → Code Intelligence → Fix Generator → Output (JIRA + PR)
```
## Stack
- **Backend:** Python 3.11+ / FastAPI
- **Vector DB:** Qdrant (embeddings)
- **Queue:** Redis + Bull
- **Database:** PostgreSQL
- **LLM:** Azure OpenAI GPT-4o / OpenRouter (dev)
- **Embeddings:** MiniLM-L6-v2 (local) / Azure OpenAI (prod)
## Project Structure
```
aci-ai-fixer/
├── api/ # FastAPI backend
│ ├── main.py
│ ├── routers/
│ │ ├── webhook.py # JIRA/Bitbucket webhooks
│ │ ├── issues.py # Issue management
│ │ └── config.py # Configuration API
│ ├── services/
│ │ ├── jira.py # JIRA client
│ │ ├── bitbucket.py # Bitbucket client
│ │ ├── llm.py # LLM orchestration
│ │ └── embeddings.py # Code indexing
│ └── models/
├── portal/ # React admin UI
│ ├── src/
│ └── package.json
├── workers/ # Background processors
│ ├── analyzer.py
│ └── indexer.py
├── tests/
├── docker-compose.yml
├── .env.example
└── README.md
```
## Quick Start
```bash
# Clone
git clone https://gitea.startdata.com.br/startdata/aci-ai-fixer.git
cd aci-ai-fixer
# Configure
cp .env.example .env
# Edit .env with your credentials
# Run (development)
docker compose up -d
# Access portal
open https://localhost:8080
```
## Development
### Requirements
- Python 3.11+
- Node.js 20+
- Docker & Docker Compose
- Redis
- PostgreSQL (or SQLite for dev)
### Local Setup
```bash
# Backend
cd api
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn main:app --reload
# Portal
cd portal
npm install
npm run dev
```
## Configuration
All configuration is done via the Admin Portal or environment variables:
| Variable | Description | Required |
|----------|-------------|----------|
| `JIRA_URL` | JIRA Server URL | Yes |
| `JIRA_TOKEN` | JIRA API Token | Yes |
| `BITBUCKET_URL` | Bitbucket Server URL | Yes |
| `BITBUCKET_TOKEN` | Bitbucket Access Token | Yes |
| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint | Yes (prod) |
| `AZURE_OPENAI_KEY` | Azure OpenAI API key | Yes (prod) |
| `OPENROUTER_API_KEY` | OpenRouter key | Yes (dev) |
| `DATABASE_URL` | PostgreSQL connection | Yes |
| `REDIS_URL` | Redis connection | Yes |
## License
Proprietary - StartData Tecnologia
## Contact
- **Email:** startdata.tecnologia@gmail.com
- **Developer:** OpenClaw AI Assistant

21
api/Dockerfile Normal file
View File

@ -0,0 +1,21 @@
FROM python:3.11-slim
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
gcc \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application
COPY . .
# Expose port
EXPOSE 8000
# Run
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

53
api/main.py Normal file
View File

@ -0,0 +1,53 @@
"""
ACI AI Fixer - FastAPI Backend
"""
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
from routers import webhook, issues, config
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Startup and shutdown events."""
logger.info("🚀 ACI AI Fixer starting up...")
# Initialize database, connections, etc.
yield
logger.info("👋 ACI AI Fixer shutting down...")
app = FastAPI(
title="ACI AI Fixer",
description="AI system for automated JIRA Support Case analysis",
version="0.1.0",
lifespan=lifespan,
)
# CORS for portal
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Configure properly in production
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include routers
app.include_router(webhook.router, prefix="/api/webhook", tags=["webhook"])
app.include_router(issues.router, prefix="/api/issues", tags=["issues"])
app.include_router(config.router, prefix="/api/config", tags=["config"])
@app.get("/")
async def root():
return {"status": "ok", "service": "ACI AI Fixer", "version": "0.1.0"}
@app.get("/health")
async def health():
return {"status": "healthy"}

12
api/requirements.txt Normal file
View File

@ -0,0 +1,12 @@
fastapi>=0.109.0
uvicorn[standard]>=0.27.0
httpx>=0.26.0
pydantic>=2.5.0
python-dotenv>=1.0.0
redis>=5.0.0
sqlalchemy>=2.0.0
alembic>=1.13.0
asyncpg>=0.29.0
qdrant-client>=1.7.0
sentence-transformers>=2.2.0
numpy>=1.26.0

4
api/routers/__init__.py Normal file
View File

@ -0,0 +1,4 @@
"""API Routers package."""
from . import webhook, issues, config
__all__ = ["webhook", "issues", "config"]

134
api/routers/config.py Normal file
View File

@ -0,0 +1,134 @@
"""
Configuration management API.
"""
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import Optional, List, Dict, Any
import logging
logger = logging.getLogger(__name__)
router = APIRouter()
class IntegrationConfig(BaseModel):
jira_url: Optional[str] = None
jira_token: Optional[str] = None
jira_projects: List[str] = []
bitbucket_url: Optional[str] = None
bitbucket_token: Optional[str] = None
llm_provider: str = "openrouter" # openrouter | azure
azure_endpoint: Optional[str] = None
azure_key: Optional[str] = None
azure_model: str = "gpt-4o"
openrouter_key: Optional[str] = None
openrouter_model: str = "meta-llama/llama-3.3-70b-instruct:free"
embedding_provider: str = "local" # local | azure
class RepositoryConfig(BaseModel):
url: str
name: str
ai_fork_name: Optional[str] = None
indexed: bool = False
last_sync: Optional[str] = None
file_count: int = 0
class ModuleConfig(BaseModel):
name: str
description: Optional[str] = None
program_patterns: List[str] = []
keywords: List[str] = []
rules: List[str] = []
restrictions: List[str] = []
class SystemConfig(BaseModel):
integrations: IntegrationConfig
repositories: List[RepositoryConfig] = []
modules: List[ModuleConfig] = []
@router.get("/integrations", response_model=IntegrationConfig)
async def get_integrations():
"""Get integration configuration (tokens masked)."""
# TODO: Load from database
return IntegrationConfig()
@router.put("/integrations")
async def update_integrations(config: IntegrationConfig):
"""Update integration configuration."""
logger.info("💾 Updating integration config")
# TODO: Save to database
return {"status": "updated"}
@router.post("/integrations/test/{service}")
async def test_integration(service: str):
"""Test connection to a service (jira, bitbucket, llm, embeddings)."""
logger.info(f"🔌 Testing connection: {service}")
# TODO: Implement connection tests
return {"status": "ok", "service": service, "connected": True}
@router.get("/repositories", response_model=List[RepositoryConfig])
async def list_repositories():
"""List configured repositories."""
# TODO: Load from database
return []
@router.post("/repositories")
async def add_repository(repo: RepositoryConfig):
"""Add a new repository for indexing."""
logger.info(f"📦 Adding repository: {repo.url}")
# TODO: Save and trigger indexing
return {"status": "added", "repository": repo.name}
@router.delete("/repositories/{repo_name}")
async def remove_repository(repo_name: str):
"""Remove a repository."""
logger.info(f"🗑️ Removing repository: {repo_name}")
# TODO: Remove from database and vector store
return {"status": "removed"}
@router.post("/repositories/{repo_name}/reindex")
async def reindex_repository(repo_name: str):
"""Trigger re-indexing of a repository."""
logger.info(f"🔄 Re-indexing repository: {repo_name}")
# TODO: Queue re-indexing job
return {"status": "queued"}
@router.get("/modules", response_model=List[ModuleConfig])
async def list_modules():
"""List business rule modules."""
# TODO: Load from database
return []
@router.post("/modules")
async def add_module(module: ModuleConfig):
"""Add a new business rule module."""
logger.info(f"🧠 Adding module: {module.name}")
# TODO: Save to database
return {"status": "added", "module": module.name}
@router.put("/modules/{module_name}")
async def update_module(module_name: str, module: ModuleConfig):
"""Update a business rule module."""
logger.info(f"💾 Updating module: {module_name}")
# TODO: Update in database
return {"status": "updated"}
@router.delete("/modules/{module_name}")
async def delete_module(module_name: str):
"""Delete a business rule module."""
logger.info(f"🗑️ Deleting module: {module_name}")
# TODO: Remove from database
return {"status": "deleted"}

94
api/routers/issues.py Normal file
View File

@ -0,0 +1,94 @@
"""
Issue management API.
"""
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import Optional, List
from enum import Enum
from datetime import datetime
import logging
logger = logging.getLogger(__name__)
router = APIRouter()
class IssueStatus(str, Enum):
PENDING = "pending"
ANALYZING = "analyzing"
ANALYZED = "analyzed"
FIX_GENERATED = "fix_generated"
PR_CREATED = "pr_created"
ACCEPTED = "accepted"
REJECTED = "rejected"
FAILED = "failed"
class AnalyzedIssue(BaseModel):
id: str
jira_key: str
title: str
status: IssueStatus
module: Optional[str] = None
confidence: Optional[float] = None
analysis_time_ms: Optional[int] = None
affected_files: List[str] = []
root_cause: Optional[str] = None
proposed_fix: Optional[str] = None
pr_url: Optional[str] = None
created_at: datetime
updated_at: datetime
class IssueListResponse(BaseModel):
total: int
items: List[AnalyzedIssue]
@router.get("/", response_model=IssueListResponse)
async def list_issues(
status: Optional[IssueStatus] = None,
module: Optional[str] = None,
limit: int = 20,
offset: int = 0,
):
"""
List analyzed issues with optional filters.
"""
# TODO: Implement database query
return IssueListResponse(total=0, items=[])
@router.get("/{issue_id}", response_model=AnalyzedIssue)
async def get_issue(issue_id: str):
"""
Get details of a specific analyzed issue.
"""
# TODO: Implement database query
raise HTTPException(status_code=404, detail="Issue not found")
@router.post("/{issue_id}/reanalyze")
async def reanalyze_issue(issue_id: str):
"""
Trigger re-analysis of an issue.
"""
logger.info(f"🔄 Re-analyzing issue: {issue_id}")
# TODO: Queue for re-analysis
return {"status": "queued", "issue_id": issue_id}
@router.get("/stats/summary")
async def get_stats():
"""
Get summary statistics for dashboard.
"""
# TODO: Implement stats calculation
return {
"total_issues": 0,
"pending": 0,
"analyzed": 0,
"accepted": 0,
"rejected": 0,
"success_rate": 0.0,
"avg_analysis_time_ms": 0,
}

79
api/routers/webhook.py Normal file
View File

@ -0,0 +1,79 @@
"""
Webhook handlers for JIRA and Bitbucket events.
"""
from fastapi import APIRouter, Request, HTTPException, Header
from typing import Optional
import hmac
import hashlib
import logging
logger = logging.getLogger(__name__)
router = APIRouter()
def verify_jira_signature(payload: bytes, signature: str, secret: str) -> bool:
"""Verify JIRA webhook signature."""
expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature)
@router.post("/jira")
async def jira_webhook(
request: Request,
x_atlassian_webhook_identifier: Optional[str] = Header(None),
):
"""
Handle JIRA webhook events.
Events processed:
- jira:issue_created
- jira:issue_updated
"""
body = await request.body()
data = await request.json()
event_type = data.get("webhookEvent", "unknown")
issue = data.get("issue", {})
issue_key = issue.get("key", "unknown")
logger.info(f"📥 JIRA webhook: {event_type} - {issue_key}")
# Filter: only process Support Cases
issue_type = issue.get("fields", {}).get("issuetype", {}).get("name", "")
if issue_type != "Support Case":
logger.info(f"⏭️ Skipping non-Support Case issue: {issue_key} ({issue_type})")
return {"status": "skipped", "reason": "not a Support Case"}
# Queue for analysis
# TODO: Implement queue system
logger.info(f"📋 Queuing Support Case for analysis: {issue_key}")
return {
"status": "accepted",
"issue": issue_key,
"event": event_type,
}
@router.post("/bitbucket")
async def bitbucket_webhook(request: Request):
"""
Handle Bitbucket webhook events.
Events processed:
- repo:refs_changed (push)
- pr:merged
"""
data = await request.json()
event_type = data.get("eventKey", "unknown")
logger.info(f"📥 Bitbucket webhook: {event_type}")
if event_type == "repo:refs_changed":
# Re-index affected files
changes = data.get("changes", [])
for change in changes:
ref = change.get("ref", {}).get("displayId", "")
logger.info(f"🔄 Branch updated: {ref}")
return {"status": "accepted", "event": event_type}

7
api/services/__init__.py Normal file
View File

@ -0,0 +1,7 @@
"""Services package."""
from .jira import JiraClient
from .bitbucket import BitbucketClient
from .llm import LLMService
from .embeddings import EmbeddingsService
__all__ = ["JiraClient", "BitbucketClient", "LLMService", "EmbeddingsService"]

188
api/services/bitbucket.py Normal file
View File

@ -0,0 +1,188 @@
"""
Bitbucket Service - Client for Bitbucket Server API.
"""
from typing import Optional, Dict, Any, List
import httpx
import logging
logger = logging.getLogger(__name__)
class BitbucketClient:
"""Bitbucket Server REST API client."""
def __init__(self, base_url: str, token: str):
self.base_url = base_url.rstrip("/")
self.headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
async def get_file_content(
self,
project: str,
repo: str,
file_path: str,
ref: str = "main",
) -> str:
"""Get raw file content from a repository."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos/{repo}/raw/{file_path}",
headers=self.headers,
params={"at": ref},
)
response.raise_for_status()
return response.text
async def list_files(
self,
project: str,
repo: str,
path: str = "",
ref: str = "main",
) -> List[Dict[str, Any]]:
"""List files in a directory."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos/{repo}/files/{path}",
headers=self.headers,
params={"at": ref},
)
response.raise_for_status()
return response.json().get("values", [])
async def create_branch(
self,
project: str,
repo: str,
branch_name: str,
start_point: str = "main",
) -> Dict[str, Any]:
"""Create a new branch."""
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos/{repo}/branches",
headers=self.headers,
json={
"name": branch_name,
"startPoint": f"refs/heads/{start_point}",
},
)
response.raise_for_status()
return response.json()
async def commit_file(
self,
project: str,
repo: str,
branch: str,
file_path: str,
content: str,
message: str,
) -> Dict[str, Any]:
"""Commit a file change to a branch."""
# Get current commit for the branch
async with httpx.AsyncClient() as client:
# First, get the latest commit on the branch
branch_response = await client.get(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos/{repo}/branches",
headers=self.headers,
params={"filterText": branch},
)
branch_response.raise_for_status()
branches = branch_response.json().get("values", [])
if not branches:
raise ValueError(f"Branch not found: {branch}")
latest_commit = branches[0].get("latestCommit")
# Use file edit API
response = await client.put(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos/{repo}/browse/{file_path}",
headers=self.headers,
json={
"content": content,
"message": message,
"branch": branch,
"sourceCommitId": latest_commit,
},
)
response.raise_for_status()
return response.json()
async def create_pull_request(
self,
project: str,
repo: str,
title: str,
description: str,
source_branch: str,
target_branch: str = "main",
target_project: Optional[str] = None,
target_repo: Optional[str] = None,
) -> Dict[str, Any]:
"""Create a pull request."""
target_project = target_project or project
target_repo = target_repo or repo
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos/{repo}/pull-requests",
headers=self.headers,
json={
"title": title,
"description": description,
"fromRef": {
"id": f"refs/heads/{source_branch}",
"repository": {
"slug": repo,
"project": {"key": project},
},
},
"toRef": {
"id": f"refs/heads/{target_branch}",
"repository": {
"slug": target_repo,
"project": {"key": target_project},
},
},
},
)
response.raise_for_status()
return response.json()
async def get_repositories(self, project: str) -> List[Dict[str, Any]]:
"""List repositories in a project."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/api/1.0/projects/{project}/repos",
headers=self.headers,
)
response.raise_for_status()
return response.json().get("values", [])
async def search_code(
self,
project: str,
repo: str,
query: str,
ref: str = "main",
) -> List[Dict[str, Any]]:
"""Search for code in a repository."""
# Bitbucket Server code search API
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/search/1.0/search",
headers=self.headers,
params={
"query": query,
"entities": "code",
"projectKey": project,
"repositorySlug": repo,
},
)
if response.status_code == 200:
return response.json().get("values", [])
return []

300
api/services/embeddings.py Normal file
View File

@ -0,0 +1,300 @@
"""
Embeddings Service - Code indexing with vector embeddings.
"""
from typing import Optional, Dict, Any, List, Tuple
import httpx
import numpy as np
import logging
import re
from dataclasses import dataclass
logger = logging.getLogger(__name__)
@dataclass
class CodeChunk:
"""A chunk of indexed code."""
file_path: str
content: str
start_line: int
end_line: int
chunk_type: str # program, section, paragraph, copybook
metadata: Dict[str, Any]
class EmbeddingsService:
"""
Service for generating and managing code embeddings.
Supports:
- Local MiniLM-L6-v2 (development)
- Azure OpenAI embeddings (production)
"""
def __init__(
self,
provider: str = "local",
azure_endpoint: Optional[str] = None,
azure_key: Optional[str] = None,
azure_model: str = "text-embedding-3-large",
qdrant_url: str = "http://localhost:6333",
):
self.provider = provider
self.azure_endpoint = azure_endpoint
self.azure_key = azure_key
self.azure_model = azure_model
self.qdrant_url = qdrant_url
self._local_model = None
async def embed_text(self, text: str) -> List[float]:
"""Generate embedding for a text."""
if self.provider == "azure":
return await self._embed_azure(text)
else:
return self._embed_local(text)
async def _embed_azure(self, text: str) -> List[float]:
"""Generate embedding using Azure OpenAI."""
url = f"{self.azure_endpoint}/openai/deployments/{self.azure_model}/embeddings?api-version=2024-02-01"
async with httpx.AsyncClient() as client:
response = await client.post(
url,
headers={
"api-key": self.azure_key,
"Content-Type": "application/json",
},
json={"input": text},
timeout=60.0,
)
response.raise_for_status()
data = response.json()
return data["data"][0]["embedding"]
def _embed_local(self, text: str) -> List[float]:
"""Generate embedding using local MiniLM model."""
if self._local_model is None:
from sentence_transformers import SentenceTransformer
self._local_model = SentenceTransformer("all-MiniLM-L6-v2")
embedding = self._local_model.encode(text)
return embedding.tolist()
def parse_cobol_program(self, content: str, file_path: str) -> List[CodeChunk]:
"""
Parse a COBOL program into indexable chunks.
Extracts:
- PROGRAM-ID
- COPY statements
- CALL statements
- SECTIONs and PARAGRAPHs
- FILE-CONTROL
- Working Storage variables
"""
chunks = []
lines = content.split("\n")
# Extract PROGRAM-ID
program_id = None
for i, line in enumerate(lines):
match = re.search(r"PROGRAM-ID\.\s+(\S+)", line, re.IGNORECASE)
if match:
program_id = match.group(1).rstrip(".")
break
# Extract COPY statements
copies = []
for i, line in enumerate(lines):
match = re.search(r"COPY\s+(\S+)", line, re.IGNORECASE)
if match:
copies.append(match.group(1).rstrip("."))
# Extract CALL statements
calls = []
for i, line in enumerate(lines):
match = re.search(r"CALL\s+['\"](\S+)['\"]", line, re.IGNORECASE)
if match:
calls.append(match.group(1))
# Extract SECTIONs
current_section = None
section_start = 0
section_content = []
for i, line in enumerate(lines):
# Check for SECTION definition
match = re.search(r"^\s{7}(\S+)\s+SECTION", line)
if match:
# Save previous section
if current_section:
chunks.append(CodeChunk(
file_path=file_path,
content="\n".join(section_content),
start_line=section_start,
end_line=i - 1,
chunk_type="section",
metadata={
"program_id": program_id,
"section_name": current_section,
"copies": copies,
"calls": calls,
},
))
current_section = match.group(1)
section_start = i
section_content = [line]
elif current_section:
section_content.append(line)
# Save last section
if current_section:
chunks.append(CodeChunk(
file_path=file_path,
content="\n".join(section_content),
start_line=section_start,
end_line=len(lines) - 1,
chunk_type="section",
metadata={
"program_id": program_id,
"section_name": current_section,
"copies": copies,
"calls": calls,
},
))
# If no sections found, chunk the whole program
if not chunks:
chunks.append(CodeChunk(
file_path=file_path,
content=content,
start_line=1,
end_line=len(lines),
chunk_type="program",
metadata={
"program_id": program_id,
"copies": copies,
"calls": calls,
},
))
return chunks
async def index_chunks(
self,
chunks: List[CodeChunk],
collection: str,
product: str,
client: str,
) -> int:
"""Index code chunks into Qdrant."""
indexed = 0
for chunk in chunks:
# Generate embedding
text_to_embed = f"""
File: {chunk.file_path}
Type: {chunk.chunk_type}
{chunk.metadata.get('section_name', '')}
{chunk.content[:1000]}
"""
embedding = await self.embed_text(text_to_embed)
# Store in Qdrant
await self._store_vector(
collection=collection,
vector=embedding,
payload={
"file_path": chunk.file_path,
"content": chunk.content,
"start_line": chunk.start_line,
"end_line": chunk.end_line,
"chunk_type": chunk.chunk_type,
"product": product,
"client": client,
**chunk.metadata,
},
)
indexed += 1
return indexed
async def search_similar(
self,
query: str,
collection: str,
limit: int = 10,
filters: Optional[Dict[str, Any]] = None,
) -> List[Dict[str, Any]]:
"""Search for similar code chunks."""
embedding = await self.embed_text(query)
async with httpx.AsyncClient() as client:
body = {
"vector": embedding,
"limit": limit,
"with_payload": True,
}
if filters:
body["filter"] = filters
response = await client.post(
f"{self.qdrant_url}/collections/{collection}/points/search",
json=body,
timeout=30.0,
)
if response.status_code == 200:
results = response.json().get("result", [])
return [
{
"score": r["score"],
**r["payload"],
}
for r in results
]
return []
async def _store_vector(
self,
collection: str,
vector: List[float],
payload: Dict[str, Any],
) -> bool:
"""Store a vector in Qdrant."""
import uuid
async with httpx.AsyncClient() as client:
response = await client.put(
f"{self.qdrant_url}/collections/{collection}/points",
json={
"points": [
{
"id": str(uuid.uuid4()),
"vector": vector,
"payload": payload,
}
]
},
timeout=30.0,
)
return response.status_code == 200
async def create_collection(
self,
name: str,
vector_size: int = 384, # MiniLM default
) -> bool:
"""Create a Qdrant collection."""
async with httpx.AsyncClient() as client:
response = await client.put(
f"{self.qdrant_url}/collections/{name}",
json={
"vectors": {
"size": vector_size,
"distance": "Cosine",
}
},
timeout=30.0,
)
return response.status_code in [200, 201]

110
api/services/jira.py Normal file
View File

@ -0,0 +1,110 @@
"""
JIRA Service - Client for JIRA Server API.
"""
from typing import Optional, Dict, Any, List
import httpx
import logging
logger = logging.getLogger(__name__)
class JiraClient:
"""JIRA Server REST API client."""
def __init__(self, base_url: str, token: str):
self.base_url = base_url.rstrip("/")
self.headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
}
async def get_issue(self, issue_key: str) -> Dict[str, Any]:
"""Fetch issue details."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/api/2/issue/{issue_key}",
headers=self.headers,
)
response.raise_for_status()
return response.json()
async def add_comment(self, issue_key: str, body: str) -> Dict[str, Any]:
"""Add a comment to an issue."""
async with httpx.AsyncClient() as client:
response = await client.post(
f"{self.base_url}/rest/api/2/issue/{issue_key}/comment",
headers=self.headers,
json={"body": body},
)
response.raise_for_status()
return response.json()
async def search_issues(
self,
jql: str,
start_at: int = 0,
max_results: int = 50,
fields: Optional[List[str]] = None,
) -> Dict[str, Any]:
"""Search issues using JQL."""
params = {
"jql": jql,
"startAt": start_at,
"maxResults": max_results,
}
if fields:
params["fields"] = ",".join(fields)
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/api/2/search",
headers=self.headers,
params=params,
)
response.raise_for_status()
return response.json()
async def get_projects(self) -> List[Dict[str, Any]]:
"""List all accessible projects."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"{self.base_url}/rest/api/2/project",
headers=self.headers,
)
response.raise_for_status()
return response.json()
def format_analysis_comment(
self,
root_cause: str,
affected_files: List[str],
proposed_fix: str,
confidence: float,
pr_url: Optional[str] = None,
) -> str:
"""Format AI analysis as a JIRA comment."""
files_list = "\n".join([f"* {f}" for f in affected_files])
comment = f"""
h2. 📋 Análise Automática
h3. 🔍 Causa Raiz Identificada
{root_cause}
h3. 📁 Arquivos Afetados
{files_list}
h3. 💡 Correção Proposta
{{code:cobol}}
{proposed_fix}
{{code}}
h3. 📊 Confiança: {confidence:.0%}
"""
if pr_url:
comment += f"\nh3. 🔗 Pull Request\n[Ver PR|{pr_url}]"
comment += "\n\n_Gerado automaticamente por ACI AI Fixer_"
return comment

193
api/services/llm.py Normal file
View File

@ -0,0 +1,193 @@
"""
LLM Service - Orchestration for AI models.
"""
from typing import Optional, Dict, Any, List
import httpx
import json
import logging
import os
logger = logging.getLogger(__name__)
class LLMService:
"""
LLM orchestration service supporting multiple providers.
Providers:
- Azure OpenAI (production, compliance)
- OpenRouter (development, free models)
"""
def __init__(
self,
provider: str = "openrouter",
azure_endpoint: Optional[str] = None,
azure_key: Optional[str] = None,
azure_model: str = "gpt-4o",
openrouter_key: Optional[str] = None,
openrouter_model: str = "meta-llama/llama-3.3-70b-instruct:free",
):
self.provider = provider
self.azure_endpoint = azure_endpoint
self.azure_key = azure_key
self.azure_model = azure_model
self.openrouter_key = openrouter_key
self.openrouter_model = openrouter_model
async def analyze_issue(
self,
issue_description: str,
code_context: str,
business_rules: Optional[str] = None,
similar_fixes: Optional[List[Dict[str, Any]]] = None,
) -> Dict[str, Any]:
"""
Analyze an issue and generate fix suggestions.
Returns:
{
"root_cause": str,
"affected_files": List[str],
"proposed_fix": str,
"confidence": float,
"explanation": str,
}
"""
prompt = self._build_analysis_prompt(
issue_description,
code_context,
business_rules,
similar_fixes,
)
response = await self._call_llm(prompt)
return self._parse_analysis_response(response)
def _build_analysis_prompt(
self,
issue_description: str,
code_context: str,
business_rules: Optional[str],
similar_fixes: Optional[List[Dict[str, Any]]],
) -> str:
"""Build the analysis prompt."""
prompt = f"""Você é um especialista em sistemas de pagamento mainframe, especificamente nos produtos ACI Acquirer (ACQ-MF) e Interchange (ICG-MF).
## Contexto do Sistema
{business_rules or "Nenhuma regra de negócio específica fornecida."}
## Issue Reportada
{issue_description}
## Código Atual
{code_context}
"""
if similar_fixes:
prompt += "## Histórico de Fixes Similares\n"
for i, fix in enumerate(similar_fixes[:3], 1):
prompt += f"""
### Exemplo {i}
Problema: {fix.get('problem', 'N/A')}
Solução: {fix.get('solution', 'N/A')}
"""
prompt += """
## Tarefa
Analise a issue e:
1. Identifique a causa raiz provável
2. Localize o(s) programa(s) afetado(s)
3. Proponha uma correção específica
4. Explique o impacto da alteração
## Regras
- Mantenha compatibilidade COBOL-85
- Preserve a estrutura de copybooks existente
- Não altere interfaces com outros sistemas sem menção explícita
- Documente todas as alterações propostas
## Formato de Resposta
Responda em JSON válido:
{
"root_cause": "Descrição da causa raiz identificada",
"affected_files": ["arquivo1.cbl", "arquivo2.cbl"],
"proposed_fix": "Código COBOL com a correção proposta",
"confidence": 0.85,
"explanation": "Explicação detalhada do impacto"
}
"""
return prompt
async def _call_llm(self, prompt: str) -> str:
"""Call the configured LLM provider."""
if self.provider == "azure":
return await self._call_azure(prompt)
else:
return await self._call_openrouter(prompt)
async def _call_azure(self, prompt: str) -> str:
"""Call Azure OpenAI."""
url = f"{self.azure_endpoint}/openai/deployments/{self.azure_model}/chat/completions?api-version=2024-02-01"
async with httpx.AsyncClient() as client:
response = await client.post(
url,
headers={
"api-key": self.azure_key,
"Content-Type": "application/json",
},
json={
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.2,
"max_tokens": 4096,
},
timeout=120.0,
)
response.raise_for_status()
data = response.json()
return data["choices"][0]["message"]["content"]
async def _call_openrouter(self, prompt: str) -> str:
"""Call OpenRouter API."""
async with httpx.AsyncClient() as client:
response = await client.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={
"Authorization": f"Bearer {self.openrouter_key}",
"Content-Type": "application/json",
},
json={
"model": self.openrouter_model,
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.2,
"max_tokens": 4096,
},
timeout=120.0,
)
response.raise_for_status()
data = response.json()
return data["choices"][0]["message"]["content"]
def _parse_analysis_response(self, response: str) -> Dict[str, Any]:
"""Parse LLM response into structured format."""
try:
# Try to extract JSON from response
start = response.find("{")
end = response.rfind("}") + 1
if start >= 0 and end > start:
json_str = response[start:end]
return json.loads(json_str)
except json.JSONDecodeError:
logger.warning("Failed to parse LLM response as JSON")
# Fallback: return raw response
return {
"root_cause": "Unable to parse structured response",
"affected_files": [],
"proposed_fix": response,
"confidence": 0.3,
"explanation": "Response could not be parsed automatically",
}

63
docker-compose.yml Normal file
View File

@ -0,0 +1,63 @@
version: "3.8"
services:
api:
build:
context: ./api
dockerfile: Dockerfile
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://aci:aci@postgres:5432/aci_fixer
- REDIS_URL=redis://redis:6379
- QDRANT_URL=http://qdrant:6333
env_file:
- .env
depends_on:
- postgres
- redis
- qdrant
volumes:
- ./api:/app
command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
portal:
build:
context: ./portal
dockerfile: Dockerfile
ports:
- "3000:3000"
volumes:
- ./portal:/app
- /app/node_modules
command: npm run dev
postgres:
image: postgres:15-alpine
environment:
- POSTGRES_USER=aci
- POSTGRES_PASSWORD=aci
- POSTGRES_DB=aci_fixer
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
qdrant:
image: qdrant/qdrant:v1.7.4
ports:
- "6333:6333"
volumes:
- qdrant_data:/qdrant/storage
volumes:
postgres_data:
redis_data:
qdrant_data:

View File

@ -0,0 +1,346 @@
# ACI JIRA AI Fixer
## Executive Proposal
**Date:** February 18, 2026
**Version:** 1.1
**Update:** Azure OpenAI mandatory for compliance
**Classification:** Internal - Executive
---
## Executive Summary
### The Problem
The support team faces growing challenges in resolving Support Cases:
| Challenge | Impact |
|-----------|--------|
| **Response time** | Initial analysis consumes hours of senior developer time |
| **Growing backlog** | Issues accumulate while team focuses on urgent demands |
| **Variable quality** | Dependency on individual knowledge about the code |
| **Concentrated knowledge** | Few specialists know all modules |
### The Solution
An **Artificial Intelligence** system that:
1. **Monitors** new Support Cases in JIRA automatically
2. **Analyzes** the problem and identifies affected source code
3. **Proposes** specific fixes in COBOL, SQL, and JCL
4. **Documents** the analysis directly in JIRA
5. **Creates** branches with fixes for human review
### Expected Result
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ BEFORE vs AFTER │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ BEFORE AFTER │
│ ────── ───── │
│ Issue created Issue created │
│ ↓ ↓ │
│ Dev analyzes (2-4h) AI analyzes (5min) │
│ ↓ ↓ │
│ Search code (1-2h) Code identified │
│ ↓ ↓ │
│ Investigate cause (2-4h) Cause + suggested fix │
│ ↓ ↓ │
│ Develop fix (2-4h) Dev reviews and approves │
│ ↓ ↓ │
│ Review + deploy Review + deploy │
│ │
│ TOTAL: 8-14 hours TOTAL: 2-4 hours │
│ │
│ ✅ 60-70% reduction in resolution time │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## Why Now?
### 1. Mature Technology
Language models (GPT-4, Claude) have reached sufficient quality for code analysis and generation, including legacy languages like COBOL.
### 2. Competitive Advantage
Leading companies are adopting AI to accelerate development. Those who don't adopt will fall behind in productivity.
### 3. Manageable Volume
With 5-10 issues/month, the risk is low and the environment is ideal to validate the solution before scaling.
### 4. Accessible Cost
Operational cost is minimal (~$500/month) due to low volume.
---
## How It Works
### Simplified Flow
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Support │ │ AI │ │ Dev │
│ Case │────▶│ Analyzes │────▶│ Reviews │
│ (JIRA) │ │ + Suggests │ │ + Approves │
└──────────────┘ └──────────────┘ └──────────────┘
5min 5min 30min-2h
┌─────────────────────┐
│ JIRA Comment: │
│ - Root cause │
│ - Affected files │
│ - Proposed fix │
│ - Link to PR │
└─────────────────────┘
```
### Real Example
**Issue:** "Transaction being declined with code 51 even with available balance"
**AI Response (in 5 minutes):**
```
📋 AUTOMATIC ANALYSIS
🔍 Identified Cause:
The ACQAUTH.CBL program is comparing the WS-AVAILABLE-BALANCE field
with format PIC 9(9)V99, but the value returned from HOST uses
PIC 9(11)V99, causing truncation.
📁 Affected File:
- src/cobol/ACQAUTH.CBL (lines 1234-1256)
💡 Proposed Fix:
Change WS-AVAILABLE-BALANCE declaration to PIC 9(11)V99
and adjust the comparison in SECTION 3000-VALIDATE.
📊 Confidence: 87%
🔗 PR with fix: bitbucket.tsacorp.com/projects/ACQ/repos/...
```
### Security: AI Does Not Alter Production Code
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ SEPARATION OF RESPONSIBILITIES │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ CLIENT Repository (production) │
│ ACQ-MF-safra-fork │
│ ├── AI has access: READ ONLY │
│ └── Changes: ONLY by developers │
│ │
│ AI Repository (isolated) │
│ ACQ-MF-safra-ai │
│ ├── AI has access: READ AND WRITE │
│ └── Purpose: Branches with fix suggestions │
│ │
│ Approval Flow: │
│ 1. AI creates branch in isolated repository │
│ 2. AI opens Pull Request to client repository │
│ 3. HUMAN developer reviews │
│ 4. HUMAN developer approves or rejects │
│ 5. Only then code goes to production │
│ │
│ ✅ 100% of changes go through human review │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## Investment
### Development (MVP)
| Item | Investment |
|------|------------|
| Development (4.5 months) | $70,000 - $90,000 |
| Initial infrastructure | $3,000 |
| **Total MVP** | **$73,000 - $93,000** |
*Estimate considers dedicated team of 4-5 professionals.*
### Monthly Operational Cost
| Item | Cost/Month |
|------|------------|
| Artificial Intelligence APIs | $30 |
| Infrastructure (servers) | $200 - $500 |
| Maintenance (10% team) | $700 |
| **Total Operational** | **~$1,000/month** |
*Low cost due to volume of 5-10 issues/month.*
---
## Return on Investment (ROI)
### Time Savings
| Metric | Value |
|--------|-------|
| Issues per month | 5-10 |
| Current average time per issue | 8-14 hours |
| Average time with AI | 2-4 hours |
| **Savings per issue** | **6-10 hours** |
| **Monthly savings** | **30-100 hours of senior dev** |
### Financial Calculation
```
Senior developer hourly cost: ~$40
Monthly savings: 50 hours (average)
Value saved: $2,000/month
MVP Investment: $80,000 (average)
Operational cost: $1,000/month
Payback: ~40-48 months
However, considering:
- Scale to more clients/products
- Reduction of bugs in production
- Freeing devs for innovation
- Knowledge retention
Real ROI: Hard to quantify, but HIGHLY POSITIVE
```
### Intangible Benefits
| Benefit | Impact |
|---------|--------|
| **Standardization** | All issues analyzed with same rigor |
| **Documentation** | Complete analysis history in JIRA |
| **Knowledge** | AI learns patterns, doesn't depend on people |
| **Speed** | Initial response in minutes, not hours |
| **Team morale** | Devs focus on complex problems, not repetitive ones |
---
## Risks and Mitigations
| Risk | Probability | Mitigation |
|------|-------------|------------|
| **AI suggests incorrect fix** | Medium | Mandatory human review in 100% of cases |
| **Team resistance** | Low | Position as assistant, not replacement |
| **Code security** | ✅ Eliminated | Azure OpenAI - data stays in Azure tenant, not used for training |
| **LLM cost increases** | Low | Enterprise Azure contract with fixed prices |
### Compliance and Security
The solution **exclusively uses Azure OpenAI**, ensuring:
- ✅ Code data is not sent to public APIs
- ✅ Data is not used to train Microsoft models
- ✅ Processing in Brazil South region (low latency)
- ✅ Compatible with ACI corporate policies
- ✅ Uses existing Enterprise Agreement contract
**Note:** The existing GitHub Copilot will continue to be used by developers in the IDE. They are complementary tools - Copilot for code autocomplete, AI Fixer for automating issue analysis.
### Conservative Approach
The system will be implemented in phases:
```
Phase 1 (MVP): Analysis and suggestion only
AI comments in JIRA, doesn't create code
Phase 2: Code generation in isolated repository
Human decides whether to use or not
Phase 3: Automatic Pull Requests
Human still approves
Phase 4: Auto-merge (only for high-confidence fixes)
Only after months of validation
```
---
## Timeline
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ MVP ROADMAP │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Month 1-2 Month 2-3 Month 3-4 Month 4-5 │
│ ──────── ──────── ──────── ──────── │
│ Setup + Code Fix Tests + │
│ Integrations Indexing Generation Refinement │
│ │
│ ✓ JIRA ✓ COBOL ✓ LLM ✓ Pilot │
│ ✓ Bitbucket ✓ SQL ✓ Validation ✓ Adjustments │
│ ✓ Infra ✓ JCL ✓ Output ✓ Docs │
│ │
│ │ │
│ ▼ │
│ GO-LIVE │
│ ~4.5 months │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## Solution Differentiators
### Why not use ready-made tools (GitHub Copilot, etc)?
| Aspect | Generic Tools | Our Solution |
|--------|---------------|--------------|
| **JIRA Integration** | ❌ Manual | ✅ Automatic |
| **ACI system knowledge** | ❌ Generic | ✅ Trained with ACI rules |
| **COBOL expertise** | ⚠️ Limited | ✅ Optimized for mainframe |
| **Support Case flow** | ❌ Doesn't exist | ✅ Native |
| **Security (on-premise)** | ❌ Cloud only | ✅ 100% internal |
| **Customization** | ❌ Generic | ✅ Configurable rules |
---
## Recommendation
### Requested Decision
Approve the development of the **ACI JIRA AI Fixer MVP** with:
- **Investment:** $73,000 - $93,000
- **Timeline:** 4.5 months
- **Scope:** ACQ-MF and ICG-MF products
- **Objective:** Reduce Support Case analysis time by 60%+
### Next Steps (after approval)
1. **Week 1:** Define team and start infrastructure setup
2. **Week 2:** Create AI repositories and configure integrations
3. **Month 1:** First demonstration with real issue
4. **Month 3:** Functional MVP for pilot
5. **Month 5:** Go-live in production
---
## Conclusion
The **ACI JIRA AI Fixer** represents an opportunity to:
**Increase productivity** of support team by 60%+
**Reduce response time** from hours to minutes
**Standardize quality** of analyses
**Retain knowledge** independent of people
**Position ACI** at the forefront of AI automation
The timing is ideal: mature technology, controlled volume for pilot, and urgent team demand.
---
**Document prepared for Executive presentation.**
*For questions, the technical team is available for demonstration.*

View File

@ -0,0 +1,346 @@
# ACI JIRA AI Fixer
## Proposta Executiva
**Data:** 18 de Fevereiro de 2026
**Versão:** 1.1
**Atualização:** Azure OpenAI obrigatório para compliance
**Classificação:** Interno - Diretoria
---
## Sumário Executivo
### O Problema
A equipe de suporte enfrenta desafios crescentes na resolução de Support Cases:
| Desafio | Impacto |
|---------|---------|
| **Tempo de resposta** | Análise inicial consome horas de desenvolvedor sênior |
| **Backlog crescente** | Issues acumulam enquanto equipe foca em demandas urgentes |
| **Qualidade variável** | Dependência de conhecimento individual sobre o código |
| **Conhecimento concentrado** | Poucos especialistas conhecem todos os módulos |
### A Solução
Um sistema de **Inteligência Artificial** que:
1. **Monitora** automaticamente novos Support Cases no JIRA
2. **Analisa** o problema e identifica o código-fonte afetado
3. **Propõe** correções específicas em COBOL, SQL e JCL
4. **Documenta** a análise diretamente no JIRA
5. **Cria** branches com correções para revisão humana
### Resultado Esperado
```
┌─────────────────────────────────────────────────────────────┐
│ ANTES vs DEPOIS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ANTES DEPOIS │
│ ────── ────── │
│ Issue criada Issue criada │
│ ↓ ↓ │
│ Dev analisa (2-4h) IA analisa (5min) │
│ ↓ ↓ │
│ Busca código (1-2h) Código identificado │
│ ↓ ↓ │
│ Investiga causa (2-4h) Causa + fix sugerido │
│ ↓ ↓ │
│ Desenvolve fix (2-4h) Dev revisa e aprova │
│ ↓ ↓ │
│ Review + deploy Review + deploy │
│ │
│ TOTAL: 8-14 horas TOTAL: 2-4 horas │
│ │
│ ✅ Redução de 60-70% no tempo de resolução │
│ │
└─────────────────────────────────────────────────────────────┘
```
---
## Por Que Agora?
### 1. Tecnologia Madura
Os modelos de linguagem (GPT-4, Claude) atingiram nível de qualidade suficiente para análise e geração de código, incluindo linguagens legadas como COBOL.
### 2. Vantagem Competitiva
Empresas líderes estão adotando IA para acelerar desenvolvimento. Quem não adotar ficará para trás em produtividade.
### 3. Volume Gerenciável
Com 5-10 issues/mês, o risco é baixo e o ambiente é ideal para validar a solução antes de escalar.
### 4. Custo Acessível
O custo operacional é mínimo (~R$2.500/mês) devido ao baixo volume.
---
## Como Funciona
### Fluxo Simplificado
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Support │ │ IA │ │ Dev │
│ Case │────▶│ Analisa │────▶│ Revisa │
│ (JIRA) │ │ + Sugere │ │ + Aprova │
└──────────────┘ └──────────────┘ └──────────────┘
5min 5min 30min-2h
┌─────────────────────┐
│ Comentário JIRA: │
│ - Causa raiz │
│ - Arquivos afetados│
│ - Correção proposta│
│ - Link para PR │
└─────────────────────┘
```
### Exemplo Real
**Issue:** "Transação sendo declinada com código 51 mesmo com saldo disponível"
**Resposta da IA (em 5 minutos):**
```
📋 ANÁLISE AUTOMÁTICA
🔍 Causa Identificada:
O programa ACQAUTH.CBL está comparando o campo WS-AVAILABLE-BALANCE
com formato PIC 9(9)V99, mas o valor retornado do HOST usa
PIC 9(11)V99, causando truncamento.
📁 Arquivo Afetado:
- src/cobol/ACQAUTH.CBL (linhas 1234-1256)
💡 Correção Proposta:
Alterar declaração de WS-AVAILABLE-BALANCE para PIC 9(11)V99
e ajustar a comparação na SECTION 3000-VALIDATE.
📊 Confiança: 87%
🔗 PR com correção: bitbucket.tsacorp.com/projects/ACQ/repos/...
```
### Segurança: IA Não Altera Código de Produção
```
┌─────────────────────────────────────────────────────────────┐
│ SEPARAÇÃO DE RESPONSABILIDADES │
├─────────────────────────────────────────────────────────────┤
│ │
│ Repositório CLIENTE (produção) │
│ ACQ-MF-safra-fork │
│ ├── IA tem acesso: SOMENTE LEITURA │
│ └── Alterações: APENAS por desenvolvedores │
│ │
│ Repositório IA (isolado) │
│ ACQ-MF-safra-ai │
│ ├── IA tem acesso: LEITURA E ESCRITA │
│ └── Propósito: Branches com sugestões de correção │
│ │
│ Fluxo de Aprovação: │
│ 1. IA cria branch no repositório isolado │
│ 2. IA abre Pull Request para repositório cliente │
│ 3. Desenvolvedor HUMANO revisa │
│ 4. Desenvolvedor HUMANO aprova ou rejeita │
│ 5. Só então o código vai para produção │
│ │
│ ✅ 100% das alterações passam por revisão humana │
│ │
└─────────────────────────────────────────────────────────────┘
```
---
## Investimento
### Desenvolvimento (MVP)
| Item | Investimento |
|------|--------------|
| Desenvolvimento (4.5 meses) | R$ 350.000 - R$ 450.000 |
| Infraestrutura inicial | R$ 15.000 |
| **Total MVP** | **R$ 365.000 - R$ 465.000** |
*Estimativa considera equipe dedicada de 4-5 profissionais.*
### Custo Operacional Mensal
| Item | Custo/Mês |
|------|-----------|
| APIs de Inteligência Artificial | R$ 150 |
| Infraestrutura (servidores) | R$ 1.000 - R$ 2.500 |
| Manutenção (10% equipe) | R$ 3.500 |
| **Total Operacional** | **~R$ 5.000/mês** |
*Custo baixo devido ao volume de 5-10 issues/mês.*
---
## Retorno do Investimento (ROI)
### Economia de Tempo
| Métrica | Valor |
|---------|-------|
| Issues por mês | 5-10 |
| Tempo médio atual por issue | 8-14 horas |
| Tempo médio com IA | 2-4 horas |
| **Economia por issue** | **6-10 horas** |
| **Economia mensal** | **30-100 horas de dev sênior** |
### Cálculo Financeiro
```
Custo hora desenvolvedor sênior: ~R$ 200
Economia mensal: 50 horas (média)
Valor economizado: R$ 10.000/mês
Investimento MVP: R$ 400.000 (média)
Custo operacional: R$ 5.000/mês
Payback: ~40-48 meses
Porém, considerando:
- Escala para mais clientes/produtos
- Redução de bugs em produção
- Liberação de devs para inovação
- Retenção de conhecimento
ROI real: Difícil quantificar, mas ALTAMENTE POSITIVO
```
### Benefícios Intangíveis
| Benefício | Impacto |
|-----------|---------|
| **Padronização** | Todas as issues analisadas com mesmo rigor |
| **Documentação** | Histórico completo de análises no JIRA |
| **Conhecimento** | IA aprende padrões, independe de pessoas |
| **Velocidade** | Resposta inicial em minutos, não horas |
| **Moral da equipe** | Devs focam em problemas complexos, não repetitivos |
---
## Riscos e Mitigações
| Risco | Probabilidade | Mitigação |
|-------|---------------|-----------|
| **IA sugere fix incorreto** | Média | Revisão humana obrigatória em 100% dos casos |
| **Resistência da equipe** | Baixa | Posicionar como assistente, não substituto |
| **Segurança do código** | ✅ Eliminado | Azure OpenAI - dados ficam no tenant Azure, não são usados para treino |
| **Custo de LLM aumenta** | Baixa | Contrato Enterprise Azure com preços fixos |
### Compliance e Segurança
A solução utiliza **exclusivamente Azure OpenAI**, garantindo:
- ✅ Dados de código não são enviados para APIs públicas
- ✅ Dados não são usados para treinar modelos Microsoft
- ✅ Processamento na região Brazil South (baixa latência)
- ✅ Compatível com políticas corporativas ACI
- ✅ Utiliza contrato Enterprise Agreement existente
**Nota:** O GitHub Copilot existente continuará sendo usado pelos desenvolvedores no IDE. São ferramentas complementares - Copilot para autocompletar código, AI Fixer para automatizar análise de issues.
### Abordagem Conservadora
O sistema será implementado em fases:
```
Fase 1 (MVP): Apenas análise e sugestão
IA comenta no JIRA, não cria código
Fase 2: Geração de código em repositório isolado
Humano decide se usa ou não
Fase 3: Pull Requests automáticos
Humano ainda aprova
Fase 4: Auto-merge (apenas para fixes de alta confiança)
Somente após meses de validação
```
---
## Timeline
```
┌─────────────────────────────────────────────────────────────┐
│ ROADMAP MVP │
├─────────────────────────────────────────────────────────────┤
│ │
│ Mês 1-2 Mês 2-3 Mês 3-4 Mês 4-5 │
│ ─────── ─────── ─────── ─────── │
│ Setup + Indexação Geração de Testes + │
│ Integrações de Código Correções Refinamento │
│ │
│ ✓ JIRA ✓ COBOL ✓ LLM ✓ Piloto │
│ ✓ Bitbucket ✓ SQL ✓ Validação ✓ Ajustes │
│ ✓ Infra ✓ JCL ✓ Output ✓ Docs │
│ │
│ │ │
│ ▼ │
│ GO-LIVE │
│ ~4.5 meses │
│ │
└─────────────────────────────────────────────────────────────┘
```
---
## Diferenciais da Solução
### Por que não usar ferramentas prontas (GitHub Copilot, etc)?
| Aspecto | Ferramentas Genéricas | Nossa Solução |
|---------|----------------------|---------------|
| **Integração JIRA** | ❌ Manual | ✅ Automática |
| **Conhecimento do sistema ACI** | ❌ Genérico | ✅ Treinado com regras ACI |
| **COBOL expertise** | ⚠️ Limitado | ✅ Otimizado para mainframe |
| **Fluxo Support Case** | ❌ Não existe | ✅ Nativo |
| **Segurança (on-premise)** | ❌ Cloud only | ✅ 100% interno |
| **Customização** | ❌ Genérico | ✅ Regras configuráveis |
---
## Recomendação
### Decisão Solicitada
Aprovar o desenvolvimento do **MVP do ACI JIRA AI Fixer** com:
- **Investimento:** R$ 400.000 - R$ 465.000
- **Timeline:** 4.5 meses
- **Escopo:** Produtos ACQ-MF e ICG-MF
- **Objetivo:** Reduzir tempo de análise de Support Cases em 60%+
### Próximos Passos (após aprovação)
1. **Semana 1:** Definir equipe e iniciar setup de infraestrutura
2. **Semana 2:** Criar repositórios AI e configurar integrações
3. **Mês 1:** Primeira demonstração com issue real
4. **Mês 3:** MVP funcional para piloto
5. **Mês 5:** Go-live em produção
---
## Conclusão
O **ACI JIRA AI Fixer** representa uma oportunidade de:
**Aumentar produtividade** da equipe de suporte em 60%+
**Reduzir tempo de resposta** de horas para minutos
**Padronizar qualidade** das análises
**Reter conhecimento** independente de pessoas
**Posicionar a ACI** na vanguarda de automação com IA
O momento é ideal: tecnologia madura, volume controlado para piloto, e demanda urgente da equipe.
---
**Documento preparado para apresentação à Diretoria.**
*Em caso de dúvidas, a equipe técnica está disponível para demonstração.*

View File

@ -0,0 +1,558 @@
# ACI JIRA AI Fixer - Admin Portal
**Version:** 1.0
**Date:** 2026-02-18
**Classification:** Internal - Product Vision
---
## 1. Overview
The ACI JIRA AI Fixer Admin Portal is a modern, intuitive web interface that allows managing all system configurations without the need to modify code or configuration files manually.
### 1.1 Objectives
- **Zero code** for configuration
- **Intuitive interface** for medium/large enterprises
- **Multi-tenant** to support multiple teams
- **Complete auditing** of all actions
- **Integrated SSO** with corporate providers
---
## 2. Portal Screens
### 2.1 Main Dashboard
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🤖 ACI AI Fixer admin@aci.com ⚙️ 🔔 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Dashboard│ │ Issues │ │ Code │ │ Config │ │ Logs │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 📊 DASHBOARD │ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ 12 │ │ 78% │ │ 2.3min │ │ │
│ │ │ Issues/month │ │ Success Rate │ │ Avg Time │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ │ │
│ │ 📈 Last 30 days │ │
│ │ ████████████████████░░░░░░ 78% fixes accepted │ │
│ │ │ │
│ │ ┌─ Recent Activity ───────────────────────────────────────────┐ │ │
│ │ │ ✅ SUPPORT-4521 - Fix accepted 2 hours ago │ │ │
│ │ │ ⏳ SUPPORT-4519 - Awaiting review 5 hours ago │ │ │
│ │ │ ❌ SUPPORT-4515 - Fix rejected 1 day ago │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
**Displayed metrics:**
- Issues processed (day/week/month)
- Success rate (accepted vs rejected fixes)
- Average analysis time
- Trend chart
- Recent activity
---
### 2.2 Settings - Integrations
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ ⚙️ SETTINGS > Integrations │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ JIRA ────────────────────────────────────────────────────────────────┐ │
│ │ ✅ Connected │ │
│ │ │ │
│ │ Server URL │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://gojira.tsacorp.com │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ API Token │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ •••••••••••••••••••••••••••••••• 👁️ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Webhook URL (copy and configure in JIRA) │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://ai-fixer.aci.com/api/webhook/jira 📋 │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Monitored Projects │ │
│ │ ☑️ ACQ - Acquirer ☑️ ICG - Interchange ☐ CORE - Core System │ │
│ │ │ │
│ │ [ 🔄 Test Connection ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Bitbucket ───────────────────────────────────────────────────────────┐ │
│ │ ✅ Connected │ │
│ │ │ │
│ │ Server URL │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://bitbucket.tsacorp.com │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Access Token │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ •••••••••••••••••••••••••••••••• 👁️ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ 🔄 Test Connection ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ LLM Provider ────────────────────────────────────────────────────────┐ │
│ │ ✅ Azure OpenAI │ │
│ │ │ │
│ │ Provider │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Azure OpenAI ▼ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ Options: Azure OpenAI | OpenAI | OpenRouter (Free) | Self-hosted │ │
│ │ │ │
│ │ Endpoint │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://aci-openai.openai.azure.com │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ API Key │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ •••••••••••••••••••••••••••••••• 👁️ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Model │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ gpt-4o ▼ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ 🔄 Test Connection ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Embeddings ──────────────────────────────────────────────────────────┐ │
│ │ ✅ Self-hosted │ │
│ │ │ │
│ │ Provider │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Self-hosted (MiniLM-L6) ▼ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ Options: Self-hosted | Azure OpenAI | OpenAI │ │
│ │ │ │
│ │ For production, we recommend Azure OpenAI for compliance. │ │
│ │ │ │
│ │ [ 🔄 Test Connection ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ [ 💾 Save All ] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.3 Repository Management
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 📁 REPOSITORIES [ + Add New ] │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 📦 ACQ-MF-safra-fork [ ⚙️ ] [ 🗑️ ]│ │
│ │ │ │
│ │ URL: bitbucket.tsacorp.com/projects/ACQ/repos/ACQ-MF-safra-fork │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Status │ ✅ Indexed │ │ │
│ │ │ Files │ 2,847 files indexed │ │ │
│ │ │ Last Sync │ 02/18/2026 11:30 │ │ │
│ │ │ AI Fork │ ACQ-MF-safra-ai ✅ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Detected languages: │ │
│ │ ████████████████████░░░░░░░░░░ COBOL 68% │ │
│ │ ██████░░░░░░░░░░░░░░░░░░░░░░░░ SQL 22% │ │
│ │ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░ JCL 10% │ │
│ │ │ │
│ │ [ 🔄 Re-index Now ] [ 📊 View Details ] [ ⏰ Schedule Sync ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 📦 ICG-MF-safra-fork [ ⚙️ ] [ 🗑️ ]│ │
│ │ │ │
│ │ URL: bitbucket.tsacorp.com/projects/ICG/repos/ICG-MF-safra-fork │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Status │ ✅ Indexed │ │ │
│ │ │ Files │ 1,923 files indexed │ │ │
│ │ │ Last Sync │ 02/18/2026 11:30 │ │ │
│ │ │ AI Fork │ ICG-MF-safra-ai ✅ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ 🔄 Re-index Now ] [ 📊 View Details ] [ ⏰ Schedule Sync ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.4 Business Rules Editor
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🧠 BUSINESS RULES [ + New Module ] │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Configured modules: │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Author. │ │Clearing │ │HostComm │ │ Batch │ │
│ │ ● │ │ │ │ │ │ │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ═══════════════════════════════════════════════════════════════════════ │
│ │
│ 📌 Module: Authorization │
│ │
│ ┌─ Description ─────────────────────────────────────────────────────────┐ │
│ │ Card transaction authorization module. Responsible for validation, │ │
│ │ HOST communication, and response generation. │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Related Programs ────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ ACQAUTH* ✕ │ │ ACQVALD* ✕ │ │ ACQHOST* ✕ │ [ + Add ] │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Detection Keywords ──────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │authorization✕│ │ decline ✕ │ │ code 51 ✕ │ │ timeout ✕ │ [+] │ │
│ │ └──────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ │ │ │
│ │ When an issue contains these words, the system automatically │ │
│ │ associates it with the Authorization module. │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Context Rules (instructions for AI) ─────────────────────────────────┐ │
│ │ │ │
│ │ 📋 Rule 1 [ ✏️ ] [ 🗑️ ]│ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Transactions above $10,000 require additional validation in │ │ │
│ │ │ program ACQVALD through SECTION 5000-VALIDATE-HIGH-VALUE │ │ │
│ │ │ before sending to HOST. │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 📋 Rule 2 [ ✏️ ] [ 🗑️ ]│ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Response codes follow ISO 8583 standard: │ │ │
│ │ │ - 00: Approved │ │ │
│ │ │ - 51: Insufficient funds (check WS-AVAILABLE-BALANCE) │ │ │
│ │ │ - 14: Invalid card │ │ │
│ │ │ - 91: Issuer unavailable │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 📋 Rule 3 [ ✏️ ] [ 🗑️ ]│ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ WS-AVAILABLE-BALANCE field must have PIC 9(11)V99 for │ │ │
│ │ │ compatibility with HOST return. Check for truncation in │ │ │
│ │ │ comparisons. │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ + Add New Rule ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Restrictions (files AI cannot modify) ───────────────────────────────┐ │
│ │ │ │
│ │ ┌────────────────┐ ┌──────────────────┐ │ │
│ │ │ /interfaces/* ✕│ │ /copybooks/HOST* ✕│ [ + Add ] │ │
│ │ └────────────────┘ └──────────────────┘ │ │
│ │ │ │
│ │ ⚠️ Files in these folders will only be analyzed, never modified. │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ [ Cancel ] [ 💾 Save Module ] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.5 Issues View
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 📋 ANALYZED ISSUES │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 🔍 Search... Status: [ All ▼ ] [ 📅 Period ] │
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─ SUPPORT-4521 ──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ Transaction declined code 51 with available balance │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ ✅ Accepted│ │ 🎯 87% │ │ ⏱️ 2m 34s │ │ 📁 1 file │ │ │ │
│ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Module: Authorization Created: 02/18/2026 09:15 │ │ │
│ │ │ │ │ │
│ │ │ [ 👁️ View Full Analysis ] [ 📝 View PR ] [ 🔗 Open JIRA ] │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ SUPPORT-4519 ──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ Formatting error in clearing file │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ ⏳ Review │ │ 🎯 72% │ │ ⏱️ 3m 12s │ │ 📁 2 files │ │ │ │
│ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Module: Clearing Created: 02/18/2026 06:45 │ │ │
│ │ │ │ │ │
│ │ │ [ 👁️ View Full Analysis ] [ 📝 View PR ] [ 🔗 Open JIRA ] │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ SUPPORT-4515 ──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ JCL failing with return code 12 │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ ❌ Rejected│ │ 🎯 45% │ │ ⏱️ 4m 01s │ │ 📁 1 file │ │ │ │
│ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Reason: "Incorrect dataset analysis PROD.CLEARING.INPUT" │ │ │
│ │ │ │ │ │
│ │ │ [ 👁️ View Analysis ] [ 🔄 Re-analyze ] [ 🔗 Open JIRA ] │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ Showing 1-10 of 47 issues [ ← Previous ] [ Next → ] │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.6 Analysis Details
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 👁️ ANALYSIS: SUPPORT-4521 [ ← Back ]│
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ Issue Information ───────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Title: Transaction declined code 51 with available balance │ │
│ │ Status: ✅ Fix Accepted │ │
│ │ Confidence: 87% │ │
│ │ Analysis time: 2 minutes 34 seconds │ │
│ │ Analyzed at: 02/18/2026 09:17:34 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Original Description ────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Safra client reports that transactions are being declined with │ │
│ │ code 51 (insufficient funds) even when the customer has available │ │
│ │ balance. Occurs on transactions above $100,000.00. │ │
│ │ │ │
│ │ Stack trace: │ │
│ │ ACQAUTH - SECTION 3000-VALIDATE - EVALUATE WS-RESPONSE-CODE │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ AI Analysis ─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 🔍 IDENTIFIED ROOT CAUSE │ │
│ │ │ │
│ │ The ACQAUTH.CBL program is comparing the WS-AVAILABLE-BALANCE │ │
│ │ field with format PIC 9(9)V99 (maximum 9,999,999.99), but the │ │
│ │ value returned from HOST uses PIC 9(11)V99 (max 999,999,999.99). │ │
│ │ │ │
│ │ This causes truncation on values above $100,000.00, │ │
│ │ making the balance appear as insufficient. │ │
│ │ │ │
│ │ 📁 AFFECTED FILES │ │
│ │ • src/cobol/ACQAUTH.CBL (lines 1234-1256) │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Proposed Fix ────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ```cobol │ │
│ │ * BEFORE (line 1234) │ │
│ │ 05 WS-AVAILABLE-BALANCE PIC 9(9)V99. │ │
│ │ │ │
│ │ * AFTER │ │
│ │ 05 WS-AVAILABLE-BALANCE PIC 9(11)V99. │ │
│ │ ``` │ │
│ │ │ │
│ │ Also adjust SECTION 3000-VALIDATE to use the new size. │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Links ───────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 🔗 Issue in JIRA: gojira.tsacorp.com/browse/SUPPORT-4521 │ │
│ │ 📝 Pull Request: bitbucket.tsacorp.com/.../pull-requests/142 │ │
│ │ 💬 AI Comment: View in JIRA │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ [ 🔄 Re-analyze ] [ 📥 Export PDF ] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 3. Portal Technology Stack
### 3.1 Frontend
```yaml
Framework: React 18 + TypeScript
Styling: Tailwind CSS + shadcn/ui
Components:
- Tables with sorting and filters
- Forms with validation
- Charts (Recharts)
- Code editor (Monaco Editor)
- Toast notifications
State Management: React Query + Zustand
Routing: React Router v6
Build: Vite
```
### 3.2 Backend (API)
```yaml
Framework: FastAPI (Python 3.11+)
Documentation: Automatic OpenAPI/Swagger
Authentication: JWT + OAuth2/OIDC
Rate Limiting: slowapi
Validation: Pydantic v2
```
### 3.3 Database
```yaml
Primary: PostgreSQL 15+
Cache: Redis 7+
Vector DB: Qdrant (embeddings)
Migrations: Alembic
```
### 3.4 Authentication
```yaml
Supported options:
- Azure AD (SAML/OIDC)
- Okta
- Google Workspace
- Email/Password with MFA (TOTP)
Permissions (RBAC):
- Admin: Full access
- Editor: Configure rules, view everything
- Viewer: View only
- API: Programmatic access only
```
---
## 4. Configuration Simplicity
| Action | Method | Time |
|--------|--------|------|
| Connect JIRA | Paste URL + Token | 2 minutes |
| Connect Bitbucket | Paste URL + Token | 2 minutes |
| Change LLM provider | Select from dropdown | 30 seconds |
| Add repository | Paste URL + Configure AI fork | 5 minutes |
| Create business rule | Visual editor | 5-10 minutes |
| Add restriction | Type path | 30 seconds |
| View logs | Click on tab | Immediate |
| Export report | "Export" button | Immediate |
**Principle: Zero code for any configuration.**
---
## 5. Multi-Tenant (Multiple Companies)
The portal supports multiple isolated tenants:
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ MULTI-TENANT ARCHITECTURE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Tenant: ACI Safra Tenant: ACI Itaú │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ - Safra Repos │ │ - Itaú Repos │ │
│ │ - Safra Rules │ │ - Itaú Rules │ │
│ │ - Safra Users │ │ - Itaú Users │ │
│ │ - Isolated Logs │ │ - Isolated Logs │ │
│ └─────────────────────────┘ └─────────────────────────┘ │
│ │ │ │
│ └────────────────┬───────────────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ Shared │ │
│ │ Infrastructure │ │
│ │ (LLM, Embeddings) │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
**Guaranteed isolation:**
- Data from one tenant never visible to another
- Independent configurations
- Separate billing (if applicable)
- Audit logs per tenant
---
## 6. Responsiveness
The portal is responsive and works on:
| Device | Support |
|--------|---------|
| Desktop (1920px+) | ✅ Optimized |
| Laptop (1366px) | ✅ Optimized |
| Tablet (768px) | ✅ Adapted |
| Mobile (375px) | ⚠️ View only |
---
## 7. Accessibility
- Full keyboard navigation
- Screen reader compatible (ARIA)
- Adequate contrast (WCAG 2.1 AA)
- Resizable text
---
## 8. Roadmap
1. **Phase 1:** Basic portal with Dashboard and Settings
2. **Phase 2:** Business rules editor
3. **Phase 3:** Multi-tenant and SSO
4. **Phase 4:** Advanced reports and export
5. **Phase 5:** Public API for integrations
---
**Document prepared for product presentation.**

View File

@ -0,0 +1,558 @@
# ACI JIRA AI Fixer - Portal Administrativo
**Versão:** 1.0
**Data:** 2026-02-18
**Classificação:** Interno - Visão de Produto
---
## 1. Visão Geral
O Portal Administrativo do ACI JIRA AI Fixer é uma interface web moderna e intuitiva que permite gerenciar todas as configurações do sistema sem necessidade de alterar código ou arquivos de configuração manualmente.
### 1.1 Objetivos
- **Zero código** para configuração
- **Interface intuitiva** para empresas de médio/grande porte
- **Multi-tenant** para suportar múltiplas equipes
- **Auditoria completa** de todas as ações
- **SSO integrado** com provedores corporativos
---
## 2. Telas do Portal
### 2.1 Dashboard Principal
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🤖 ACI AI Fixer admin@aci.com ⚙️ 🔔 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Dashboard│ │ Issues │ │ Código │ │ Config │ │ Logs │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 📊 DASHBOARD │ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ 12 │ │ 78% │ │ 2.3min │ │ │
│ │ │ Issues/mês │ │ Taxa Acerto │ │ Tempo Médio │ │ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ │ │
│ │ 📈 Últimos 30 dias │ │
│ │ ████████████████████░░░░░░ 78% fixes aceitos │ │
│ │ │ │
│ │ ┌─ Atividade Recente ─────────────────────────────────────────┐ │ │
│ │ │ ✅ SUPPORT-4521 - Fix aceito há 2 horas │ │ │
│ │ │ ⏳ SUPPORT-4519 - Aguardando review há 5 horas │ │ │
│ │ │ ❌ SUPPORT-4515 - Fix rejeitado há 1 dia │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
**Métricas exibidas:**
- Issues processadas (dia/semana/mês)
- Taxa de acerto (fixes aceitos vs rejeitados)
- Tempo médio de análise
- Gráfico de tendência
- Atividade recente
---
### 2.2 Configurações - Integrações
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ ⚙️ CONFIGURAÇÕES > Integrações │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ JIRA ────────────────────────────────────────────────────────────────┐ │
│ │ ✅ Conectado │ │
│ │ │ │
│ │ URL do Servidor │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://gojira.tsacorp.com │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ API Token │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ •••••••••••••••••••••••••••••••• 👁️ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Webhook URL (copie e configure no JIRA) │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://ai-fixer.aci.com/api/webhook/jira 📋 │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Projetos Monitorados │ │
│ │ ☑️ ACQ - Acquirer ☑️ ICG - Interchange ☐ CORE - Core System │ │
│ │ │ │
│ │ [ 🔄 Testar Conexão ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Bitbucket ───────────────────────────────────────────────────────────┐ │
│ │ ✅ Conectado │ │
│ │ │ │
│ │ URL do Servidor │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://bitbucket.tsacorp.com │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Access Token │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ •••••••••••••••••••••••••••••••• 👁️ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ 🔄 Testar Conexão ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ LLM Provider ────────────────────────────────────────────────────────┐ │
│ │ ✅ Azure OpenAI │ │
│ │ │ │
│ │ Provedor │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Azure OpenAI ▼ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ Opções: Azure OpenAI | OpenAI | OpenRouter (Free) | Self-hosted │ │
│ │ │ │
│ │ Endpoint │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ https://aci-openai.openai.azure.com │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ API Key │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ •••••••••••••••••••••••••••••••• 👁️ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Modelo │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ gpt-4o ▼ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ 🔄 Testar Conexão ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Embeddings ──────────────────────────────────────────────────────────┐ │
│ │ ✅ Self-hosted │ │
│ │ │ │
│ │ Provedor │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Self-hosted (MiniLM-L6) ▼ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ Opções: Self-hosted | Azure OpenAI | OpenAI │ │
│ │ │ │
│ │ Para produção, recomendamos Azure OpenAI para compliance. │ │
│ │ │ │
│ │ [ 🔄 Testar Conexão ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ [ 💾 Salvar Tudo ] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.3 Gerenciamento de Repositórios
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 📁 REPOSITÓRIOS [ + Adicionar ] │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 📦 ACQ-MF-safra-fork [ ⚙️ ] [ 🗑️ ]│ │
│ │ │ │
│ │ URL: bitbucket.tsacorp.com/projects/ACQ/repos/ACQ-MF-safra-fork │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Status │ ✅ Indexado │ │ │
│ │ │ Arquivos │ 2.847 arquivos indexados │ │ │
│ │ │ Última Sync │ 18/02/2026 11:30 │ │ │
│ │ │ Fork AI │ ACQ-MF-safra-ai ✅ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Linguagens detectadas: │ │
│ │ ████████████████████░░░░░░░░░░ COBOL 68% │ │
│ │ ██████░░░░░░░░░░░░░░░░░░░░░░░░ SQL 22% │ │
│ │ ███░░░░░░░░░░░░░░░░░░░░░░░░░░░ JCL 10% │ │
│ │ │ │
│ │ [ 🔄 Re-indexar Agora ] [ 📊 Ver Detalhes ] [ ⏰ Agendar Sync ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 📦 ICG-MF-safra-fork [ ⚙️ ] [ 🗑️ ]│ │
│ │ │ │
│ │ URL: bitbucket.tsacorp.com/projects/ICG/repos/ICG-MF-safra-fork │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Status │ ✅ Indexado │ │ │
│ │ │ Arquivos │ 1.923 arquivos indexados │ │ │
│ │ │ Última Sync │ 18/02/2026 11:30 │ │ │
│ │ │ Fork AI │ ICG-MF-safra-ai ✅ │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ 🔄 Re-indexar Agora ] [ 📊 Ver Detalhes ] [ ⏰ Agendar Sync ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.4 Editor de Regras de Negócio
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🧠 REGRAS DE NEGÓCIO [ + Novo Módulo ] │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Módulos configurados: │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Autoriz. │ │Clearing │ │HostComm │ │ Batch │ │
│ │ ● │ │ │ │ │ │ │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ═══════════════════════════════════════════════════════════════════════ │
│ │
│ 📌 Módulo: Autorização │
│ │
│ ┌─ Descrição ───────────────────────────────────────────────────────────┐ │
│ │ Módulo de autorização de transações de cartão. Responsável pela │ │
│ │ validação, comunicação com HOST e geração de resposta. │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Programas Relacionados ──────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ ACQAUTH* ✕ │ │ ACQVALD* ✕ │ │ ACQHOST* ✕ │ [ + Adicionar ]│ │
│ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Keywords de Detecção ────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │autorização✕│ │ decline ✕ │ │código 51 ✕ │ │ timeout ✕ │ [+Add] │ │
│ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │
│ │ │ │
│ │ Quando uma issue contém essas palavras, o sistema associa │ │
│ │ automaticamente ao módulo de Autorização. │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Regras de Contexto (instruções para a IA) ───────────────────────────┐ │
│ │ │ │
│ │ 📋 Regra 1 [ ✏️ ] [ 🗑️ ]│ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Transações acima de R$ 10.000 requerem validação adicional no │ │ │
│ │ │ programa ACQVALD através da SECTION 5000-VALIDATE-HIGH-VALUE │ │ │
│ │ │ antes de enviar ao HOST. │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 📋 Regra 2 [ ✏️ ] [ 🗑️ ]│ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ Códigos de resposta seguem padrão ISO 8583: │ │ │
│ │ │ - 00: Aprovada │ │ │
│ │ │ - 51: Saldo insuficiente (verificar WS-AVAILABLE-BALANCE) │ │ │
│ │ │ - 14: Cartão inválido │ │ │
│ │ │ - 91: Emissor indisponível │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ 📋 Regra 3 [ ✏️ ] [ 🗑️ ]│ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ O campo WS-AVAILABLE-BALANCE deve ter PIC 9(11)V99 para │ │ │
│ │ │ compatibilidade com o retorno do HOST. Verificar se não há │ │ │
│ │ │ truncamento em comparações. │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ [ + Adicionar Nova Regra ] │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Restrições (arquivos que a IA NÃO pode alterar) ─────────────────────┐ │
│ │ │ │
│ │ ┌────────────────┐ ┌────────────────┐ │ │
│ │ │ /interfaces/* ✕│ │ /copybooks/HOST* ✕│ [ + Adicionar ]│ │
│ │ └────────────────┘ └────────────────┘ │ │
│ │ │ │
│ │ ⚠️ Arquivos nestas pastas serão apenas analisados, nunca alterados. │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ [ Cancelar ] [ 💾 Salvar Módulo ] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.5 Visualização de Issues
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 📋 ISSUES ANALISADAS │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ 🔍 Buscar... Status: [ Todos ▼ ] [ 📅 Período ] │
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─ SUPPORT-4521 ──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ Transação declinada código 51 com saldo disponível │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ ✅ Aceito │ │ 🎯 87% │ │ ⏱️ 2m 34s │ │ 📁 1 arquivo│ │ │ │
│ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Módulo: Autorização Criado: 18/02/2026 09:15 │ │ │
│ │ │ │ │ │
│ │ │ [ 👁️ Ver Análise Completa ] [ 📝 Ver PR ] [ 🔗 Abrir JIRA ] │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ SUPPORT-4519 ──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ Erro de formatação no arquivo de clearing │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ ⏳ Review │ │ 🎯 72% │ │ ⏱️ 3m 12s │ │ 📁 2 arquivos│ │ │ │
│ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Módulo: Clearing Criado: 18/02/2026 06:45 │ │ │
│ │ │ │ │ │
│ │ │ [ 👁️ Ver Análise Completa ] [ 📝 Ver PR ] [ 🔗 Abrir JIRA ] │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌─ SUPPORT-4515 ──────────────────────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ │ JCL falhando com código de retorno 12 │ │ │
│ │ │ │ │ │
│ │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │
│ │ │ │ ❌ Rejeitado│ │ 🎯 45% │ │ ⏱️ 4m 01s │ │ 📁 1 arquivo│ │ │ │
│ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ │ │
│ │ │ │ │ │
│ │ │ Motivo: "Análise incorreta do dataset PROD.CLEARING.INPUT" │ │ │
│ │ │ │ │ │
│ │ │ [ 👁️ Ver Análise ] [ 🔄 Re-analisar ] [ 🔗 Abrir JIRA ] │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ Mostrando 1-10 de 47 issues [ ← Anterior ] [ Próximo → ] │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
### 2.6 Detalhes da Análise
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 👁️ ANÁLISE: SUPPORT-4521 [ ← Voltar]│
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ Informações da Issue ────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Título: Transação declinada código 51 com saldo disponível │ │
│ │ Status: ✅ Fix Aceito │ │
│ │ Confiança: 87% │ │
│ │ Tempo de análise: 2 minutos 34 segundos │ │
│ │ Analisado em: 18/02/2026 09:17:34 │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Descrição Original ──────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Cliente Safra reporta que transações estão sendo declinadas com │ │
│ │ código 51 (saldo insuficiente) mesmo quando o cliente possui saldo │ │
│ │ disponível. Ocorre em transações acima de R$ 100.000,00. │ │
│ │ │ │
│ │ Stack trace: │ │
│ │ ACQAUTH - SECTION 3000-VALIDATE - EVALUATE WS-RESPONSE-CODE │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Análise da IA ───────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 🔍 CAUSA RAIZ IDENTIFICADA │ │
│ │ │ │
│ │ O programa ACQAUTH.CBL está comparando o campo WS-AVAILABLE-BALANCE │ │
│ │ com formato PIC 9(9)V99 (máximo 9.999.999,99), mas o valor │ │
│ │ retornado do HOST usa PIC 9(11)V99 (máximo 999.999.999,99). │ │
│ │ │ │
│ │ Isso causa truncamento em valores acima de R$ 100.000,00, │ │
│ │ fazendo com que o saldo apareça como insuficiente. │ │
│ │ │ │
│ │ 📁 ARQUIVOS AFETADOS │ │
│ │ • src/cobol/ACQAUTH.CBL (linhas 1234-1256) │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Correção Proposta ───────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ```cobol │ │
│ │ * ANTES (linha 1234) │ │
│ │ 05 WS-AVAILABLE-BALANCE PIC 9(9)V99. │ │
│ │ │ │
│ │ * DEPOIS │ │
│ │ 05 WS-AVAILABLE-BALANCE PIC 9(11)V99. │ │
│ │ ``` │ │
│ │ │ │
│ │ Também ajustar a SECTION 3000-VALIDATE para usar o novo tamanho. │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Links ───────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 🔗 Issue no JIRA: gojira.tsacorp.com/browse/SUPPORT-4521 │ │
│ │ 📝 Pull Request: bitbucket.tsacorp.com/.../pull-requests/142 │ │
│ │ 💬 Comentário IA: Ver no JIRA │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
│ [ 🔄 Re-analisar ] [ 📥 Exportar PDF ] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 3. Stack Tecnológico do Portal
### 3.1 Frontend
```yaml
Framework: React 18 + TypeScript
Estilização: Tailwind CSS + shadcn/ui
Componentes:
- Tabelas com ordenação e filtros
- Formulários com validação
- Gráficos (Recharts)
- Editor de código (Monaco Editor)
- Notificações toast
State Management: React Query + Zustand
Roteamento: React Router v6
Build: Vite
```
### 3.2 Backend (API)
```yaml
Framework: FastAPI (Python 3.11+)
Documentação: OpenAPI/Swagger automático
Autenticação: JWT + OAuth2/OIDC
Rate Limiting: slowapi
Validação: Pydantic v2
```
### 3.3 Banco de Dados
```yaml
Principal: PostgreSQL 15+
Cache: Redis 7+
Vector DB: Qdrant (embeddings)
Migrations: Alembic
```
### 3.4 Autenticação
```yaml
Opções suportadas:
- Azure AD (SAML/OIDC)
- Okta
- Google Workspace
- Email/Senha com MFA (TOTP)
Permissões (RBAC):
- Admin: Acesso total
- Editor: Configura regras, visualiza tudo
- Viewer: Apenas visualização
- API: Apenas acesso programático
```
---
## 4. Facilidade de Configuração
| Ação | Método | Tempo |
|------|--------|-------|
| Conectar JIRA | Colar URL + Token | 2 minutos |
| Conectar Bitbucket | Colar URL + Token | 2 minutos |
| Trocar provedor LLM | Selecionar no dropdown | 30 segundos |
| Adicionar repositório | Colar URL + Configurar fork AI | 5 minutos |
| Criar regra de negócio | Editor visual | 5-10 minutos |
| Adicionar restrição | Digitar path | 30 segundos |
| Ver logs | Clicar na aba | Imediato |
| Exportar relatório | Botão "Exportar" | Imediato |
**Princípio: Zero código para qualquer configuração.**
---
## 5. Multi-Tenant (Múltiplas Empresas)
O portal suporta múltiplos tenants isolados:
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ ARQUITETURA MULTI-TENANT │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Tenant: ACI Safra Tenant: ACI Itaú │
│ ┌─────────────────────────┐ ┌─────────────────────────┐ │
│ │ - Repos Safra │ │ - Repos Itaú │ │
│ │ - Regras Safra │ │ - Regras Itaú │ │
│ │ - Usuários Safra │ │ - Usuários Itaú │ │
│ │ - Logs isolados │ │ - Logs isolados │ │
│ └─────────────────────────┘ └─────────────────────────┘ │
│ │ │ │
│ └────────────────┬───────────────────┘ │
│ │ │
│ ┌──────────▼──────────┐ │
│ │ Infraestrutura │ │
│ │ Compartilhada │ │
│ │ (LLM, Embeddings) │ │
│ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
**Isolamento garantido:**
- Dados de um tenant nunca visíveis para outro
- Configurações independentes
- Billing separado (se aplicável)
- Audit logs por tenant
---
## 6. Responsividade
O portal é responsivo e funciona em:
| Dispositivo | Suporte |
|-------------|---------|
| Desktop (1920px+) | ✅ Otimizado |
| Laptop (1366px) | ✅ Otimizado |
| Tablet (768px) | ✅ Adaptado |
| Mobile (375px) | ⚠️ Visualização apenas |
---
## 7. Acessibilidade
- Navegação por teclado completa
- Compatível com leitores de tela (ARIA)
- Contraste adequado (WCAG 2.1 AA)
- Textos redimensionáveis
---
## 8. Próximos Passos
1. **Fase 1:** Portal básico com Dashboard e Configurações
2. **Fase 2:** Editor de regras de negócio
3. **Fase 3:** Multi-tenant e SSO
4. **Fase 4:** Relatórios avançados e exportação
5. **Fase 5:** API pública para integrações
---
**Documento preparado para apresentação de produto.**

View File

@ -0,0 +1,611 @@
# ACI JIRA AI Fixer - Technical Document
**Version:** 1.1
**Date:** 2026-02-18
**Update:** Azure OpenAI mandatory for compliance
**Classification:** Internal - Technical Team
---
## 1. Overview
### 1.1 Objective
Develop an artificial intelligence system that integrates with JIRA and Bitbucket to automate Support Case analysis, identify affected modules in source code (COBOL/SQL/JCL), propose fixes, and automatically document solutions.
### 1.2 Scope
- **Products:** ACQ-MF (Acquirer) and ICG-MF (Interchange)
- **Repositories:** Client-specific forks (e.g., ACQ-MF-safra-fork, ICG-MF-safra-fork)
- **Issues:** Support Cases in JIRA
- **Languages:** COBOL, SQL, JCL
### 1.3 High-Level Architecture
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ ACI JIRA AI FIXER - ARCHITECTURE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ │
│ │ JIRA │ │
│ │ gojira.tsacorp│ │
│ │ .com │ │
│ └───────┬───────┘ │
│ │ Webhook (issue_created, issue_updated) │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ EVENT PROCESSOR │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │ │
│ │ │ Queue │ │ Filter │ │ Issue Classifier │ │ │
│ │ │ (Redis) │──▶ (Support │──▶ (Product, Module, │ │ │
│ │ │ │ │ Cases) │ │ Severity) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ CODE INTELLIGENCE ENGINE │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │ │
│ │ │ Bitbucket │ │ Code Index │ │ Context │ │ │
│ │ │ Connector │ │ (Azure OpenAI │ │ Builder │ │ │
│ │ │ │ │ Embeddings) │ │ │ │ │
│ │ │ bitbucket. │ │ - COBOL procs │ │ - CALLs │ │ │
│ │ │ tsacorp.com │ │ - SQL tables │ │ - COPYBOOKs │ │ │
│ │ │ │ │ - JCL jobs │ │ - Includes │ │ │
│ │ └─────────────────┘ └─────────────────┘ └──────────────┘ │ │
│ │ │ │
│ │ Repositories: │ │
│ │ ├── ACQ-MF (base) │ │
│ │ │ └── ACQ-MF-safra-fork (client) │ │
│ │ │ └── ACQ-MF-safra-ai (AI) ← NEW │ │
│ │ ├── ICG-MF (base) │ │
│ │ │ └── ICG-MF-safra-fork (client) │ │
│ │ │ └── ICG-MF-safra-ai (AI) ← NEW │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ FIX GENERATION ENGINE │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │ │
│ │ │ LLM Engine │ │ Fix Validator │ │ Output │ │ │
│ │ │ (Azure OpenAI) │ │ │ │ Generator │ │ │
│ │ │ - GPT-4o │ │ - Syntax check │ │ │ │ │
│ │ │ - GPT-4 Turbo │ │ - COBOL rules │ │ - JIRA │ │ │
│ │ │ │ │ - SQL lint │ │ comment │ │ │
│ │ │ │ │ - JCL validate │ │ - PR/Branch │ │ │
│ │ └─────────────────┘ └─────────────────┘ └──────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ JIRA │ │ Bitbucket │ │
│ │ Comment │ │ Pull Request│ │
│ │ (Analysis + │ │ (AI Fork) │ │
│ │ Suggestion)│ │ │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 2. Detailed Components
### 2.1 Event Processor
#### 2.1.1 JIRA Webhook Receiver
```yaml
Endpoint: POST /api/webhook/jira
Events:
- jira:issue_created
- jira:issue_updated
Filters:
- issueType: "Support Case"
- project: ["ACQ", "ICG"]
Authentication: Webhook Secret (HMAC-SHA256)
```
#### 2.1.2 Queue System
```yaml
Technology: Redis + Bull Queue
Queues:
- jira-events: Raw JIRA events
- analysis-jobs: Pending analysis jobs
- fix-generation: Fix generation tasks
Retry Policy:
- Max attempts: 3
- Backoff: exponential (1min, 5min, 15min)
Dead Letter Queue: jira-events-dlq
```
#### 2.1.3 Issue Classifier
Responsible for extracting metadata from issues:
```python
class IssueClassifier:
def classify(self, issue: JiraIssue) -> ClassifiedIssue:
return ClassifiedIssue(
product=self._detect_product(issue), # ACQ-MF or ICG-MF
module=self._detect_module(issue), # Authorization, Clearing, etc.
severity=self._detect_severity(issue), # P1, P2, P3
keywords=self._extract_keywords(issue), # Technical terms
stack_trace=self._parse_stack_trace(issue),
affected_programs=self._detect_programs(issue)
)
```
### 2.2 Code Intelligence Engine
#### 2.2.1 Bitbucket Connector
```yaml
Base URL: https://bitbucket.tsacorp.com
API Version: REST 1.0 (Bitbucket Server)
Authentication: Personal Access Token or OAuth
Operations:
- Clone/Pull: Sparse checkout (relevant directories only)
- Read: Specific file contents
- Branches: Create/list branches in AI fork
- Pull Requests: Create PR from AI fork → client fork
```
**Access Structure per Repository:**
| Repository | AI Permission | Usage |
|------------|---------------|-------|
| ACQ-MF (base) | READ | Reference, standards |
| ACQ-MF-safra-fork | READ | Current client code |
| ACQ-MF-safra-ai | WRITE | AI branches and commits |
| ICG-MF (base) | READ | Reference, standards |
| ICG-MF-safra-fork | READ | Current client code |
| ICG-MF-safra-ai | WRITE | AI branches and commits |
#### 2.2.2 Code Index (Embeddings)
**⚠️ IMPORTANT: Azure OpenAI Embeddings (Mandatory)**
The client has compliance requirements that mandate source code data not be processed by public APIs. Therefore, we **mandatorily** use Azure OpenAI Embeddings:
```yaml
Provider: Azure OpenAI (data remains in client's Azure tenant)
Model: text-embedding-ada-002 or text-embedding-3-large
Region: Brazil South (recommended) or East US
Compliance: Data not used for training Microsoft models
Contract: ACI's existing Enterprise Agreement
```
**Why not use GitHub Copilot for embeddings?**
- GitHub Copilot is an IDE tool, has no API for integration
- Does not offer indexing or semantic search functionality
- There is no way to use Copilot to search code programmatically
**COBOL Code Indexing:**
```yaml
Granularity: By PROGRAM-ID / SECTION / PARAGRAPH
Extracted metadata:
- PROGRAM-ID
- COPY statements (dependencies)
- CALL statements (called programs)
- FILE-CONTROL (accessed files)
- SQL EXEC (tables/queries)
- Working Storage (main variables)
Embedding Model: Azure OpenAI text-embedding-3-large
Vector DB: Qdrant (self-hosted on ACI infra) or Azure AI Search
Dimensions: 3072
Index separated by: product + client
```
**SQL Indexing:**
```yaml
Granularity: By table/view/procedure
Extracted metadata:
- Object name
- Columns and types
- Foreign keys
- Referencing procedures
```
**JCL Indexing:**
```yaml
Granularity: By JOB / STEP
Extracted metadata:
- JOB name
- Executed PGMs
- DD statements (datasets)
- Passed PARMs
- Dependencies (JCL INCLUDEs)
```
#### 2.2.3 Context Builder
Assembles relevant context for LLM analysis:
```python
class ContextBuilder:
def build_context(self, issue: ClassifiedIssue) -> AnalysisContext:
# 1. Search programs mentioned in the issue
mentioned_programs = self._search_by_keywords(issue.keywords)
# 2. Search similar programs from past issues
similar_issues = self._find_similar_issues(issue)
# 3. Expand dependencies (COPYBOOKs, CALLs)
dependencies = self._expand_dependencies(mentioned_programs)
# 4. Get configured business rules
business_rules = self._get_business_rules(issue.product)
# 5. Build final context (respecting token limit)
return AnalysisContext(
primary_code=mentioned_programs[:5], # Max 5 main programs
dependencies=dependencies[:10], # Max 10 dependencies
similar_fixes=similar_issues[:3], # Max 3 examples
business_rules=business_rules,
total_tokens=self._count_tokens()
)
```
### 2.3 Fix Generation Engine
#### 2.3.1 LLM Engine
```yaml
Primary: Azure OpenAI GPT-4o (data does not leave Azure environment)
Fallback: Azure OpenAI GPT-4 Turbo
Gateway: LiteLLM (unified interface)
Configuration:
temperature: 0.2 # Low for code
max_tokens: 4096
top_p: 0.95
```
**Note on GitHub Copilot:** The client has GitHub Copilot, however this tool is intended for use in the IDE by developers. Copilot **does not have a public API** for integration in automated systems and **does not offer embedding/indexing functionality**. Therefore, the solution uses Azure OpenAI for all AI operations.
**COBOL Prompt Template:**
```
You are an expert in mainframe payment systems,
specifically ACI Acquirer (ACQ-MF) and Interchange (ICG-MF) products.
## System Context
{business_rules}
## Reported Issue
{issue_description}
## Current Code
{code_context}
## Similar Fix History
{similar_fixes}
## Task
Analyze the issue and:
1. Identify the probable root cause
2. Locate the affected program(s)
3. Propose a specific fix
4. Explain the impact of the change
## Rules
- Maintain COBOL-85 compatibility
- Preserve existing copybook structure
- Do not change interfaces with other systems without explicit mention
- Document all proposed changes
## Response Format
{response_format}
```
#### 2.3.2 Fix Validator
**COBOL Validations:**
```yaml
Syntax:
- Compilation with GnuCOBOL (syntax check)
- Verification of referenced copybooks
Semantics:
- CALLs to existing programs
- Variables declared before use
- Compatible PIC clauses
Style:
- Standard indentation (Area A/B)
- ACI naming conventions
- Mandatory comments
```
**SQL Validations:**
```yaml
- Syntax check with SQL parser
- Verification of existing tables/columns
- Performance analysis (EXPLAIN)
```
**JCL Validations:**
```yaml
- JCL syntax check
- Referenced datasets exist
- Referenced PGMs exist
```
---
## 3. Repository Structure (AI Fork)
### 3.1 AI Fork Creation
```bash
# Proposed structure in Bitbucket
projects/
├── ACQ/
│ ├── ACQ-MF # Base product (existing)
│ ├── ACQ-MF-safra-fork # Client fork (existing)
│ └── ACQ-MF-safra-ai # AI fork (NEW)
├── ICG/
│ ├── ICG-MF # Base product (existing)
│ ├── ICG-MF-safra-fork # Client fork (existing)
│ └── ICG-MF-safra-ai # AI fork (NEW)
```
### 3.2 Branch Flow
```
ACQ-MF-safra-fork (client)
│ fork
ACQ-MF-safra-ai (AI)
├── main (sync with client)
└── ai-fix/JIRA-1234-description
│ Pull Request
ACQ-MF-safra-fork (client)
│ Review + Approve
merge
```
### 3.3 Commit Convention
```
[AI-FIX] JIRA-1234: Short fix description
Problem:
- Original problem description
Solution:
- What was changed and why
Modified files:
- src/cobol/ACQAUTH.CBL (lines 1234-1256)
Confidence: 85%
Generated by: ACI JIRA AI Fixer v1.0
Co-authored-by: ai-fixer@aci.com
```
### 3.4 Recommended Permissions
| User/Group | ACQ-MF (base) | Client Fork | AI Fork |
|------------|---------------|-------------|---------|
| ai-fixer-svc | READ | READ | WRITE |
| devs-aci | WRITE | WRITE | READ |
| tech-leads | ADMIN | ADMIN | ADMIN |
---
## 4. Technology Stack
### 4.1 Backend
```yaml
Runtime: Python 3.11+
Framework: FastAPI
Async: asyncio + httpx
Queue: Redis 7+ with Bull Queue (via Python-RQ or Celery)
Database: PostgreSQL 15+ (metadata, configurations, logs)
Vector DB: Qdrant 1.7+ (self-hosted)
Cache: Redis
```
### 4.2 Frontend (Admin Panel)
```yaml
Framework: React 18+ or Vue 3+
UI Kit: Tailwind CSS + shadcn/ui
State: React Query or Pinia
Build: Vite
```
### 4.3 Infrastructure
```yaml
Container: Docker + Docker Compose
Orchestration: Docker Swarm (initial) or Kubernetes (scale)
CI/CD: Bitbucket Pipelines
Reverse Proxy: Traefik or nginx
SSL: Let's Encrypt
Monitoring: Prometheus + Grafana
Logs: ELK Stack or Loki
```
### 4.4 External Integrations
```yaml
LLM (Azure OpenAI - MANDATORY):
Primary: Azure OpenAI GPT-4o
Fallback: Azure OpenAI GPT-4 Turbo
Region: Brazil South or East US
Gateway: LiteLLM (natively supports Azure OpenAI)
Compliance: Data not used for training, stays in Azure tenant
Embeddings (Azure OpenAI - MANDATORY):
Model: Azure OpenAI text-embedding-3-large
Alternative: Azure OpenAI text-embedding-ada-002
Vector DB: Qdrant (self-hosted) or Azure AI Search
JIRA:
API: REST API v2 (Server)
Auth: Personal Access Token
Bitbucket:
API: REST API 1.0 (Server)
Auth: Personal Access Token
```
**⚠️ Note on GitHub Copilot:**
The client has GitHub Copilot licenses, however this tool **is not applicable** for this solution because:
1. It's an IDE tool (code autocomplete), not an API
2. Has no public endpoint for programmatic integration
3. Does not offer embeddings or semantic search functionality
4. Does not allow indexing or querying code repositories
GitHub Copilot will continue to be used by developers in their daily work, while the ACI AI Fixer solution uses Azure OpenAI for automation.
---
## 5. Security
### 5.1 Sensitive Data
```yaml
Source code:
- Processed in memory, not persisted to disk
- Embeddings stored in Qdrant (encrypted at-rest)
- Sanitized logs (no complete code)
Credentials:
- Vault (HashiCorp) or AWS Secrets Manager
- Automatic token rotation
- Access audit log
LLM and Embeddings:
- MANDATORY: Azure OpenAI (data does not leave Azure tenant)
- Data is not used to train Microsoft models
- Compliance with ACI corporate policies
- Brazil South region for lower latency
```
### 5.2 Network
```yaml
Deployment:
- Internal network (not exposed to internet)
- HTTPS/TLS 1.3 communication
- Firewall: only JIRA and Bitbucket can access webhooks
Authentication:
- Admin Panel: SSO via SAML/OIDC (integrate with ACI AD)
- API: JWT tokens with short expiration
- Webhooks: HMAC-SHA256 signature verification
```
### 5.3 Compliance
```yaml
Requirements:
- [ ] Data segregation by client/fork
- [ ] Complete audit trail (who, when, what)
- [ ] Configurable log retention
- [ ] Option for 100% on-premise processing
- [ ] Data flow documentation
```
---
## 6. Estimates
### 6.1 Development Timeline
| Phase | Duration | Deliverables |
|-------|----------|--------------|
| **1. Initial Setup** | 2 weeks | Infra, repos, basic CI/CD |
| **2. Integrations** | 3 weeks | JIRA webhook, Bitbucket connector |
| **3. Code Intelligence** | 4 weeks | COBOL/SQL/JCL indexing, embeddings |
| **4. Fix Engine** | 3 weeks | LLM integration, prompt engineering |
| **5. Output & PR** | 2 weeks | JIRA comments, Bitbucket PRs |
| **6. Admin Panel** | 2 weeks | Dashboard, configurations |
| **7. Tests & Adjustments** | 2 weeks | Validation with real issues |
| **Total MVP** | **18 weeks** | ~4.5 months |
### 6.2 Suggested Team
| Role | Quantity | Dedication |
|------|----------|------------|
| Tech Lead | 1 | 100% |
| Backend Developer | 2 | 100% |
| Frontend Developer | 1 | 50% |
| DevOps | 1 | 25% |
| **Total** | **5** | |
### 6.3 Monthly Operational Costs (Estimate)
| Item | Cost/Month |
|------|------------|
| LLM APIs (10 issues × ~$3/issue) | ~$30 |
| Infra (VPS/On-premise) | $200-500 |
| Vector DB (Qdrant self-hosted) | $0 (infra) |
| **Total** | **~$230-530/month** |
*Note: Low volume (5-10 issues/month) results in minimal operational cost.*
---
## 7. Technical Risks and Mitigations
| Risk | Probability | Impact | Mitigation |
|------|-------------|--------|------------|
| LLM generates incorrect fix | High | High | Mandatory human review, confidence score |
| Insufficient COBOL context | Medium | High | RAG with copybooks, fix examples |
| High latency | Low | Medium | Async queue, visual feedback |
| Bitbucket API rate limit | Low | Low | Aggressive cache, sparse checkout |
| Security (code exposure) | Medium | High | Azure OpenAI or self-hosted LLM |
---
## 8. Success Metrics
### 8.1 Technical KPIs
| Metric | MVP Target | 6-Month Target |
|--------|------------|----------------|
| Successful analysis rate | 80% | 95% |
| Accepted fixes (no modification) | 30% | 50% |
| Accepted fixes (with adjustments) | 50% | 70% |
| Average analysis time | < 5 min | < 2 min |
| System uptime | 95% | 99% |
### 8.2 Business KPIs
| Metric | Target |
|--------|--------|
| Initial analysis time reduction | 50% |
| Issues with useful suggestion | 70% |
| Team satisfaction | > 4/5 |
---
## 9. Next Steps
1. **Week 1-2:**
- Provision development infrastructure
- Create AI forks in Bitbucket
- Configure JIRA webhooks (test environment)
2. **Week 3-4:**
- Implement Bitbucket connector
- Index code from 1 repository (ACQ-MF-safra-fork)
- Test embeddings with 5 historical issues
3. **Week 5-6:**
- Integrate LLM (Azure OpenAI GPT-4o)
- Develop COBOL-specific prompts
- Validate outputs with technical team
---
**Document prepared for technical review.**
*Contact: [Development Team]*

View File

@ -0,0 +1,749 @@
# ACI JIRA AI Fixer - Documento Técnico
**Versão:** 1.1
**Data:** 2026-02-18
**Atualização:** Azure OpenAI obrigatório para compliance
**Classificação:** Interno - Equipe Técnica
---
## 1. Visão Geral
### 1.1 Objetivo
Desenvolver um sistema de inteligência artificial que integra com JIRA e Bitbucket para automatizar a análise de Support Cases, identificar módulos afetados no código-fonte (COBOL/SQL/JCL), propor correções e documentar soluções automaticamente.
### 1.2 Escopo
- **Produtos:** ACQ-MF (Acquirer) e ICG-MF (Interchange)
- **Repositórios:** Forks específicos por cliente (ex: ACQ-MF-safra-fork, ICG-MF-safra-fork)
- **Issues:** Support Cases no JIRA
- **Linguagens:** COBOL, SQL, JCL
### 1.3 Arquitetura de Alto Nível
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ ACI JIRA AI FIXER - ARQUITETURA │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ │
│ │ JIRA │ │
│ │ gojira.tsacorp│ │
│ │ .com │ │
│ └───────┬───────┘ │
│ │ Webhook (issue_created, issue_updated) │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ EVENT PROCESSOR │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │ │
│ │ │ Queue │ │ Filter │ │ Issue Classifier │ │ │
│ │ │ (Redis) │──▶ (Support │──▶ (Produto, Módulo, │ │ │
│ │ │ │ │ Cases) │ │ Severidade) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ CODE INTELLIGENCE ENGINE │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │ │
│ │ │ Bitbucket │ │ Code Index │ │ Context │ │ │
│ │ │ Connector │ │ (Embeddings) │ │ Builder │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ bitbucket. │ │ - COBOL procs │ │ - CALLs │ │ │
│ │ │ tsacorp.com │ │ - SQL tables │ │ - COPYBOOKs │ │ │
│ │ │ │ │ - JCL jobs │ │ - Includes │ │ │
│ │ └─────────────────┘ └─────────────────┘ └──────────────┘ │ │
│ │ │ │
│ │ Repositórios: │ │
│ │ ├── ACQ-MF (base) │ │
│ │ │ └── ACQ-MF-safra-fork (cliente) │ │
│ │ │ └── ACQ-MF-safra-ai (IA) ← NOVO │ │
│ │ ├── ICG-MF (base) │ │
│ │ │ └── ICG-MF-safra-fork (cliente) │ │
│ │ │ └── ICG-MF-safra-ai (IA) ← NOVO │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────┐ │
│ │ FIX GENERATION ENGINE │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │ │
│ │ │ LLM Engine │ │ Fix Validator │ │ Output │ │ │
│ │ │ │ │ │ │ Generator │ │ │
│ │ │ - GPT-4o │ │ - Syntax check │ │ │ │ │
│ │ │ - Claude 3.5 │ │ - COBOL rules │ │ - JIRA │ │ │
│ │ │ - Fallback │ │ - SQL lint │ │ comment │ │ │
│ │ │ │ │ - JCL validate │ │ - PR/Branch │ │ │
│ │ └─────────────────┘ └─────────────────┘ └──────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ JIRA │ │ Bitbucket │ │
│ │ Comment │ │ Pull Request│ │
│ │ (Análise + │ │ (Fork AI) │ │
│ │ Sugestão) │ │ │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 2. Componentes Detalhados
### 2.1 Event Processor
#### 2.1.1 JIRA Webhook Receiver
```yaml
Endpoint: POST /api/webhook/jira
Eventos:
- jira:issue_created
- jira:issue_updated
Filtros:
- issueType: "Support Case"
- project: ["ACQ", "ICG"]
Autenticação: Webhook Secret (HMAC-SHA256)
```
#### 2.1.2 Queue System
```yaml
Tecnologia: Redis + Bull Queue
Filas:
- jira-events: Eventos brutos do JIRA
- analysis-jobs: Jobs de análise pendentes
- fix-generation: Geração de correções
Retry Policy:
- Max attempts: 3
- Backoff: exponential (1min, 5min, 15min)
Dead Letter Queue: jira-events-dlq
```
#### 2.1.3 Issue Classifier
Responsável por extrair metadados da issue:
```python
class IssueClassifier:
def classify(self, issue: JiraIssue) -> ClassifiedIssue:
return ClassifiedIssue(
produto=self._detect_product(issue), # ACQ-MF ou ICG-MF
modulo=self._detect_module(issue), # Autorização, Clearing, etc.
severidade=self._detect_severity(issue), # P1, P2, P3
keywords=self._extract_keywords(issue), # Termos técnicos
stack_trace=self._parse_stack_trace(issue),
affected_programs=self._detect_programs(issue)
)
```
### 2.2 Code Intelligence Engine
#### 2.2.1 Bitbucket Connector
```yaml
Base URL: https://bitbucket.tsacorp.com
API Version: REST 1.0 (Bitbucket Server)
Autenticação: Personal Access Token ou OAuth
Operações:
- Clone/Pull: Sparse checkout (apenas diretórios relevantes)
- Read: Conteúdo de arquivos específicos
- Branches: Criar/listar branches no fork AI
- Pull Requests: Criar PR do fork AI → fork cliente
```
**Estrutura de Acesso por Repo:**
| Repositório | Permissão IA | Uso |
|-------------|--------------|-----|
| ACQ-MF (base) | READ | Referência, padrões |
| ACQ-MF-safra-fork | READ | Código atual cliente |
| ACQ-MF-safra-ai | WRITE | Branches e commits IA |
| ICG-MF (base) | READ | Referência, padrões |
| ICG-MF-safra-fork | READ | Código atual cliente |
| ICG-MF-safra-ai | WRITE | Branches e commits IA |
#### 2.2.2 Code Index (Embeddings)
**⚠️ IMPORTANTE: Azure OpenAI Embeddings (Obrigatório)**
O cliente possui requisitos de compliance que exigem que os dados de código-fonte não sejam processados por APIs públicas. Por isso, **obrigatoriamente** utilizamos Azure OpenAI Embeddings:
```yaml
Provedor: Azure OpenAI (dados permanecem no tenant Azure do cliente)
Modelo: text-embedding-ada-002 ou text-embedding-3-large
Região: Brazil South (recomendado) ou East US
Compliance: Dados não são usados para treinar modelos Microsoft
Contrato: Enterprise Agreement existente da ACI
```
**Por que não usar GitHub Copilot para embeddings?**
- GitHub Copilot é uma ferramenta de IDE, não possui API para integração
- Não oferece funcionalidade de indexação ou busca semântica
- Não há como usar Copilot para buscar código relevante programaticamente
**Indexação de Código COBOL:**
```yaml
Granularidade: Por PROGRAM-ID / SECTION / PARAGRAPH
Metadados extraídos:
- PROGRAM-ID
- COPY statements (dependências)
- CALL statements (programas chamados)
- FILE-CONTROL (arquivos acessados)
- SQL EXEC (tabelas/queries)
- Working Storage (variáveis principais)
Modelo de Embedding: Azure OpenAI text-embedding-3-large
Vector DB: Qdrant (self-hosted na infra ACI) ou Azure AI Search
Dimensões: 3072
Índice separado por: produto + cliente
```
**Indexação de SQL:**
```yaml
Granularidade: Por tabela/view/procedure
Metadados extraídos:
- Nome do objeto
- Colunas e tipos
- Foreign keys
- Procedures que referenciam
```
**Indexação de JCL:**
```yaml
Granularidade: Por JOB / STEP
Metadados extraídos:
- JOB name
- PGM executados
- DD statements (datasets)
- PARM passados
- Dependências (JCL INCLUDEs)
```
#### 2.2.3 Context Builder
Monta o contexto relevante para o LLM analisar:
```python
class ContextBuilder:
def build_context(self, issue: ClassifiedIssue) -> AnalysisContext:
# 1. Busca programas mencionados na issue
mentioned_programs = self._search_by_keywords(issue.keywords)
# 2. Busca programas similares a issues passadas
similar_issues = self._find_similar_issues(issue)
# 3. Expande dependências (COPYBOOKs, CALLs)
dependencies = self._expand_dependencies(mentioned_programs)
# 4. Busca regras de negócio configuradas
business_rules = self._get_business_rules(issue.produto)
# 5. Monta contexto final (respeitando limite de tokens)
return AnalysisContext(
primary_code=mentioned_programs[:5], # Max 5 programas principais
dependencies=dependencies[:10], # Max 10 dependências
similar_fixes=similar_issues[:3], # Max 3 exemplos
business_rules=business_rules,
total_tokens=self._count_tokens()
)
```
### 2.3 Fix Generation Engine
#### 2.3.1 LLM Engine
```yaml
Primary: Azure OpenAI GPT-4o (dados não saem do ambiente Azure)
Fallback: Azure OpenAI GPT-4 Turbo
Gateway: LiteLLM (unified interface)
Configuração:
temperature: 0.2 # Baixa para código
max_tokens: 4096
top_p: 0.95
```
**Nota sobre GitHub Copilot:** O cliente possui GitHub Copilot, porém esta ferramenta é destinada ao uso no IDE pelos desenvolvedores. O Copilot **não possui API pública** para integração em sistemas automatizados e **não oferece funcionalidade de embeddings/indexação**. Por isso, a solução utiliza Azure OpenAI para todas as operações de IA.
**Prompt Template para COBOL:**
```
Você é um especialista em sistemas de pagamentos mainframe,
especificamente nos produtos ACI Acquirer (ACQ-MF) e Interchange (ICG-MF).
## Contexto do Sistema
{business_rules}
## Issue Reportada
{issue_description}
## Código Atual
{code_context}
## Histórico de Fixes Similares
{similar_fixes}
## Tarefa
Analise a issue e:
1. Identifique a causa raiz provável
2. Localize o(s) programa(s) afetado(s)
3. Proponha uma correção específica
4. Explique o impacto da mudança
## Regras
- Mantenha compatibilidade com COBOL-85
- Preserve a estrutura de copybooks existente
- Não altere interfaces com outros sistemas sem explicitar
- Documente todas as alterações propostas
## Formato de Resposta
{response_format}
```
#### 2.3.2 Fix Validator
**Validações COBOL:**
```yaml
Syntax:
- Compilação com GnuCOBOL (syntax check)
- Verificação de copybooks referenciados
Semântica:
- CALLs para programas existentes
- Variáveis declaradas antes do uso
- PIC clauses compatíveis
Estilo:
- Indentação padrão (área A/B)
- Naming conventions da ACI
- Comentários obrigatórios
```
**Validações SQL:**
```yaml
- Syntax check com parser SQL
- Verificação de tabelas/colunas existentes
- Análise de performance (EXPLAIN)
```
**Validações JCL:**
```yaml
- Syntax check JCL
- Datasets referenciados existem
- PGMs referenciados existem
```
#### 2.3.3 Output Generator
**Formato do Comentário JIRA:**
```markdown
## 🤖 Análise Automática - AI Fixer
### 📋 Resumo
[Descrição concisa do problema identificado]
### 🔍 Causa Raiz Identificada
[Explicação técnica da causa]
### 📁 Arquivos Afetados
| Arquivo | Tipo | Alteração |
|---------|------|-----------|
| ACQAUTH.CBL | COBOL | Modificação na SECTION 3000-VALIDATE |
| ACQAUTH.CPY | COPYBOOK | Sem alteração |
### 💡 Correção Proposta
```cobol
[Código da correção]
```
### ⚠️ Impacto
- [Lista de impactos]
### 📊 Confiança
- **Score:** 85%
- **Base:** 3 issues similares encontradas
### 🔗 Ações
- [Link para PR no Bitbucket] (se aplicável)
- [Link para branch com correção]
---
*Gerado automaticamente por ACI JIRA AI Fixer v1.0*
*Review humano obrigatório antes de merge*
```
---
## 3. Estrutura de Repositórios (Fork AI)
### 3.1 Criação dos Forks AI
```bash
# Estrutura proposta no Bitbucket
projects/
├── ACQ/
│ ├── ACQ-MF # Produto base (existente)
│ ├── ACQ-MF-safra-fork # Fork cliente (existente)
│ └── ACQ-MF-safra-ai # Fork IA (NOVO)
├── ICG/
│ ├── ICG-MF # Produto base (existente)
│ ├── ICG-MF-safra-fork # Fork cliente (existente)
│ └── ICG-MF-safra-ai # Fork IA (NOVO)
```
### 3.2 Fluxo de Branches
```
ACQ-MF-safra-fork (cliente)
│ fork
ACQ-MF-safra-ai (IA)
├── main (sync com cliente)
└── ai-fix/JIRA-1234-descricao
│ Pull Request
ACQ-MF-safra-fork (cliente)
│ Review + Approve
merge
```
### 3.3 Convenção de Commits
```
[AI-FIX] JIRA-1234: Descrição curta do fix
Problema:
- Descrição do problema original
Solução:
- O que foi alterado e por quê
Arquivos modificados:
- src/cobol/ACQAUTH.CBL (linha 1234-1256)
Confiança: 85%
Gerado por: ACI JIRA AI Fixer v1.0
Co-authored-by: ai-fixer@aci.com
```
### 3.4 Permissões Recomendadas
| Usuário/Grupo | ACQ-MF (base) | Fork Cliente | Fork AI |
|---------------|---------------|--------------|---------|
| ai-fixer-svc | READ | READ | WRITE |
| devs-aci | WRITE | WRITE | READ |
| tech-leads | ADMIN | ADMIN | ADMIN |
---
## 4. Interface de Configuração (Admin Panel)
### 4.1 Funcionalidades
```
┌─────────────────────────────────────────────────────────────┐
│ ACI AI FIXER - ADMIN │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Dashboard │ │ Config │ │ Logs │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 📊 Dashboard │
│ ├── Issues processadas (hoje/semana/mês) │
│ ├── Taxa de acerto (fixes aceitos) │
│ ├── Tempo médio de análise │
│ └── Fila atual │
│ │
│ ⚙️ Configurações │
│ ├── Regras de Negócio │
│ │ └── [Editor de regras por módulo] │
│ ├── Mapeamento de Módulos │
│ │ └── [Keywords → Programas] │
│ ├── Exemplos de Fixes │
│ │ └── [Issues resolvidas como referência] │
│ ├── Restrições │
│ │ └── [Arquivos/módulos que IA não pode alterar] │
│ └── Conexões │
│ ├── JIRA (webhook URL, credentials) │
│ └── Bitbucket (repos, tokens) │
│ │
│ 📝 Logs │
│ ├── Histórico de análises │
│ ├── Erros e exceções │
│ └── Audit trail (quem aprovou o quê) │
│ │
└─────────────────────────────────────────────────────────────┘
```
### 4.2 Configuração de Regras de Negócio
```yaml
# Exemplo de configuração por módulo
modulos:
autorizacao:
descricao: "Módulo de autorização de transações"
programas:
- ACQAUTH*
- ACQVALD*
keywords:
- autorização
- auth
- decline
- aprovação
regras:
- "Transações acima de 10000 requerem validação adicional"
- "Códigos de resposta seguem padrão ISO 8583"
restricoes:
- "Não alterar interface com HOST sem aprovação"
clearing:
descricao: "Módulo de clearing e settlement"
programas:
- ICGCLR*
- ICGSET*
keywords:
- clearing
- settlement
- arquivo retorno
regras:
- "Arquivos de clearing seguem layout CNAB"
```
### 4.3 API do Admin Panel
```yaml
# Endpoints principais
POST /api/config/rules
- Criar/atualizar regras de negócio
GET /api/config/modules
- Listar módulos configurados
POST /api/config/examples
- Adicionar exemplo de fix
GET /api/dashboard/stats
- Métricas de uso
GET /api/logs/analyses
- Histórico de análises
POST /api/manual/analyze
- Trigger análise manual de uma issue
```
---
## 5. Stack Tecnológico
### 5.1 Backend
```yaml
Runtime: Python 3.11+
Framework: FastAPI
Async: asyncio + httpx
Queue: Redis 7+ com Bull Queue (via Python-RQ ou Celery)
Database: PostgreSQL 15+ (metadados, configurações, logs)
Vector DB: Qdrant 1.7+ (self-hosted)
Cache: Redis
```
### 5.2 Frontend (Admin Panel)
```yaml
Framework: React 18+ ou Vue 3+
UI Kit: Tailwind CSS + shadcn/ui
State: React Query ou Pinia
Build: Vite
```
### 5.3 Infraestrutura
```yaml
Container: Docker + Docker Compose
Orquestração: Docker Swarm (inicial) ou Kubernetes (escala)
CI/CD: Bitbucket Pipelines
Reverse Proxy: Traefik ou nginx
SSL: Let's Encrypt
Monitoramento: Prometheus + Grafana
Logs: ELK Stack ou Loki
```
### 5.4 Integrações Externas
```yaml
LLM (Azure OpenAI - OBRIGATÓRIO):
Primary: Azure OpenAI GPT-4o
Fallback: Azure OpenAI GPT-4 Turbo
Região: Brazil South ou East US
Gateway: LiteLLM (suporta Azure OpenAI nativamente)
Compliance: Dados não usados para treino, ficam no tenant Azure
Embeddings (Azure OpenAI - OBRIGATÓRIO):
Modelo: Azure OpenAI text-embedding-3-large
Alternativa: Azure OpenAI text-embedding-ada-002
Vector DB: Qdrant (self-hosted) ou Azure AI Search
JIRA:
API: REST API v2 (Server)
Auth: Personal Access Token
Bitbucket:
API: REST API 1.0 (Server)
Auth: Personal Access Token
```
**⚠️ Nota sobre GitHub Copilot:**
O cliente possui licenças de GitHub Copilot, porém esta ferramenta **não é aplicável** para esta solução porque:
1. É uma ferramenta de IDE (autocompletar código), não uma API
2. Não possui endpoint público para integração programática
3. Não oferece funcionalidade de embeddings ou busca semântica
4. Não permite indexar ou consultar repositórios de código
O GitHub Copilot continuará sendo usado pelos desenvolvedores no dia-a-dia, enquanto a solução ACI AI Fixer usa Azure OpenAI para automação.
---
## 6. Segurança
### 6.1 Dados Sensíveis
```yaml
Código fonte:
- Processado em memória, não persistido em disco
- Embeddings armazenados em Qdrant (criptografado at-rest)
- Logs sanitizados (sem código completo)
Credenciais:
- Vault (HashiCorp) ou AWS Secrets Manager
- Rotação automática de tokens
- Audit log de acessos
LLM e Embeddings:
- OBRIGATÓRIO: Azure OpenAI (dados não saem do tenant Azure)
- Dados não são usados para treinar modelos da Microsoft
- Compliance com políticas corporativas ACI
- Região Brazil South para menor latência
```
### 6.2 Rede
```yaml
Deployment:
- Rede interna (não exposto à internet)
- Comunicação HTTPS/TLS 1.3
- Firewall: apenas JIRA e Bitbucket podem acessar webhooks
Autenticação:
- Admin Panel: SSO via SAML/OIDC (integrar com AD da ACI)
- API: JWT tokens com expiração curta
- Webhooks: HMAC-SHA256 signature verification
```
### 6.3 Compliance
```yaml
Requisitos:
- [ ] Segregação de dados por cliente/fork
- [ ] Audit trail completo (quem, quando, o quê)
- [ ] Retenção de logs configurável
- [ ] Opção de processamento 100% on-premise
- [ ] Documentação de fluxo de dados
```
---
## 7. Estimativas
### 7.1 Timeline de Desenvolvimento
| Fase | Duração | Entregas |
|------|---------|----------|
| **1. Setup Inicial** | 2 semanas | Infra, repos, CI/CD básico |
| **2. Integrações** | 3 semanas | JIRA webhook, Bitbucket connector |
| **3. Code Intelligence** | 4 semanas | Indexação COBOL/SQL/JCL, embeddings |
| **4. Fix Engine** | 3 semanas | LLM integration, prompt engineering |
| **5. Output & PR** | 2 semanas | JIRA comments, Bitbucket PRs |
| **6. Admin Panel** | 2 semanas | Dashboard, configurações |
| **7. Testes & Ajustes** | 2 semanas | Validação com issues reais |
| **Total MVP** | **18 semanas** | ~4.5 meses |
### 7.2 Equipe Sugerida
| Função | Quantidade | Dedicação |
|--------|------------|-----------|
| Tech Lead | 1 | 100% |
| Backend Developer | 2 | 100% |
| Frontend Developer | 1 | 50% |
| DevOps | 1 | 25% |
| **Total** | **5** | |
### 7.3 Custos Operacionais Mensais (Estimativa)
| Item | Custo/Mês |
|------|-----------|
| LLM APIs (10 issues × ~$3/issue) | ~$30 |
| Infra (VPS/On-premise) | $200-500 |
| Vector DB (Qdrant self-hosted) | $0 (infra) |
| **Total** | **~$230-530/mês** |
*Nota: Volume baixo (5-10 issues/mês) resulta em custo operacional mínimo.*
---
## 8. Riscos Técnicos e Mitigações
| Risco | Probabilidade | Impacto | Mitigação |
|-------|---------------|---------|-----------|
| LLM gera fix incorreto | Alta | Alto | Human review obrigatório, confidence score |
| Contexto COBOL insuficiente | Média | Alto | RAG com copybooks, exemplos de fixes |
| Latência alta | Baixa | Médio | Queue assíncrona, feedback visual |
| Bitbucket API rate limit | Baixa | Baixo | Cache agressivo, sparse checkout |
| Segurança (código exposto) | Média | Alto | Azure OpenAI ou self-hosted LLM |
---
## 9. Métricas de Sucesso
### 9.1 KPIs Técnicos
| Métrica | Target MVP | Target 6 meses |
|---------|------------|----------------|
| Taxa de análises bem-sucedidas | 80% | 95% |
| Fixes aceitos (sem modificação) | 30% | 50% |
| Fixes aceitos (com ajustes) | 50% | 70% |
| Tempo médio de análise | < 5 min | < 2 min |
| Uptime do sistema | 95% | 99% |
### 9.2 KPIs de Negócio
| Métrica | Target |
|---------|--------|
| Redução tempo de análise inicial | 50% |
| Issues com sugestão útil | 70% |
| Satisfação da equipe | > 4/5 |
---
## 10. Próximos Passos
1. **Semana 1-2:**
- Provisionar infra de desenvolvimento
- Criar forks AI no Bitbucket
- Configurar webhooks JIRA (ambiente de teste)
2. **Semana 3-4:**
- Implementar connector Bitbucket
- Indexar código de 1 repositório (ACQ-MF-safra-fork)
- Testar embeddings com 5 issues históricas
3. **Semana 5-6:**
- Integrar LLM (GPT-4o)
- Desenvolver prompts específicos para COBOL
- Validar outputs com equipe técnica
---
**Documento preparado para revisão técnica.**
*Contato: [Equipe de Desenvolvimento]*