miner-harness 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- miner_harness-0.1.0/.claude/settings.local.json +35 -0
- miner_harness-0.1.0/.coverage.claude.pid3.XTQBlLZx.HLhidamyyZvh +0 -0
- miner_harness-0.1.0/.git +1 -0
- miner_harness-0.1.0/.github/pull_request_template.md +32 -0
- miner_harness-0.1.0/.github/workflows/ci.yml +95 -0
- miner_harness-0.1.0/.github/workflows/e2e.yml +62 -0
- miner_harness-0.1.0/.github/workflows/release.yml +58 -0
- miner_harness-0.1.0/.gitignore +48 -0
- miner_harness-0.1.0/CHANGELOG.md +70 -0
- miner_harness-0.1.0/CLAUDE.md +122 -0
- miner_harness-0.1.0/CONTRIBUTING.md +92 -0
- miner_harness-0.1.0/PKG-INFO +202 -0
- miner_harness-0.1.0/README.md +159 -0
- miner_harness-0.1.0/docs/adr/ADR-001-stack-decision.md +65 -0
- miner_harness-0.1.0/docs/adr/ADR-002-geosgb-data-access.md +220 -0
- miner_harness-0.1.0/docs/adr/ADR-003-engineering-security-standards.md +166 -0
- miner_harness-0.1.0/docs/adr/ADR-004-user-interface.md +79 -0
- miner_harness-0.1.0/docs/adr/ADR-005-remote-sensing-strategy.md +79 -0
- miner_harness-0.1.0/docs/architecture/branch-protection.md +93 -0
- miner_harness-0.1.0/docs/architecture/environment-protocols.md +131 -0
- miner_harness-0.1.0/docs/architecture/fase-0-baseline-governanca.md +162 -0
- miner_harness-0.1.0/docs/architecture/fase-0-gate-saida.md +138 -0
- miner_harness-0.1.0/docs/architecture/fase-1-discovery-report.md +287 -0
- miner_harness-0.1.0/docs/architecture/fase-1-gate-saida.md +84 -0
- miner_harness-0.1.0/docs/architecture/fase-10-gate-saida.md +126 -0
- miner_harness-0.1.0/docs/architecture/fase-11-gate-saida.md +112 -0
- miner_harness-0.1.0/docs/architecture/fase-2-gate-saida.md +87 -0
- miner_harness-0.1.0/docs/architecture/fase-3-gate-saida.md +135 -0
- miner_harness-0.1.0/docs/architecture/fase-4-gate-saida.md +139 -0
- miner_harness-0.1.0/docs/architecture/fase-5-gate-saida.md +127 -0
- miner_harness-0.1.0/docs/architecture/fase-6-gate-saida.md +124 -0
- miner_harness-0.1.0/docs/architecture/fase-7-gate-saida.md +123 -0
- miner_harness-0.1.0/docs/architecture/fase-8-gate-saida.md +109 -0
- miner_harness-0.1.0/docs/architecture/fase-9-gate-saida.md +119 -0
- miner_harness-0.1.0/docs/architecture/knowledge-crystallization-local.md +121 -0
- miner_harness-0.1.0/docs/architecture/system-overview.md +97 -0
- miner_harness-0.1.0/docs/architecture/wizard-gate-saida.md +45 -0
- miner_harness-0.1.0/docs/personas/dr-augusto-valen.md +108 -0
- miner_harness-0.1.0/docs/prd/PRD-001-miner-harness.md +169 -0
- miner_harness-0.1.0/docs/rca/.gitkeep +0 -0
- miner_harness-0.1.0/docs/rfc/.gitkeep +0 -0
- miner_harness-0.1.0/docs/rfc/RFC-001-geosgb-connector.md +344 -0
- miner_harness-0.1.0/docs/rfc/RFC-002-agent-orchestration.md +732 -0
- miner_harness-0.1.0/docs/rfc/RFC-003-storage-and-index.md +616 -0
- miner_harness-0.1.0/infra/.gitkeep +0 -0
- miner_harness-0.1.0/pyproject.toml +118 -0
- miner_harness-0.1.0/scripts/.gitkeep +0 -0
- miner_harness-0.1.0/src/.gitkeep +0 -0
- miner_harness-0.1.0/src/miner_harness/__init__.py +8 -0
- miner_harness-0.1.0/src/miner_harness/agents/__init__.py +23 -0
- miner_harness-0.1.0/src/miner_harness/agents/base.py +193 -0
- miner_harness-0.1.0/src/miner_harness/agents/evaluator.py +33 -0
- miner_harness-0.1.0/src/miner_harness/agents/geochemist.py +25 -0
- miner_harness-0.1.0/src/miner_harness/agents/geophysicist.py +25 -0
- miner_harness-0.1.0/src/miner_harness/agents/remote_sensing.py +22 -0
- miner_harness-0.1.0/src/miner_harness/agents/structural_geo.py +25 -0
- miner_harness-0.1.0/src/miner_harness/cache/__init__.py +18 -0
- miner_harness-0.1.0/src/miner_harness/cache/manager.py +181 -0
- miner_harness-0.1.0/src/miner_harness/cache/sqlite_store.py +388 -0
- miner_harness-0.1.0/src/miner_harness/cache/ttl_policy.py +54 -0
- miner_harness-0.1.0/src/miner_harness/cache/types.py +50 -0
- miner_harness-0.1.0/src/miner_harness/cli/__init__.py +14 -0
- miner_harness-0.1.0/src/miner_harness/cli/app.py +214 -0
- miner_harness-0.1.0/src/miner_harness/cli/commands.py +275 -0
- miner_harness-0.1.0/src/miner_harness/connectors/__init__.py +1 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/__init__.py +17 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/alias_mapper.py +174 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/connector.py +468 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/grid_extractor.py +163 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/sanitizer.py +73 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/services.py +108 -0
- miner_harness-0.1.0/src/miner_harness/connectors/geosgb/throttled_client.py +180 -0
- miner_harness-0.1.0/src/miner_harness/connectors/ollama/__init__.py +15 -0
- miner_harness-0.1.0/src/miner_harness/connectors/ollama/client.py +251 -0
- miner_harness-0.1.0/src/miner_harness/connectors/ollama/prompt_manager.py +276 -0
- miner_harness-0.1.0/src/miner_harness/connectors/ollama/registry.py +157 -0
- miner_harness-0.1.0/src/miner_harness/core/__init__.py +31 -0
- miner_harness-0.1.0/src/miner_harness/core/config.py +126 -0
- miner_harness-0.1.0/src/miner_harness/core/exceptions.py +117 -0
- miner_harness-0.1.0/src/miner_harness/core/types.py +232 -0
- miner_harness-0.1.0/src/miner_harness/index/__init__.py +23 -0
- miner_harness-0.1.0/src/miner_harness/index/document_store.py +259 -0
- miner_harness-0.1.0/src/miner_harness/index/embedder.py +111 -0
- miner_harness-0.1.0/src/miner_harness/index/search_engine.py +216 -0
- miner_harness-0.1.0/src/miner_harness/index/text_builder.py +168 -0
- miner_harness-0.1.0/src/miner_harness/index/types.py +38 -0
- miner_harness-0.1.0/src/miner_harness/observability/__init__.py +12 -0
- miner_harness-0.1.0/src/miner_harness/observability/health.py +240 -0
- miner_harness-0.1.0/src/miner_harness/observability/logging_config.py +82 -0
- miner_harness-0.1.0/src/miner_harness/observability/metrics.py +242 -0
- miner_harness-0.1.0/src/miner_harness/orchestrator/__init__.py +22 -0
- miner_harness-0.1.0/src/miner_harness/orchestrator/context_builder.py +139 -0
- miner_harness-0.1.0/src/miner_harness/orchestrator/orchestrator.py +341 -0
- miner_harness-0.1.0/src/miner_harness/orchestrator/report_validator.py +379 -0
- miner_harness-0.1.0/src/miner_harness/rca/__init__.py +32 -0
- miner_harness-0.1.0/src/miner_harness/rca/classifier.py +181 -0
- miner_harness-0.1.0/src/miner_harness/rca/diagnostics.py +137 -0
- miner_harness-0.1.0/src/miner_harness/rca/reporter.py +291 -0
- miner_harness-0.1.0/src/miner_harness/rca/retry.py +144 -0
- miner_harness-0.1.0/src/miner_harness/self_improvement/__init__.py +43 -0
- miner_harness-0.1.0/src/miner_harness/self_improvement/feedback_loop.py +148 -0
- miner_harness-0.1.0/src/miner_harness/self_improvement/profiler.py +176 -0
- miner_harness-0.1.0/src/miner_harness/self_improvement/rca_learner.py +142 -0
- miner_harness-0.1.0/src/miner_harness/self_improvement/tuner.py +233 -0
- miner_harness-0.1.0/src/miner_harness/wizard/__init__.py +39 -0
- miner_harness-0.1.0/src/miner_harness/wizard/checks.py +249 -0
- miner_harness-0.1.0/src/miner_harness/wizard/installer.py +185 -0
- miner_harness-0.1.0/src/miner_harness/wizard/runner.py +206 -0
- miner_harness-0.1.0/tests/.gitkeep +0 -0
- miner_harness-0.1.0/tests/__init__.py +0 -0
- miner_harness-0.1.0/tests/agents/__init__.py +0 -0
- miner_harness-0.1.0/tests/agents/test_agents.py +222 -0
- miner_harness-0.1.0/tests/cache/__init__.py +0 -0
- miner_harness-0.1.0/tests/cache/test_manager.py +116 -0
- miner_harness-0.1.0/tests/cache/test_sqlite_store.py +270 -0
- miner_harness-0.1.0/tests/cache/test_ttl_policy.py +97 -0
- miner_harness-0.1.0/tests/cli/__init__.py +0 -0
- miner_harness-0.1.0/tests/cli/test_app.py +57 -0
- miner_harness-0.1.0/tests/cli/test_commands.py +240 -0
- miner_harness-0.1.0/tests/conftest.py +69 -0
- miner_harness-0.1.0/tests/connectors/__init__.py +0 -0
- miner_harness-0.1.0/tests/connectors/geosgb/__init__.py +0 -0
- miner_harness-0.1.0/tests/connectors/geosgb/test_alias_mapper.py +84 -0
- miner_harness-0.1.0/tests/connectors/geosgb/test_connector.py +266 -0
- miner_harness-0.1.0/tests/connectors/geosgb/test_grid_extractor.py +141 -0
- miner_harness-0.1.0/tests/connectors/geosgb/test_sanitizer.py +76 -0
- miner_harness-0.1.0/tests/connectors/geosgb/test_throttled_client.py +134 -0
- miner_harness-0.1.0/tests/connectors/ollama/__init__.py +0 -0
- miner_harness-0.1.0/tests/connectors/ollama/test_client.py +139 -0
- miner_harness-0.1.0/tests/connectors/ollama/test_prompt_manager.py +127 -0
- miner_harness-0.1.0/tests/connectors/ollama/test_registry.py +70 -0
- miner_harness-0.1.0/tests/contract/__init__.py +0 -0
- miner_harness-0.1.0/tests/contract/test_module_contracts.py +406 -0
- miner_harness-0.1.0/tests/core/__init__.py +0 -0
- miner_harness-0.1.0/tests/core/test_config.py +85 -0
- miner_harness-0.1.0/tests/core/test_types.py +145 -0
- miner_harness-0.1.0/tests/e2e/__init__.py +0 -0
- miner_harness-0.1.0/tests/e2e/conftest.py +65 -0
- miner_harness-0.1.0/tests/e2e/test_geosgb_live.py +146 -0
- miner_harness-0.1.0/tests/e2e/test_ollama_live.py +129 -0
- miner_harness-0.1.0/tests/e2e/test_pipeline_live.py +205 -0
- miner_harness-0.1.0/tests/index/__init__.py +0 -0
- miner_harness-0.1.0/tests/index/test_document_store.py +165 -0
- miner_harness-0.1.0/tests/index/test_search_engine.py +261 -0
- miner_harness-0.1.0/tests/index/test_text_builder.py +155 -0
- miner_harness-0.1.0/tests/integration/__init__.py +0 -0
- miner_harness-0.1.0/tests/integration/test_cache_index_pipeline.py +326 -0
- miner_harness-0.1.0/tests/integration/test_orchestrator_pipeline.py +259 -0
- miner_harness-0.1.0/tests/observability/__init__.py +0 -0
- miner_harness-0.1.0/tests/observability/test_health.py +180 -0
- miner_harness-0.1.0/tests/observability/test_logging_config.py +65 -0
- miner_harness-0.1.0/tests/observability/test_metrics.py +116 -0
- miner_harness-0.1.0/tests/orchestrator/__init__.py +0 -0
- miner_harness-0.1.0/tests/orchestrator/test_context_builder.py +110 -0
- miner_harness-0.1.0/tests/orchestrator/test_orchestrator.py +315 -0
- miner_harness-0.1.0/tests/orchestrator/test_report_validator.py +232 -0
- miner_harness-0.1.0/tests/property/__init__.py +0 -0
- miner_harness-0.1.0/tests/property/test_property_based.py +305 -0
- miner_harness-0.1.0/tests/rca/__init__.py +1 -0
- miner_harness-0.1.0/tests/rca/test_classifier.py +117 -0
- miner_harness-0.1.0/tests/rca/test_diagnostics.py +143 -0
- miner_harness-0.1.0/tests/rca/test_reporter.py +138 -0
- miner_harness-0.1.0/tests/rca/test_retry.py +161 -0
- miner_harness-0.1.0/tests/self_improvement/__init__.py +0 -0
- miner_harness-0.1.0/tests/self_improvement/test_feedback_loop.py +133 -0
- miner_harness-0.1.0/tests/self_improvement/test_profiler.py +143 -0
- miner_harness-0.1.0/tests/self_improvement/test_rca_learner.py +148 -0
- miner_harness-0.1.0/tests/self_improvement/test_tuner.py +170 -0
- miner_harness-0.1.0/tests/storage/__init__.py +0 -0
- miner_harness-0.1.0/tests/wizard/__init__.py +0 -0
- miner_harness-0.1.0/tests/wizard/test_checks.py +187 -0
- miner_harness-0.1.0/tests/wizard/test_installer.py +136 -0
- miner_harness-0.1.0/tests/wizard/test_runner.py +99 -0
- miner_harness-0.1.0/uv.lock +1748 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(python -m ruff check src/miner_harness/self_improvement/ tests/self_improvement/)",
|
|
5
|
+
"Bash(where ruff *)",
|
|
6
|
+
"Bash(ruff --version)",
|
|
7
|
+
"Bash(python -m pytest tests/self_improvement/ -v)",
|
|
8
|
+
"Bash(python -m pip show pytest)",
|
|
9
|
+
"Bash(pip show *)",
|
|
10
|
+
"Bash(ls .venv/Scripts/)",
|
|
11
|
+
"Bash(ls venv/Scripts/)",
|
|
12
|
+
"Bash(ls .venv/bin/)",
|
|
13
|
+
"PowerShell(Get-Command pytest -ErrorAction SilentlyContinue)",
|
|
14
|
+
"PowerShell(Get-Command ruff -ErrorAction SilentlyContinue)",
|
|
15
|
+
"PowerShell(Get-Command python -ErrorAction SilentlyContinue)",
|
|
16
|
+
"PowerShell($env:PATH -split \";\" | Where-Object { $_ -match \"python|pip|uv|conda\" })",
|
|
17
|
+
"Bash(uv run *)",
|
|
18
|
+
"Bash(uv add *)",
|
|
19
|
+
"Bash(git add *)",
|
|
20
|
+
"Bash(git commit -m ' *)",
|
|
21
|
+
"Bash(git push *)",
|
|
22
|
+
"Bash(gh pr create --title 'feat: Phase 11 — Self-Improvement' --body ' *)",
|
|
23
|
+
"Bash(gh pr *)",
|
|
24
|
+
"Bash(gh run *)",
|
|
25
|
+
"Bash(git fetch *)",
|
|
26
|
+
"Bash(git checkout *)",
|
|
27
|
+
"Bash(git pull *)",
|
|
28
|
+
"Bash(git merge *)",
|
|
29
|
+
"Bash(gh release *)",
|
|
30
|
+
"Bash(echo \"exit: $?\")",
|
|
31
|
+
"Bash(git tag *)",
|
|
32
|
+
"Bash(uv build *)"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
Binary file
|
miner_harness-0.1.0/.git
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
gitdir: C:/Users/victo/Documents/Claude/Projects/Testing rules/miner-harness/.git/worktrees/hopeful-hypatia-9aec15
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
## Descricao
|
|
2
|
+
|
|
3
|
+
<!-- Descreva brevemente o que este PR faz -->
|
|
4
|
+
|
|
5
|
+
## Tipo de Mudanca
|
|
6
|
+
|
|
7
|
+
- [ ] `feat:` Nova funcionalidade
|
|
8
|
+
- [ ] `fix:` Correcao de bug
|
|
9
|
+
- [ ] `refactor:` Refatoracao sem mudanca funcional
|
|
10
|
+
- [ ] `test:` Adicao/correcao de testes
|
|
11
|
+
- [ ] `docs:` Documentacao
|
|
12
|
+
- [ ] `ci:` Mudancas de CI/CD
|
|
13
|
+
- [ ] `chore:` Manutencao
|
|
14
|
+
|
|
15
|
+
## Checklist
|
|
16
|
+
|
|
17
|
+
- [ ] Testes passando (`pytest tests/ -v`)
|
|
18
|
+
- [ ] Lint limpo (`ruff check src/ tests/`)
|
|
19
|
+
- [ ] Mypy limpo (`mypy src/ --strict`)
|
|
20
|
+
- [ ] Coverage >= 80%
|
|
21
|
+
- [ ] Conventional Commits no titulo do PR
|
|
22
|
+
|
|
23
|
+
## Rastreabilidade
|
|
24
|
+
|
|
25
|
+
<!-- Vincule a RFC, ADR ou issue relevante -->
|
|
26
|
+
- RFC:
|
|
27
|
+
- ADR:
|
|
28
|
+
- Issue:
|
|
29
|
+
|
|
30
|
+
## Notas para Revisao
|
|
31
|
+
|
|
32
|
+
<!-- Algo que o revisor deve saber? -->
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main, develop]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ci-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
lint:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: '3.11'
|
|
21
|
+
- name: Install ruff
|
|
22
|
+
run: pip install ruff
|
|
23
|
+
- name: Lint
|
|
24
|
+
run: ruff check src/ tests/
|
|
25
|
+
- name: Format check
|
|
26
|
+
run: ruff format --check src/ tests/
|
|
27
|
+
|
|
28
|
+
typecheck:
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
needs: lint
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
- uses: actions/setup-python@v5
|
|
34
|
+
with:
|
|
35
|
+
python-version: '3.11'
|
|
36
|
+
- name: Install dependencies
|
|
37
|
+
run: pip install -e ".[dev]"
|
|
38
|
+
- name: Type check
|
|
39
|
+
run: mypy src/ --strict
|
|
40
|
+
|
|
41
|
+
test:
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
needs: lint
|
|
44
|
+
strategy:
|
|
45
|
+
matrix:
|
|
46
|
+
python-version: ['3.11', '3.12']
|
|
47
|
+
steps:
|
|
48
|
+
- uses: actions/checkout@v4
|
|
49
|
+
- uses: actions/setup-python@v5
|
|
50
|
+
with:
|
|
51
|
+
python-version: ${{ matrix.python-version }}
|
|
52
|
+
- name: Install dependencies
|
|
53
|
+
run: pip install -e ".[dev]"
|
|
54
|
+
- name: Run tests with coverage
|
|
55
|
+
run: pytest tests/ -v --tb=short --cov --cov-report=term-missing --cov-report=xml
|
|
56
|
+
- name: Check coverage threshold
|
|
57
|
+
run: coverage report --fail-under=80
|
|
58
|
+
|
|
59
|
+
security:
|
|
60
|
+
runs-on: ubuntu-latest
|
|
61
|
+
needs: lint
|
|
62
|
+
steps:
|
|
63
|
+
- uses: actions/checkout@v4
|
|
64
|
+
- uses: actions/setup-python@v5
|
|
65
|
+
with:
|
|
66
|
+
python-version: '3.11'
|
|
67
|
+
- name: Install dependencies
|
|
68
|
+
run: pip install -e ".[dev]"
|
|
69
|
+
- name: Security scan (bandit)
|
|
70
|
+
run: bandit -r src/ -ll --format json --output bandit-report.json || true
|
|
71
|
+
- name: Check bandit results
|
|
72
|
+
run: bandit -r src/ -ll
|
|
73
|
+
- name: Dependency audit
|
|
74
|
+
run: pip-audit --skip-editable
|
|
75
|
+
|
|
76
|
+
# Gate job — all checks must pass before merge is allowed
|
|
77
|
+
gate:
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
needs: [lint, typecheck, test, security]
|
|
80
|
+
if: always()
|
|
81
|
+
steps:
|
|
82
|
+
- name: Check all jobs passed
|
|
83
|
+
run: |
|
|
84
|
+
if [ "${{ needs.lint.result }}" != "success" ] || \
|
|
85
|
+
[ "${{ needs.typecheck.result }}" != "success" ] || \
|
|
86
|
+
[ "${{ needs.test.result }}" != "success" ] || \
|
|
87
|
+
[ "${{ needs.security.result }}" != "success" ]; then
|
|
88
|
+
echo "One or more required jobs failed:"
|
|
89
|
+
echo " lint: ${{ needs.lint.result }}"
|
|
90
|
+
echo " typecheck: ${{ needs.typecheck.result }}"
|
|
91
|
+
echo " test: ${{ needs.test.result }}"
|
|
92
|
+
echo " security: ${{ needs.security.result }}"
|
|
93
|
+
exit 1
|
|
94
|
+
fi
|
|
95
|
+
echo "All gates passed — merge allowed."
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: E2E Tests
|
|
2
|
+
|
|
3
|
+
# Disparado manualmente ou em schedule semanal (domingo 06:00 UTC)
|
|
4
|
+
# Requer: runner com acesso à internet (GeoSGB) e Ollama instalado
|
|
5
|
+
on:
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
ollama_model:
|
|
9
|
+
description: "Modelo Ollama a usar"
|
|
10
|
+
default: "qwen3:8b-q4_K_M"
|
|
11
|
+
required: false
|
|
12
|
+
schedule:
|
|
13
|
+
- cron: "0 6 * * 0" # domingo 06:00 UTC
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
e2e:
|
|
17
|
+
name: E2E (GeoSGB + Ollama)
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
timeout-minutes: 30
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
|
|
24
|
+
- name: Install uv
|
|
25
|
+
uses: astral-sh/setup-uv@v5
|
|
26
|
+
with:
|
|
27
|
+
version: "latest"
|
|
28
|
+
|
|
29
|
+
- name: Set up Python
|
|
30
|
+
run: uv python install 3.11
|
|
31
|
+
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: uv sync --all-extras
|
|
34
|
+
|
|
35
|
+
- name: Install Ollama
|
|
36
|
+
run: |
|
|
37
|
+
curl -fsSL https://ollama.com/install.sh | sh
|
|
38
|
+
ollama serve &
|
|
39
|
+
sleep 5
|
|
40
|
+
|
|
41
|
+
- name: Pull model
|
|
42
|
+
run: |
|
|
43
|
+
MODEL="${{ github.event.inputs.ollama_model || 'qwen3:8b-q4_K_M' }}"
|
|
44
|
+
ollama pull "$MODEL"
|
|
45
|
+
env:
|
|
46
|
+
OLLAMA_HOST: http://localhost:11434
|
|
47
|
+
|
|
48
|
+
- name: Run e2e tests
|
|
49
|
+
run: uv run pytest tests/e2e/ -v --tb=short --timeout=300
|
|
50
|
+
env:
|
|
51
|
+
MINER_E2E: "1"
|
|
52
|
+
MINER_OLLAMA_URL: "http://localhost:11434"
|
|
53
|
+
MINER_OLLAMA_MODEL: "${{ github.event.inputs.ollama_model || 'qwen3:8b-q4_K_M' }}"
|
|
54
|
+
|
|
55
|
+
- name: Upload e2e report
|
|
56
|
+
if: always()
|
|
57
|
+
uses: actions/upload-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: e2e-report
|
|
60
|
+
path: |
|
|
61
|
+
.pytest_cache/
|
|
62
|
+
retention-days: 7
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
validate:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: '3.11'
|
|
19
|
+
- name: Install dependencies
|
|
20
|
+
run: pip install -e ".[dev]"
|
|
21
|
+
- name: Lint
|
|
22
|
+
run: ruff check src/ tests/
|
|
23
|
+
- name: Type check
|
|
24
|
+
run: mypy src/ --strict
|
|
25
|
+
- name: Run tests
|
|
26
|
+
run: pytest tests/ -v --tb=short --cov --cov-report=term-missing
|
|
27
|
+
- name: Coverage threshold
|
|
28
|
+
run: coverage report --fail-under=80
|
|
29
|
+
- name: Security scan
|
|
30
|
+
run: bandit -r src/ -ll
|
|
31
|
+
|
|
32
|
+
release:
|
|
33
|
+
runs-on: ubuntu-latest
|
|
34
|
+
needs: validate
|
|
35
|
+
steps:
|
|
36
|
+
- uses: actions/checkout@v4
|
|
37
|
+
with:
|
|
38
|
+
fetch-depth: 0
|
|
39
|
+
- name: Generate changelog
|
|
40
|
+
id: changelog
|
|
41
|
+
run: |
|
|
42
|
+
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
|
|
43
|
+
if [ -z "$PREV_TAG" ]; then
|
|
44
|
+
CHANGES=$(git log --pretty=format:"- %s (%h)" HEAD)
|
|
45
|
+
else
|
|
46
|
+
CHANGES=$(git log --pretty=format:"- %s (%h)" ${PREV_TAG}..HEAD)
|
|
47
|
+
fi
|
|
48
|
+
echo "changes<<EOF" >> $GITHUB_OUTPUT
|
|
49
|
+
echo "$CHANGES" >> $GITHUB_OUTPUT
|
|
50
|
+
echo "EOF" >> $GITHUB_OUTPUT
|
|
51
|
+
- name: Create GitHub Release
|
|
52
|
+
uses: softprops/action-gh-release@v2
|
|
53
|
+
with:
|
|
54
|
+
body: |
|
|
55
|
+
## Changes
|
|
56
|
+
|
|
57
|
+
${{ steps.changelog.outputs.changes }}
|
|
58
|
+
generate_release_notes: true
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
*.egg
|
|
9
|
+
.eggs/
|
|
10
|
+
|
|
11
|
+
# Virtual environments
|
|
12
|
+
.venv/
|
|
13
|
+
venv/
|
|
14
|
+
env/
|
|
15
|
+
|
|
16
|
+
# IDE
|
|
17
|
+
.vscode/
|
|
18
|
+
.idea/
|
|
19
|
+
*.swp
|
|
20
|
+
*.swo
|
|
21
|
+
|
|
22
|
+
# OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
Thumbs.db
|
|
25
|
+
|
|
26
|
+
# Testing
|
|
27
|
+
.pytest_cache/
|
|
28
|
+
.coverage
|
|
29
|
+
htmlcov/
|
|
30
|
+
.mypy_cache/
|
|
31
|
+
|
|
32
|
+
# Data (large files)
|
|
33
|
+
data/
|
|
34
|
+
*.tif
|
|
35
|
+
*.tiff
|
|
36
|
+
*.shp
|
|
37
|
+
*.dbf
|
|
38
|
+
*.shx
|
|
39
|
+
*.prj
|
|
40
|
+
|
|
41
|
+
# Models
|
|
42
|
+
models/
|
|
43
|
+
*.gguf
|
|
44
|
+
*.bin
|
|
45
|
+
|
|
46
|
+
# Environment
|
|
47
|
+
.env
|
|
48
|
+
.env.local
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.0] — 2026-05-17
|
|
4
|
+
|
|
5
|
+
Primeira release — todas as 11 fases do ASO v3 completas.
|
|
6
|
+
|
|
7
|
+
### Adicionado
|
|
8
|
+
|
|
9
|
+
**Core**
|
|
10
|
+
- `core/types.py` — modelos Pydantic para todos os domínios geológicos (OcorrenciaMineral, DadoGravimetrico, AmostraGeoquimica, DatacaoGeocronologica, UnidadeLitoestratigrafica, ProjetoAerogeofisico, ProspectionReport)
|
|
11
|
+
- `core/config.py` — configuração hierárquica (MinerHarnessConfig, StorageConfig, GeoSGBConfig, OrchestratorConfig)
|
|
12
|
+
- `core/exceptions.py` — hierarquia de exceções tipadas
|
|
13
|
+
|
|
14
|
+
**Conectores**
|
|
15
|
+
- `connectors/geosgb/` — connector completo para API GeoSGB: MapServer/identify (grid + dedup) + FeatureServer/query com paginação, rate limiting, alias mapping
|
|
16
|
+
- `connectors/ollama/` — cliente async httpx para Ollama: chat, embeddings, list_models, health
|
|
17
|
+
|
|
18
|
+
**Orquestrador**
|
|
19
|
+
- `orchestrator/orchestrator.py` — pipeline principal: connector → cache → context → agentes → report
|
|
20
|
+
- `orchestrator/report_validator.py` — validação e reparo automático de relatórios
|
|
21
|
+
- `orchestrator/context_builder.py` — construção de contexto para agentes
|
|
22
|
+
|
|
23
|
+
**Agentes**
|
|
24
|
+
- `agents/` — 5 agentes especialistas: geólogo estrutural, geofísico, geoquímico, sensoriamento remoto, avaliador
|
|
25
|
+
- `agents/base.py` — classe base com retry e logging estruturado
|
|
26
|
+
|
|
27
|
+
**Cache**
|
|
28
|
+
- `cache/manager.py` — CacheManager com TTL configurável
|
|
29
|
+
- `cache/sqlite_store.py` — persistência SQLite
|
|
30
|
+
|
|
31
|
+
**Índice**
|
|
32
|
+
- `index/document_store.py` — índice vetorial via sqlite-vec
|
|
33
|
+
- `index/search_engine.py` — busca semântica
|
|
34
|
+
|
|
35
|
+
**Observabilidade**
|
|
36
|
+
- `observability/health.py` — health checks async (disco, Ollama, cache, índice)
|
|
37
|
+
- `observability/metrics.py` — MetricsCollector com structlog
|
|
38
|
+
- `observability/logging_config.py` — configuração de logging estruturado
|
|
39
|
+
|
|
40
|
+
**RCA**
|
|
41
|
+
- `rca/classifier.py` — classificação automática de falhas
|
|
42
|
+
- `rca/diagnostics.py` — diagnóstico estruturado
|
|
43
|
+
- `rca/reporter.py` — geração de relatórios RCA em JSON
|
|
44
|
+
- `rca/retry.py` — retry com backoff exponencial
|
|
45
|
+
|
|
46
|
+
**Self-Improvement**
|
|
47
|
+
- `self_improvement/profiler.py` — profiling de pipeline e identificação de gargalos
|
|
48
|
+
- `self_improvement/tuner.py` — geração de recomendações de tuning
|
|
49
|
+
- `self_improvement/rca_learner.py` — aprendizado a partir de histórico de RCA
|
|
50
|
+
- `self_improvement/feedback_loop.py` — ciclo Profile → Tune → Apply → Learn
|
|
51
|
+
|
|
52
|
+
**Wizard**
|
|
53
|
+
- `wizard/checks.py` — verificações puras de pré-requisitos (Python, disco, Ollama, MINER_HOME)
|
|
54
|
+
- `wizard/installer.py` — criação de MINER_HOME, config.json, env_hint.sh
|
|
55
|
+
- `wizard/runner.py` — UI Rich com injeção de Console para testabilidade
|
|
56
|
+
|
|
57
|
+
**CLI**
|
|
58
|
+
- `miner-harness analyze` — pipeline completo de análise
|
|
59
|
+
- `miner-harness validate` — validação de relatório JSON
|
|
60
|
+
- `miner-harness install` — wizard de instalação (interativo e --non-interactive)
|
|
61
|
+
- `miner-harness health` — health checks do sistema
|
|
62
|
+
- `miner-harness cache stats/clear` — gestão do cache
|
|
63
|
+
|
|
64
|
+
**Testes**
|
|
65
|
+
- 447 testes unitários e de integração (92% cobertura)
|
|
66
|
+
- 17 testes e2e opt-in (`MINER_E2E=1`) contra GeoSGB real e Ollama local
|
|
67
|
+
|
|
68
|
+
**CI/CD**
|
|
69
|
+
- GitHub Actions: lint (ruff), typecheck (mypy), test (3.11 + 3.12), security (bandit + pip-audit), gate
|
|
70
|
+
- Workflow e2e separado (manual + schedule semanal)
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# miner-harness — CLAUDE.md
|
|
2
|
+
|
|
3
|
+
## Identidade do Projeto
|
|
4
|
+
|
|
5
|
+
**miner-harness** é um sistema de prospecção mineral inteligente que utiliza agentes especialistas em geologia e geofísica para analisar dados da base GeoSGB. O sistema roda localmente, com LLMs embarcados, e disponibiliza um wizard de instalação para download.
|
|
6
|
+
|
|
7
|
+
- **Repositório**: https://github.com/VictorAMM/miner-harness
|
|
8
|
+
- **Metodologia**: Agentic SDLC Operating System v3 (ASO v3)
|
|
9
|
+
- **Documentação ASO**: `../entrai-docs/`
|
|
10
|
+
|
|
11
|
+
## Persona Principal
|
|
12
|
+
|
|
13
|
+
**Dr. Augusto Valen** — Geólogo exploracionista e geofísico de elite (25+ anos). Define o tom técnico e o framework analítico dos agentes. Ver `docs/personas/dr-augusto-valen.md`.
|
|
14
|
+
|
|
15
|
+
## Princípios Inegociáveis (ASO v3)
|
|
16
|
+
|
|
17
|
+
1. **Contexto e segurança antes de velocidade** — nunca pular etapas de discovery
|
|
18
|
+
2. **Decision-by-evidence** — proibido decisões por "vibe"; toda decisão com rationale explícito
|
|
19
|
+
3. **Secure-by-Design** — segurança desde a Fase 0
|
|
20
|
+
4. **Policy-as-Code** — bloquear avanço em caso de violação
|
|
21
|
+
5. **Evaluator-Optimizer** — toda saída crítica passa por avaliação
|
|
22
|
+
6. **Memória persistente e temporal** — semântica, episódica e procedural
|
|
23
|
+
|
|
24
|
+
## Stack e Arquitetura
|
|
25
|
+
|
|
26
|
+
### Decisão de Stack (Discovery-First)
|
|
27
|
+
- **Python 3** — core do sistema: agentes, análise geoespacial, ML, integração com LLMs locais
|
|
28
|
+
- **LLMs embarcados** — modelos rodando localmente (ollama/llama.cpp ou similar)
|
|
29
|
+
- **Execução local** — aplicação instala e roda na máquina do usuário
|
|
30
|
+
- **Wizard de instalação** — installer para download com setup guiado
|
|
31
|
+
|
|
32
|
+
### Dependências esperadas
|
|
33
|
+
- GeoSGB como fonte de dados principal
|
|
34
|
+
- Bibliotecas geocientíficas (geopandas, rasterio, shapely, etc.)
|
|
35
|
+
- Framework de agentes com LLM local
|
|
36
|
+
- Interface de usuário para o wizard
|
|
37
|
+
|
|
38
|
+
## Fases do Projeto (ASO v3)
|
|
39
|
+
|
|
40
|
+
O desenvolvimento segue as fases 0→11 do Agentic SDLC OS:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
Fase 0 — Fundação e Governança ✅ CONCLUÍDA (2026-05-11)
|
|
44
|
+
Fase 1 — Discovery e Pesquisa Autônoma ✅ CONCLUÍDA (2026-05-11)
|
|
45
|
+
Fase 2 — PRD Executável ✅ CONCLUÍDA (2026-05-11)
|
|
46
|
+
Fase 3 — Technical Design e RFC Swarm ✅ CONCLUÍDA (2026-05-12)
|
|
47
|
+
Fase 4 — Incepção de Infra ✅ CONCLUÍDA (2026-05-12)
|
|
48
|
+
Fase 5 — Implementação ✅ CONCLUÍDA (2026-05-15)
|
|
49
|
+
Fase 6 — Validation Harness ✅ CONCLUÍDA (2026-05-16)
|
|
50
|
+
Fase 7 — Testing Swarm ✅ CONCLUÍDA (2026-05-16)
|
|
51
|
+
Fase 8 — Governed CI/CD ✅ CONCLUÍDA (2026-05-16)
|
|
52
|
+
Fase 9 — Observabilidade ✅ CONCLUÍDA (2026-05-16)
|
|
53
|
+
Fase 10 — RCA Autônomo ✅ CONCLUÍDA (2026-05-17)
|
|
54
|
+
Fase 11 — Self-Improvement ✅ CONCLUÍDA (2026-05-17)
|
|
55
|
+
Wizard — Instalação Guiada ✅ CONCLUÍDA (2026-05-17)
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Status**: Todas as fases concluídas. Próximo entregável: testes e2e com GeoSGB real + Ollama local.
|
|
59
|
+
|
|
60
|
+
## Grafo de Rastreabilidade
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
Feature ↔ PRD ↔ RFC ↔ ADR ↔ Commit ↔ Deploy ↔ Incidente ↔ RCA
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Estrutura do Projeto
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
miner-harness/
|
|
70
|
+
├── CLAUDE.md # Este arquivo
|
|
71
|
+
├── docs/
|
|
72
|
+
│ ├── prd/ # Product Requirements Documents
|
|
73
|
+
│ ├── rfc/ # Request for Comments (design técnico)
|
|
74
|
+
│ ├── adr/ # Architecture Decision Records
|
|
75
|
+
│ ├── rca/ # Root Cause Analysis
|
|
76
|
+
│ ├── architecture/ # Diagramas e decisões de arquitetura
|
|
77
|
+
│ └── personas/ # Personas dos agentes
|
|
78
|
+
├── src/ # Código-fonte
|
|
79
|
+
├── tests/ # Testes
|
|
80
|
+
├── scripts/ # Scripts de automação e instalação
|
|
81
|
+
├── infra/ # Configuração de infraestrutura
|
|
82
|
+
└── .github/workflows/ # GitHub Actions CI/CD
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Convenções de Código
|
|
86
|
+
|
|
87
|
+
- **Linguagem principal**: Python 3.11+
|
|
88
|
+
- **Formatação**: ruff (lint + format)
|
|
89
|
+
- **Tipos**: type hints obrigatórios em funções públicas
|
|
90
|
+
- **Testes**: pytest
|
|
91
|
+
- **Commits**: Conventional Commits (`feat:`, `fix:`, `docs:`, `refactor:`, `test:`)
|
|
92
|
+
- **Branches**: `main` (prod), `develop` (integração), `feature/*`, `fix/*`
|
|
93
|
+
|
|
94
|
+
## Templates de Artefatos
|
|
95
|
+
|
|
96
|
+
Usar os templates definidos em `../entrai-docs/docs/agentic-os/templates/README.md`:
|
|
97
|
+
- **PRD** → `docs/prd/`
|
|
98
|
+
- **RFC** → `docs/rfc/`
|
|
99
|
+
- **ADR** → `docs/adr/` (com `valid_from`, `valid_until`, `review_trigger`)
|
|
100
|
+
- **RCA** → `docs/rca/`
|
|
101
|
+
|
|
102
|
+
## Gates de Qualidade
|
|
103
|
+
|
|
104
|
+
Antes de avançar qualquer fase:
|
|
105
|
+
- [ ] Checklist de segurança OWASP
|
|
106
|
+
- [ ] Validação por Evaluator-Optimizer
|
|
107
|
+
- [ ] Policy-as-Code sem violações
|
|
108
|
+
- [ ] Testes passando
|
|
109
|
+
- [ ] Documentação atualizada
|
|
110
|
+
|
|
111
|
+
## CI/CD (GitHub Actions)
|
|
112
|
+
|
|
113
|
+
- Lint e format check em todo PR
|
|
114
|
+
- Testes automatizados
|
|
115
|
+
- Security scan
|
|
116
|
+
- Build do wizard de instalação
|
|
117
|
+
|
|
118
|
+
## Notas
|
|
119
|
+
|
|
120
|
+
- Toda decisão arquitetural deve ter ADR com validade temporal
|
|
121
|
+
- Incertezas devem ser marcadas com `[NEEDS CLARIFICATION]`
|
|
122
|
+
- PRD define O QUÊ e PORQUÊ, nunca o COMO
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Contribuindo para miner-harness
|
|
2
|
+
|
|
3
|
+
## Requisitos
|
|
4
|
+
|
|
5
|
+
- Python 3.11+
|
|
6
|
+
- Ferramentas de dev: `pip install -e ".[dev]"`
|
|
7
|
+
|
|
8
|
+
## Fluxo de Desenvolvimento
|
|
9
|
+
|
|
10
|
+
1. Criar branch a partir de `develop`:
|
|
11
|
+
```bash
|
|
12
|
+
git checkout develop
|
|
13
|
+
git pull origin develop
|
|
14
|
+
git checkout -b feature/minha-feature
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
2. Implementar mudancas seguindo as convencoes abaixo.
|
|
18
|
+
|
|
19
|
+
3. Verificar localmente antes de abrir PR:
|
|
20
|
+
```bash
|
|
21
|
+
ruff check src/ tests/
|
|
22
|
+
ruff format --check src/ tests/
|
|
23
|
+
mypy src/ --strict
|
|
24
|
+
pytest tests/ -v --cov --cov-report=term-missing
|
|
25
|
+
coverage report --fail-under=80
|
|
26
|
+
bandit -r src/ -ll
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
4. Abrir PR para `develop` com titulo em Conventional Commits.
|
|
30
|
+
|
|
31
|
+
## Conventional Commits
|
|
32
|
+
|
|
33
|
+
Todos os commits devem seguir o formato:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
<tipo>(<escopo>): <descricao>
|
|
37
|
+
|
|
38
|
+
[corpo opcional]
|
|
39
|
+
|
|
40
|
+
[footer opcional]
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Tipos validos:
|
|
44
|
+
- `feat` — Nova funcionalidade
|
|
45
|
+
- `fix` — Correcao de bug
|
|
46
|
+
- `docs` — Documentacao
|
|
47
|
+
- `refactor` — Refatoracao sem mudanca funcional
|
|
48
|
+
- `test` — Adicao/correcao de testes
|
|
49
|
+
- `ci` — Mudancas de CI/CD
|
|
50
|
+
- `chore` — Manutencao geral
|
|
51
|
+
|
|
52
|
+
Exemplo:
|
|
53
|
+
```
|
|
54
|
+
feat(cache): adicionar TTL configuravel por servico
|
|
55
|
+
|
|
56
|
+
Permite configurar TTL diferente para cada tipo de dado do GeoSGB.
|
|
57
|
+
Dados gravimetricos mudam menos frequentemente que ocorrencias.
|
|
58
|
+
|
|
59
|
+
Refs: RFC-003 §3.2
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Gates de Qualidade
|
|
63
|
+
|
|
64
|
+
Nenhum PR sera mergeado se:
|
|
65
|
+
- Ruff reportar erros de lint ou formatacao
|
|
66
|
+
- Mypy (strict) reportar erros de tipo
|
|
67
|
+
- Testes falharem
|
|
68
|
+
- Coverage ficar abaixo de 80%
|
|
69
|
+
- Bandit encontrar vulnerabilidades de severidade media+
|
|
70
|
+
- pip-audit encontrar dependencias vulneraveis
|
|
71
|
+
|
|
72
|
+
## Estrutura de Testes
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
tests/
|
|
76
|
+
├── cache/ # Testes unitarios do CacheManager
|
|
77
|
+
├── cli/ # Testes dos comandos CLI
|
|
78
|
+
├── connectors/ # Testes dos connectors (GeoSGB, Ollama)
|
|
79
|
+
├── contract/ # Testes de contrato entre modulos
|
|
80
|
+
├── core/ # Testes dos tipos e config
|
|
81
|
+
├── index/ # Testes do VectorIndex
|
|
82
|
+
├── integration/ # Testes de integracao end-to-end
|
|
83
|
+
├── orchestrator/ # Testes do Orchestrator
|
|
84
|
+
└── property/ # Property-based tests (Hypothesis)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Rastreabilidade
|
|
88
|
+
|
|
89
|
+
Toda mudanca significativa deve referenciar:
|
|
90
|
+
- RFC relevante (ex: `Refs: RFC-001 §4.1`)
|
|
91
|
+
- ADR se houver decisao arquitetural
|
|
92
|
+
- Issue/ticket se aplicavel
|