v0.110.0 #1010
v0.110.0
#1010
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
What
The arming release. The project file
nika.yamllearns to PROPOSE aschedule, and the machine learns to keep it — « le fichier propose, la
machine dispose ». The
arm:registry carries the team's armed beats(thirteen keys, two of them required with no default —
plafond:andmanqué:— because choosing for you would be choosing who pays), onefirer computes the due window and spends under the per-tick ceiling, the
OS bridge hands launchd/systemd the calendar, and
nika servekeeps thesame firer resident behind the wall clock. One firer, four doors (D2):
nika arm fire, the emitted OS units, andserveall end at the SAMEfire — a beat the lock, the ceiling, or the miss policy governs is
governed identically no matter who pulled the trigger.
Added
The project file carries the thirteen beat keys (
arm:· W1 ·feat(arm): the file proposes, the machine fires · W1 #993). Each beat spells
workflow(a repo-relative*.nika.yamlpath) ·
cadence(a 5-field cron with the zone INSIDE the expression—
TZ=Europe/Paris 0 9 * * 1— oron-webhook, resolved against theembedded tzdb, never the host's) ·
où·plafond·manqué·chevauchement·après_saut·actif·raison·jusqu_au·tolérance·décalage·par. The grammar is CLOSED(
deny_unknown_fields): an unknown key fails at parse and the refusalnames what is known.
plafond:(the per-tick USD ceiling) andmanqué:(what "missed" means:rattraper·rattraper-une-fois·sauter) are OBLIGATORY with no default — a defaultrattraperspends what nobody asked for, a default
sauterloses a deliverablein silence. A suspended beat must tell its story:
actif: falsewithout
raison:is a suspension nobody narrates, withoutjusqu_au:an oblivion — both refuse by name. Barenika armREADSthe registry and reports what is armed, due, suspended, or refused —
it fires nothing.
nika arm fire <label>— the one firer (W2 · feat(arm): the one firer · W2 #1001). Computesthe planner's silence over
(last, now], the on-time window, and themiss policy; takes the project lock; refuses BEFORE spending when the
tick would cross the beat's
plafond:; and writes the firing recordto the ledger. Prints exactly one stdout line, always (D8) — a skip
is an event, said as such (
skipped <label> · inactive — <raison>),never a silence.
nika arm --emit launchd|systemd— the OS bridge (W3 · feat(arm): the OS bridge · W3 #1005).Renders the unit files PURE from the registry (
--writeinstallsthem); per-beat units are labelled
nika.arm.<radical>(D4 — thelabels the firer uses, computed once); the env file rides by PATH
only (D7 — provider keys never enter a unit). launchd's
StartCalendarIntervalis the cartesian product of the restrictedfields, counted before built — past 500 dicts the emit refuses (a
plist of n dicts is a load, not a calendar); systemd writes the sets
inline and the zone travels in
OnCalendar=;Persistent=answersmanqué ≠ sauter. Every refusal teaches: D10TzMismatch(launchdfires in the machine's zone — the remedy names
TZ=or systemd) ·Webhook(no calendar can fire an event) ·TooManyIntervals· theD6 v0 set below.
nika arm disarm <label>— the N4 gesture (W3 · feat(arm): the OS bridge · W3 #1005). Removingthe line does NOT disarm — the file would simply stop proposing while
the OS keeps firing. Disarming is
actif: false+raison:+jusqu_au:in the registry; the verb teaches exactly that, and--tear-downtakes the emitted OS unit down with it.nika serve— the same firer, resident (W5 · feat(arm): the same firer, resident · W5 #1008). The SAMEfireasarm fireand the OS units (D2), driven by the wall clockin place of launchd/systemd. The loop reads ONLY the registry —
judged by vocab + cadence BEFORE any shot — and its own
.nika/arm/sidecar; it reloads
nika.yamlwhen its mtime moves (a broken editis told, and the last-good registry keeps serving); it fires what
duereturns through the one firer (the per-tick ceiling alwayspassed · every fire is a fresh run); and it sleeps to the earliest
next slot (≤ 60 s) racing ctrl-c/SIGTERM — a signal breaks clean
(exit 0 · the current fire, synchronous, finishes first · the lock is
released). No network input, no environment read, no argument beyond
the clap surface.
What v0 refuses — and when each arrives (D6)
A policy the firer cannot honor REFUSES, never approximates — and the
refusal names the version the support arrives with:
chevauchement: remplacersauter(the law-⑥ default) orfileaprès_saut: à-complétionprochain-créneau(the default)manqué: rattraperrattraper-une-foisorsauterdécalage:où: cloudsignature:·budget:traces:/registry:likewise)Fixed
(
nika-display· fix(nika-display): the ORDER and LIFT findings render in the human lane #1002).nika explainand rustdoc(fix: leftover teaching speaks the nine-key envelope #1007).
NIKA-PARSE-002taughtnika: v1+workflow:+ atasks:list;NIKA-PARSE-005parked custom metadata indescription:. TheRawWorkflowfence, the analyzer crate doc,MissingEnvelopeField, and the LSP outline still namedworkflow:as a required envelope key. They now speak the live nine-key
envelope (identity on
nika: <kebab-id>·tasks:is a map ·prose is a
#comment abovenika:).Documentation
hello-example comments name the nine-key identity (docs(examples): hello comments name the nine-key identity #995) · the README
gifs are rebaked for the envelope (docs(media): rebake readme gifs for the 0.109 nine-key envelope #996) · the docs sweep of 0.109
lands in-repo (docs: in-repo teaching speaks the nine-key envelope of 0.109 #992).
Build & CI
trusts has already run on the commit it tags.
red, not a six-hour hang.
Install
Tarballs below: macOS arm64 / x64 · Linux x64 / arm64, plus
SHA256SUMS.Verify: three independent proofs
Provenance
Built from tag
v0.110.0byrelease.ymlon GitHub-hosted runners. Provenance is published twice: GitHub's native
build attestation (proof 2) and the SLSA generator's
multiple.intoto.jsonlrelease asset (proof 3). The release itself is a claim on the
machine-verified timeline: https://nika.sh/timeline
What's Changed
Full Changelog: v0.109.2...v0.110.0
This discussion was created from the release v0.110.0.
All reactions