46e036e1c3
feat(ultraplan-local): next-session-prompt-validator (Bug 3 consistency check) [skip-docs]
...
Step 6 of v3.4.1 plan. Adds the validator quartet
(Content/Object/Consistency/CLI) for NEXT-SESSION-PROMPT.local.md
frontmatter (produced_by, produced_at). State-anchored staleness check
is the primary refusal; 24h wall-clock drift downgraded to soft warning
to avoid false positives on weekend pauses.
Internal scaffolding consumed by Step 8 (Phase 1.5 wire-up). User-facing
docs land with Step 14 (CHANGELOG + README + version bump).
Tests 335 -> 346 (+11): 9 unit + 2 CLI shim cases.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-04 17:34:16 +02:00
7cdbcb7425
test(ultraplan-local): add ultracontinue to FLAG_SCHEMA + tests
...
Step 1 of v3.4.1 hot-fix plan (project 2026-05-04-v3.3.1-ultracontinue-fixes).
Adds ultracontinue entry to FLAG_SCHEMA covering boolean flags --help,
--cleanup, --confirm, --dry-run with no valued flags. The -h short form
is intentionally not aliased: it appears as positional[0] === '-h' and
the command prose dispatches usage on either condition.
7 new tests in tests/lib/arg-parser.test.mjs verify empty args, --help,
-h positional, --cleanup, --cleanup --confirm, project-dir positional,
and .md positional (parser-level accept; command-level reject).
2026-05-04 16:34:55 +02:00
bbe7971d01
feat(ultraplan-local): add stats event-emit for autonomy lifecycle events
...
Step 6 of plan-v2 (ultra-pipeline-speedup).
lib/stats/event-emit.mjs (NEW)
Atomic JSONL append to ${CLAUDE_PLUGIN_DATA}/ultraexecute-stats.jsonl.
Every record carries:
ts : ISO-8601 timestamp (REQUIRED per SC4)
event : caller-supplied name
known_event : true for { brief-approved, main-merge-gate, user_input },
false for everything else (still emitted — audit-complete)
payload : caller object (defaults to {})
Stats failures NEVER block workflow: missing CLAUDE_PLUGIN_DATA, missing
dir, mkdir failure, append failure → all return { written: false, reason }
without throwing.
CLI shim:
node lib/stats/event-emit.mjs --event NAME [--payload JSON]
Always exits 0 (telemetry is best-effort).
Tests: 12 (record-build + ISO-8601 ts + known/unknown distinction + silent
skip + dir-on-demand + CLI shim happy-path + bad-payload tolerance +
concurrent-append smoke).
[skip-docs]
2026-05-04 06:31:52 +02:00
bed14eae4a
feat(ultraplan-local): add plan-review-dedup helper for Phase 9 finding dedup
...
Step 5 of plan-v2 (ultra-pipeline-speedup).
lib/review/plan-review-dedup.mjs (NEW)
Two-pass dedup:
1. Exact match — identical computeFindingId(file:line:rule_key) → merge.
2. Jaccard ≥ 0.7 on text-token sets → merge near-duplicates.
Provenance preserved in surviving finding's raised_by[] (which agents
raised it). Reuses lib/parsers/jaccard.mjs + lib/parsers/finding-id.mjs.
CLI shim:
node lib/review/plan-review-dedup.mjs \
--plan-critic /tmp/x.json --scope-guardian /tmp/y.json
Missing inputs tolerated (single-agent review still works).
Tests: 10 (tokenize + threshold + 6 dedup-logic cases + 2 CLI shim).
[skip-docs]
2026-05-04 06:30:28 +02:00
645f01625b
feat(ultraplan-local): add autonomy-gate state machine + manifest schema extensions for skip_commit_check + memory_write
...
Step 4 of plan-v2 (ultra-pipeline-speedup).
lib/util/autonomy-gate.mjs (NEW)
5-state machine {idle, gates_on, auto_running, paused_for_gate, completed}
honoring the --gates flag intent. Re-entry to completed is idempotent.
Includes CLI shim:
node lib/util/autonomy-gate.mjs --state X --event Y [--gates true|false]
→ JSON: { ok, next_state | error }, exit 0 on success / 1 on invalid.
lib/parsers/manifest-yaml.mjs (EXTENDED)
OPTIONAL_KEYS list adds skip_commit_check and memory_write — both boolean,
default false when absent, MANIFEST_OPTIONAL_TYPE when non-boolean.
Existing REQUIRED_KEYS contract untouched; existing 9 manifest tests
still pass.
Tests: 19 (autonomy-gate) + 8 (manifest-schema-extensions) = 27 new.
[skip-docs]
2026-05-04 06:28:47 +02:00
Kjell Tore Guttormsen
819fd47ce0
feat(ultraplan-local): add session-state-validator + tests for /ultracontinue
...
Validator at lib/validators/session-state-validator.mjs:
- validateSessionStateObject(parsed, opts) — pure object validation
- validateSessionStateContent(jsonText, opts) — wraps JSON parse + validation
- validateSessionState(filePath, opts) — file-mode with existsSync guard
- CLI shim with --json output (errors→stderr, result→stdout, exit 0/1/2)
- Schema v1: schema_version, project, next_session_brief_path,
next_session_label, status, updated_at
- Error codes: SESSION_STATE_PARSE_ERROR, SESSION_STATE_NOT_FOUND,
SESSION_STATE_MISSING_FIELD, SESSION_STATE_INVALID_STATUS,
SESSION_STATE_NOT_RESUMABLE (warning), SESSION_STATE_SCHEMA_MISMATCH,
SESSION_STATE_INVALID_TIMESTAMP, SESSION_STATE_INVALID_PATH
- Forward-compat hard requirement: unknown top-level keys ignored —
protects future graceful-handoff v2.2 dual-writes
Tests at tests/validators/session-state-validator.test.mjs — 15 subtests:
- happy path + 5 missing-field tests
- invalid status, completed warns NOT_RESUMABLE, schema mismatch, bad
timestamp, malformed JSON, missing file
- fixture load (SC-1) + malformed fixture (SC-3)
- forward-compat: unknown keys ignored silently
167 → 182 tests, 0 fail.
Step 4 of /ultracontinue v3.3.0. Closes Session 1 of the execution
strategy (foundation: gitignore + util + fixtures + validator+tests).
2026-05-01 20:23:09 +02:00
Kjell Tore Guttormsen
655c8d46f8
refactor(ultraplan-local): extract atomicWriteJson to lib/util
...
Three changes in one commit:
1. NEW lib/util/atomic-write.mjs — exports atomicWriteJson(path, obj),
the canonical tmp+rename pattern. Reused by pre-compact-flush.mjs and
(in subsequent steps) by the new session-state writer.
2. NEW tests/lib/atomic-write.test.mjs — 4 unit tests covering
round-trip, no-orphan-tmp, overwrite-atomic, pretty-print formatting.
3. REFACTOR hooks/scripts/pre-compact-flush.mjs — replace the inline
atomicWrite() with the imported atomicWriteJson(). Also fixes a
pre-existing syntax error (leading whitespace + stray --resume token
outside the comment block) that silently broke the hook from v3.1.0
onward — PreCompact runtime is fail-open and swallowed the error.
File reformatted with standard zero-indent JS.
163 → 167 tests, 0 fail.
Step 2 of /ultracontinue v3.3.0 (project 2026-05-01-ultracontinue).
2026-05-01 20:21:15 +02:00
Kjell Tore Guttormsen
ebeae010c1
feat(ultraplan-local): extend project-discovery with review.md
2026-05-01 16:43:08 +02:00
Kjell Tore Guttormsen
535dce87dc
feat(ultraplan-local): add ultrareview to arg-parser FLAG_SCHEMA
2026-05-01 16:42:01 +02:00
Kjell Tore Guttormsen
1c22452e81
feat(ultraplan-local): extend brief-validator to accept type:ultrareview
2026-05-01 13:31:39 +02:00
Kjell Tore Guttormsen
f6e61e92cd
feat(ultraplan-local): add lib/validators/review-validator.mjs
2026-05-01 13:30:43 +02:00
Kjell Tore Guttormsen
cf56fbbe27
feat(ultraplan-local): add lib/parsers/jaccard.mjs
2026-05-01 13:28:44 +02:00
Kjell Tore Guttormsen
38b801f534
feat(ultraplan-local): add lib/parsers/finding-id.mjs (stable SHA1)
2026-05-01 13:28:05 +02:00
Kjell Tore Guttormsen
e4b23dc735
feat(ultraplan-local): add lib/review/rule-catalogue.mjs (12 rule keys)
2026-05-01 13:27:29 +02:00
Kjell Tore Guttormsen
1a65d8e4d5
feat(graceful-handoff): 2.0 — migrate to skills/ with disable-model-invocation [skip-docs]
...
Step 1 of v2.0 plan. Hard cut from commands/ to skills/ per Anthropic
recommendation for new plugins. Frontmatter sets disable-model-invocation:
true and pins model: claude-sonnet-4-6. Docs (README, CLAUDE.md, root
README) deferred to Step 9 per plan.
2026-05-01 05:45:26 +02:00
Kjell Tore Guttormsen
65c9242160
feat(ultraplan-local): Spor 1 wave 2 — 5 validators + doc-consistency, 108 tests grønn [skip-docs]
...
5 nye validator-moduler (alle m/ CLI-shim for invokering fra commands):
- brief-validator.mjs — frontmatter (type, brief_version, task, slug, research_topics, research_status), state machine (research_topics > 0 + skipped requires brief_quality: partial), body sections (Intent/Goal/Success Criteria)
- research-validator.mjs — type=ultraresearch-brief, confidence ∈ [0,1], dimensions ≥ 1, body sections, --dir mode for batch validering
- plan-validator.mjs — wrapper over plan-schema + manifest-yaml; håndhever step-count == manifest-count, plan_version=1.7
- progress-validator.mjs — schema_version, status enum, current_step in range, step shape, checkResumeReadiness
- architecture-discovery.mjs — EKSTERN KONTRAKT: drift-WARN ikke drift-FAIL; tolererer non-canonical filnavn, surfacer loose files som warnings
Doc-consistency-test pinning prose vs source-of-truth:
- agents/*.md count == CLAUDE.md agent-tabell rader
- commands/*.md mentioned i CLAUDE.md
- command frontmatter.name == filnavn
- templates/plan-template.md plan_version 1.7 invariant
- settings.json kun kjente scopes (ultraplan, ultraresearch)
- settings.json ingen exploration eller agentTeam (vestigial guard etter Spor 0)
- CLAUDE.md refererer alle 4 pipeline-commands
Wave 1 + Wave 2 = 108 tester grønn.
[skip-docs]: Test-infrastrukturen er ikke user-facing før Spor 1 wiring lander; README/CLAUDE.md oppdateres når commands faktisk endrer atferd (neste commit).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-01 05:39:47 +02:00
Kjell Tore Guttormsen
205cdbf77f
feat(ultraplan-local): Spor 1 wave 1 — lib/parsers + 66 tests grønn
...
7 nye moduler:
- lib/util/result.mjs — Result-shape m/ ok/fail/combine helpers
- lib/util/frontmatter.mjs — håndruller YAML-frontmatter-parser (subset, zero deps)
- lib/parsers/plan-schema.mjs — v1.7 step-regex + forbidden-heading-deteksjon (Fase/Phase/Stage/Steg)
- lib/parsers/manifest-yaml.mjs — per-step Manifest YAML-ekstraksjon m/ regex-validering
- lib/parsers/project-discovery.mjs — finn brief/research/architecture/plan/progress i prosjektmappe
- lib/parsers/arg-parser.mjs — $ARGUMENTS for alle 4 commands m/ flag-schema
- lib/parsers/bash-normalize.mjs — løftet fra hooks/scripts/pre-bash-executor.mjs
6 test-filer (66 tester totalt) — alle grønn:
- frontmatter (CRLF/BOM, scalars, lister, indent-rejection)
- plan-schema (positive Step-form, negative Fase/Phase/Stage/Steg, numbering, slicing)
- manifest-yaml (extraction, parsing, regex-validering, missing-key detection)
- project-discovery (sortert research, architecture-detection, phase-requirements)
- arg-parser (boolean/valued/multi-value flags, kvotert positional, ukjente flag)
- bash-normalize (\${x}/\\\\evasion, ANSI-stripping, full canonicalize-pipeline)
Forbereder Wave 2 (validators) og Spor 1-wiring inn i commands.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-01 05:35:28 +02:00