Commit Graph
67 Commits
Author SHA1 Message Date
beug.k@beugsiud.deandClaude Opus 5.5 2fa3f4db21 feat(web): live updates, pending-changes notice, agent mode switch
Server-sent events from /api/v1/events invalidate the affected queries
(agents, deployments, revisions, pending changes) and reconnect with
backoff; while connected, polling drops to a 60 s fallback. The footer
shows the live status, the header notes how many changes wait to be
deployed. Agents get a mode switch (auto_pull/manual) with their target
revision; deployments show the pending and superseded outcomes and who
requested a push. Translations for all M4 texts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:12:51 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 d5511b3286 feat: M4 contracts for push deployments, diff, rollback and live events
ADR 0022, OpenAPI additions (agent mode, deploy, rollback, diff, pending
changes, server-sent events), deployment_id in GetDesiredStateResponse
for pushes picked up by polling, and the textdiff package (Myers,
unified format).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:53:21 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 866c0cbdcb docs: mark milestone M3 as complete, update project log
ci / Protobuf (push) Successful in 18s
ci / Web (lint, test, audit, build) (push) Successful in 1m15s
ci / Shell and licence headers (push) Successful in 19s
ci / Release build (dry run) (push) Successful in 2m8s
release / release (push) Successful in 2m11s
ci / Go (lint, test, vuln) (push) Successful in 4m16s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 1m48s
ci / Development environment (compose) (push) Successful in 12s
ci / Integration (real BIND and Kea) (push) Successful in 2m42s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.4.0
2026-10-13 19:48:09 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 d3e5807a09 test: retry image pulls, executable e2e scripts, fix truncation test
ci / Protobuf (push) Successful in 18s
ci / Web (lint, test, audit, build) (push) Successful in 1m16s
ci / Shell and licence headers (push) Successful in 20s
ci / Release build (dry run) (push) Successful in 2m9s
ci / Go (lint, test, vuln) (push) Successful in 4m19s
ci / End-to-end (server, agents, BIND, Kea) (push) Successful in 1m49s
ci / Development environment (compose) (push) Successful in 12s
ci / Integration (real BIND and Kea) (push) Successful in 5m12s
Docker Hub timed out on the shared runner; pulls now retry and fall back
to a local image. The e2e scripts were committed without the executable
bit. The truncation test checked letters that the marker itself contains.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:37:53 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 56347ec5ff test: end-to-end test of the agent path, fix first CI findings
ci / Web (lint, test, audit, build) (push) Successful in 1m1s
ci / Shell and licence headers (push) Successful in 7s
ci / Go (lint, test, vuln) (push) Failing after 2m40s
ci / Protobuf (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 2m27s
ci / End-to-end (server, agents, BIND, Kea) (push) Failing after 1m26s
ci / Development environment (compose) (push) Successful in 13s
ci / Integration (real BIND and Kea) (push) Failing after 1m58s
test/e2e runs server, PostgreSQL, BIND and Kea with both agents in
containers (make test-e2e, CI job End-to-end): enrollment with the
command from the API, revision 1 and 2 applied and served by BIND and
Kea, unchanged data creates no revision, revoking disconnects the agent
while BIND keeps serving.

Fixes from the first CI run: quote a spec description containing a
comma, exempt the agent lock-out routes in the route protection test,
whole-second certificate lifetimes, a push replacing queued pulls, the
truncation marker containing the letter checked, and curl|grep -q under
pipefail in the server smoke test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:29:58 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 56892631be feat: wire BIND and Kea roles into the agents, allow revoking agents in read-only mode
ci / Protobuf (push) Successful in 2m18s
ci / Go (lint, test, vuln) (push) Failing after 3m11s
ci / Shell and licence headers (push) Successful in 8s
ci / Web (lint, test, audit, build) (push) Successful in 1m14s
ci / Integration (real BIND and Kea) (push) Successful in 1m42s
ci / Release build (dry run) (push) Failing after 2m24s
ci / Development environment (compose) (push) Successful in 38s
Revoking or deleting an agent and deleting enrollment tokens lock agents
out, a security function that must stay available when the license is
read-only. Translations for the new problem codes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:19:31 +02:00
beug.k@beugsiud.de 31fb8285eb Merge branch 'worktree-agent-a423f65773305d370' 2026-10-13 19:16:01 +02:00
beug.k@beugsiud.de 1a88112ce3 Merge branch 'worktree-agent-af35c8bdd4b0bcf64' 2026-10-13 19:15:16 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 7bbcd28aa6 test(agent/role): run the DNS and DHCP roles against real BIND and Kea
A driver is cross-compiled for the Docker daemon's architecture and
copied with fixture revisions into BIND 9.18/9.20 and Kea 2.6.5/3.2.1
containers (docker cp, no bind mounts or published ports). It runs the
core's pipeline: two revisions apply, broken revisions are rejected,
a failed live check and a failed health check roll back, a failed Kea
reload restores the previous file, and leases added with lease4-add
are listed page by page. make test-integration runs it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:14:35 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 562f35c10c feat(agent/dhcp): Kea DHCPv4 role over the UNIX control socket
Validate requires exactly kea-dhcp4.conf with this agent's control
socket and runs kea-dhcp4 -t. Activate writes the file atomically and
sends config-reload; on failure the previous file is restored and
reloaded. Health uses status-get (pid, uptime, last reload, socket
state) and checks that the installed file is the expected revision.
Leases pages through lease4-get-page and maps Kea lease states
(default, declined, expired-reclaimed, released) to core lease states.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:14:34 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 d61b738a8c feat(agent/dns): BIND role with validation, activation and SOA health check
Validate maps ddi-suite*.conf to conf_dir and zones/db.<zone> to
zone_dir, rejects other files and a zone directory that differs from
dns.zone_dir, and runs named-checkconf on a temporary named.conf plus
strict named-checkzone per zone. Activate backs up all touched files,
writes zone files then includes atomically (unchanged files are kept),
never touches existing create-only files, removes files dropped since
the previous revision and the stale journal of a zone that became
managed, runs named-checkconf -z on the live named.conf and then
rndc reconfig and rndc reload; failures restore the backup (and reload
again). Health runs rndc status and compares the SOA serial of every
managed zone (UDP with TCP fallback, authoritative answers only).

golang.org/x/net becomes a direct dependency (dnsmessage).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:14:34 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 bb13723c2b feat(app): start the agent API next to the HTTP listener
Loads or creates the agent PKI at startup, serves the gRPC agent API on
agent_api.listen with graceful shutdown, exports ddi_agents_connected
and removes old enrollment tokens periodically.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:14:30 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 53e4cb75d6 fix(agentapi): align keepalive, message size and deployment reports with the agent core
Keepalive MinTime 20 s (agents ping every 30 s, also without a stream),
send limit above bundle.MaxTotalSize, and resent deployment reports
(same agent, revision and start time) are dropped without error and
without touching the agent's state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:14:30 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 b5e57c3cb7 feat(agent/role): command runner and atomic file helpers for the roles
Shared, role-internal helpers: programs run without a shell, with a
timeout and captured, truncated output quoted in errors; configuration
files are replaced atomically (temp file, fsync, rename, directory sync)
with explicit mode and the owner of the existing file or its directory;
an in-memory backup restores touched files after a failed activation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:14:23 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 4b02c06adf chore: ignore local agent worktrees
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:12:07 +02:00
beug.k@beugsiud.de c6162e00d2 Merge branch 'worktree-agent-a2c569cc905081672' 2026-10-13 19:10:13 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 258919fd12 feat(agentapi): gRPC agent service with mTLS and certificate checks
TLS 1.3 listener that requests client certificates and checks them in
interceptors: Enroll needs a valid one-time token (rate limited per
source IP), RenewCertificate accepts certificates expired up to 30 days,
every other call needs the agent's current, unrevoked certificate.
Connect registers the stream in the hub (pushes, revocation, shutdown);
FetchBundle signs the role's artifacts per agent; lease batches are
deduplicated by sequence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:09:11 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 3065175673 feat(agent): enrollment, server connection and apply pipeline
- CLI: enroll, run, status, version, help (core.Main with a role
  factory); the agent binaries use a placeholder factory until the
  BIND and Kea roles are wired in.
- Enrollment: local ECDSA P-256 key and CSR, TLS 1.3 to the agent API
  with the server chain pinned to the CA fingerprint.
- ServerSource: mTLS gRPC with keepalive, Connect stream (Hello,
  Welcome, heartbeats, apply and renew commands), reconnect with
  exponential backoff and jitter, GetDesiredState polling as fallback,
  certificate renewal after half of the lifetime.
- Apply pipeline: fetch, bundle verification with replay protection,
  store, Validate, Activate, Health with retries, rollback to the last
  good revision; outcomes succeeded/rejected/rolled_back/failed are
  queued in state.json and reported; failed revisions are retried only
  by a newer revision or an explicit push.
- Lease reporting with change detection, persistent sequence and full
  snapshots at start, per connection and periodically.
- Tests with fake roles, a fake source and an in-process fake
  AgentService over real mTLS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:06:05 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 c96eb33e58 feat(agent): configuration file and file-based agent state
Agent configuration (agent-<role>.yaml, strict decoding, role section
passed undecoded to the role factory) and the state directory of ADR
0011: identity with interrupted-renewal recovery, verified revisions
under revisions/<n>/, state.json with apply results, lease sequence and
queued deployment reports, atomic writes, pruning and a lock file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:05:16 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 92d1d9ec3d feat(api): agents, enrollment tokens, revisions, deployments and leases
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:02:50 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 1bdd877051 feat(service): agents, enrollment tokens, revisions, deployments and leases
Use cases for the REST API (agent list/revoke/delete, one-time tokens
with the ready enrollment command, immutable revisions with unchanged
detection, deployment and lease lists) and for the agent data plane
(enrollment, renewal, status, bundles, deployment and lease reports).
A hub of open agent streams pushes new revisions to auto_pull agents and
closes the stream of revoked agents.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:02:49 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 89d7949e18 feat(config): agent_api listener settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 18:54:14 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 c60cd4a21e feat(pki): agent CA, bundle signing key and certificate issuance
The CA (ECDSA P-256, 10 years) and the Ed25519 bundle signing key are
created on first start, sealed with the master key and stored once
(concurrent starts read back the winner). The agent-port server
certificate is issued in memory; agent CSRs are signed for 14 days.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 18:54:13 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 8e76c0cf32 feat(store): agents, enrollment tokens, revisions, deployments and leases
Migration 00003 adds the PKI key table, agents, enrollment tokens,
immutable configuration revisions with their files, deployment reports
and DHCP leases, each with database constraints. Repositories and DB
tests for all of them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 18:54:12 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 6c1f7249b0 feat(web): agents, enrollment tokens, revisions, deployments and leases
Agent overview with connection, health and revision state (polled every
five seconds until the live stream of M4), agent details with checks and
deployment history, enrollment token dialog showing the ready-to-run
command, revision list and creation, revision details with deployments
and files, and a lease list with network, state and text filters.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 15:05:01 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 e843502cbf feat: M3 contracts for agents, revisions and bundles
Shared Apache-2.0 packages for the signed bundle format and the agent
certificate conventions, the agent role interface, REST API spec for
agents, enrollment tokens, revisions, deployments and leases, and ADR
0021. Generator settings now hold the target paths on the managed hosts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:54:30 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 44de779fbf docs: mark milestone M2 as complete, update project log
ci / Shell and licence headers (push) Successful in 6s
release / release (push) Successful in 1m53s
ci / Go (lint, test, vuln) (push) Successful in 3m36s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 56s
ci / Release build (dry run) (push) Failing after 1m55s
ci / Integration (real BIND and Kea) (push) Successful in 43s
ci / Development environment (compose) (push) Successful in 13s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.3.0
2026-10-13 14:36:57 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 279bb92c74 test(integration): pull images first and keep docker stderr apart
ci / Go (lint, test, vuln) (push) Successful in 3m43s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 57s
ci / Shell and licence headers (push) Successful in 7s
ci / Release build (dry run) (push) Successful in 1m58s
ci / Integration (real BIND and Kea) (push) Successful in 41s
ci / Development environment (compose) (push) Successful in 14s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:28:17 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 b94b6c8dae test(api): reset preview before decoding the second response
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:24:08 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 0a74d4b3ba feat: generator settings and configuration preview (API and UI)
ci / Go (lint, test, vuln) (push) Failing after 3m31s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 57s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m59s
ci / Integration (real BIND and Kea) (push) Failing after 43s
ci / Development environment (compose) (push) Successful in 13s
- stable Kea subnet IDs per network (migration 00002)
- generator settings (SOA, name servers, TTLs, recursion, DHCP defaults)
- GET /config/preview renders the configuration for the current data
- UI: configuration preview page and DNS/DHCP settings page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:19:26 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 3564686db0 feat(configgen): BIND and Kea configuration generator with integration tests
- configgen: input model shared by derivation and renderers
- derive: forward zones per domain, reverse zones (IPv4 octet, IPv6 nibble
  boundaries), A/AAAA/PTR from static and manual_dhcp entries, Kea subnets
  with effective pools and reservations; pure and deterministic
- bindgen: zone-statement include, options include, zone files with strict
  validation, canonical ordering and RFC 1035 TXT escaping
- keagen: typed Kea DHCPv4 JSON with strict validation
- golden-file, validation, determinism and fuzz tests
- integration tests check generated files with real named-checkconf,
  named-checkzone (BIND 9.18, 9.20) and kea-dhcp4 -t (Kea 2.6, 3.2);
  new CI job

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:19:25 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 e91d1d63c0 docs: add project log (handover notes) and CLAUDE.md pointer
ci / Go (lint, test, vuln) (push) Successful in 3m27s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 53s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m53s
ci / Development environment (compose) (push) Successful in 15s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:56:38 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 a670256be6 docs: mark milestone M1 as complete
ci / Protobuf (push) Canceled after 0s
ci / Web (lint, test, audit, build) (push) Canceled after 0s
ci / Shell and licence headers (push) Canceled after 0s
ci / Release build (dry run) (push) Canceled after 0s
ci / Development environment (compose) (push) Canceled after 0s
ci / Go (lint, test, vuln) (push) Canceled after 2m22s
release / release (push) Successful in 1m51s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.2.0
2026-10-12 21:54:20 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 c88321f297 ci: smoke-test the released server binary with the embedded UI
ci / Protobuf (push) Successful in 6s
ci / Development environment (compose) (push) Successful in 14s
ci / Go (lint, test, vuln) (push) Successful in 3m26s
ci / Web (lint, test, audit, build) (push) Successful in 55s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m58s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:41:49 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 4717ae5cb1 docs: API overview, architecture and README updated for M1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:41:12 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 79c1b0bba8 test(api): OIDC login flow against a fake identity provider; dev run targets
ci / Go (lint, test, vuln) (push) Successful in 3m30s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 54s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m48s
ci / Development environment (compose) (push) Successful in 15s
- end-to-end OIDC test: discovery, PKCE (S256) verified by the IdP, nonce,
  state cookie, ID token signature, user creation, role sync, refused
  login without role, forged state
- make run-server / dev-admin with deploy/config/server.dev.yaml

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:39:30 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 42aee163f3 feat(tools): keygen-setup script and licensing guide
Creates the product and the standard policy in Keygen (one server per
license, license-key activation, daily heartbeat), issues licenses with
limits in metadata and writes offline license files. The admin token is
only read from the environment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:36:16 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 63d6dac0f5 feat(web): management UI for M1
ci / Go (lint, test, vuln) (push) Successful in 3m27s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 54s
ci / Shell and licence headers (push) Successful in 6s
ci / Development environment (compose) (push) Canceled after 0s
ci / Release build (dry run) (push) Canceled after 33s
- login with TOTP step and SSO button, forced password change, account
  page with password change and TOTP setup (QR code)
- layout with permission-based navigation, license banner, theme/language
- networks: list with utilization, create/edit with pool editor, detail
  page with address map
- addresses: server-side filtered/sorted, virtualized table, inline type
  switch with DNS/DHCP preview, bulk actions, saved filters, CSV import
  (dry run first) and export
- license, users, audit log and OIDC settings pages
- typed API client from the OpenAPI spec; errors translated by code
- German default, English second language

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:34:45 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 eb511e0a85 fix(server): issues found by the API contract tests
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m43s
ci / Go (lint, test, vuln) (push) Successful in 3m25s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Development environment (compose) (push) Successful in 14s
- route the UI as "/" (GET/HEAD only) to avoid a ServeMux conflict with /api/
- constraint violations carry their specific top-level code
- MAC search accepts '-' and '.' separators
- CSV import reports syntax and validation problems in one pass
- license write lock is evaluated against the clock on every request
- enabling TOTP keeps the consumed time step (no replay of the setup code)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:14:39 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 1aefed471c feat(server): wire database, licensing, API and metrics into ddi-server
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 5s
ci / Release build (dry run) (push) Successful in 1m43s
ci / Development environment (compose) (push) Canceled after 5s
ci / Go (lint, test, vuln) (push) Failing after 3m7s
ci / Protobuf (push) Successful in 6s
- commands: serve, migrate, bootstrap-admin, gen-master-key
- /metrics with route-pattern labels and license gauge, /readyz checks DB
- fix OpenAPI flow mappings with commas; generate TypeScript API types
  (openapi-typescript) and check them in CI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 21:08:59 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 1417e8f578 feat(api): add REST API with OpenAPI spec and contract tests
ci / Go (lint, test, vuln) (push) Failing after 2m34s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 5s
ci / Release build (dry run) (push) Successful in 1m15s
ci / Development environment (compose) (push) Successful in 14s
- one route table with access level, permission and write flag
- session cookie auth, MFA and forced password change gates, CSRF token
  plus Origin/Sec-Fetch-Site checks, license read-only lock
- RFC 9457 problem responses with stable codes and field problems
- OIDC authorization code flow with PKCE, state cookie and nonce
- contract tests: spec valid, routes == spec, every request/response in
  the API tests validated against the spec

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:58:08 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 f619881dc5 feat(service): add use cases for auth, users, IPAM, license, audit, CSV and OIDC
ci / Go (lint, test, vuln) (push) Successful in 2m40s
ci / Protobuf (push) Successful in 5s
ci / Release build (dry run) (push) Successful in 1m15s
ci / Development environment (compose) (push) Successful in 14s
ci / Web (lint, test, audit, build) (push) Successful in 33s
ci / Shell and licence headers (push) Successful in 6s
- every mutation writes its audit entry in the same transaction
- stable error codes; constraint violations mapped to field problems
- bulk changes and CSV import are all-or-nothing, using savepoints so that
  all problems are reported at once
- CSV export neutralizes spreadsheet formulas
- OIDC settings with encrypted client secret, role mapping from claims

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:47:47 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 b071d5fa1f fix(license): keep query string out of the request path
ci / Go (lint, test, vuln) (push) Failing after 2m20s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m14s
ci / Development environment (compose) (push) Successful in 14s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:42:12 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 3fee3fca70 feat(license): add Keygen provider, license files and license manager
ci / Go (lint, test, vuln) (push) Failing after 2m23s
ci / Protobuf (push) Successful in 5s
ci / Development environment (compose) (push) Canceled after 0s
ci / Release build (dry run) (push) Canceled after 1m6s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 6s
- every Keygen response is verified: Ed25519 signature over request target,
  host, date and digest; body digest; date freshness; validation nonce
- machine activation by HMAC-based fingerprint, entitlements, heartbeats
- offline license files (base64+ed25519, aes-256-gcm+ed25519)
- pure state evaluation trial -> valid <-> grace -> read_only with one grace
  period for unreachable, suspended and expired licenses
- encrypted cache, periodic revalidation; account ID and public key are
  embedded at build time

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:37:54 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 56962a69f5 feat(store): add network, address, saved filter and license state repositories
ci / Go (lint, test, vuln) (push) Successful in 2m41s
ci / Protobuf (push) Successful in 7s
ci / Web (lint, test, audit, build) (push) Successful in 34s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m16s
ci / Development environment (compose) (push) Successful in 14s
Server-side filtering/sorting/pagination with whitelisted sort keys, usage
aggregation in SQL, optimistic locking, FQDN maintenance on domain change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:29:20 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 975401ee69 feat(server): add auth primitives, user/session/audit repositories and IPAM domain
ci / Go (lint, test, vuln) (push) Successful in 2m40s
ci / Protobuf (push) Successful in 5s
ci / Web (lint, test, audit, build) (push) Successful in 34s
ci / Shell and licence headers (push) Successful in 6s
ci / Development environment (compose) (push) Canceled after 0s
ci / Release build (dry run) (push) Canceled after 35s
- auth: Argon2id (PHC, rehash detection), TOTP (RFC 6238 vectors, replay
  protection), session tokens, keyed rate limiter, role permissions
- store: users, sessions (hashed tokens), audit log with keyset pagination
- ipam: network/pool/address validation, effective pools split around
  static/reserved/manual_dhcp, utilization, address map, change preview

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:25:20 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 14bd32dc5d feat(server): add config file support, secret encryption and database layer
ci / Go (lint, test, vuln) (push) Successful in 2m34s
ci / Protobuf (push) Successful in 5s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 5s
ci / Release build (dry run) (push) Successful in 1m14s
ci / Development environment (compose) (push) Successful in 14s
- config: YAML file plus environment overrides, day durations, validation
- secrets: AES-256-GCM keyring with key IDs, AAD binding and rotation
- store: pgx pool, embedded goose migrations with downgrade protection,
  initial schema with overlap/containment/uniqueness constraints
- storetest: per-test schemas; CI runs them against a PostgreSQL service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:17:05 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 eb1fa0b2e4 docs(adr): record verified Keygen CE facts, contract tests and auth design
- 0016: verified edition, signature scheme and feature set; build-time
  account/public key, nonce, fingerprint, grace semantics, license files
- 0019: OpenAPI contract tests instead of generated server stubs
- 0020: Argon2id, TOTP, OIDC with PKCE, sessions, CSRF, rate limits, RBAC

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 20:10:06 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 a8e432e635 docs(adr): record verified release download path in ADR 0003
ci / Go (lint, test, vuln) (push) Successful in 2m5s
ci / Protobuf (push) Successful in 6s
ci / Web (lint, test, audit, build) (push) Successful in 32s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m13s
ci / Development environment (compose) (push) Successful in 14s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:59:52 +02:00
beug.k@beugsiud.deandClaude Opus 5.5 eecd314d11 docs: mark milestone M0 as complete
ci / Web (lint, test, audit, build) (push) Successful in 31s
ci / Go (lint, test, vuln) (push) Successful in 1m57s
ci / Protobuf (push) Successful in 5s
ci / Shell and licence headers (push) Successful in 6s
ci / Release build (dry run) (push) Successful in 1m12s
ci / Development environment (compose) (push) Successful in 14s
release / release (push) Successful in 1m14s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.1.0
2026-10-12 19:53:21 +02:00