Commit Graph
265 Commits
Author SHA1 Message Date
dongar 78122c407e Merge pull request 'Implement A9 state-change logging in the state store' (#5) from state-change-logging into main
CI / checks (push) Successful in 7s
Reviewed-on: dongar/nisse#5
Reviewed-by: Don Garrett <dgarrett@acm.org>
2026-09-05 21:22:46 +00:00
dongarandClaude Fable 5 7e89a791d2 Add literal-format test showing exact log lines
CI / checks (push) Successful in 8s
CI / checks (pull_request) Successful in 8s
Freezes the clock and asserts the exact bytes emitted per event, so
the on-disk log format is reviewable in the test file itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-05 21:20:41 +00:00
dongarandClaude Fable 5 18d4fcd701 Implement A9 state-change logging in the state store
CI / checks (push) Successful in 9s
CI / checks (pull_request) Successful in 8s
Retrofit for the conventions merged in #4 (issue #3):

- OpLog: JSON-lines emitter with the fixed envelope (ts, agent,
  event, task_id, cause); task_id set by the orchestrator at
  unit-of-work start
- StateStore owns emission: transition, intent begin/commit/abort,
  and schema migrations each emit their event right after the
  durable write commits; callers pass the cause
- reconcile_on_boot emits boot.reconcile with action and verdicts,
  and resolves intents with reconciliation-verdict causes
- Failed resolutions emit nothing (a line exists iff the write
  committed)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-05 21:13:36 +00:00
dongar ba848281ec Merge pull request 'Amend A9 with state-change log conventions' (#4) from logging-conventions-a9 into main
CI / checks (push) Successful in 8s
Reviewed-on: dongar/nisse#4
Reviewed-by: Don Garrett <dgarrett@acm.org>
2026-09-05 21:10:20 +00:00
dongarandClaude Fable 5 41e103c35d Amend A9 with state-change log conventions (issue #3)
CI / checks (push) Successful in 7s
CI / checks (pull_request) Successful in 7s
Every durable mutation emits one JSON-lines event, emitted by the
state store itself immediately after the commit returns, with a fixed
envelope (ts, agent, event, task_id correlation ID, cause) and a
dotted event taxonomy covering transitions, intents, gates, boot
reconciliation, and migrations. Logs stay diagnostic-only, never
load-bearing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-05 19:29:27 +00:00
dongar 99a8c7b3a2 Merge pull request 'Add durable state store and boot-time reconciliation (A2/A3)' (#2) from state-store-durability into main
CI / checks (push) Successful in 8s
Reviewed-on: dongar/nisse#2
Reviewed-by: Don Garrett <dgarrett@acm.org>
2026-09-05 19:25:17 +00:00
dongarandClaude Fable 5 4319882f35 Add durable state store and boot-time reconciliation (A2/A3)
CI / checks (push) Successful in 8s
CI / checks (pull_request) Successful in 7s
Build-order step 1: the critical path everything else sits on.

- StateStore: SQLite in WAL mode with synchronous=FULL, so every
  state transition and intent-log write is committed and fsynced
  before returning; a power cut cannot tear state
- Durable intent log: begin_intent records a unit of work before it
  starts; commit/abort resolve it; pending intents survive restart
- schema_version stamped from the first commit, with a sequential
  migration hook; a newer state file than the code supports is
  refused rather than misread
- reconcile_on_boot (A3 first cut): pending intents are checked
  against external truth by registered reconcilers (observable
  checks, never model self-assessment); verified effects are
  committed, verified no-ops aborted, anything unverifiable gates
  to AWAIT_INPUT — never blind-resume
- Lives in nisse_dev per spec 0.1: the library is extracted after
  the dev agent works, not designed up front
- Integration test kills a subprocess mid-work with os._exit and
  verifies state integrity and intent visibility on reopen

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-05 18:59:15 +00:00
dongar 5962aaee57 Merge pull request 'Scaffold hello-world apps, test frameworks, and Gitea CI' (#1) from scaffold-hello-world-ci into main
CI / checks (push) Successful in 7s
Reviewed-on: dongar/nisse#1
Reviewed-by: Don Garrett <dgarrett@acm.org>
2026-09-05 18:51:16 +00:00
dongarandClaude Fable 5 c1041a5ba1 Scaffold hello-world apps, test frameworks, and Gitea CI
CI / checks (push) Successful in 45s
CI / checks (pull_request) Successful in 6s
- uv workspace tying nisse-core, nisse-dev, nisse-ops together
  (src layouts, workspace-sourced nisse-core dependency)
- Placeholder hello-world entry points for both agents, calling
  through nisse-core to exercise the package boundary
- pytest unit tests per package; integration tests (marker-gated)
  running the installed console scripts as subprocesses
- ruff lint + format, nisse_* declared first-party
- Gitea Actions workflow running lint, format check, unit and
  integration tests; scripts/check.sh mirrors it locally

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-05 18:48:51 +00:00
dongarandClaude Fable 5 b0efbe7b4c Add working conventions to CLAUDE.md
Ask when unclear, script repeated tasks, and require automated tests
with every feature or fix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-04 22:26:41 +00:00
dongarandClaude Fable 5 69375c0da1 Record the monorepo decision in the spec
Part H's repository-layout item is resolved: one repo, three packages.
Naming (S0), scope (S0.1), the step-10 extraction, and the repository
layout section are updated to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-04 22:13:45 +00:00
dongarandClaude Fable 5 94aa51135f Merge the three repositories into one monorepo
nisse-core's history becomes the repo root; the spec moves to docs/ at
top level; nisse-dev and nisse-ops fold in as package directories, their
seed histories (pointer files only) discarded. Pointer READMEs and
CLAUDE.mds are rewritten for in-tree paths.

Rationale: for a solo operator the three-repo split tripled admin
surface (tokens, CI, webhooks, permissions, backups) and imposed a
version-pinning contract on nisse-core, while the repo boundary was
never a trust boundary — the VM is. The spec's Part H is updated in the
next commit to record the decision.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-04 22:13:06 +00:00
dongarandClaude Opus 5 defa0a9214 Add README
Names the artifact and points at the specification in docs/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 21:58:01 +00:00
dongarandClaude Opus 5 bafe4cc9e6 Drop reference to nonexistent Architecture.md
The companion rationale document was never written; this spec stands alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 21:57:11 +00:00
dongarandClaude Opus 5 be04c28542 Add Nisse build specification
Seeds nisse-core as the home for system-level design documentation. The
spec covers the shared library (Part A), both agents (Parts B and C), and
the supporting services, build order, and open decisions.

nisse-core holds this because the document describes the shared design
rather than either agent's implementation; the repo gains code later, at
the extraction step in the build order.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 21:56:23 +00:00