Commit graph

122 commits

Author SHA1 Message Date
1cd137cd9d Route Binky onboarding through user portal 2026-07-27 22:31:43 +02:00
3d108adeb8 Refresh work record index 2026-07-27 21:13:44 +02:00
custodian-sync
3def97b087 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-27:
  - update .custodian-brief.md for key-cape
2026-07-27 20:53:36 +02:00
e54bcd9a40 Advance Binky identity onboarding 2026-07-27 20:39:13 +02:00
custodian-sync
0fa9ec9673 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-27:
  - update .custodian-brief.md for key-cape
2026-07-27 20:18:33 +02:00
881fffc079 Complete KeyCape service-token rollout
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 25s
2026-07-27 20:17:55 +02:00
custodian-sync
f4a2f7eb1e chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-27:
  - update .custodian-brief.md for key-cape
2026-07-27 20:03:36 +02:00
custodian-sync
e4464278e7 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-27:
  - KEY-WP-0006-T04: progress → wait
2026-07-27 20:03:31 +02:00
e877d2752d Implement KeyCape service-token issuance
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 47s
2026-07-27 20:03:07 +02:00
custodian-sync
519f0772d2 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-27:
  - update .custodian-brief.md for key-cape
2026-07-27 19:39:07 +02:00
86e6c083f7 Define Qonto runtime identity contract 2026-07-26 13:34:56 +02:00
custodian-sync
739b1f5c72 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-26:
  - update .custodian-brief.md for key-cape
2026-07-26 13:09:56 +02:00
custodian-sync
a32512c6de chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-26:
  - update .custodian-brief.md for key-cape
2026-07-26 11:03:32 +02:00
9ce84b915f chore(consistency): sync WORK-RECORDS.md for KEY-WP-0005 closure [auto]
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:18:50 +02:00
custodian-sync
f4da182a1f chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-24:
  - update .custodian-brief.md for key-cape
2026-07-24 00:18:41 +02:00
44da5f5f99 KEY-WP-0005-T02-T03: cached tenant_roles claim, close workplan
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 1m21s
New internal/adapters/tenantengine package, mirroring
internal/adapters/{lldap,privacyidea,authelia}'s shape: Client.Roles()
calls tenant-engine's cache-read endpoint. Fails open by construction --
unreachable, non-200, malformed body, or a nil *Client all return
(nil, false), never an error to specially handle. Wired into
TokenHandler.TenantEngine (nil by default, existing tests unaffected);
token.go stamps tenant_roles only when ok.

7 adapter tests plus 3 TokenHandler-level tests proving the actual
required behavior end-to-end: present when reachable, token issuance still
200 with every other core claim intact when unreachable (tenant_roles
simply absent -- the literal done-criteria), absent when not configured.

Real bug found and fixed at the source, not worked around: the first live
cross-process check (real flex-auth, real tenant-engine, this adapter)
returned tenant_not_found for a tenant that existed -- tenant-engine's read
endpoint was keyed by its internal tenant_id, but key-cape only ever has
the tenant's profile identifier. Fixed in tenant-engine
(ADHOC-2026-07-24), re-verified with the same live three-process chain --
roles=[IAM] ok=true.

Workplan closed: T01-T03 done. Explicitly still open: client_credentials /
service-token issuance -- no such flow exists in token.go at all, a
materially larger separate piece of work than either task here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:18:17 +02:00
fb888579dc chore(consistency): sync WORK-RECORDS.md for KEY-WP-0005-T01 [auto]
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:04:09 +02:00
custodian-sync
f66df69202 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-24:
  - update .custodian-brief.md for key-cape
2026-07-24 00:03:59 +02:00
f1f7fa9dd7 KEY-WP-0005-T01: IAM Profile core claims for the human PKCE flow
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 1m50s
Verified first: grant_types_supported advertises client_credentials in
discovery.go, but token.go only ever accepted authorization_code -- no
service-token issuance path exists at all. Building one from scratch is
materially bigger than extending the existing flow; explicitly not
attempted here, left open in the workplan rather than declared done.

What shipped for the human Authorization Code + PKCE flow:

- domain.User.Tenant (new, omitempty) + token.go's effectiveTenant():
  falls back to tenant:coulomb (this workstation's actual tenant, ADR-0006)
  when unset -- never an empty tenant claim, never a silent reassignment.
- principal_type: "human", unconditional.
- groups/roles promoted from scope-gated to unconditional core claims,
  always [] not null when empty. One pre-existing test asserted the old
  scope-gated groups behavior -- updated to match the new intentional
  behavior, not left failing or reverted.
- assurance built from PKCESession.MFAVerified (new field, threaded
  through completeAuthorization's two call sites in authorize.go) --
  whether MFA was actually verified in this session, not static enrollment
  state. aal2 only when required-and-passed this time, aal1 otherwise.

go build/vet clean, go test ./... green repo-wide. Two new authorize_test.go
cases assert MFAVerified on both paths. tests/profile/profile_test.go's
TestCompleteTokenFlow (the repo's own full HTTP integration test) extended
with real value assertions for all five claims, not just presence checks.

Python conformance tool not run against a live instance (needs the full
Authelia+LLDAP+privacyIDEA stack); TestCompleteTokenFlow's real HTTP round
trip covers the equivalent claim checks instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 00:03:31 +02:00
custodian-sync
e51a2d74e9 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-23:
  - update .custodian-brief.md for key-cape
2026-07-23 23:52:35 +02:00
8059f65a1b chore(consistency): write back state_hub ids for KEY-WP-0005 [auto]
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 23:52:13 +02:00
cca7434b2d chore(consistency): register KEY-WP-0005 in State Hub [auto]
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 22:48:04 +02:00
custodian-sync
74c81f0566 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-23:
  - update .custodian-brief.md for key-cape
2026-07-23 22:47:34 +02:00
260ff9cc99 Draft KEY-WP-0005: IAM Profile core claims (tenant, principal_type, roles, assurance, tenant_roles)
Discovered while planning tenant-engine's flex-auth WriteAuthorizer
(TEN-WP-0003): src/internal/server/oidc/token.go emits none of
iam-profile_v0.3.md's Core Claims yet -- not tenant, principal_type,
groups, roles, or assurance. tenant_roles isn't a small addition on top of
existing tenant support; it's the last, optional claim on top of a
baseline that doesn't exist yet.

Registered, not implemented -- security-sensitive Go token-issuance code
deserves dedicated context before changing, not a rushed edit from a first
read of the file.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 22:47:00 +02:00
df26aee844 KEY-WP-0004-T01: adopt tenant:<grouping>:<name> identifier, binky -> friendly
Bernd's decision: role words (customer/vendor) collide with the separate
capability-role dimension a tenant can hold (PLTF/IAM/VEN/CUS, per
net-kingdom/docs/princedom-isolation-exploration.md's unratified model --
Binky itself is both CUS and, later, VEN). Tenants are grouped instead by
onboarding-risk/entity-shape, orthogonal to role: trial, friendly, single,
small, medium, large, enterprise, consumer, family, community, association,
agentic.

Binky maps to friendly -> tenant:friendly:binky, replacing the earlier
tenant:customer:binky throughout this workplan.

Two open questions flagged, not resolved here: where tenant:coulomb (the
platform's own internal/reference tenant) fits this external-shaped grouping
list, and whether net-kingdom should ratify this list into
iam-profile_v0.2.md's Tenant Claim section, since it currently still
documents the old customer/sandbox suggested identifiers and NetKingdom
owns that canon per ADR-0011.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 15:45:43 +02:00
7ddc48d3cd chore(consistency): register KEY-WP-0004 in State Hub [auto]
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 14:35:36 +02:00
custodian-sync
8a7e243d69 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-23:
  - update .custodian-brief.md for key-cape
2026-07-23 14:35:12 +02:00
b9a7d1b008 Draft KEY-WP-0004: Binky Hedgehog GmbH as first tenant + qonto-assistant workload identity
Provisions the first real NetKingdom tenant (tenant:customer:binky, matching
the slug already live in production OpenBao paths) with a human tenant-admin
user and a workload-identity OIDC client for qonto-assistant's MCP callers,
routed through secrets-engine for secret custody and ops-warden for
discoverable, minimal-touch credential access. Closes Gap #1 flagged in
qonto-assistant's QONTO-WP-0003 closure (no OIDC issuer existed in the fleet).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 14:34:40 +02:00
1a7fdadcda docs: workplan-first agent guidance prose (CUST-WP-0055 T04 batch 5) 2026-07-08 19:51:38 +02:00
c95ec5d245 Regenerate agent instructions from state-hub templates (CUST-WP-0055 T01)
Sync AGENTS.md, CLAUDE.md, and .claude/rules from updated project_rules
templates: workplan-first session protocol, legacy terminology footnote,
and GET /workplans/ examples.
2026-07-08 14:50:29 +02:00
custodian-sync
33d7d44205 chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-07-08:
  - update .custodian-brief.md for key-cape
2026-07-08 14:05:58 +02:00
326f7d1f07 Draft capability entry (reuse-surface REUSE-WP-0017-T04, cohort 2)
Honest first-pass maturity vector grounded in README/docs/tests present
in this repo; no invented evidence. Flagged for human review before
publish. See reuse-surface history/2026-07-06-coverage-classification.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-06 19:41:37 +02:00
ec706da304 Tier-2 Forgejo pilot: image build workflow on railiance01 runner
All checks were successful
Build and Publish Container Image / build-and-push (push) Successful in 51s
Uses archive checkout + static docker-cli (non-root host runner pattern).
Pushes to forgejo.coulomb.social/coulomb/key-cape per RAIL-HO-WP-0005-T10.
2026-07-04 10:23:38 +02:00
2fd69f0374 Normalize agent instructions and workplan frontmatter (STATE-WP-0067)
Some checks are pending
Build and Publish Container Image / build-and-push (push) Waiting to run
- Align agent files with on-disk workplan prefixes (infer from workplan ids)
- Set workplan domain to registered domain_slug; add topic_slug where applicable
- Repair frontmatter delimiter formatting; migrate legacy task status literals
- Regenerate AGENTS.md, CLAUDE.md, and .claude/rules from State Hub templates
2026-06-22 23:16:27 +02:00
afc01456a5 Fixed workplan frontmatter 2026-06-22 18:40:55 +02:00
d076e7ee7b chore(consistency): sync task status from DB [auto]
Updated by fix-consistency on 2026-06-22:
  - update .custodian-brief.md for key-cape
2026-06-22 18:02:26 +02:00
c4f281a376 Human-review .repo-classification.yaml (CUST-WP-0050 follow-up) 2026-06-22 17:56:17 +02:00
bee021735c Add .repo-classification.yaml (CUST-WP-0050 T11 agent first-pass) 2026-06-22 17:47:37 +02:00
c9838a4811 Add credential routing instructions for all agent runtimes
Propagate shared credential-routing section (Codex, Claude, Grok, llm-connect)
from state-hub template via scripts/propagate_credential_routing.py.
2026-06-18 22:48:38 +02:00
593b5af8dc Add capability registry scaffold (REUSE-WP-0014-T05 B03) 2026-06-16 01:53:59 +02:00
d6d41dd84f Fix OpenBao OIDC token exchange compatibility 2026-06-01 21:20:54 +02:00
06d20c3379 Load LLDAP organizational unit config 2026-05-25 00:28:33 +02:00
937cb39de6 Require MFA during bootstrap mode 2026-05-25 00:09:40 +02:00
56d279a8e6 Use basic auth for Authelia token exchange 2026-05-24 18:04:28 +02:00
1d68639225 Align KeyCape image namespace with deployment 2026-05-24 17:17:37 +02:00
7e22fcf3c7 bootrapping support 2026-05-24 17:03:01 +02:00
393abf3e0e Reference IAM Profile v0.2 2026-05-22 14:35:29 +02:00
f45784f951 Make INTENT.md self-coherent
Remove external reference points so the intent stands on its own at the
abstract, stable level. The IAM profile this repo implements is described
as a versioned profile contract rather than attributed to an external
owner, and the heavier comparison mode is described generically instead of
by product name. All of KeyCape's own substance is preserved — purpose,
primary utility, intended users, strategic role and boundaries, design
principles, maturity target, and stability note.

Relationships to other systems belong in interface contracts and the
orchestration responsibility map, not in intent.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 01:50:08 +02:00
465a778c1f Refresh agent instruction files 2026-05-18 16:55:43 +02:00
10868739a8 Added INTENT.md file 2026-05-03 17:37:45 +02:00