Arckit
Security Notice
This extension includes AI agent skills that can modify AI assistant behavior. Review the skill files before installing.
Standalone swamp port of ArcKit (https://github.com/tractorjuice/arc-kit — the Enterprise Architecture Governance Harness): a skill-driven governance state machine with the full arc-kit template corpus bundled. No ArcKit Claude plugin and no Python CLI required.
Model type @magistr/arckit/workspace:
State machine (one governance project per state artifact)
startProject -> foundation -> context -> risk -> business-case ->
requirements -> design -> procurement -> design-review -> delivery ->
operations -> assurance -> story -> complete (abandon from any state)advance re-scans the disk and refuses unless every gate group of the
current phase has an ARC-* artifact present; skipPhase records an
explicit bypass of skippable phases. Profiles (standard | uk-gov | mod |
ai | nl-gov) add gate groups (uk-gov: tcop + secure; mod: mod-secure; ai:
data-model + ai-playbook + atrs; nl-gov: nl-tbb + nl-cloud + nl-bio +
nl-exit + eu-sovereignty). 000-global artifacts (e.g. principles) satisfy
gates workspace-wide.
Netherlands sovereign-cloud overlay (nl-gov)
Six artifact types grounded in current Dutch and EU instruments — Herziening rijksbreed cloudbeleid 2026 (3 juli 2026), VIRBI 2025 with the Te Beschermen Belangen systematiek, Cbw + Wwke (in force 15 August 2026), BIO2, and the EU Cloud Sovereignty Framework v1.2.1. Two of them are computable rather than prose-only.
Methods
- startProject / status / advance / skipPhase / abandon — the lifecycle
- template / templates / provisionTemplates — 71 bundled templates (65 arc-kit v6.2.0 plus 6 NL/EU), served with doc code, target ARC filename, and mandatory input artifacts
- init / scan / gaps — workspace scaffold, full artifact inventory, mandatory-dependency violation report
- migrateClassification — port of
arckit migrate-classification;ladderselects the target ladder (uae = UK → UAE Smart Data, the default and unchanged; nl = UK → NL rubricering), report-only by default - euSovereigntyScore — EU Cloud Sovereignty Framework v1.2.1 weighted score over SOV-1..SOV-8, the overall SEAL (the framework's actual rejection gate — the minimum SEAL across all eight objectives), and, with caller-supplied minimum SEAL floors, pass/fail per objective. Records an assessment; it does not certify
- nlCloudEligibility — public-cloud eligibility under the Herziening rijksbreed cloudbeleid 2026, returning allowed | conditional | discouraged | prohibited with every fired clause and a plain-language reason
Ships the arckit skill that drives Claude through the loop: status →
fetch template → read mandatory inputs → produce artifact → human
approval → advance.
Global Arguments
| Argument | Type | Description |
|---|---|---|
| path | string | Absolute path to the ArcKit workspace root (the directory containing projects/) |
| maxFileBytes | number | Reject/skip any single artifact or bundled template file larger than this many bytes (default 10 MiB) |
| Argument | Type | Description |
|---|---|---|
| title | string | Human project title |
| profile | enum | Governance profile — adds gate groups (uk-gov: tcop+secure, mod: mod-secure, ai: data-model+ai-playbook+atrs) |
| dir? | string | Explicit NNN-slug project directory (allocated from the title when omitted) |
| Argument | Type | Description |
|---|---|---|
| project | string | Project dir, e.g. 001-payments |
| Argument | Type | Description |
|---|---|---|
| project | string | Project dir, e.g. 001-payments |
| note? | string | Optional note recorded in the transition history |
| Argument | Type | Description |
|---|---|---|
| project | string | Project dir, e.g. 001-payments |
| reason | string | Why this phase does not apply |
| Argument | Type | Description |
|---|---|---|
| project | string | Project dir, e.g. 001-payments |
| reason | string | Why the project is abandoned |
| Argument | Type | Description |
|---|---|---|
| command | string | ArcKit command whose template to fetch, e.g. requirements |
| project? | string | Project dir (e.g. 001-payments) — fills in targetDir and suggested ARC filename |
| Argument | Type | Description |
|---|---|---|
| apply | boolean | Write the proposed changes (default: report only) |
| ladder | enum | Target classification ladder — uae (UAE Smart Data, default) or nl (NL rubricering, VIRBI 2025) |
| Argument | Type | Description |
|---|---|---|
| subject | string | The service or provider being assessed |
| project? | string | Project dir, e.g. 001-payments — prefixes the written resource name |
| objectives | array | Exactly the eight EU CSF v1.2.1 Sovereignty Objectives SOV-1..SOV-8, any order |
| sealFloors? | record | Caller-supplied minimum SEAL per objective id — never hardcoded; the tender specification defines these, per the EU CSF |
| Argument | Type | Description |
|---|---|---|
| subject | string | The service or provider being assessed |
| project? | string | Project dir, e.g. 001-payments — prefixes the written resource name |
| rubricering? | enum | NL VIRBI 2025 rubricering level (at least one of rubricering/tbbCategory required; Stg. = staatsgeheim) |
| tbbCategory? | enum | Te Beschermen Belang category, TBB 1 (highest) .. TBB 4 (lowest) — TBB systematiek, Gereedschap v1.0 |
| processingRegion | string | Where the data is stored and processed (e.g. EEA, Switzerland, United States) |
| supplierJurisdiction | string | Jurisdiction(s) the supplier and its sub-processors fall under — distinct from processingRegion |
| isPrimaryProcess | boolean | Whether the service supports the entity's primary process |
| isBasisregistratie | boolean | Whether the service holds basisregistratie source data |
| isEmailOrWorkplace | boolean | Whether the service is email/workplace storage (clause 4.5) |
| continuityEstablishedIndependently | boolean | Clause 4.5 condition: continuity established independently of the supplier |
| riskAnalysisAndExitPlanTested | boolean | Clause 4.5 condition: risk analysis and exit plan tested |
| ministerialApprovalObtained | boolean | Clause 4.5 condition: ministerial approval obtained |
| isVitaleAanbieder | boolean | Whether the entity is a vitale aanbieder |
| isWwkeEntity | boolean | Whether the entity is a Wwke (Cyberbeveiligingswet) entity |
| isCbwEssentialEntity | boolean | Whether the entity is a Cbw (NIS2) essential entity |
Resources
2026.08.14.1
Ports three verified upstream arc-kit defects in the EU Cloud Sovereignty Framework v1.2.1 implementation into this fork, found against the Commission's own Implementation guidance PDF and Annex Sovereignty assessment calculator XLSX, plus one related backward-compatible widening. TDD RED round: the weight fix's test asserted all eight weights individually against unmodified source first, capturing SOV-1/SOV-5/SOV-7 failing by name before any production code changed — a sum-only assertion would have missed all three, since both the wrong and the right weight sets sum to 100.
SOV_WEIGHTShad three wrong values. SOV-1 was 15 (should be 20), SOV-5 was 20 (should be 10), SOV-7 was 10 (should be 15) — ground truth is guidance p.7 / calculator cells D4/D45/D76/D102/D133/D169/D195/D231. The wrong set summed to 100 too, which is exactly why it survived review. Previously-writtensovereigntyAssessmentrecords were scored against the wrong weights and are NOT recomputed by this upgrade — that resource islifetime: "infinite", so such records persist; re-runeuSovereigntyScorefor any assessment that still matters.SEAL_LABELS.SEAL3.enwas wrong. Corrected"Digital resilience"→"Technological sovereignty"(guidance p.2-3, p.10).SEAL_LABELS.SEAL3.nlis UNCHANGED —"Digitale veerkracht"is a verified, deliberate divergence from the Commission's English name, quoted verbatim from the NDS Cloudprogramma notitie "Verkenning Overheidsbrede Soevereine Clouddiensten" (11 juni 2026), Tabel 1 p.8 — not a bug, and not something a future pass should "fix" to match the English.- No overall SEAL was computed, even though it is the framework's actual
rejection gate (guidance p.9: "The overall SEAL level is the lowest SEAL level
achieved in any of the objectives" — calculator cell F2:
="SEAL-"&MIN(H5:H251)).computeSovereigntyScorenow returnsoverallSeal(a MINIMUM across all eight objectives, never an average or a mode;undefined— never fabricated as SEAL0 — when any objective has no recorded SEAL) andoverallSealGovernedBy(every objective id tied at that minimum).SovereigntyAssessmentSchemagains both fields. maxScorehad no default and no documented ceiling. Added an exportedSOV_MAX_SCORESconstant with the calculator's actual per-objective maxima (SOV-1 1000.03 · SOV-2 1002 · SOV-3 1000 · SOV-4 1002 · SOV-5 1001 · SOV-6 1000 · SOV-7 1001 · SOV-8 1000— a nominal 1000 is design intent, not arithmetic; the workbook rounds each criterion's answer value to 2dp).objectives[].maxScoreis now OPTIONAL: when omitted, the accept/reject GUARD widens to the objective's actualSOV_MAX_SCORES[id]ceiling (a flat-1000 clamp would have falsely rejected a legitimate maximal SOV-2 response of 1002), while the contribution DIVISOR stays the calculator's flat nominal 1000 — the same formula the calculator itself uses for every objective regardless of that objective's true ceiling. Consequence, kept faithful rather than hidden: a maximal response across all eight objectives (every objective at itsSOV_MAX_SCORESceiling,maxScoreomitted throughout) scores 100.0756%, not 100%. An explicit caller-suppliedmaxScoreis honoured exactly as before for both roles — the new defaulting only applies when it is omitted.
manifest.yaml and model.version bumped in lockstep with a fifth identity
upgrades[] entry — additive/corrective resource-shape changes only, no data
transformation. New suite file arckit_workspace_csf_test.ts (26 tests) plus
corrections to three stale assertions in arckit_workspace_nl_test.ts that
hard-coded the old wrong weights (a local SOV_WEIGHTS duplicate, one
sanity-test title, one hard-coded 15 in the fractional-contribution test).
Suite is now 274, all green; deno lint/deno fmt --check clean.
2026.08.07.1
Release of the NL sovereign-cloud overlay, with two defects closed that the
pre-publish adversarial review found in 2026.08.06.1. 2026.08.06.1 was
never published — the registry moves 2026.08.02.1 → 2026.08.07.1 directly.
See the 2026.08.06.1 section below for the overlay itself.
computeSovereigntyScore's fail-closed guard was one-sided. It rejected a missing objective but silently accepted a duplicate id — a repeatedSOV-1changed the computed score from 50 to 57.5, the later entry winning via thenew Map(...)construction — and silently ignored an unrecognized id. The objective set is now validated closed and exact (SOV-1..SOV-8, each exactly once) before scoring, naming the offending id.MigrationSchema.ladderwas required with no default, so aclassificationMigrationrecord written before the field existed failed to parse. That resource islifetime: "infinite", so such records persist and can be restored from the datastore. It now defaults to"uae"— the only ladder that ever existed — matching the.default([])precedent set forskipped/unmappedFiles.MigrationSchemais exported so a test pins it.
Both passed a fully green 244-test suite: the tests only exercised the
missing-objective direction and never parsed a legacy record. Suite is now 248.
quality.yaml gains its entry and lists arckit_workspace_nl_test.ts under the
coverage role.
Modified 1 models
2026.08.02.1
Real-fix pass closing all six remaining latent bugs tracked on the LOCAL
arckit-latent-bugs issue-lifecycle model (NEVER filed to the swamp.club Lab) —
LB2 (MEDIUM) and LB3..LB7 (LOW). arckit_workspace.ts was no longer byte-frozen
after the LB1 fix in 2026.08.01.1; this is the second production change.
- LB2 (MEDIUM) —
migrateClassification apply=truenon-atomic overwrite, no backup. The apply branch now copies the pre-migration content to a<artifact>.bakrecovery sibling, writes the proposed text to a sibling temp file, thenDeno.renames it over the artifact — an atomic replace on the same filesystem, so a reader always sees the whole old or whole new file, never a truncated partial, and a crash mid-write leaves the artifact intact plus a recoverable.tmporphan. - LB3 (LOW) — unbounded
readTextFileintemplate/migrateClassification. Added a defaulted global argmaxFileBytes(default 10 MiB) toGlobalArgsSchema.migrateClassificationcap-checks via the scan snapshot'ssizeBytesWITHOUT reading, recording an oversize artifact in the newskipped[]field (reason: "oversize") in both report and apply modes;templateDeno.stats the bundled file and rejects before reading if it exceeds the cap. - LB4 (LOW) — non-enum
projectState.statevacuously satisfies the gate.ProjectStateSchema.stateis nowz.enum(PROJECT_STATES)(PHASESpluscomplete/abandoned) instead ofz.string()— a schema seam change only.readProjectState(the sole reader forstatus/advance/skipPhase/abandon) now rethrows a friendlyCorrupted project state for <dir>: ...error instead of a raw ZodError when a hand-edited/datastore-restored state falls outside the enum, soadvancecan no longer auto-complete a bogus phase.nextPhaseandgateFor/evaluateGateare UNCHANGED pure functions — the frozen contract-fixture (nextPhase("bogus") === "complete") andcoverage_test.ts'sgateFor/evaluateGatebogus-phase assertions stay byte-behaviorally identical; the schema simply makes them unreachable from the public API. Trade-off:abandonon a corrupted record now also rejects (fail-closed, cannot rescue a corrupted record via abandon) — accepted for a LOW corruption-recovery path. - LB5 (LOW) — project-id allocation breaks past 999.
parseProjectDir's regex and thestartProjectallowlist guard both widen\d{3}to\d{3,}(3-OR-MORE digits);nextProjectDir'spadStart(3, "0")is unchanged, so ids<=999keep their existing 3-digit zero-padding and ids>=1000widen naturally. The guard's character class still forbids/,\,., so every LB1 traversal payload stays rejected;ARTIFACT_RE(artifact filename ids) is untouched and stays 3-digit. - LB6 (LOW/info) —
templatesvsprovisionTemplatesinventory divergence.templatesnow additionally walks the bundledtemplates/directory (the same sourceprovisionTemplatescopies) and surfaces any file with noTEMPLATE_MAPcommand in a new defaultedunmappedFiles: string[]field onTemplateCatalogSchema, reconciling the two methods' inventories.templateCountand thesizeBytes:0missing-file behavior are unchanged. - LB7 (LOW/info) — symlinked artifacts silently skipped.
listFilesRecursiveandscanWorkspacenow resolve a symlink entry's target kind viaDeno.stat— a symlinked artifact or project directory is inventoried like a real one (bounded by the existing depth cap). Write-safety cross-cut with LB1/LB2:migrateClassification's apply branchDeno.lstats before writing and skips (reason"symlink", reusing the LB3skipped[]field) rather than writing through a symlink to a target outside the workspace; report-only mode still reads through the symlink and proposes.
extensions/models/arckit_workspace.ts: all six fixes land in a single
consolidated ordered block inside migrateClassification's per-file apply loop
(LB3 cap-check → read+propose → LB7 symlink skip / LB2 backup+atomic write),
plus the schema/regex/directory-walk changes above.
manifest.yaml/model.version bumped 2026.08.01.1 → 2026.08.02.1 in
lockstep. Added upgrades[] (previously absent on this model) with identity
upgradeAttributes: (old) => old entries — maxFileBytes is a defaulted global
arg and skipped/unmappedFiles are defaulted resource-schema arrays, so no
stored data needs transformation.
extensions/models/arckit_workspace_adversarial_test.ts: flipped LB2 (:121), LB4 (:197,:221), LB5 (:251), LB6 (:270), and LB7 (:306) frompin (arckit-latent-bugs LBN, SEVERITY):-titled current-behavior pins tofix regression (arckit-latent-bugs LBN, SEVERITY):-titled POST-fix assertions; relabeled the two LB3 500 KB pins from "
Release 2026.07.16.2 — align model versions with manifests
Maintenance release across the @magistr extensions. For most packages this
carries no functional change: the only edit is the model's version: field,
brought back in line with its manifest version so the published model type
version and the package version no longer drift.
Functional changes in this release are limited to:
anime-cron: normalizeTitle now strips a ": subtitle" suffix and a trailing parenthesized year before comparison, fixing dedup false-misses where the torrent title carries a subtitle or year that the AniList romaji does not.
arckit: first publish. Standalone ArcKit port — a 12-phase architecture governance state machine with 65 bundled templates, driven by a bundled skill.
Also tracks three extensions (kaiten, observability-agent, music-library) that previously existed only as untracked working-tree directories, recovered from stashes.
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License declared1/1earned
- Verified public repository2/2earned