Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
290 commits
Select commit Hold shift + click to select a range
b6f180b
docs(aiac): add UC-1/UC-2 call flows and restructure Technical Addendum
oblinder Jun 7, 2026
36b66ce
docs(aiac): add Short-Term Objectives section to architecture summary
oblinder Jun 7, 2026
d7ddc08
docs(aiac): merge architecture summary into PRD and restructure
oblinder Jun 7, 2026
16660c5
docs(aiac): update architecture diagram call labels with specific API…
oblinder Jun 7, 2026
beb0dff
docs(aiac): add Red Hat AMQ evaluation as Event Broker alternative
oblinder Jun 8, 2026
e7245c9
docs(aiac): remove Key Interface Surface section and simplify UC-1 title
oblinder Jun 8, 2026
8ea332f
docs(aiac): replace flat call flow with structured UC call flows in PRD
oblinder Jun 8, 2026
bc1692f
docs(aiac): reorder architecture summary sections and remove Technica…
oblinder Jun 8, 2026
653d90e
Merge remote-tracking branch 'origin/main' into aiac
anatolykoyfman Jun 9, 2026
f777590
minor fix
anatolykoyfman Jun 10, 2026
91f4da0
rego generation
anatolykoyfman Jun 10, 2026
41b4fee
improve prompt + better rego
anatolykoyfman Jun 14, 2026
d5f38a1
improve prompt + better rego
anatolykoyfman Jun 14, 2026
85f7b6f
docs(aiac): redesign aiac.pdp.library component PRD
oblinder Jun 14, 2026
e738bdf
docs(aiac): add missing description field to Service model in library…
oblinder Jun 14, 2026
69fc6a4
refactor(aiac): Reshape pdp.library into class-based config/policy cl…
oblinder Jun 14, 2026
8b3ba35
docs(aiac): move create_scope from policy to configuration library mo…
oblinder Jun 14, 2026
dada065
feat(aiac): move create_scope to Configuration; add POST /services/{i…
oblinder Jun 14, 2026
b2b3487
docs(aiac): split create_scope into create/map; add role equivalents
oblinder Jun 14, 2026
6d20fc5
feat(aiac): add scope/role write endpoints to config service and library
oblinder Jun 14, 2026
e001125
new config API
anatolykoyfman Jun 15, 2026
471261e
docs(aiac): split aiac-agent PRD into 3 UC sub-PRDs
oblinder Jun 15, 2026
5ed725e
docs(aiac): rename policy update subjects and endpoints
oblinder Jun 15, 2026
f9c1973
docs(aiac): rename 'realm role' to 'role' across all requirements
oblinder Jun 15, 2026
c90f1d0
minor formatting
anatolykoyfman Jun 15, 2026
afeabc6
Merge branch 'aiac' of github.com:s-and-p-team/kagenti-extensions int…
anatolykoyfman Jun 15, 2026
fe98a63
feat(agent): implement Role sub-agent, orchestrator, and NATS consumer
oblinder Jun 15, 2026
f30e6fa
feat(agent): implement controller routes, shared nodes, and tests (is…
oblinder Jun 15, 2026
a7001f5
docs: fix Mermaid node colors for dark theme readability
oblinder Jun 16, 2026
c3cb27a
docs: remove unreferenced aiac-agent-diagram.md
oblinder Jun 16, 2026
92301b9
docs: Remove mermaid element styles from aiac-agent requirement docs
oblinder Jun 16, 2026
6686ef7
docs: refine classify_service spec with AgentRuntime LIST lookup and …
oblinder Jun 16, 2026
a2b58d9
docs: redesign UC1 Service Provision nodes — remove LLM, deterministi…
oblinder Jun 16, 2026
0268174
docs: Mark analyze_tool lookup strategy as TBD in UC1 spec
oblinder Jun 16, 2026
78e1e89
docs: Update UC1 spec with agreed design decisions from grilling session
oblinder Jun 16, 2026
7f3a7be
docs: rename OnboardingProvisionState.client_id to service_id in UC1 …
oblinder Jun 16, 2026
040fc0d
docs: Refactor UC1 Service Onboarding policy sub-agent into PolicyMod…
oblinder Jun 17, 2026
acb7eb7
docs: update aiac-agent.md spec for policy sub-agent refactor
oblinder Jun 17, 2026
a6ade2f
docs: fix Mermaid node ID conflict in aiac-agent.md
oblinder Jun 17, 2026
712ec2b
docs: Restructure library PRD into configuration/ and policy/ sub-pac…
oblinder Jun 17, 2026
7fbe12a
refactor(pdp): restructure library into configuration/ and policy/ su…
oblinder Jun 17, 2026
ceb5f43
docs: Fix PDP config service install guide for local dev
oblinder Jun 17, 2026
20dfa23
chore: untrack Claude Code files and add to .gitignore
oblinder Jun 17, 2026
d9051ff
revert: restore .claude/ tracking in kagenti-extensions
oblinder Jun 17, 2026
85a9b0e
revert: restore CLAUDE.md tracking in kagenti-extensions
oblinder Jun 17, 2026
ca1008b
docs: Refactor PolicyApplyGraph and PolicyModel as shared across all …
oblinder Jun 17, 2026
e37f920
allow for both i nbound and outbound
anatolykoyfman Jun 17, 2026
759a22e
fix: resolve Keycloak clientId and service type in Service model
oblinder Jun 17, 2026
ce2e652
test: Expand show_keycloak_data smoke test to display all model fields
oblinder Jun 17, 2026
256fc6c
feat: persist kagenti.service.type via PATCH /services and extend mod…
oblinder Jun 17, 2026
296afe0
temp
anatolykoyfman Jun 17, 2026
c7e01a0
remove python path
anatolykoyfman Jun 17, 2026
f3496af
feat: populate Service.roles/scopes and Role.childRoles/mappedScopes …
oblinder Jun 17, 2026
5466064
test: add unit tests for get_roles() secondary calls and GET /roles/{…
oblinder Jun 17, 2026
f4fd13d
docs: update PRD and component specs for get_roles() childRoles/mappe…
oblinder Jun 17, 2026
328d2fb
fix: fix PDP config service scope-mappings and sync stale tests
oblinder Jun 17, 2026
d72b498
refactor: reorder Keycloak config API endpoints by functionality
oblinder Jun 18, 2026
7727b6f
fix: use service account user API for service roles endpoints
oblinder Jun 18, 2026
edbdaa0
temp
anatolykoyfman Jun 18, 2026
82a8097
fix: use service account user for realm role operations on services
oblinder Jun 18, 2026
16180a1
feat: Add serviceId field to Service model from Keycloak clientId
oblinder Jun 18, 2026
72ef1ca
feat: Print serviceId in show_keycloak_data.py services output
oblinder Jun 18, 2026
4871de6
fix: populate Scope descriptions and Role details in get_services
oblinder Jun 18, 2026
463db4e
Merge remote-tracking branch 'origin/aiac' into scopes
anatolykoyfman Jun 19, 2026
6535d3a
fixes for new api
anatolykoyfman Jun 19, 2026
93e04c6
scopes initial
anatolykoyfman Jun 19, 2026
7ba5fbe
merge with scopes
anatolykoyfman Jun 19, 2026
559b433
better prompt
anatolykoyfman Jun 20, 2026
167c526
minor prompt fixes for weaker models
anatolykoyfman Jun 20, 2026
1f4d1c8
fix: Infer Service type from description in get_services
oblinder Jun 21, 2026
3b1f230
refactor: remove per-request realm override from PDP Configuration Se…
oblinder Jun 21, 2026
12eb891
feat: per-request realm support with lazy KeycloakAdmin cache in PDP …
oblinder Jun 21, 2026
f34c7a9
test: update config service tests for required realm param and lazy c…
oblinder Jun 21, 2026
fa306ef
fix: remove realm query param from /health, use KEYCLOAK_ADMIN_REALM
oblinder Jun 21, 2026
3a2b331
docs: update PRD and component spec for /health realm-param removal
oblinder Jun 21, 2026
fbc3ec5
Merge remote-tracking branch 'origin/main' into aiac
oblinder Jun 21, 2026
84e7dfb
feat: add get_service and refactor service enrichment into _build_ser…
oblinder Jun 21, 2026
cc245cd
docs: add get_service and document _build_service refactor in library…
oblinder Jun 21, 2026
a19eb2c
test: add TestGetService and TestSetServiceType; fix TestGetServices …
oblinder Jun 21, 2026
971b5d0
model
anatolykoyfman Jun 21, 2026
89f36b3
model
anatolykoyfman Jun 21, 2026
f5d6ac2
feat: populate Subject.roles from Keycloak realm role assignments
oblinder Jun 21, 2026
ac2b249
docs: update library.md for get_subjects() role enrichment
oblinder Jun 21, 2026
62986d0
docs: Add Phase 2 PDP Policy Service (OPA) component PRD
oblinder Jun 22, 2026
d861878
docs: Update PRD for Phase 2 OPA architecture and idp/pdp namespace s…
oblinder Jun 22, 2026
955f52c
docs: Remove Phase 1/2 duality from PRD and component specs
oblinder Jun 23, 2026
3bd9248
docs: add State Management Service and state library PRDs; update mas…
oblinder Jun 23, 2026
38d50d0
docs: rename Kubernetes Interface Pod to Kagenti Interface Pod, add S…
oblinder Jun 23, 2026
4516cbf
docs: update requirements to reflect OPA-first architecture and Kagen…
oblinder Jun 23, 2026
e891309
docs: rename PDP Interface Pod to Kagenti Interface Pod in standalone…
oblinder Jun 23, 2026
0c9e26c
docs(aiac): update state management PRD for SQLite + StatefulSet
oblinder Jun 24, 2026
930b561
docs(aiac): rename State Management Service and PDP Policy Service
oblinder Jun 24, 2026
d9f9db0
docs: Remove deployment topology section from PRD; sync architecture …
oblinder Jun 24, 2026
69bfdd5
Minor arch diagram update
oblinder Jun 24, 2026
70bd53b
temp
anatolykoyfman Jun 26, 2026
9a7bcd1
temp
anatolykoyfman Jun 26, 2026
042732f
temp, fix tests
anatolykoyfman Jun 26, 2026
09486b4
fix prompts + add tests
anatolykoyfman Jun 28, 2026
03012e0
docs: redesign AIAC policy architecture — Policy Store, PCE, Policy M…
oblinder Jun 28, 2026
fa205b1
docs(aiac-agent): replace PolicyBuilder TBD with SharedApplyGraph and…
oblinder Jun 29, 2026
61d213d
refactor: rename aiac.pdp.library.configuration → aiac.idp.configurat…
oblinder Jun 29, 2026
1d6185e
docs: sync ARCHITECTURE-SUMMARY diagram and component table with PRD
oblinder Jun 29, 2026
fcfb746
docs(aiac-agent): replace shared apply node with Policy Rules Builder…
oblinder Jun 29, 2026
3a4ebed
docs(aiac-agent): align PRD with Policy Rules Builder architecture
oblinder Jun 29, 2026
835d602
docs(aiac-agent): remove stale shared module and LLM integration; ext…
oblinder Jun 29, 2026
48dda11
docs(aiac-agent): simplify file structure tree
oblinder Jun 29, 2026
34e8b87
docs(aiac-agent): align main PRD with grill-me shared contract
oblinder Jun 29, 2026
de4721f
docs(aiac-agent): rewrite UC1, UC2, UC3 sub-PRDs per grill-me session
oblinder Jun 29, 2026
ca3527d
docs(aiac-agent): rename Service Policy Update sub-agent to Service P…
oblinder Jun 29, 2026
f2011c7
docs(aiac-agent): specify Policy Rules Builder interface
oblinder Jun 30, 2026
fb5d242
docs(aiac-agent): move PRB calls from Controller into producing sub-a…
oblinder Jun 30, 2026
5e0fff0
docs(aiac): align idp-configuration-service spec with implementation
oblinder Jun 30, 2026
61ac3c7
feat(aiac): implement id-only hash/eq, remove set_service_type, updat…
oblinder Jun 30, 2026
a0b8a79
minor pathe related fixes
anatolykoyfman Jun 30, 2026
dca6b3a
Merge branch 'aiac' of github.com:s-and-p-team/kagenti-extensions int…
anatolykoyfman Jun 30, 2026
144e0ba
docs(aiac): add subject_roles to AgentPolicyModel and PCE algorithm
oblinder Jun 30, 2026
093495f
feat(aiac): add get_subjects_by_role, move IdP tests to test/idp/
oblinder Jun 30, 2026
ccf858a
Adding aiac/.gitignore
oblinder Jun 30, 2026
c2f20c5
test(aiac): add unit tests for Subject hashability and get_subjects_b…
oblinder Jun 30, 2026
b3dcd4f
feat(aiac): add aiac.policy.model package with PolicyRule, AgentPolic…
oblinder Jun 30, 2026
42b2ee3
feat(aiac): add policy store service with SQLite-backed FastAPI and u…
oblinder Jun 30, 2026
bede4ee
feat(aiac): add policy store library and unit tests
oblinder Jun 30, 2026
47dd872
new model struct
anatolykoyfman Jul 1, 2026
e868795
new rego builder + new policy retuns
anatolykoyfman Jul 1, 2026
7399962
docs: rename aiac-pdp-policy-service ClusterIP to aiac-pdp-policy-wri…
oblinder Jul 1, 2026
e8dc4a5
refactor(policy): remove IdP model hashability, key policy maps by st…
oblinder Jul 1, 2026
56693bc
docs: Align PDP writer, PCE, and PRD with revised policy model spec
oblinder Jul 1, 2026
a604320
feat(aiac): add Rego package generator for PDP policy writer
oblinder Jul 1, 2026
31e1c77
feat(aiac): add PDP Policy Writer OPA filesystem stub service
oblinder Jul 1, 2026
1cb3e2f
style: Sort imports in OPA policy-writer per ruff
oblinder Jul 1, 2026
4d38393
Style: Fix ruff lint errors across src/aiac
oblinder Jul 1, 2026
ce70b2a
remove old rego generation
anatolykoyfman Jul 1, 2026
681acfc
merge
anatolykoyfman Jul 1, 2026
b068ab1
remove old
anatolykoyfman Jul 1, 2026
651c63c
cleanup
anatolykoyfman Jul 1, 2026
7c7957b
feat(aiac): Add aiac.pdp.policy.library OPA HTTP client with unit tests
oblinder Jul 1, 2026
cf2b9f8
style(aiac): Add aiac-local ruff config and fix lint violations
oblinder Jul 1, 2026
0f25da6
docs: Rework PDP policy-writer PRD to ID-only rego model; index integ…
oblinder Jul 1, 2026
9ef0f59
docs: Add PDP Policy Writer (OPA) integration-test spec
oblinder Jul 1, 2026
341657b
refactor(aiac): Rewrite OPA Rego generator to ID-only model
oblinder Jul 1, 2026
db6d078
test(aiac): Add PDP policy-writer OPA integration launcher (generate_…
oblinder Jul 1, 2026
ebb33b6
Refactor(aiac): Reset stale agent layer; finish pdp.policy.library cl…
oblinder Jul 2, 2026
f21a22a
Docs(aiac): Update CLAUDE.md for the agent layer reset
oblinder Jul 2, 2026
1ddf65f
feat(aiac): Add Policy Computation Engine (aiac.policy.computation)
oblinder Jul 2, 2026
1340a60
docs(aiac): Move role flattening upstream of PRB; add PCE append/over…
oblinder Jul 3, 2026
7bac2cb
feat(aiac): Add PCE override merge mode and drop role flattening
oblinder Jul 3, 2026
6f7cb3b
Refactor(aiac): Drop unused _BASE_URL constant in policy store library
oblinder Jul 5, 2026
9610d79
feat(aiac): Add agent Controller skeleton + flatten_role helper
oblinder Jul 5, 2026
21e5ea3
docs: Record resolved Policy Rules Builder internal design
oblinder Jul 5, 2026
7bb56dc
feat(aiac): Implement Policy Rules Builder phase 1
oblinder Jul 5, 2026
e326151
docs: add Keycloak access control analysis for U→A→T scenario with RB…
oblinder Jul 6, 2026
b4a18db
chore: gitignore aiac/inception/plans and remove stale aiac artefact …
oblinder Jul 6, 2026
b5ef7af
docs: add OPA-as-PDP architecture sections to Keycloak access control…
oblinder Jul 6, 2026
ef7d3d8
fix(aiac): Filter services client-side and drop role→scopes endpoint
oblinder Jul 7, 2026
41aa64d
feat(aiac): route PCE rules by kind and add outbound subject gate
oblinder Jul 7, 2026
2cc3cec
docs: Add policy-pipeline integration-test spec and index it in the PRD
oblinder Jul 8, 2026
429c3bb
feat(aiac): add policy-pipeline integration test (5.3) with shared la…
oblinder Jul 8, 2026
c90d47a
docs(aiac): record 5.3 launcher deviations in policy-pipeline spec
oblinder Jul 8, 2026
a7fe45a
feat(aiac): mark AIAC-provisioned roles/scopes and filter Keycloak bu…
oblinder Jul 8, 2026
35c5269
feat(aiac): canonical client.type attribute for service typing with I…
oblinder Jul 8, 2026
f86e710
docs(aiac): make policy-pipeline scenario descriptions generic and ty…
oblinder Jul 8, 2026
84111b1
docs(aiac): reframe policy-pipeline spec as asserting opa-eval pytest…
oblinder Jul 9, 2026
bc63a54
test(aiac): add policy-pipeline OPA-eval integration test; align scen…
oblinder Jul 9, 2026
60f4177
docs(aiac): elaborate policy-pipeline roles; rename agent roles to so…
oblinder Jul 12, 2026
efbc908
fix(aiac): scope PRB auditor to one access relationship per verdict
oblinder Jul 12, 2026
b986849
fix(aiac): converge PRB output across explicit/abstract policy variants
oblinder Jul 12, 2026
7daf3c8
chore(aiac): gitignore policy-pipeline integration-test rego_out
oblinder Jul 12, 2026
2b623ec
refactor(aiac): remove spiffe:// clientId type fallback in IdP models
oblinder Jul 12, 2026
3bb7449
docs(aiac): label-based onboarding classification + hybrid MCP tool l…
oblinder Jul 12, 2026
c9832f6
chore(aiac): untrack and gitignore gh-issues drafts
oblinder Jul 12, 2026
fccff9c
docs: Clarify UC1 own-vs-other roles/scopes and self-mapping invariant
oblinder Jul 12, 2026
c1ccbde
feat(aiac): Service Provision sub-agent (UC1) + shared ServiceType
oblinder Jul 12, 2026
08d920f
feat(aiac): Service Policy sub-agent (UC1) + shared run_upstream helper
oblinder Jul 12, 2026
545a902
refactor(aiac): Rename Service Policy sub-agent to Service Policy Bui…
oblinder Jul 12, 2026
1719eb8
feat(aiac): Service Onboarding Orchestrator (UC1) — provision → polic…
oblinder Jul 12, 2026
b5e582e
refactor(aiac): Relocate run_upstream to project level and push retri…
oblinder Jul 12, 2026
d01f57b
Fix(aiac): Reconcile PRB deny-by-default with description-based grants
oblinder Jul 12, 2026
fcb50cf
Refactor(aiac): Factor generic policy into the PRB prompt
oblinder Jul 12, 2026
36e8d51
Docs(aiac): Add github-agent demo spec (source + issue A2A agent)
oblinder Jul 12, 2026
1ca4bc4
Docs(aiac): Spec UC-1 onboarding-pipeline integration test + github-t…
oblinder Jul 13, 2026
31cd1e8
Test(aiac): Assert onboarding orchestrator invokes provision graph wi…
oblinder Jul 13, 2026
962f892
Feat: Add minimal github-tool MCP demo server (UC-1 discovery)
oblinder Jul 13, 2026
b04c702
Feat(aiac): Add github-agent demo (GA-1…GA-9)
oblinder Jul 13, 2026
1513412
Feat(aiac): Add k8s deployment manifests Phase 1 — Interface Pod, Pol…
oblinder Jul 13, 2026
f7a6834
Fix(aiac): Phase 1 k8s — Policy Store own ConfigMap, keycloak PDP Pol…
oblinder Jul 13, 2026
54fb64a
fix: use localhost/...:local image names in AIAC k8s production manif…
oblinder Jul 13, 2026
7b14995
docs: reorganise inception/ into docs/ — specs, issues, handoffs, gh-…
oblinder Jul 13, 2026
448da92
Test(aiac): Add UC-1 onboarding-pipeline integration test (5.4)
oblinder Jul 13, 2026
727743f
Chore(aiac): Retarget github demo manifests to aiac-demo namespace
oblinder Jul 13, 2026
263fb32
Docs: Add AIAC specification documents
oblinder Jul 13, 2026
cd6b389
Merge branch 'aiac' into aiac-phase1
oblinder Jul 13, 2026
cf48099
Chore(aiac): Defer aiac-init and phase-gated env vars from Phase 1 de…
oblinder Jul 14, 2026
2a3c0a1
Chore(aiac): Retarget github demo manifests back to team1 namespace
oblinder Jul 14, 2026
1895994
Chore(aiac): Point github demo at existing kagenti realm
oblinder Jul 14, 2026
c19073d
Docs(aiac): Reframe uc1-onboarding integration test as a rung ladder
oblinder Jul 14, 2026
1f64da0
Docs(aiac): Apply SPM/APM redesign across policy component specs
oblinder Jul 14, 2026
4500bc9
feat(aiac): Add ServicePolicyModel + Role/Scope SPM fields (Wave 1)
oblinder Jul 15, 2026
9c82313
Test(aiac): Verify idp Configuration surfaces SPM/APM fields (handoff…
oblinder Jul 15, 2026
6a93e1f
Feat(aiac): SPM-centric policy store (persist SPMs, drop APM persiste…
oblinder Jul 15, 2026
8ad2286
Feat(aiac): Source agent roles from client roles + populate SPM/APM f…
oblinder Jul 15, 2026
c53e1e3
Refactor(aiac): Rewrite PCE to SPM-based order-independent engine
oblinder Jul 15, 2026
773844c
Docs(aiac): Refresh CLAUDE.md source/image map post handoffs 01-05
oblinder Jul 15, 2026
b58a16d
Test(aiac): Fix stale store DB env var name in policy-pipeline integr…
oblinder Jul 15, 2026
24c5fec
Fix(aiac): Populate agent-role kind/actorIds + scope.serviceId at IdP…
oblinder Jul 15, 2026
259f2b4
Docs(aiac): Reconcile IdP role-sourcing specs with two-source agent r…
oblinder Jul 15, 2026
b785c2e
fix(demo): add protocol label and direct agent port for AgentCard aut…
oblinder Jul 15, 2026
e55a333
Fix(aiac): Deploy OPA rego-file PDP writer in Phase 1, not Keycloak mock
oblinder Jul 15, 2026
646d1a4
Fix(aiac): UC-1 onboarding pipeline fixes + rung-1 integration test
oblinder Jul 15, 2026
a118fb6
Docs(aiac): Reconcile UC-1 specs with the onboarding pipeline fixes
oblinder Jul 15, 2026
5bd33e5
Docs(aiac): Reconcile PCE spec/PRD with re-raise (was fire-and-forget…
oblinder Jul 15, 2026
86a20a6
Docs(aiac): Add Kagenti dev-guide link to CLAUDE.md external references
oblinder Jul 15, 2026
1317e20
test(aiac): Add UC-1 onboarding rung-2 integration test + shared harness
oblinder Jul 15, 2026
cc3afb8
Fix(aiac): Policy Store slash-safe service_id + SPIFFE-aware slugify
oblinder Jul 15, 2026
c5f2fc3
Chore(aiac): Remove obsolete onboarding.old and test_llm_config.py.old
oblinder Jul 15, 2026
954c204
Fix(aiac): Authenticate UC-1 tool MCP discovery with tool-audienced t…
oblinder Jul 15, 2026
1b24f96
docs(aiac): Reconcile IdP/library/UC-1 specs with discovery-token fix
oblinder Jul 15, 2026
8a3f415
test(aiac): Capture UC-1 rego into per-rung project subfolders
oblinder Jul 15, 2026
bf93895
test(aiac): Nest policy-pipeline rego under rego_out/policy_pipeline
oblinder Jul 15, 2026
91738fe
Fix(aiac): Align UC-1 integration realm with deployed stack (kagenti)
oblinder Jul 15, 2026
872daef
Test(aiac): Rename policy-pipeline throwaway realm to aiac-pp
oblinder Jul 15, 2026
5939673
chore(aiac): Remove unused test/fixtures directory
oblinder Jul 15, 2026
6b56983
docs: Correct PDP responsibility wording in architecture summary
oblinder Jul 26, 2026
32ed2ae
docs(aiac): Fix OPA/token-issuance contradiction in spec docs
oblinder Jul 26, 2026
29b20af
docs: Align PDP Policy Writer service name and library import path
oblinder Jul 26, 2026
cbe0301
docs: Fix module path, naming, and link inconsistencies in AIAC specs
oblinder Jul 26, 2026
bb123be
docs(aiac): Fix dangling link to issue 6.2 in uc1-service-onboarding …
oblinder Jul 26, 2026
122eae0
fix: Exclude Keycloak default-roles composite from GET /roles
oblinder Jul 27, 2026
34700bd
fix(pdp): Drop dead agent_scopes from outbound Rego package
oblinder Jul 27, 2026
15d3bf3
fix: Source Service Policy Builder candidates from get_services()/get…
oblinder Jul 27, 2026
b91e4d2
test: Rewrite Service Policy Builder unit tests for ownership-based c…
oblinder Jul 27, 2026
2efc4d4
fix: Resolve Service Policy Builder focus by internal client UUID
oblinder Jul 27, 2026
e50ce3e
docs: Correct service_id identity to internal client UUID
oblinder Jul 27, 2026
c7f9867
chore: Drop onboarding.old/policy from ruff/pytest config
oblinder Jul 27, 2026
fd620df
feat: Add Policy Store clear-all endpoint and clear store per UC-1 run
oblinder Jul 27, 2026
53fd2d8
docs: Record RC-B per-scope two-gate AND + capability-match in PCE an…
oblinder Jul 27, 2026
e59ed76
feat: Capability-match UC-1 outbound as per-scope two-gate AND
oblinder Jul 27, 2026
696a649
test: Align 5.3 pipeline agent roles to UC-1 (source_operations / iss…
oblinder Jul 27, 2026
e3e3352
feat: Add PCE decommission (service offboard) + offboard route
oblinder Jul 28, 2026
4e9c6c0
Merge origin/main into aiac-phase1-pr
oblinder Jul 28, 2026
0d26fed
chore: Fix pre-commit hook findings on PR diff files
oblinder Jul 28, 2026
dd13b10
Merge remote-tracking branch 'origin/main' into aiac-phase1-pr
oblinder Jul 29, 2026
6298321
fix(aiac): Address CodeRabbit review findings on UC-1 Phase 1
oblinder Jul 29, 2026
c79fa2e
Fix: Address second CodeRabbit pass on UC-1 Phase 1
oblinder Jul 29, 2026
2e0eb79
Fix: Resolve CodeQL security findings on UC-1 Phase 1
oblinder Jul 29, 2026
53258ac
Fix: Resolve CodeQL SSRF/path-injection and chromadb dependency-revie…
oblinder Jul 29, 2026
21b03a5
Fix: Bump json-repair to 0.60.1 to clear dependency-review DoS finding
oblinder Jul 29, 2026
1490494
Fix: Run AIAC service containers as non-root (clawgenti finding)
oblinder Aug 2, 2026
679392f
Docs: Document non-root container / volume-ownership deployment pattern
oblinder Aug 2, 2026
d83f0db
Fix: Address must-fix PR review findings (PR #710)
oblinder Aug 2, 2026
585b7a6
Fix: Address suggestion-severity PR review findings (PR #710)
oblinder Aug 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/security-scans.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ jobs:
fail-on-severity: moderate
deny-licenses: GPL-3.0, AGPL-3.0
comment-summary-in-pr: never
# CVE-2026-45829 / GHSA-f4j7-r4q5-qw2c (chromadb, transitive via crewai): no patched
# version exists (affected <= 1.5.9, crewai pins chromadb < 1.2). The vulnerability

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: allow-ghsas: GHSA-f4j7-r4q5-qw2c is scoped at the job level, so it silences the advisory for all packages in the scan, not just chromadb. The justification in the comment is sound (no fixed version, trust_remote_code not used), but worth noting if a future dep happens to share the advisory ID. Consider adding a follow-up ticket to re-evaluate once chromadb ships a patched release.

# requires running a chromadb HTTP server with trust_remote_code=true, which the
# github_agent demo does not do. See demo/agents/github_agent/pyproject.toml.
allow-ghsas: GHSA-f4j7-r4q5-qw2c

shellcheck:
name: Shell Script Lint
Expand Down
12 changes: 12 additions & 0 deletions aiac/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# AIAC working artefacts (regenerated; not source of truth)
docs/issues/
docs/handoffs/
docs/gh-issues/

# PDP policy writer integration-test scratch output (test/pdp/policy/generate_rego.py)
test/pdp/policy/rego_out/

# policy-pipeline integration-test generated Rego (test/integration/test_policy_pipeline.py);
# regenerated per run, left on disk for eyeballing — not source of truth. probe.rego is a
# committed fixture and is not under rego_out/, so it stays tracked.
test/integration/rego_out/
180 changes: 180 additions & 0 deletions aiac/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
# AIAC Codebase Guide

All paths below are relative to `kagenti-extensions/aiac/`.

## Requirements / PRD docs

`docs/specs/PRD.md` — master PRD.
`docs/specs/components/` — per-component specs.

For current file list, `ls docs/specs/` and `ls docs/specs/components/`.

## Requirements directory — link-following policy

When a document under `docs/specs/` contains a markdown link to another file, use the AskUserQuestion tool to ask before reading it — present "Yes" and "No" as clickable options. If the user picks Yes, read the file normally. If No, treat the link as a label and continue without reading it.

## Issue tracking

Issues are tracked as local markdown files under `docs/issues/`, not on GitHub.
Never use `gh` commands to create, update, or list issues — always read/write the local files directly.

`docs/issues/implementation-plan.md` — overall implementation plan.
For current issue list, `ls` the subdirectories under `docs/issues/`.

## Issue tracking — codebase inspection policy

When working on an issue would benefit from inspecting the relevant source code, use the AskUserQuestion tool to ask before doing so — present "Yes" and "No" as clickable options. If the user picks Yes, inspect the codebase normally. If No, work from the issue description and existing context only.

## Handoffs

Per-task handoff documents live under `docs/handoffs/` — one markdown file per task, numeric-prefixed (e.g. `01-update-issues.md`, `02-update-source-and-tests.md`). When asked to generate a handoff, write it here (not a scratch/temp path). Each handoff must be self-contained — background, task, exact files, and acceptance criteria — so a fresh session can execute it without the originating conversation.

## Source code

`src/aiac/` — Python package root (`__init__.py` is empty).

Key stable structure:
- `idp/` — IdP configuration service and models
- `pdp/` — PDP policy writer service and library
- `agent/` — the AIAC Agent layer (rebuilt on the SPM/APM model):
- `agent/controller/` — FastAPI Controller (`routes.py` + Dockerfile); `/apply/*` routes dispatch to the UC sub-agents and make the single `compute_and_apply` (PCE) call
- `agent/uc/` — use-case sub-agents: `onboarding/` (provision + policy_builder + orchestrator), `policy_update/` (build/rebuild), `role_update/`
- `agent/policy_rules_builder/` — PRB: `build_role_rules` / `build_scope_rules` emit `list[PolicyRule]`
- `agent/shared/` — shared helpers (`roles.py`, e.g. `flatten_role`)
- `agent/onboarding.old/` — archived prior implementation (built on the superseded `ProposedDiff` model); not part of the active build
- `policy/` — the two-layer policy stack (all implemented):
- `policy/model/` — `PolicyRule`, `ServicePolicyModel` (SPM), `AgentPolicyModel` (APM), `PolicyModel`
- `policy/store/` — Policy Store service + library (SPM CRUD)
- `policy/computation/` — Policy Computation Engine (`compute_and_apply`, SPM-based)

For current file list, `ls` or `find` under `src/aiac/`.

## Tests

`test/` — mirrors `src/aiac/` structure. For current file list, `ls` under `test/`.

**Unit test command:**

```bash
.venv/bin/pytest test/ -m "not integration"
```

The whole `test/` tree (including `test/policy/`) collects and runs green. The Policy
Computation Engine (`aiac.policy.computation.engine`) was migrated to the SPM store surface in
**Wave 3 / Handoff 05**, so the earlier PCE-chain collection failures (which required ignoring
`test/policy/computation`, `test/agent/controller/test_routes.py`, and
`test/integration/test_policy_pipeline.py`) are resolved — no `--ignore` flags are needed.

Use `ls test/` to discover current test directories.

**Integration tests** (`-m integration`) need live config — Keycloak + admin creds + an LLM
endpoint (`opa` on PATH for the policy-pipeline suite). Those variables live in
`test/integration/.env` (gitignored): `LLM_BASE_URL`, `LLM_API_KEY`, `LLM_MODEL`, `KEYCLOAK_URL`,
`KEYCLOAK_ADMIN_USERNAME`, `KEYCLOAK_ADMIN_PASSWORD`. Source it before running:

```bash
set -a; . test/integration/.env; set +a
.venv/bin/pytest test/integration/ -m integration
```

**Smoke test** (requires live service at `AIAC_PDP_CONFIG_URL`, default `http://127.0.0.1:7071`):

```bash
.venv/bin/python test/idp/configuration/show_keycloak_data.py
```

Exercises all `Configuration` methods — run `ls test/idp/configuration/` to see current coverage.

## Python environment

Virtual environment: `kagenti-extensions/aiac/.venv`

Activate: `source kagenti-extensions/aiac/.venv/bin/activate`
Run directly: `kagenti-extensions/aiac/.venv/bin/python` / `kagenti-extensions/aiac/.venv/bin/pytest`

Always use this venv for any Python execution, test runs, or dependency checks.

## Kubernetes & builds

Config: `k8s/`, `pyproject.toml`, `pyrightconfig.json`

Docker images:

| Image | Dockerfile location |
|-------|-------------------|
| `aiac-agent` | `src/aiac/agent/controller/Dockerfile` (build context `src/`) |
| `aiac-pdp-config` | `src/aiac/idp/service/configuration/keycloak/Dockerfile` |
| `aiac-pdp-policy-opa` | `src/aiac/pdp/service/policy/opa/Dockerfile` |
| `aiac-policy-store` | `src/aiac/policy/store/service/Dockerfile` |
| `aiac-rag-ingest` | `rag-ingest/` (separate directory) |

### Non-root container / volume-ownership pattern

All AIAC service images run as **non-root UID 10001**. Each service Dockerfile
adds the user before `CMD`, matching the `authbridge/sparc-service` pattern:

```dockerfile
# Drop privileges.
RUN useradd --no-create-home --uid 10001 aiac
USER 10001
```

A Dockerfile `chown` of a directory is **masked once a volume is mounted over
it** (the mounted volume, not the image layer, is what the container sees), and
the kubelet leaves emptyDir/PVC volumes root-owned by default. So any service
that writes to a mounted volume also needs pod-level `securityContext` in its
k8s manifest so the kubelet chowns the volume to the non-root user:

```yaml
spec:
securityContext:
runAsUser: 10001
runAsGroup: 10001
fsGroup: 10001 # makes the mounted volume group-writable by UID 10001
```

Services requiring this today:
- **Policy store** — PVC at `/data` (SQLite backend), `policy-store-statefulset.yaml`
- **PDP policy OPA writer** — emptyDir at `/rego` (`REGO_OUTPUT_DIR`), `pdp-interface-deployment.yaml`

Services that mount no volumes still need the Dockerfile `USER` directive; the
pod-level `fsGroup`/volume-chown block above is only required for those that
write to a mounted volume.

### Pod-security hardening baseline

Beyond non-root, every workload in `k8s/` and the demo manifests carries a
hardened `securityContext`. Pod level (omitted on the demo `github-agent`, whose
injected AuthBridge sidecar runs as UID 1337 — hardening there is set per
container instead so a pod-level `runAsUser` can't clobber the sidecar):

```yaml
spec:
securityContext:
runAsNonRoot: true
runAsUser: 10001 # 1001 for the demo github-agent
seccompProfile:
type: RuntimeDefault
```

Container level, on each app container:

```yaml
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
```

With `readOnlyRootFilesystem: true` the container gets a writable `/tmp`
`emptyDir` (and its real data mount — `/data`, `/rego`) so runtime temp writes
have somewhere to land. The demo `github-agent` **omits** `readOnlyRootFilesystem`
because its runtime (`uv` / `litellm` / `crewai`) writes caches under `HOME=/app`.
All core workloads also carry both readiness **and** liveness probes (`httpGet
/health` where the service exposes one; `tcpSocket` for the Controller and the
demo workloads, which don't) and CPU/memory requests + limits.

## External references

- [Kagenti Developer Guide](https://github.com/kagenti/kagenti/blob/main/docs/dev-guide.md) — upstream Kagenti dev guide: per-persona workflows (agent, tool, extensions developers, MCP gateway operators), Git/PR process, pre-commit hooks, feature flags, local Kagenti UI v2 development (React frontend + FastAPI backend, building/deploying images to Kubernetes), and HyperShift-based testing on ephemeral OpenShift clusters (cluster lifecycle, cost management, troubleshooting).
7 changes: 7 additions & 0 deletions aiac/demo/agents/github_agent/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.venv

# Secrets — never bake into the image
.env

# `expect` scripts
test_startup.exp
28 changes: 28 additions & 0 deletions aiac/demo/agents/github_agent/.env.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Github Agent - configuration template
# Copy to .env and fill in your values.

# LLM configuration
TASK_MODEL_ID=ollama/ibm/granite4:latest
LLM_API_BASE=http://host.docker.internal:11434
LLM_API_KEY=my_api_key
MODEL_TEMPERATURE=0

# MCP Tool endpoint
MCP_URL=http://github-tool-mcp:9090/mcp

# Agent service
PORT=8000
LOG_LEVEL=INFO

# Optional: static GitHub PAT passed to MCP as Bearer token.
# If unset, the inbound Authorization header (AuthBridge path) is forwarded instead.
GITHUB_TOKEN=

# Optional: override the URL advertised in the agent card
AGENT_ENDPOINT=

# Optional: override the curated tool allow-list (comma-separated tool names)
ENABLED_TOOLS=

# Optional: expected issuer of inbound JWTs (informational)
ISSUER=
15 changes: 15 additions & 0 deletions aiac/demo/agents/github_agent/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
ARG RELEASE_VERSION="main"

WORKDIR /app
COPY . .
RUN uv sync --no-cache --locked --link-mode copy

ENV PRODUCTION_MODE=True \
HOME=/app \
RELEASE_VERSION=${RELEASE_VERSION}

RUN chown -R 1001:1001 /app
USER 1001

CMD ["uv", "run", "--no-sync", "server"]
113 changes: 113 additions & 0 deletions aiac/demo/agents/github_agent/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# github-agent

An autonomous A2A agent that acts on a user's behalf against GitHub **source repositories** and an **issue/PR tracker**, using the [`github-tool-mcp`](https://github.com/kagenti/kagenti-extensions) MCP server.

This agent implements the canonical `github-agent` used by the AIAC policy-pipeline integration test — the two skills match the policy scenario's `source_operations` and `issue_operations` roles.

## Skills

| Skill id | Name | Description |
|---|---|---|
| `source_operations` | Source repository operations | Browse and search code; read, create, and modify repository file contents, branches, and commits. |
| `issue_operations` | Issue & PR tracker operations | Read, search, create, and update issues, comments, sub-issues, and pull requests. |

## Prerequisite: `github-tool-mcp` (production tool)

This agent connects to **`github-tool-mcp:9090/mcp`** — the production 44-tool MCP server — at `MCP_URL`.
Deploy it before starting the agent:

```
authbridge/demos/github-issue/k8s/github-tool-deployment.yaml
```

> **Not the same as `demo/tools/github_tool/`.**
> `demo/tools/github_tool/` is a simplified 4-tool stub (`source-read`, `source-write`, `issues-read`,
> `issues-write`) deployed as Service `github-tool` for **UC-1 onboarding discovery** only.
> The agent never connects to it — it connects to the production `github-tool-mcp` server which
> exposes the 44-tool GitHub API federation.

## Configuration

All settings are read from environment variables (or a `.env` file). Copy one of the presets:

| Preset | Description |
|---|---|
| `.env.ollama` | Default — local Ollama (ibm/granite4) |
| `.env.openai` | OpenAI gpt-4o-mini |
| `.env.claude` | Anthropic Claude Sonnet |
| `.env.template` | Documented placeholder for all vars |

### Variables

| Variable | Description | Default |
|---|---|---|
| `TASK_MODEL_ID` | litellm model id | `ollama/ibm/granite4:latest` |
| `LLM_API_BASE` | OpenAI-compatible base URL | `http://host.docker.internal:11434` |
| `LLM_API_KEY` | LLM API key | `my_api_key` |
| `MODEL_TEMPERATURE` | Sampling temperature | `0` |
| `EXTRA_HEADERS` | Extra LLM headers (JSON) | `{}` |
| `MCP_URL` | MCP tool endpoint | `http://github-tool-mcp:9090/mcp` |
| `MCP_TIMEOUT` | MCP connect timeout (s) | `600` |
| `ENABLED_TOOLS` | Override the curated tool allow-list (comma-separated) | (unset → default set) |
| `PORT` | A2A listen port | `8000` |
| `LOG_LEVEL` | Log level | `INFO` |
| `GITHUB_TOKEN` | Static Bearer to MCP (else inbound passthrough) | (unset) |
| `ISSUER` | Expected `iss` of inbound JWTs (informational) | (unset) |
| `AGENT_ENDPOINT` | Override the URL advertised in the card | (unset) |

## Running locally

```bash
cd aiac/demo/agents/github_agent
cp .env.ollama .env # or another preset
uv sync
uv run server
# In another terminal:
curl -s localhost:8000/.well-known/agent-card.json | python3 -m json.tool
```

Optionally, run `expect -f test_startup.exp` instead to check startup automatically.

## Deploying to Kagenti (Kind cluster)

Prerequisites: a running Kagenti cluster (Keycloak realm `kagenti`, namespace `team1`) with `github-tool-mcp` already deployed.

1. **Build the image:**
```bash
cd aiac/demo/agents/github_agent
podman build -t github-agent:latest .
# or: docker build -t github-agent:latest .
```

2. **Load into the Kind cluster:**
```bash
kind load docker-image github-agent:latest --name kagenti
```

3. **Apply manifests:**
```bash
kubectl apply -f k8s/configmaps.yaml
kubectl apply -f k8s/github-agent-deployment.yaml
```

4. **Confirm AuthBridge injection:**
```bash
kubectl get pod -n team1 -l app.kubernetes.io/name=github-agent -o jsonpath='{.items[0].spec.containers[*].name}'
```
You should see the `authbridge-proxy` (or `envoy-proxy`) sidecar alongside `agent`.

5. **Port-forward and send a message:**
```bash
kubectl port-forward svc/github-agent 8080:8080 -n team1 &
# Send an A2A message/send request:
curl -s http://localhost:8080/.well-known/agent-card.json | python3 -m json.tool
```

## Architecture

```
A2A client ──(JSON-RPC /)──► github-agent (:8000)
│ CrewAI: prereq extract → researcher
└──(streamable-http, MCP_URL)──► github-tool-mcp:9090/mcp ──► GitHub
(AuthBridge sidecar: inbound JWT validation; outbound RFC-8693 token exchange for MCP_URL host)
```
Loading
Loading