Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
9a7bd47
Add local HTTPS setup guide, URL matrix, and references documentation
ivanprytula Jun 14, 2026
64a0876
chore: Update .gitignore to include examples directory; modify cloud …
ivanprytula Jun 15, 2026
dfa6d19
chore: simplify documentation and just recipes
ivanprytula Jun 16, 2026
3becdf4
chore: full docs reorganization
ivanprytula Jun 16, 2026
b3ed48c
refactor: extend Dashboard service with Observation panel
ivanprytula Jun 16, 2026
877c66e
feat: Integrated monitoring stack into local Docker Compose
ivanprytula Jun 16, 2026
c963308
feat: Integrated monitoring stack into local Docker Compose. add miss…
ivanprytula Jun 16, 2026
60134ce
refactor: drop agent enrichment for MVP
ivanprytula Jun 16, 2026
a3bf704
refactor: Streamlit dashboard: finalize use_*/render_* split, elimina…
ivanprytula Jun 16, 2026
8d4156d
feat: K3Sc / K8S LOCAL SANDBOX
ivanprytula Jun 16, 2026
f471420
fix: remove outdated CI job 'docker-scan-advisory'
ivanprytula Jun 16, 2026
4ff5137
deps: bump fastapi, rm ragas
ivanprytula Jun 17, 2026
f860d90
docs: consolidation of MVP/post-MVP documentation in order to simplif…
ivanprytula Jun 17, 2026
608f2cd
choreL audit status of functionality gaps
ivanprytula Jun 17, 2026
3469311
deps: bump uv, base images digests
ivanprytula Jun 17, 2026
fb3569d
refactor: improve Sandbox loop (local AWS emulator, zero cost)
ivanprytula Jun 18, 2026
5a1e2a5
refactor: Restructure root pyproject.toml: split deps into MVP core +…
ivanprytula Jun 18, 2026
3341269
chore: unify naming for application
ivanprytula Jun 18, 2026
bd1b179
fix: remove pandas (and other deps like openai, aiohttp, aiokafka) fr…
ivanprytula Jun 18, 2026
953af32
chore: floci ect registry created as part of compose services
ivanprytula Jun 18, 2026
8b95218
fix: catches httpx.HTTPStatusError (which raise_for_status() throws) …
ivanprytula Jun 18, 2026
4083b08
chore: add 'watch' compose core services options for faster dev loop
ivanprytula Jun 18, 2026
7ae4412
chore: bump Python version; secret generation tooling, secrets scanni…
ivanprytula Jun 19, 2026
19ef72c
fix: integration test suite
ivanprytula Jun 19, 2026
7f085a4
feat: MVP Week 1 — fix drift panel, add automated contract snapshots,…
ivanprytula Jun 25, 2026
f966bd5
chore: add dashboard to uv workspace, switch ops to ingress profile
ivanprytula Jun 25, 2026
ffe90dc
feat: add user registration to dashboard auth sidebar
ivanprytula Jun 25, 2026
af49f3f
docs: update docker CI checklist wording for caching clarity
ivanprytula Jun 25, 2026
91e25ce
chore: gitignore local planning docs directory
ivanprytula Jun 25, 2026
3055159
test: add tests for run_source_probe and run_source_contract_snapshot
ivanprytula Jun 25, 2026
2e32584
docs: add CLAUDE.md with ACROSS principles, update AGENTS.md to defer…
ivanprytula Jun 25, 2026
b252a2d
test: add WebSocket event forwarding tests for pub/sub → client path
ivanprytula Jun 25, 2026
d099be3
docs: add Git, Safety, Python Tooling, and Shell Scripting rules to C…
ivanprytula Jun 25, 2026
ed18e78
fix: escape % in alembic URL, patch AsyncOpenAI at source, fix hook r…
ivanprytula Jun 25, 2026
1de84cb
fix: harden Azure provisioning script with loud errors and capacity p…
ivanprytula Jun 25, 2026
dea736c
chore: remove AWS infra replaced by Azure migration
ivanprytula Jun 27, 2026
bba3758
feat: add Azure infra, multi-cloud sandboxes (floci-az/aws/gcp)
ivanprytula Jun 27, 2026
52be8a3
refactor: remove cloud infra moved to api-observatory-infra
ivanprytula Jun 27, 2026
1179b56
docs: add cross-repo references
ivanprytula Jun 27, 2026
2cddb57
docs: add application baseline checklist + evolution/OWASP/maintenanc…
ivanprytula Jun 28, 2026
bbfca85
chore(actions): update(deps): bump actions/checkout from 6.0.3 to 7.0.0
dependabot[bot] Jun 28, 2026
1ffe3d7
Merge pull request #23 from ivanprytula/docs/app-evolution-baseline
ivanprytula Jun 28, 2026
244d4ec
fix(deps): bump msgpack 1.2.1 + pydantic-settings 2.14.2 (CVE fixes)
ivanprytula Jun 28, 2026
347ca42
Merge pull request #26 from ivanprytula/fix/dep-advisory-msgpack-pyda…
ivanprytula Jun 28, 2026
84b6c09
chore(actions): update(deps): bump docker/login-action
dependabot[bot] Jul 1, 2026
24716c4
chore(actions): update(deps): bump azure/login from 2.2.0 to 3.0.0
dependabot[bot] Jul 1, 2026
09beb84
chore(actions): update(deps): bump actions/attest-build-provenance
dependabot[bot] Jul 1, 2026
91d3bbc
chore(deps)(deps): bump the python-minor-patch group with 61 updates
dependabot[bot] Jul 1, 2026
fb51d99
chore(deps)(deps): bump the uv-minor-patch group across 1 directory w…
dependabot[bot] Jul 2, 2026
5528c79
fix(docker): align container UID to 10001 across app and infra manifests
ivanprytula Jul 9, 2026
c14619c
Merge pull request #37 from ivanprytula/fix/container-uid-10001-align…
ivanprytula Jul 9, 2026
cd31594
Merge pull request #22 from ivanprytula/dependabot/github_actions/dev…
ivanprytula Jul 9, 2026
ed502b9
Merge pull request #29 from ivanprytula/dependabot/github_actions/dev…
ivanprytula Jul 9, 2026
969cf37
Merge pull request #30 from ivanprytula/dependabot/github_actions/dev…
ivanprytula Jul 9, 2026
0d2d0ac
Merge pull request #31 from ivanprytula/dependabot/github_actions/dev…
ivanprytula Jul 9, 2026
3e1b8c5
chore(actions): update(deps): bump actions/cache from 5.0.4 to 6.1.0
dependabot[bot] Jul 9, 2026
f765fef
Merge pull request #32 from ivanprytula/dependabot/github_actions/dev…
ivanprytula Jul 9, 2026
0067ce2
Merge pull request #33 from ivanprytula/dependabot/pip/develop/python…
ivanprytula Jul 9, 2026
b5848cf
Merge pull request #36 from ivanprytula/dependabot/uv/develop/uv-mino…
ivanprytula Jul 9, 2026
9eb5d89
chore(ci): dedupe Python dependency ecosystem and consolidate pip-audit
ivanprytula Jul 9, 2026
cc7c317
chore(deps): record exclude-newer in uv.lock from global uv config
ivanprytula Jul 9, 2026
4ad0860
Merge pull request #38 from ivanprytula/chore/dependabot-uv-only-and-…
ivanprytula Jul 9, 2026
7967976
Merge pull request #39 from ivanprytula/chore/uv-lock-exclude-newer-m…
ivanprytula Jul 9, 2026
e40a98f
fix: make aiokafka import optional in events.py to unblock observatio…
ivanprytula Jul 9, 2026
c88b19c
Merge pull request #41 from ivanprytula/fix/observations-router-404-a…
ivanprytula Jul 9, 2026
c41deff
fix(ingestor): close gaps found in infra contract audit
ivanprytula Jul 9, 2026
27d1ca1
docs(claude): clarify ruff and git staging rules
ivanprytula Jul 9, 2026
aae6972
fix(tests): decouple ingestor unit tests from optional extras
ivanprytula Jul 10, 2026
3c93799
fix(k3s): restore local helm-values and repair stale deployment docs
ivanprytula Jul 10, 2026
8d7683b
fix(k3s): point redpanda helm repo at charts.redpanda.com
ivanprytula Jul 10, 2026
6b94ed9
fix(k3s): match redpanda helm-values to current chart schema (v26)
ivanprytula Jul 10, 2026
ff32f00
fix(k3s): give redpanda enough container memory headroom
ivanprytula Jul 10, 2026
006af9c
docs(architecture): replace stale 8-phase doc with current-state diag…
ivanprytula Jul 10, 2026
981efae
fix(k3s): correct postgresql service hostname in local secret
ivanprytula Jul 10, 2026
4f63c49
fix(k3s): set seccompProfile so pods pass restricted PodSecurity
ivanprytula Jul 10, 2026
b66abf2
fix(k3s): fix probe Host header, dashboard port mismatch, add migrations
ivanprytula Jul 10, 2026
3702680
fix(k3s): set SERVICE_VERSION for ingestor in local overlay
ivanprytula Jul 10, 2026
cbd7151
fix(ingestor): decouple liveness/readiness from strict version resolu…
ivanprytula Jul 10, 2026
eba0d85
refactor(ci): extract duplicated tree-SHA resolution into a composite…
ivanprytula Jul 10, 2026
7a1eb58
feat(cd): wire SERVICE_VERSION to deployed tag, enable manual rollback
ivanprytula Jul 10, 2026
638e855
fix(dashboard): source freshness heatmap "Last probe" was wired to th…
ivanprytula Jul 10, 2026
a25ce6e
fix(dashboard): scheduler job status always showed runs:0 errors:0
ivanprytula Jul 10, 2026
19025ea
feat(ingestor): register probe job immediately when a source is created
ivanprytula Jul 10, 2026
74fc645
chore(bruno): update collections
ivanprytula Jul 10, 2026
d0541e4
fix(scheduler): jobs registered after start() weren't actually scheduled
ivanprytula Jul 10, 2026
aef1c29
feat(ingestor): auto-create incident + pending AgentRun on breaking/c…
ivanprytula Jul 11, 2026
77d7ed2
feat(inference): real embeddings/RAG microservice on its own dedicate…
ivanprytula Jul 11, 2026
a1ed939
feat(ingestor): real LangGraph incident-triage agent with HITL review
ivanprytula Jul 11, 2026
f4afc63
feat(ingestor): require JWT auth on observations/agent routers
ivanprytula Jul 12, 2026
efc3d3e
chore: remove dead pre-MVP agent scaffolding leftover in the dashboar…
ivanprytula Jul 12, 2026
e0fe61d
fix(tests): make auth test fixtures hermetic against local .env
ivanprytula Jul 12, 2026
b2c342d
docs: dedupe ACROSS to global CLAUDE.md, add sandbox CLAUDE.md regen …
ivanprytula Jul 12, 2026
a5ea420
feat(mcp): add MCP server exposing the observatory's toolset (Phase 5)
ivanprytula Jul 12, 2026
5f6c842
fix(auth): make login's Cache session write fail open
ivanprytula Jul 12, 2026
5fe86fc
fix(ci): unblock develop CI — optional langgraph import, skip Docker …
ivanprytula Jul 13, 2026
86db5e3
fix(security): stop leaking raw exception text in LLM analysis SSE st…
ivanprytula Jul 13, 2026
fc4a6ad
fix(security): write generated secrets to a 0600 file instead of stdout
ivanprytula Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .claude/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
settings.local.json
skills/
CLAUDE.md
36 changes: 36 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"permissions": {
"deny": [
"Read(/home/ivanp/PersonalProjects/api-observatory/.env)",
"Read(/home/ivanp/PersonalProjects/api-observatory/.env.*)",
"Read(/home/ivanp/PersonalProjects/api-observatory/.streamlit/secrets.toml)",
"Read(/home/ivanp/PersonalProjects/api-observatory/infra/certs/*-key.pem)",
"Bash(cat */.env*)",
"Bash(cat *.pem)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qiE '(printenv|\\benv\\b|export|echo.*PASSWORD|echo.*SECRET|echo.*TOKEN|echo.*API_KEY)'; then echo 'BLOCKED: Command may leak secrets' >&2; exit 2; fi"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "ruff check --fix $CLAUDE_FILE_PATHS && ruff format $CLAUDE_FILE_PATHS"
}
]
}
]
}
}
28 changes: 27 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ __pycache__/
*.coverage
.coverage*
.cache/
pytest_cache/
.pytest_cache/
.env
.env.*
.vscode/
Expand All @@ -23,23 +23,49 @@ build/
.eggs/
*.egg-info/
*.egg

# Python tooling caches (large, never needed in images)
.mypy_cache/
.ruff_cache/
.pytest_cache/

# Virtual environment (massive, kills build context)
.venv/

# Agent tooling data (large, irrelevant)
.kilo/
.copilot/

# Streamlit local config
.streamlit/

# Terraform state/cache
.terraform/

# Exclude test and local dev files
*.md
learning_docs/
tests/
scripts/
bruno/
examples/

# Exclude repo metadata and docs (large, never needed in images)
.git/
.github/
docs/
_archive/

# Exclude sensitive and generated root files
secrets-findings.json

# Exclude Docker artifacts
Dockerfile*
.dockerignore

# Exclude local volumes
pg_data/
.local-dev/

# Coverage reports
htmlcov/
Expand Down
41 changes: 18 additions & 23 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ LOG_ASYNCIO_LEVEL=WARNING
# Documentation Authentication (optional)
# Leave empty to allow public access to /docs, /redoc, /openapi.json
# Set both to enable HTTP Basic Auth protection on docs endpoints
# ⚠️ Dev defaults — use strong credentials or clear both values in non-local environments
DOCS_USERNAME=admin
DOCS_PASSWORD=changeme
DOCS_USERNAME=
DOCS_PASSWORD=

# API Authentication — v1 (Token-based + Session)
# ⚠️ Dev default — replace with a strong random value in staging and production
Expand All @@ -35,13 +34,18 @@ JWT_SECRET=your-super-secret-key-at-least-32-characters-long-change-in-prod
JWT_ALGORITHM=HS256
JWT_EXPIRY_MINUTES=60

# Service-to-service and privileged auth (injected by infra via secretKeyRef in production)
INTERNAL_JWT_SECRET=dev-internal-secret-change-in-prod
ADMIN_TOKEN=dev-admin-token-change-in-prod

# Cache
# Set CACHE_ENABLED=true to enable: scorecard cache (SETEX 30s), WebSocket pub/sub fan-out,
# JWT session store, slowapi rate limiting backend, LangGraph agent checkpointer.
# When false: in-memory fallback for rate limits, MemorySaver for agent, no live WS events.
CACHE_ENABLED=true
CACHE_URL=redis://localhost:6379/0
# Inside Docker Compose: redis://cache:6379 (set automatically in docker-compose.yml)
CACHE_URL=redis://:cache_secret@localhost:6379/0
# Inside Docker Compose: redis://:${REDIS_PASSWORD}@cache:6379/0 (set automatically in docker-compose.yml)
REDIS_PASSWORD=cache_secret

# Local HTTPS toggle
# Set to true to automatically use https://localhost for API, dashboard, docs.
Expand Down Expand Up @@ -71,7 +75,7 @@ OPENAI_API_KEY=sk-your-real-key-here
# OpenTelemetry (distributed tracing → Jaeger)
# Set OTEL_ENABLED=true when running with docker compose (Jaeger is included)
OTEL_ENABLED=false
OTEL_ENDPOINT=http://localhost:4317
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
OTEL_SERVICE_NAME=api-obs-ingestor

# Sentry / GlitchTip (error tracking)
Expand All @@ -88,28 +92,19 @@ GLITCHTIP_DB_PASSWORD=glitchtip
GLITCHTIP_SECRET_KEY=change-me-in-production-at-least-50-chars-random
GLITCHTIP_DOMAIN=http://localhost:8010

# S3 backup (used by infra/scripts/backup.sh + restore.sh)
# BACKUP_STORAGE: local | s3 | both (default: local)
# AWS_ENDPOINT_URL: set to http://localhost:4566 for Floci, leave empty for real AWS
# Blob Storage backup (used by infra/scripts/backup.sh + restore.sh)
# BACKUP_STORAGE: local | blob | both (default: local)
BACKUP_STORAGE=local
BACKUP_S3_BUCKET=api-observatory-backups
BACKUP_S3_PREFIX=backups/
AWS_ENDPOINT_URL=http://localhost:4566
BACKUP_BLOB_CONTAINER=backups
BACKUP_BLOB_PREFIX=

# Background workers (Pillar 5 prototype)
BACKGROUND_WORKERS_ENABLED=false
BACKGROUND_WORKER_COUNT=2
BACKGROUND_WORKER_QUEUE_SIZE=200
BACKGROUND_MAX_TRACKED_TASKS=500

# LocalStack configuration
AWS_PROFILE=localstack
AWS_ENDPOINT_URL=http://localhost:4566
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
AWS_DEFAULT_REGION=us-east-1

# Dev environment configuration
AWS_PROFILE=dev
AWS_DEFAULT_REGION=us-east-1
# Don't set endpoint_url for real AWS
# floci-az emulator (local Azure sandbox)
AZURE_ENDPOINT_URL=http://localhost:4577
AZURE_STORAGE_ACCOUNT=devstoreaccount1
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:4577/devstoreaccount1;QueueEndpoint=http://127.0.0.1:4577/devstoreaccount1
17 changes: 17 additions & 0 deletions .github/actions/resolve-tree-sha/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: "Resolve tree SHA"
description: >-
Compute the deterministic per-commit tree SHA used for image tags
(tree-<sha>). Requires the repo to already be checked out.
outputs:
tree_sha:
description: "7-character git tree SHA"
value: ${{ steps.resolve.outputs.tree_sha }}
runs:
using: "composite"
steps:
- id: resolve
shell: bash
run: |
set -euo pipefail
TREE_SHA=$(git rev-parse HEAD^{tree} | cut -c1-7)
echo "tree_sha=${TREE_SHA}" >> "$GITHUB_OUTPUT"
33 changes: 0 additions & 33 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,39 +5,6 @@ version: 2
# Keep this file in sync on the default branch to ensure target-branch rules apply.

updates:
# Python package updates (pip)
- package-ecosystem: pip
directory: "/"
schedule:
interval: monthly
target-branch: develop
open-pull-requests-limit: 3
reviewers:
- ivanp
assignees:
- ivanp
labels:
- "dependencies"
- "type/dependency"
- "area/python-packages"
allow:
- dependency-type: "direct"
- dependency-type: "indirect"
commit-message:
prefix: "chore(deps)"
include: "scope"
pull-request-branch-name:
separator: "/"
rebase-strategy: auto
versioning-strategy: auto
groups:
python-minor-patch:
patterns:
- "*"
update-types:
- "minor"
- "patch"

# Python package updates (uv)
- package-ecosystem: uv
directory: "/"
Expand Down
2 changes: 1 addition & 1 deletion .github/instructions/docker-ci-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ This reduces per-job setup time and guarantees Python 3.14 parity for cp314 whee

### Week 1: Docker + Lint/Test CI

- [ ] Dockerfile: multi-stage, slim base, <150MB final image
- [ ] Dockerfile: multi-stage, slim base, efficient caching (proper layers ordering)
- [ ] .dockerignore: exclude unnecessary files
- [ ] ci.yml: lint job (Ruff check + format)
- [ ] ci.yml: test job with matrix (Python 3.10/3.11/3.12)
Expand Down
Loading
Loading