burndown 3: report, evidence, register (174 -> 168), 07 Redis RDB [DESIGN], 04 §6.3 the box's password doors
gates / gates (push) Successful in 7m2s
gates / gates (push) Successful in 7m2s
Closed R-1115, R-1111, R-1112, R-1113, R-1109, R-1110, R-1114, R-1096; opened R-1116 (decoy suites in the other runners), R-1117 (Immich/Nextcloud Redis volume, deferred). Controller 0.325.0 is the floor since 08:21 UTC. Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
1 parent
0314b8e7cf
commit
e1dd1cadd3
40 files changed
+2654
-14
No files matched your search
@@ -0,0 +1,283 @@
|
||||
ok FACT: docmost-postgres major + 1 (read from the clone) rc=1 (expected 1)
|
||||
ok FACT: docmost-postgres major + 1, alone rc=1 (expected 1)
|
||||
ok FACT: kimai-db 11.6 -> 12.3 BUNDLED with the kimai app bump rc=1 (expected 1)
|
||||
ok FACT: kimai-db mariadb:11.6 -> mariadb:lts (major unreadable) rc=2 (expected 2)
|
||||
ok GENUINE: kimai-db mariadb:11.x -> 11.99 (within major) rc=0 (expected 0)
|
||||
ok GENUINE: kimai-db mariadb:11.6 -> 12.3 ALONE (the R-469 lift) rc=0 (expected 0)
|
||||
ok GENUINE: docmost-postgres major+1 ALONE with its proven two-venue MARKED entry rc=0 (expected 0)
|
||||
ok DECOY: the entry is proven on both venues but carries NO conversion mark rc=1 (expected 1)
|
||||
ok DECOY: the marked entry cites ONE venue only (no box_evidence) rc=1 (expected 1)
|
||||
ok DECOY: the mark sits in a COMMENT, the entry has none rc=1 (expected 1)
|
||||
ok DECOY: the marked entry, but the move is BUNDLED with the app's own bump rc=1 (expected 1)
|
||||
ok FACT: adventurelog's postgis 16 -> 17 (the postgis family was never judged before) rc=1 (expected 1)
|
||||
ok DECOY: major moves only in a comment + serverVersion env rc=0 (expected 0)
|
||||
ok DECOY: the APP image crosses a major (kimai 2.57 -> 3.0) rc=0 (expected 0)
|
||||
ok DECOY: 'mariadb:12.3' lands in README.md, not a template rc=0 (expected 0)
|
||||
ok FACT: kimai image moves, catalog_since untouched rc=1 (expected 1)
|
||||
ok FACT: kimai image moves, catalog_since set to a FUTURE year rc=1 (expected 1)
|
||||
ok GENUINE: kimai image moves AND catalog_since = today rc=0 (expected 0)
|
||||
ok DECOY: image moves; today's date lands in a COMMENT and README, the field stays rc=1 (expected 1)
|
||||
ok DECOY: only a comment + env line change, images untouched, date untouched rc=0 (expected 0)
|
||||
ok FACT: a Hungarian byte changed in a frozen string rc=1 (expected 1)
|
||||
ok FACT: an em dash in a Hungarian string (R-932) rc=1 (expected 1)
|
||||
ok FACT: a Hungarian first_step removed rc=1 (expected 1)
|
||||
ok FACT: a NEW app is not in the freeze rc=1 (expected 1)
|
||||
ok FACT: an unknown key inside the English block rc=1 (expected 1)
|
||||
ok FACT: an English deploy field with no Hungarian twin rc=1 (expected 1)
|
||||
ok FACT: an accented Hungarian letter left in the English rc=1 (expected 1)
|
||||
ok FACT: ASCII-only Hungarian left in the English (no accent to find) rc=1 (expected 1)
|
||||
ok FACT: the product begs ("please") rc=1 (expected 1)
|
||||
ok FACT: an English retrieval promise the Hungarian never made rc=1 (expected 1)
|
||||
ok GENUINE: a REGISTERED true retrieval promise passes rc=0 (expected 0)
|
||||
ok FACT: registered for ANOTHER app - the promise still convicts, the entry is stale rc=1 (expected 1)
|
||||
ok FACT: registered on the path, but the sentence was rewritten (match gone) rc=1 (expected 1)
|
||||
ok FACT: a STALE entry - nothing in the English promises it any more rc=1 (expected 1)
|
||||
ok FACT: a registered promise with a two-word reason rc=1 (expected 1)
|
||||
ok FACT: a credential token rewritten in translation rc=1 (expected 1)
|
||||
ok FACT: a credential value reworded in translation (one digit added) rc=1 (expected 1)
|
||||
ok FACT: an i18n block for a language the controller does not render rc=1 (expected 1)
|
||||
ok FACT: an English list with a different number of steps rc=1 (expected 1)
|
||||
ok FACT: ratchet — fewer strings translated than the ceiling records rc=1 (expected 1)
|
||||
ok FACT: ratchet — more translated than the ceiling records rc=1 (expected 1)
|
||||
ok GENUINE: a correct English block on privatebin rc=0 (expected 0)
|
||||
ok GENUINE: naming an app does not change the coverage count rc=0 (expected 0)
|
||||
ok FACT(no-yaml): a Hungarian byte changed in a frozen string rc=1 (expected 1)
|
||||
ok FACT(no-yaml): a frozen Hungarian line deleted rc=1 (expected 1)
|
||||
ok FACT(no-yaml): a NEW app is not in the freeze rc=1 (expected 1)
|
||||
ok GENUINE(no-yaml): the untouched tree passes, and SAYS what it did not check rc=0 (expected 0)
|
||||
ok GENUINE(no-yaml): romm's escaped-quote help_texts are still found rc=0 (expected 0)
|
||||
ok DECOY: Hungarian rewritten inside a YAML COMMENT rc=0 (expected 0)
|
||||
ok DECOY: a frozen Hungarian sentence pasted into README.md rc=0 (expected 0)
|
||||
ok DECOY: display_name changed - a NAME, never copy rc=0 (expected 0)
|
||||
ok DECOY: docs_url changed - configuration, never copy rc=0 (expected 0)
|
||||
ok DECOY: Hungarian text added to a docker-compose.yml rc=0 (expected 0)
|
||||
|
||||
-- probe-matches-compose: the facts (each MUST be refused)
|
||||
ok FACT: tandoor's real R-618 port fault, re-introduced rc=1 (expected 1)
|
||||
ok FACT: wger's real R-618 port fault, re-introduced rc=1 (expected 1)
|
||||
ok FACT: zipline's real R-618 path fault, re-introduced rc=1 (expected 1)
|
||||
ok GENUINE: the fixed tree passes rc=0 (expected 0)
|
||||
ok FACT: a clean app given a wrong probe port rc=1 (expected 1)
|
||||
ok FACT: api+expect probe given a path the app does not answer rc=1 (expected 1)
|
||||
-- probe-matches-compose: the decoys (the label moves, the fact does not)
|
||||
ok DECOY: the port moves in a COMMENT in .felhom.yml rc=0 (expected 0)
|
||||
ok DECOY: traefik loadbalancer.server.port changed rc=0 (expected 0)
|
||||
ok DECOY: a published `ports:` mapping changed rc=0 (expected 0)
|
||||
ok DECOY: a NON-probed sidecar's healthcheck port changed rc=0 (expected 0)
|
||||
ok DECOY: path mismatch on a probe that CANNOT fail on it -> WARN, not FAIL rc=0 (expected 0)
|
||||
-- probe-matches-compose: the DEGRADED mode CI actually runs (no PyYAML)
|
||||
ok DEGRADED: the fixed tree passes, and SAYS it is degraded rc=0 (expected 0)
|
||||
ok DEGRADED FACT: tandoor's port fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED FACT: wger's port fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED FACT: zipline's path fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED DECOY: traefik label moves, the fact does not rc=0 (expected 0)
|
||||
-- probe-matches-compose: the probe TARGET (R-630)
|
||||
ok FACT: paperless-ngx without its explicit container is refused rc=1 (expected 1)
|
||||
ok FACT: immich's FOUR prefix candidates are an ambiguity, not a pick rc=1 (expected 1)
|
||||
ok FACT: an explicit container no service declares is refused rc=1 (expected 1)
|
||||
ok GENUINE: both explicit containers resolve rc=0 (expected 0)
|
||||
ok DECOY: the container name moves in a COMMENT, not the field rc=0 (expected 0)
|
||||
ok DECOY: a UNIQUE prefix still resolves without the field rc=0 (expected 0)
|
||||
ok DEGRADED: the explicit container is read without PyYAML too rc=0 (expected 0)
|
||||
ok DEGRADED FACT: removing it still refuses rc=1 (expected 1)
|
||||
-- test-record-move: an image move needs its own proven record
|
||||
ok FACT: a bare image move, no entry rc=1 (expected 1)
|
||||
ok GENUINE: a proven entry whose digest the registry serves rc=0 (expected 0)
|
||||
ok FACT: the entry's verdict is failed rc=1 (expected 1)
|
||||
ok FACT: the registry now serves another digest rc=1 (expected 1)
|
||||
ok INCONCLUSIVE: the registry cannot be asked rc=2 (expected 2)
|
||||
ok DECOY: the entry only in a COMMENT under update_ladder rc=1 (expected 1)
|
||||
ok DECOY: the entry only in README.md rc=1 (expected 1)
|
||||
ok FACT: a new move carrying a BACKFILLED entry rc=1 (expected 1)
|
||||
ok FACT: memory_tight and the limit did not move rc=1 (expected 1)
|
||||
ok GENUINE: memory_tight WITH the limit raised rc=0 (expected 0)
|
||||
ok DECOY: a ref moves in a compose COMMENT only rc=0 (expected 0)
|
||||
-- test-record (static): the newest step IS the compose
|
||||
ok GENUINE: a ladder whose head is the compose rc=0 (expected 0)
|
||||
ok FACT: the compose moved past the ladder's head rc=1 (expected 1)
|
||||
ok FACT: a line that is not one JSON entry rc=1 (expected 1)
|
||||
ok FACT: a gap between steps rc=1 (expected 1)
|
||||
ok FACT: a failed verdict sits in the ladder rc=1 (expected 1)
|
||||
-- test-record (static): every intermediate step carries its own definition
|
||||
ok FACT: a two-step ladder with NO steps/ file for the first step rc=1 (expected 1)
|
||||
ok GENUINE: a two-step ladder whose first step carries its definition rc=0 (expected 0)
|
||||
ok DECOY: the steps/ file has the right NAME and names the head's image rc=1 (expected 1)
|
||||
ok DECOY: the step's definition sits beside the template under another name rc=1 (expected 1)
|
||||
ok FACT: the step has its compose but no .felhom.yml rc=1 (expected 1)
|
||||
ok DECOY: the step's .felhom.yml exists by NAME and holds no healthcheck rc=1 (expected 1)
|
||||
-- test-record: a same-tag re-test (decision 52)
|
||||
ok GENUINE: head + a re-test from its digest, both venues rc=0 (expected 0)
|
||||
ok FACT: a re-test with NO new digest rc=1 (expected 1)
|
||||
ok FACT: a re-test without the box venue rc=1 (expected 1)
|
||||
ok FACT: a re-test FROM a digest the previous entry never tested rc=1 (expected 1)
|
||||
ok DECOY: a re-test that names digest_from only in its evidence text rc=1 (expected 1)
|
||||
ok GENUINE: a re-test whose digest the registry serves now rc=0 (expected 0)
|
||||
ok FACT: a re-test whose digest the registry no longer serves rc=1 (expected 1)
|
||||
ok FACT: a re-test with no new digest reaches the move gate too rc=1 (expected 1)
|
||||
ok probe-measured: genuine komga note passes rc=0 (expected 0)
|
||||
ok probe-measured: note moved into the TAGLINE rc=1 (expected 1)
|
||||
ok probe-measured: date but no before/after rc=1 (expected 1)
|
||||
ok probe-measured: before/after but no date rc=1 (expected 1)
|
||||
ok probe-measured: 'read upstream' is not a measurement rc=1 (expected 1)
|
||||
|
||||
-- copy-i18n: the user guide (each FACT must be refused, naming the key)
|
||||
ok GENUINE: a full Hungarian guide with its English overlay rc=0 (expected 0)
|
||||
ok FACT: guide strings that are not in the freeze rc=1 (expected 1)
|
||||
ok FACT: checked_version in the English block rc=1 (expected 1)
|
||||
ok FACT: a section with an empty steps list rc=1 (expected 1)
|
||||
ok FACT: an FAQ entry with a question and no answer rc=1 (expected 1)
|
||||
ok FACT: an unquoted checked_version (YAML reads 4.10 as 4.1) rc=1 (expected 1)
|
||||
ok FACT: more English sections than Hungarian rc=1 (expected 1)
|
||||
ok FACT: an English section with a different step count rc=1 (expected 1)
|
||||
ok FACT: an English guide with no Hungarian guide rc=1 (expected 1)
|
||||
ok FACT: a tracker named in an English step rc=1 (expected 1)
|
||||
ok FACT: a tracker named in a Hungarian answer (folded, any case) rc=1 (expected 1)
|
||||
ok DECOY: a tracker named only in a YAML comment rc=0 (expected 0)
|
||||
ok DECOY: a source-like word only in docs_url (configuration) rc=0 (expected 0)
|
||||
|
||||
-- guide-version (ADVISORY: WARN on the fact, silent on the label, exit 0 always)
|
||||
ok FACT: the app's image moved off the checked tag (4.0.20 -> 4.0.21) rc=0 (advisory)
|
||||
ok GENUINE: the guide is current rc=0 (advisory)
|
||||
ok DECOY: the checked tag survives only on a SIDECAR rc=0 (advisory)
|
||||
ok DECOY: checked_version only in a COMMENT rc=0 (advisory)
|
||||
ok DECOY: checked_version only inside the English block rc=0 (advisory)
|
||||
ok FACT: an empty checked_version is HIDDEN and named rc=0 (advisory)
|
||||
ok image-pins: FACT: untagged rc=1 (expected 1)
|
||||
ok image-pins: FACT: a registry PORT is not a tag rc=1 (expected 1)
|
||||
ok image-pins: FACT: quoted :latest rc=1 (expected 1)
|
||||
ok image-pins: FACT: :LATEST in capitals rc=1 (expected 1)
|
||||
ok image-pins: FACT: a floating alias (:edge) rc=1 (expected 1)
|
||||
ok image-pins: FACT: untagged with a comment saying pinned rc=1 (expected 1)
|
||||
ok image-pins: FACT: a QUOTED key is the same field rc=1 (expected 1)
|
||||
ok image-pins: FACT: an interpolated ref cannot be read rc=1 (expected 1)
|
||||
ok image-pins: FACT: @sha256: with no digest behind it rc=1 (expected 1)
|
||||
ok image-pins: INERT: a commented-out untagged image rc=0 (expected 0)
|
||||
ok image-pins: INERT: an x- extension field (Compose ignores it) rc=0 (expected 0)
|
||||
ok image-pins: INERT: an untagged image in README.md rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a concrete tag rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a registry port WITH a tag rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a real digest rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: :latest pinned by its digest rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: the real catalog rc=0 (expected 0)
|
||||
ok image-resolvable: GENUINE: every pin resolves rc=0 (expected 0)
|
||||
ok image-resolvable: FACT: the registry says one pin is gone rc=1 (expected 1)
|
||||
ok image-resolvable: LABEL: rc=0 carrying a throttle message rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: rc=0 carrying any error text rc=2 (expected 2)
|
||||
ok image-resolvable: CRY-WOLF: a throttle on rc=1 is not an accusation rc=2 (expected 2)
|
||||
ok image-resolvable: CRY-WOLF: an unrecognised failure is not an accusation rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: a docker that resolves EVERYTHING, the canary too rc=3 (expected 3)
|
||||
ok image-resolvable: LABEL: no docker at all rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: nothing to judge rc=3 (expected 3)
|
||||
ok volume-persistence: injected-prober suite OK
|
||||
ok volume-persistence: LABEL: a runtime that answers nothing rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: no docker at all rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: nothing to judge rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: not a scratch host rc=3 (expected 3)
|
||||
|
||||
-- onboarding: the facts (each MUST be refused)
|
||||
ok FACT: a new template with NO record rc=1 (expected 1)
|
||||
ok FACT: a record missing id 1.4 rc=1 (expected 1)
|
||||
ok FACT: 1.4 answered only inside an HTML comment rc=1 (expected 1)
|
||||
ok FACT: done with a path that does not exist rc=1 (expected 1)
|
||||
ok FACT: done with an EMPTY directory (the mkdir shape) rc=1 (expected 1)
|
||||
ok FACT: done naming an absent file in the sibling repo rc=1 (expected 1)
|
||||
ok FACT: n/a with an EMPTY reason rc=1 (expected 1)
|
||||
ok FACT: n/a with a two-word reason rc=1 (expected 1)
|
||||
ok FACT: an OPEN row rc=1 (expected 1)
|
||||
ok FACT: opened: backdated before the checklist rc=1 (expected 1)
|
||||
ok FACT: a checklist id the template a new app copies lacks rc=1 (expected 1)
|
||||
ok FACT: an exempt app's record with a done that points nowhere rc=1 (expected 1)
|
||||
-- onboarding: the genuine articles (each MUST pass)
|
||||
ok GENUINE: a complete record (catalog + sibling evidence) rc=0 (expected 0)
|
||||
ok GENUINE: an id added AFTER opened: does not bind rc=0 (expected 0)
|
||||
ok GENUINE: an exempt app's record may say open rc=0 (expected 0)
|
||||
ok STATED SKIP: sibling repo absent (the CI shape) - printed, not checked rc=0 (expected 0)
|
||||
|
||||
-- family-gate: genuine and decoys
|
||||
ok GENUINE: a family app, literal exceptions, min 0.287.0, golden 0.287.0 rc=0 (expected 0)
|
||||
ok DECOY: family_gate only in a COMMENT -> not gated, nothing owed rc=0 (expected 0)
|
||||
ok DECOY: no sibling -> rule 3 stated NOT CHECKED rc=0 (expected 0)
|
||||
-- family-gate: the facts (each MUST be refused)
|
||||
ok FACT: an exception that is a regex rc=1 (expected 1)
|
||||
ok FACT: the exception '/' (the whole app) rc=1 (expected 1)
|
||||
ok FACT: an exception with '..' rc=1 (expected 1)
|
||||
ok FACT: an exception list with no gate rc=1 (expected 1)
|
||||
ok FACT: min_controller only in a comment rc=1 (expected 1)
|
||||
ok FACT: min_controller below the release rc=1 (expected 1)
|
||||
ok FACT: newest baked golden below the release rc=1 (expected 1)
|
||||
ok FACT: a golden DIRECTORY 0.287.0 with no bake log (a name is not a bake) rc=1 (expected 1)
|
||||
ok FACT: glance (ruled family-gated, decision 221) without family_gate rc=1 (expected 1)
|
||||
ok FACT: glance with family_gate only in a COMMENT (the label without the fact) rc=1 (expected 1)
|
||||
ok FACT: grimmory (ruled, decisions 63/64) with family_gate: false rc=1 (expected 1)
|
||||
ok GENUINE: glance gated, no exceptions rc=0 (expected 0)
|
||||
|
||||
-- mem-limit-sum: genuine and decoys
|
||||
ok GENUINE: 384+256 = 640M, the field says 640M rc=0 (expected 0)
|
||||
ok GENUINE: 1G is 1024M (1G + 256M = 1280M) rc=0 (expected 0)
|
||||
ok DECOY: a steps/ file with an old figure is not judged rc=0 (expected 0)
|
||||
-- mem-limit-sum: the facts (each MUST be refused)
|
||||
ok FACT: the field under the sum; the right figure only in comments rc=1 (expected 1)
|
||||
ok FACT: reservations: memory makes nothing a limit (service w/o limit) rc=1 (expected 1)
|
||||
ok FACT: mem_limit only OUTSIDE resources: (top level) is no declaration rc=1 (expected 1)
|
||||
ok FACT: an unreadable size is INCONCLUSIVE, never a pass rc=2 (expected 2)
|
||||
|
||||
-- db-credentials: genuine and decoys
|
||||
ok GENUINE + DECOYS: comment, app-service ref, redis, literal - all not judged rc=0 (expected 0)
|
||||
-- db-credentials: the facts (each MUST be refused)
|
||||
ok FACT: list form, the variable has no deploy field rc=1 (expected 1)
|
||||
ok FACT: list form, fed by a `type: password` field rc=1 (expected 1)
|
||||
ok FACT: map form, the variable has no deploy field rc=1 (expected 1)
|
||||
|
||||
-- data-key: genuine and decoys
|
||||
ok GENUINE: a flagged *_ENCRYPTION_KEY; a signing key labelled 'Encryption key' unflagged; bookstack registered rc=0 (expected 0)
|
||||
-- data-key: the facts (each MUST be refused)
|
||||
ok FACT: the flag only in a COMMENT rc=1 (expected 1)
|
||||
ok FACT: the flag only inside the i18n: block rc=1 (expected 1)
|
||||
ok FACT: a REGISTERED data key unflagged (bookstack APP_KEY) rc=1 (expected 1)
|
||||
ok FACT: an unexplained flag (a signing key flagged) rc=1 (expected 1)
|
||||
ok FACT: a stale REGISTRY entry (bookstack has no APP_KEY any more) rc=1 (expected 1)
|
||||
ok FACT: a non-boolean flag is INCONCLUSIVE rc=2 (expected 2)
|
||||
|
||||
-- unclean-boot-images: genuine and decoys
|
||||
ok GENUINE: the block lists the server's image rc=0 (expected 0)
|
||||
ok GENUINE: bumped AND the list updated (flow list) rc=0 (expected 0)
|
||||
ok GENUINE: bumped AND the list updated (block list) rc=0 (expected 0)
|
||||
ok DECOY: the new image only in a compose COMMENT rc=0 (expected 0)
|
||||
ok DECOY: ANOTHER service bumped (machine-learning) rc=0 (expected 0)
|
||||
ok DECOY: the block COMMENTED OUT, server bumped (no block, nothing owed) rc=0 (expected 0)
|
||||
ok DECOY: a template with no block rc=0 (expected 0)
|
||||
-- unclean-boot-images: the facts (each MUST be refused)
|
||||
ok FACT: the server bumped, the list unchanged rc=1 (expected 1)
|
||||
ok FACT: the same in a steps/ file (the ladder) rc=1 (expected 1)
|
||||
ok FACT: the block names a service the compose does not run rc=1 (expected 1)
|
||||
ok FACT: the block lists no images rc=1 (expected 1)
|
||||
|
||||
-- login-kind: genuine and decoys
|
||||
ok GENUINE: login_kind first_visit rc=0 (expected 0)
|
||||
ok GENUINE: login_kind email rc=0 (expected 0)
|
||||
ok GENUINE: login_kind none rc=0 (expected 0)
|
||||
ok GENUINE: quoted value rc=0 (expected 0)
|
||||
ok DECOY: a bad value only in a COMMENT rc=0 (expected 0)
|
||||
ok DECOY: a bad value only in the English block rc=0 (expected 0)
|
||||
ok DECOY: the key under ANOTHER mapping rc=0 (expected 0)
|
||||
-- login-kind: the facts (each MUST be refused)
|
||||
ok FACT: an unknown value rc=1 (expected 1)
|
||||
ok FACT: a wrong case rc=1 (expected 1)
|
||||
ok FACT: the key twice rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
-- image-volumes: genuine
|
||||
ok GENUINE: a named volume AT /romm/assets rc=0 (expected 0)
|
||||
ok GENUINE: a bind AT /romm/assets, quoted rc=0 (expected 0)
|
||||
ok GENUINE: an image not in the registry is not judged rc=0 (expected 0)
|
||||
-- image-volumes: decoys and facts (each MUST be refused)
|
||||
ok DECOY: the mount only in a COMMENT rc=1 (expected 1)
|
||||
ok DECOY: the mount on ANOTHER service rc=1 (expected 1)
|
||||
ok DECOY: the PARENT /romm mounted rc=1 (expected 1)
|
||||
ok DECOY: a CHILD /romm/assets/x mounted rc=1 (expected 1)
|
||||
ok DECOY: only a top-level volume, never mounted rc=1 (expected 1)
|
||||
ok FACT: a steps/ file without it rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
catalog gate decoys OK — 243 case(s), every label judged on its fact (R-421)
|
||||
rc=0 seconds=196
|
||||
@@ -0,0 +1,52 @@
|
||||
ok GENUINE: a bind AT /romm/assets, quoted rc=0 (expected 0)
|
||||
ok GENUINE: an image not in the registry is not judged rc=0 (expected 0)
|
||||
-- image-volumes: decoys and facts (each MUST be refused)
|
||||
ok DECOY: the mount only in a COMMENT rc=1 (expected 1)
|
||||
ok DECOY: the mount on ANOTHER service rc=1 (expected 1)
|
||||
ok DECOY: the PARENT /romm mounted rc=1 (expected 1)
|
||||
ok DECOY: a CHILD /romm/assets/x mounted rc=1 (expected 1)
|
||||
ok DECOY: only a top-level volume, never mounted rc=1 (expected 1)
|
||||
ok FACT: a steps/ file without it rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
FAIL: FACT: a credential token rewritten in translation: rc=0 expected 1; missing ['credential token']
|
||||
code-server 52/52, crafty-controller 57/57, dawarich 54/54, docmost 51/51, emby 22/22, ghost 54/54, gitea 54/54, glance 43/43, grafana 50/50, gramps-web 53/53, grimmory 57/57, grocy 54/54, home-assistant 50/50, homebox 50/50, homepage 43/43, immich 59/59, jellyfin 54/54, karakeep 52/52, kimai 53/53, komga 56/56, lubelogger 57/57, mealie 53/53, metube 51/51, n8n 45/45, navidrome 55/55, nextcloud 60/60, nzbget 55/55, onlyoffice 52/52, opengist 49/49, outline 53/53, paperless-ngx 66/66, papra 50/50, plant-it 48/48, plex 57/57, privatebin 45/45, prowlarr 44/44, qbittorrent 54/54, radarr 55/55, radicale 51/51, rallly 48/48, recipe-importer 52/52, romm 74/74, sabnzbd 60/60, seerr 50/50, sonarr 55/55, sparkyfitness 54/54, tandoor 49/49, termix 46/46, transmission 52/52, uptime-kuma 49/49, vaultwarden 56/56, vikunja 50/50, wanderer 52/52, wger 52/52, wishlist 47/47, zipline 52/52
|
||||
copy-i18n: OK
|
||||
|
||||
|
||||
real 3m12.242s
|
||||
user 3m6.178s
|
||||
sys 0m5.255s
|
||||
1654: case_copy("FACT: a credential token rewritten in translation", clone,
|
||||
1655- [(WG, lambda t: t.replace(" default_creds: 'admin / adminadmin'",
|
||||
1656- " default_creds: 'Sign in: administrator / hunter2'"))],
|
||||
1657- expect_rc=1, must_contain=("credential token 'admin'", "credential token 'adminadmin'"))
|
||||
1658- # The value itself reworded (a digit token, CRED_TOKEN), with the account word kept.
|
||||
1659- CW = "templates/calibre-web/.felhom.yml"
|
||||
1660- case_copy("FACT: a credential value reworded in translation (one digit added)", clone,
|
||||
1661- [(CW, lambda t: t.replace(" default_creds: 'admin / admin123'",
|
||||
1662- " default_creds: 'admin / admin1234'"))],
|
||||
1663- expect_rc=1, must_contain=("credential token 'admin123'", "calibre-web"))
|
||||
1664- case_copy("FACT: an i18n block for a language the controller does not render", clone,
|
||||
1665- [(PB, lambda t: t.rstrip("\n") + "\ni18n:\n de:\n description: \"Verschluesselte Notizen\"\n")],
|
||||
1666- expect_rc=1, must_contain=("renders en only",))
|
||||
1667- case_copy("FACT: an English list with a different number of steps", clone,
|
||||
1668- [(PB, en_with(" - 'Share the link you get - the encryption key is inside the URL'\n", ""))],
|
||||
1669- expect_rc=1, must_contain=("a list is replaced",))
|
||||
1670-
|
||||
1671- # THE RATCHET — the one thing --expect-missing does not test for the cases above, so it is
|
||||
1672- # tested here explicitly, in BOTH directions. A ceiling that only convicts upwards can be
|
||||
1673- # left behind by a push that translated more than it recorded.
|
||||
1674- # The ABOVE case REMOVES privatebin's English (2026-10-05): it used to ADD it and rely on the rest
|
||||
1675- # of the catalog being untranslated, so the day the catalog reached full coverage (ceiling 0) the
|
||||
1676- # tree had nothing missing, the gate rightly said OK, and the case failed on its own premise.
|
||||
1677- case_copy("FACT: ratchet — fewer strings translated than the ceiling records", clone,
|
||||
1678- [(PB, strip_en)], expect_rc=1,
|
||||
1679- must_contain=("English coverage", "ABOVE"),
|
||||
1680- extra_args=("--expect-missing", "0"))
|
||||
1681- case_copy("FACT: ratchet — more translated than the ceiling records", clone,
|
||||
1682- [(PB, add_en())], expect_rc=1,
|
||||
1683- must_contain=("English coverage", "BELOW"),
|
||||
1684- extra_args=("--expect-missing", "999999"))
|
||||
|
||||
[exited with code 0]
|
||||
@@ -0,0 +1,288 @@
|
||||
ok FACT: docmost-postgres major + 1 (read from the clone) rc=1 (expected 1)
|
||||
ok FACT: docmost-postgres major + 1, alone rc=1 (expected 1)
|
||||
ok FACT: kimai-db 11.6 -> 12.3 BUNDLED with the kimai app bump rc=1 (expected 1)
|
||||
ok FACT: kimai-db mariadb:11.6 -> mariadb:lts (major unreadable) rc=2 (expected 2)
|
||||
ok GENUINE: kimai-db mariadb:11.x -> 11.99 (within major) rc=0 (expected 0)
|
||||
ok GENUINE: kimai-db mariadb:11.6 -> 12.3 ALONE (the R-469 lift) rc=0 (expected 0)
|
||||
ok GENUINE: docmost-postgres major+1 ALONE with its proven two-venue MARKED entry rc=0 (expected 0)
|
||||
ok DECOY: the entry is proven on both venues but carries NO conversion mark rc=1 (expected 1)
|
||||
ok DECOY: the marked entry cites ONE venue only (no box_evidence) rc=1 (expected 1)
|
||||
ok DECOY: the mark sits in a COMMENT, the entry has none rc=1 (expected 1)
|
||||
ok DECOY: the marked entry, but the move is BUNDLED with the app's own bump rc=1 (expected 1)
|
||||
ok FACT: adventurelog's postgis 16 -> 17 (the postgis family was never judged before) rc=1 (expected 1)
|
||||
ok DECOY: major moves only in a comment + serverVersion env rc=0 (expected 0)
|
||||
ok DECOY: the APP image crosses a major (kimai 2.57 -> 3.0) rc=0 (expected 0)
|
||||
ok DECOY: 'mariadb:12.3' lands in README.md, not a template rc=0 (expected 0)
|
||||
ok FACT: kimai image moves, catalog_since untouched rc=1 (expected 1)
|
||||
ok FACT: kimai image moves, catalog_since set to a FUTURE year rc=1 (expected 1)
|
||||
ok GENUINE: kimai image moves AND catalog_since = today rc=0 (expected 0)
|
||||
ok DECOY: image moves; today's date lands in a COMMENT and README, the field stays rc=1 (expected 1)
|
||||
ok DECOY: only a comment + env line change, images untouched, date untouched rc=0 (expected 0)
|
||||
ok FACT: a Hungarian byte changed in a frozen string rc=1 (expected 1)
|
||||
ok FACT: an em dash in a Hungarian string (R-932) rc=1 (expected 1)
|
||||
ok FACT: a Hungarian first_step removed rc=1 (expected 1)
|
||||
ok FACT: a NEW app is not in the freeze rc=1 (expected 1)
|
||||
ok FACT: an unknown key inside the English block rc=1 (expected 1)
|
||||
ok FACT: an English deploy field with no Hungarian twin rc=1 (expected 1)
|
||||
ok FACT: an accented Hungarian letter left in the English rc=1 (expected 1)
|
||||
ok FACT: ASCII-only Hungarian left in the English (no accent to find) rc=1 (expected 1)
|
||||
ok FACT: the product begs ("please") rc=1 (expected 1)
|
||||
ok FACT: an English retrieval promise the Hungarian never made rc=1 (expected 1)
|
||||
ok GENUINE: a REGISTERED true retrieval promise passes rc=0 (expected 0)
|
||||
ok FACT: registered for ANOTHER app - the promise still convicts, the entry is stale rc=1 (expected 1)
|
||||
ok FACT: registered on the path, but the sentence was rewritten (match gone) rc=1 (expected 1)
|
||||
ok FACT: a STALE entry - nothing in the English promises it any more rc=1 (expected 1)
|
||||
ok FACT: a registered promise with a two-word reason rc=1 (expected 1)
|
||||
ok FACT: a credential value reworded in translation (one digit added) rc=1 (expected 1)
|
||||
ok FACT: an i18n block for a language the controller does not render rc=1 (expected 1)
|
||||
ok FACT: an English list with a different number of steps rc=1 (expected 1)
|
||||
ok FACT: ratchet — fewer strings translated than the ceiling records rc=1 (expected 1)
|
||||
ok FACT: ratchet — more translated than the ceiling records rc=1 (expected 1)
|
||||
ok GENUINE: a correct English block on privatebin rc=0 (expected 0)
|
||||
ok GENUINE: naming an app does not change the coverage count rc=0 (expected 0)
|
||||
ok FACT(no-yaml): a Hungarian byte changed in a frozen string rc=1 (expected 1)
|
||||
ok FACT(no-yaml): a frozen Hungarian line deleted rc=1 (expected 1)
|
||||
ok FACT(no-yaml): a NEW app is not in the freeze rc=1 (expected 1)
|
||||
ok GENUINE(no-yaml): the untouched tree passes, and SAYS what it did not check rc=0 (expected 0)
|
||||
ok GENUINE(no-yaml): romm's escaped-quote help_texts are still found rc=0 (expected 0)
|
||||
ok DECOY: Hungarian rewritten inside a YAML COMMENT rc=0 (expected 0)
|
||||
ok DECOY: a frozen Hungarian sentence pasted into README.md rc=0 (expected 0)
|
||||
ok DECOY: display_name changed - a NAME, never copy rc=0 (expected 0)
|
||||
ok DECOY: docs_url changed - configuration, never copy rc=0 (expected 0)
|
||||
ok DECOY: Hungarian text added to a docker-compose.yml rc=0 (expected 0)
|
||||
|
||||
-- probe-matches-compose: the facts (each MUST be refused)
|
||||
ok FACT: tandoor's real R-618 port fault, re-introduced rc=1 (expected 1)
|
||||
ok FACT: wger's real R-618 port fault, re-introduced rc=1 (expected 1)
|
||||
ok FACT: zipline's real R-618 path fault, re-introduced rc=1 (expected 1)
|
||||
ok GENUINE: the fixed tree passes rc=0 (expected 0)
|
||||
ok FACT: a clean app given a wrong probe port rc=1 (expected 1)
|
||||
ok FACT: api+expect probe given a path the app does not answer rc=1 (expected 1)
|
||||
-- probe-matches-compose: the decoys (the label moves, the fact does not)
|
||||
ok DECOY: the port moves in a COMMENT in .felhom.yml rc=0 (expected 0)
|
||||
ok DECOY: traefik loadbalancer.server.port changed rc=0 (expected 0)
|
||||
ok DECOY: a published `ports:` mapping changed rc=0 (expected 0)
|
||||
ok DECOY: a NON-probed sidecar's healthcheck port changed rc=0 (expected 0)
|
||||
ok DECOY: path mismatch on a probe that CANNOT fail on it -> WARN, not FAIL rc=0 (expected 0)
|
||||
-- probe-matches-compose: the DEGRADED mode CI actually runs (no PyYAML)
|
||||
ok DEGRADED: the fixed tree passes, and SAYS it is degraded rc=0 (expected 0)
|
||||
ok DEGRADED FACT: tandoor's port fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED FACT: wger's port fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED FACT: zipline's path fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED DECOY: traefik label moves, the fact does not rc=0 (expected 0)
|
||||
-- probe-matches-compose: the probe TARGET (R-630)
|
||||
ok FACT: paperless-ngx without its explicit container is refused rc=1 (expected 1)
|
||||
ok FACT: immich's FOUR prefix candidates are an ambiguity, not a pick rc=1 (expected 1)
|
||||
ok FACT: an explicit container no service declares is refused rc=1 (expected 1)
|
||||
ok GENUINE: both explicit containers resolve rc=0 (expected 0)
|
||||
ok DECOY: the container name moves in a COMMENT, not the field rc=0 (expected 0)
|
||||
ok DECOY: a UNIQUE prefix still resolves without the field rc=0 (expected 0)
|
||||
ok DEGRADED: the explicit container is read without PyYAML too rc=0 (expected 0)
|
||||
ok DEGRADED FACT: removing it still refuses rc=1 (expected 1)
|
||||
-- test-record-move: an image move needs its own proven record
|
||||
ok FACT: a bare image move, no entry rc=1 (expected 1)
|
||||
ok GENUINE: a proven entry whose digest the registry serves rc=0 (expected 0)
|
||||
ok FACT: the entry's verdict is failed rc=1 (expected 1)
|
||||
ok FACT: the registry now serves another digest rc=1 (expected 1)
|
||||
ok INCONCLUSIVE: the registry cannot be asked rc=2 (expected 2)
|
||||
ok DECOY: the entry only in a COMMENT under update_ladder rc=1 (expected 1)
|
||||
ok DECOY: the entry only in README.md rc=1 (expected 1)
|
||||
ok FACT: a new move carrying a BACKFILLED entry rc=1 (expected 1)
|
||||
ok FACT: memory_tight and the limit did not move rc=1 (expected 1)
|
||||
ok GENUINE: memory_tight WITH the limit raised rc=0 (expected 0)
|
||||
ok DECOY: a ref moves in a compose COMMENT only rc=0 (expected 0)
|
||||
-- test-record (static): the newest step IS the compose
|
||||
ok GENUINE: a ladder whose head is the compose rc=0 (expected 0)
|
||||
ok FACT: the compose moved past the ladder's head rc=1 (expected 1)
|
||||
ok FACT: a line that is not one JSON entry rc=1 (expected 1)
|
||||
ok FACT: a gap between steps rc=1 (expected 1)
|
||||
ok FACT: a failed verdict sits in the ladder rc=1 (expected 1)
|
||||
-- test-record (static): every intermediate step carries its own definition
|
||||
ok FACT: a two-step ladder with NO steps/ file for the first step rc=1 (expected 1)
|
||||
ok GENUINE: a two-step ladder whose first step carries its definition rc=0 (expected 0)
|
||||
ok DECOY: the steps/ file has the right NAME and names the head's image rc=1 (expected 1)
|
||||
ok DECOY: the step's definition sits beside the template under another name rc=1 (expected 1)
|
||||
ok FACT: the step has its compose but no .felhom.yml rc=1 (expected 1)
|
||||
ok DECOY: the step's .felhom.yml exists by NAME and holds no healthcheck rc=1 (expected 1)
|
||||
-- test-record: a same-tag re-test (decision 52)
|
||||
ok GENUINE: head + a re-test from its digest, both venues rc=0 (expected 0)
|
||||
ok FACT: a re-test with NO new digest rc=1 (expected 1)
|
||||
ok FACT: a re-test without the box venue rc=1 (expected 1)
|
||||
ok FACT: a re-test FROM a digest the previous entry never tested rc=1 (expected 1)
|
||||
ok DECOY: a re-test that names digest_from only in its evidence text rc=1 (expected 1)
|
||||
ok GENUINE: a re-test whose digest the registry serves now rc=0 (expected 0)
|
||||
ok FACT: a re-test whose digest the registry no longer serves rc=1 (expected 1)
|
||||
ok FACT: a re-test with no new digest reaches the move gate too rc=1 (expected 1)
|
||||
ok probe-measured: genuine komga note passes rc=0 (expected 0)
|
||||
ok probe-measured: note moved into the TAGLINE rc=1 (expected 1)
|
||||
ok probe-measured: date but no before/after rc=1 (expected 1)
|
||||
ok probe-measured: before/after but no date rc=1 (expected 1)
|
||||
ok probe-measured: 'read upstream' is not a measurement rc=1 (expected 1)
|
||||
|
||||
-- copy-i18n: the user guide (each FACT must be refused, naming the key)
|
||||
ok GENUINE: a full Hungarian guide with its English overlay rc=0 (expected 0)
|
||||
ok FACT: guide strings that are not in the freeze rc=1 (expected 1)
|
||||
ok FACT: checked_version in the English block rc=1 (expected 1)
|
||||
ok FACT: a section with an empty steps list rc=1 (expected 1)
|
||||
ok FACT: an FAQ entry with a question and no answer rc=1 (expected 1)
|
||||
ok FACT: an unquoted checked_version (YAML reads 4.10 as 4.1) rc=1 (expected 1)
|
||||
ok FACT: more English sections than Hungarian rc=1 (expected 1)
|
||||
ok FACT: an English section with a different step count rc=1 (expected 1)
|
||||
ok FACT: an English guide with no Hungarian guide rc=1 (expected 1)
|
||||
ok FACT: a tracker named in an English step rc=1 (expected 1)
|
||||
ok FACT: a tracker named in a Hungarian answer (folded, any case) rc=1 (expected 1)
|
||||
ok DECOY: a tracker named only in a YAML comment rc=0 (expected 0)
|
||||
ok DECOY: a source-like word only in docs_url (configuration) rc=0 (expected 0)
|
||||
|
||||
-- guide-version (ADVISORY: WARN on the fact, silent on the label, exit 0 always)
|
||||
ok FACT: the app's image moved off the checked tag (4.0.20 -> 4.0.21) rc=0 (advisory)
|
||||
ok GENUINE: the guide is current rc=0 (advisory)
|
||||
ok DECOY: the checked tag survives only on a SIDECAR rc=0 (advisory)
|
||||
ok DECOY: checked_version only in a COMMENT rc=0 (advisory)
|
||||
ok DECOY: checked_version only inside the English block rc=0 (advisory)
|
||||
ok FACT: an empty checked_version is HIDDEN and named rc=0 (advisory)
|
||||
ok image-pins: FACT: untagged rc=1 (expected 1)
|
||||
ok image-pins: FACT: a registry PORT is not a tag rc=1 (expected 1)
|
||||
ok image-pins: FACT: quoted :latest rc=1 (expected 1)
|
||||
ok image-pins: FACT: :LATEST in capitals rc=1 (expected 1)
|
||||
ok image-pins: FACT: a floating alias (:edge) rc=1 (expected 1)
|
||||
ok image-pins: FACT: untagged with a comment saying pinned rc=1 (expected 1)
|
||||
ok image-pins: FACT: a QUOTED key is the same field rc=1 (expected 1)
|
||||
ok image-pins: FACT: an interpolated ref cannot be read rc=1 (expected 1)
|
||||
ok image-pins: FACT: @sha256: with no digest behind it rc=1 (expected 1)
|
||||
ok image-pins: INERT: a commented-out untagged image rc=0 (expected 0)
|
||||
ok image-pins: INERT: an x- extension field (Compose ignores it) rc=0 (expected 0)
|
||||
ok image-pins: INERT: an untagged image in README.md rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a concrete tag rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a registry port WITH a tag rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a real digest rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: :latest pinned by its digest rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: the real catalog rc=0 (expected 0)
|
||||
ok image-resolvable: GENUINE: every pin resolves rc=0 (expected 0)
|
||||
ok image-resolvable: FACT: the registry says one pin is gone rc=1 (expected 1)
|
||||
ok image-resolvable: LABEL: rc=0 carrying a throttle message rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: rc=0 carrying any error text rc=2 (expected 2)
|
||||
ok image-resolvable: CRY-WOLF: a throttle on rc=1 is not an accusation rc=2 (expected 2)
|
||||
ok image-resolvable: CRY-WOLF: an unrecognised failure is not an accusation rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: a docker that resolves EVERYTHING, the canary too rc=3 (expected 3)
|
||||
ok image-resolvable: LABEL: no docker at all rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: nothing to judge rc=3 (expected 3)
|
||||
ok volume-persistence: injected-prober suite OK
|
||||
ok volume-persistence: LABEL: a runtime that answers nothing rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: no docker at all rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: nothing to judge rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: not a scratch host rc=3 (expected 3)
|
||||
|
||||
-- onboarding: the facts (each MUST be refused)
|
||||
ok FACT: a new template with NO record rc=1 (expected 1)
|
||||
ok FACT: a record missing id 1.4 rc=1 (expected 1)
|
||||
ok FACT: 1.4 answered only inside an HTML comment rc=1 (expected 1)
|
||||
ok FACT: done with a path that does not exist rc=1 (expected 1)
|
||||
ok FACT: done with an EMPTY directory (the mkdir shape) rc=1 (expected 1)
|
||||
ok FACT: done naming an absent file in the sibling repo rc=1 (expected 1)
|
||||
ok FACT: n/a with an EMPTY reason rc=1 (expected 1)
|
||||
ok FACT: n/a with a two-word reason rc=1 (expected 1)
|
||||
ok FACT: an OPEN row rc=1 (expected 1)
|
||||
ok FACT: opened: backdated before the checklist rc=1 (expected 1)
|
||||
ok FACT: a checklist id the template a new app copies lacks rc=1 (expected 1)
|
||||
ok FACT: an exempt app's record with a done that points nowhere rc=1 (expected 1)
|
||||
-- onboarding: the genuine articles (each MUST pass)
|
||||
ok GENUINE: a complete record (catalog + sibling evidence) rc=0 (expected 0)
|
||||
ok GENUINE: an id added AFTER opened: does not bind rc=0 (expected 0)
|
||||
ok GENUINE: an exempt app's record may say open rc=0 (expected 0)
|
||||
ok STATED SKIP: sibling repo absent (the CI shape) - printed, not checked rc=0 (expected 0)
|
||||
|
||||
-- family-gate: genuine and decoys
|
||||
ok GENUINE: a family app, literal exceptions, min 0.287.0, golden 0.287.0 rc=0 (expected 0)
|
||||
ok DECOY: family_gate only in a COMMENT -> not gated, nothing owed rc=0 (expected 0)
|
||||
ok DECOY: no sibling -> rule 3 stated NOT CHECKED rc=0 (expected 0)
|
||||
-- family-gate: the facts (each MUST be refused)
|
||||
ok FACT: an exception that is a regex rc=1 (expected 1)
|
||||
ok FACT: the exception '/' (the whole app) rc=1 (expected 1)
|
||||
ok FACT: an exception with '..' rc=1 (expected 1)
|
||||
ok FACT: an exception list with no gate rc=1 (expected 1)
|
||||
ok FACT: min_controller only in a comment rc=1 (expected 1)
|
||||
ok FACT: min_controller below the release rc=1 (expected 1)
|
||||
ok FACT: newest baked golden below the release rc=1 (expected 1)
|
||||
ok FACT: a golden DIRECTORY 0.287.0 with no bake log (a name is not a bake) rc=1 (expected 1)
|
||||
ok FACT: glance (ruled family-gated, decision 221) without family_gate rc=1 (expected 1)
|
||||
ok FACT: glance with family_gate only in a COMMENT (the label without the fact) rc=1 (expected 1)
|
||||
ok FACT: grimmory (ruled, decisions 63/64) with family_gate: false rc=1 (expected 1)
|
||||
ok GENUINE: glance gated, no exceptions rc=0 (expected 0)
|
||||
|
||||
-- mem-limit-sum: genuine and decoys
|
||||
ok GENUINE: 384+256 = 640M, the field says 640M rc=0 (expected 0)
|
||||
ok GENUINE: 1G is 1024M (1G + 256M = 1280M) rc=0 (expected 0)
|
||||
ok DECOY: a steps/ file with an old figure is not judged rc=0 (expected 0)
|
||||
-- mem-limit-sum: the facts (each MUST be refused)
|
||||
ok FACT: the field under the sum; the right figure only in comments rc=1 (expected 1)
|
||||
ok FACT: reservations: memory makes nothing a limit (service w/o limit) rc=1 (expected 1)
|
||||
ok FACT: mem_limit only OUTSIDE resources: (top level) is no declaration rc=1 (expected 1)
|
||||
ok FACT: an unreadable size is INCONCLUSIVE, never a pass rc=2 (expected 2)
|
||||
|
||||
-- db-credentials: genuine and decoys
|
||||
ok GENUINE + DECOYS: comment, app-service ref, redis, literal - all not judged rc=0 (expected 0)
|
||||
-- db-credentials: the facts (each MUST be refused)
|
||||
ok FACT: list form, the variable has no deploy field rc=1 (expected 1)
|
||||
ok FACT: list form, fed by a `type: password` field rc=1 (expected 1)
|
||||
ok FACT: map form, the variable has no deploy field rc=1 (expected 1)
|
||||
|
||||
-- data-key: genuine and decoys
|
||||
ok GENUINE: a flagged *_ENCRYPTION_KEY; a signing key labelled 'Encryption key' unflagged; bookstack registered rc=0 (expected 0)
|
||||
-- data-key: the facts (each MUST be refused)
|
||||
ok FACT: the flag only in a COMMENT rc=1 (expected 1)
|
||||
ok FACT: the flag only inside the i18n: block rc=1 (expected 1)
|
||||
ok FACT: a REGISTERED data key unflagged (bookstack APP_KEY) rc=1 (expected 1)
|
||||
ok FACT: an unexplained flag (a signing key flagged) rc=1 (expected 1)
|
||||
ok FACT: a stale REGISTRY entry (bookstack has no APP_KEY any more) rc=1 (expected 1)
|
||||
ok FACT: a non-boolean flag is INCONCLUSIVE rc=2 (expected 2)
|
||||
|
||||
-- unclean-boot-images: genuine and decoys
|
||||
ok GENUINE: the block lists the server's image rc=0 (expected 0)
|
||||
ok GENUINE: bumped AND the list updated (flow list) rc=0 (expected 0)
|
||||
ok GENUINE: bumped AND the list updated (block list) rc=0 (expected 0)
|
||||
ok DECOY: the new image only in a compose COMMENT rc=0 (expected 0)
|
||||
ok DECOY: ANOTHER service bumped (machine-learning) rc=0 (expected 0)
|
||||
ok DECOY: the block COMMENTED OUT, server bumped (no block, nothing owed) rc=0 (expected 0)
|
||||
ok DECOY: a template with no block rc=0 (expected 0)
|
||||
-- unclean-boot-images: the facts (each MUST be refused)
|
||||
ok FACT: the server bumped, the list unchanged rc=1 (expected 1)
|
||||
ok FACT: the same in a steps/ file (the ladder) rc=1 (expected 1)
|
||||
ok FACT: the block names a service the compose does not run rc=1 (expected 1)
|
||||
ok FACT: the block lists no images rc=1 (expected 1)
|
||||
|
||||
-- login-kind: genuine and decoys
|
||||
ok GENUINE: login_kind first_visit rc=0 (expected 0)
|
||||
ok GENUINE: login_kind email rc=0 (expected 0)
|
||||
ok GENUINE: login_kind none rc=0 (expected 0)
|
||||
ok GENUINE: quoted value rc=0 (expected 0)
|
||||
ok DECOY: a bad value only in a COMMENT rc=0 (expected 0)
|
||||
ok DECOY: a bad value only in the English block rc=0 (expected 0)
|
||||
ok DECOY: the key under ANOTHER mapping rc=0 (expected 0)
|
||||
-- login-kind: the facts (each MUST be refused)
|
||||
ok FACT: an unknown value rc=1 (expected 1)
|
||||
ok FACT: a wrong case rc=1 (expected 1)
|
||||
ok FACT: the key twice rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
-- image-volumes: genuine
|
||||
ok GENUINE: a named volume AT /romm/assets rc=0 (expected 0)
|
||||
ok GENUINE: a bind AT /romm/assets, quoted rc=0 (expected 0)
|
||||
ok GENUINE: an image not in the registry is not judged rc=0 (expected 0)
|
||||
-- image-volumes: decoys and facts (each MUST be refused)
|
||||
ok DECOY: the mount only in a COMMENT rc=1 (expected 1)
|
||||
ok DECOY: the mount on ANOTHER service rc=1 (expected 1)
|
||||
ok DECOY: the PARENT /romm mounted rc=1 (expected 1)
|
||||
ok DECOY: a CHILD /romm/assets/x mounted rc=1 (expected 1)
|
||||
ok DECOY: only a top-level volume, never mounted rc=1 (expected 1)
|
||||
ok FACT: a steps/ file without it rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
FAIL: FACT: a credential token rewritten in translation: rc=1 expected 1; missing ["credential token 'adminadmin'"]
|
||||
53/53, grimmory 57/57, grocy 54/54, home-assistant 50/50, homebox 50/50, homepage 43/43, immich 59/59, jellyfin 54/54, karakeep 52/52, kimai 53/53, komga 56/56, lubelogger 57/57, mealie 53/53, metube 51/51, n8n 45/45, navidrome 55/55, nextcloud 60/60, nzbget 55/55, onlyoffice 52/52, opengist 49/49, outline 53/53, paperless-ngx 66/66, papra 50/50, plant-it 48/48, plex 57/57, privatebin 45/45, prowlarr 44/44, qbittorrent 54/54, radarr 55/55, radicale 51/51, rallly 48/48, recipe-importer 52/52, romm 74/74, sabnzbd 60/60, seerr 50/50, sonarr 55/55, sparkyfitness 54/54, tandoor 49/49, termix 46/46, transmission 52/52, uptime-kuma 49/49, vaultwarden 56/56, vikunja 50/50, wanderer 52/52, wger 52/52, wishlist 47/47, zipline 52/52
|
||||
|
||||
copy-i18n: FAIL — 1 finding(s)
|
||||
|
||||
- wger / i18n.en.app_info.default_creds: the credential token 'admin' is not in the English text: 'Sign in: administrator / hunter2'
|
||||
|
||||
rc=1 seconds=198
|
||||
@@ -0,0 +1,201 @@
|
||||
controller_gates — 18 gate(s) [--fast]
|
||||
|
||||
==============================================================================
|
||||
== gate: template-id (template_id_gate.py)
|
||||
==============================================================================
|
||||
integrity gate OK — every JS element-ID reference resolves in the page it renders on
|
||||
|
||||
==============================================================================
|
||||
== gate: emoji (emoji_gate.py)
|
||||
==============================================================================
|
||||
emoji gate OK — no emoji in web templates
|
||||
|
||||
==============================================================================
|
||||
== gate: native-confirm (native_confirm_gate.py)
|
||||
==============================================================================
|
||||
native-confirm gate OK — no native confirm()/prompt()/alert() in templates
|
||||
|
||||
==============================================================================
|
||||
== gate: offbox-rename (offbox_rename_gate.py)
|
||||
==============================================================================
|
||||
offbox rename gate OK — Tier-3 is 'Tavoli mentes' everywhere customer-facing (26 file(s) + 129 bundle value(s) named by them)
|
||||
|
||||
==============================================================================
|
||||
== gate: app-row-dedup (app_row_dedup_gate.py)
|
||||
==============================================================================
|
||||
app_row_dedup_gate: OK (row markup single-sourced in app_row.html; 44 templates scanned)
|
||||
|
||||
==============================================================================
|
||||
== gate: mojibake (mojibake_gate.py)
|
||||
==============================================================================
|
||||
mojibake_gate: OK (1187 files clean — no double-encoding signatures)
|
||||
|
||||
==============================================================================
|
||||
== gate: docker-v (docker_run_volume_path_gate.py)
|
||||
==============================================================================
|
||||
docker -v gate OK — every volume mount is named-volume or proven host-visible
|
||||
|
||||
==============================================================================
|
||||
== gate: secret-markup (secret_in_markup_gate.py)
|
||||
==============================================================================
|
||||
secret-in-markup gate OK — 44 templates, no secret-named expression rendered
|
||||
(NAME-BASED: blind to a secret arriving under a neutral PAGE-DATA key — see the docstring)
|
||||
|
||||
==============================================================================
|
||||
== gate: retrieval-promise (retrieval_promise_gate.py)
|
||||
==============================================================================
|
||||
retrieval-promise gate OK — 45 surface(s) incl. 1 Go handler file(s), 18 registered claim(s) + 16 English, none unregistered
|
||||
(BLIND SPOT: it registers WHERE the claim is made, not whether each conditional is wired
|
||||
to a true predicate — that is what the R-302 render tests are for.)
|
||||
|
||||
==============================================================================
|
||||
== gate: debug-routes (debug_route_gate.py)
|
||||
==============================================================================
|
||||
debug route gate OK - 19 referenced address(es), all dispatched, none orphaned
|
||||
|
||||
==============================================================================
|
||||
== gate: reuse-refs (reuse_refs_check.py /mnt/5_hdd/felhom.eu/git/felhom-controller)
|
||||
==============================================================================
|
||||
note [felhom-controller] line 15: backup/appbackup_bridge.go (resolved by suffix → controller/internal/backup/appbackup_bridge.go)
|
||||
note [felhom-controller] line 19: appbackup/userdata.go (resolved by suffix → controller/internal/appbackup/userdata.go)
|
||||
note [felhom-controller] line 19: stacks/skeleton_derive.go (resolved by suffix → controller/internal/stacks/skeleton_derive.go)
|
||||
note [felhom-controller] line 64: internal/report/builder.go (resolved by suffix → controller/internal/report/builder.go)
|
||||
note [felhom-controller] line 95: stacks/deploy.go (resolved by suffix → controller/internal/stacks/deploy.go)
|
||||
note [felhom-controller] line 155: cmd/controller/main.go (resolved by suffix → controller/cmd/controller/main.go)
|
||||
note [felhom-controller] line 172: internal/selfupdate/updater.go (resolved by suffix → controller/internal/selfupdate/updater.go)
|
||||
note [felhom-controller] line 180: appbackup/appdata.go (resolved by suffix → controller/internal/appbackup/appdata.go)
|
||||
note [felhom-controller] line 206: scripts/secret_in_markup_gate.py (resolved by suffix → controller/scripts/secret_in_markup_gate.py)
|
||||
note [felhom-controller] line 258: hub/internal/api/handler.go (cross-repo → felhom.eu/hub/internal/api/handler.go)
|
||||
note [felhom-controller] line 258: hub/internal/notify/dispatcher.go (cross-repo → felhom.eu/hub/internal/notify/dispatcher.go)
|
||||
note [felhom-controller] line 275: monitor/deadline.go (cross-repo (suffix) → felhom.eu/hub/internal/monitor/deadline.go)
|
||||
note [felhom-controller] line 320: wgsync/reconciler.go (cross-repo (suffix) → felhom.eu/hub/internal/wgsync/reconciler.go)
|
||||
note [felhom-controller] line 325: templates/app_shell.html (resolved by suffix → controller/internal/web/templates/app_shell.html)
|
||||
note [felhom-controller] line 361: api/router.go (resolved by suffix → controller/internal/api/router.go)
|
||||
note [felhom-controller] line 378: cmd/controller/r856_wiring_test.go (resolved by suffix → controller/cmd/controller/r856_wiring_test.go)
|
||||
note [felhom-controller] line 387: web/netprobe.go (resolved by suffix → controller/internal/web/netprobe.go)
|
||||
note [felhom-controller] line 387: web/server.go (resolved by suffix → controller/internal/web/server.go)
|
||||
note [felhom-controller] line 411: felhom.eu/scripts/golden_currency_gate.py (cross-repo → felhom.eu/scripts/golden_currency_gate.py)
|
||||
OK [felhom-controller]: 231 cited paths — exact 212, suffix 14, ambiguous 0, cross-repo 5, FAILED 0 (siblings searched: app-catalog-felhom.eu, felhom-agent, felhom.eu, felhom.eu-media, felhom.eu-sizing-push, felhom.eu-wt-sizing)
|
||||
|
||||
==============================================================================
|
||||
== gate: instructions (instructions_gate.py /mnt/5_hdd/felhom.eu/git/felhom-controller)
|
||||
==============================================================================
|
||||
instructions_gate: /mnt/5_hdd/felhom.eu/git/felhom-controller
|
||||
CLAUDE.md effective lines : 92 (ceiling 200)
|
||||
version literals : 0
|
||||
TEMPORARY blocks : 0
|
||||
rule files : 5 (4 path-scoped)
|
||||
workspace file : SYMLINK -> felhom.eu/documentation/runbooks/workspace-CLAUDE.md (resolves to the versioned copy)
|
||||
memory index : 200 lines (ceiling 200), 24321 bytes (ceiling 25600)
|
||||
memory index content : 28 version literal(s), 3 host address(es), 0 expired statement(s) [WARN only]
|
||||
memory topic files : 177 indexed, 4 orphaned, 41 archived
|
||||
register citations : 12 cited, 1077 register items known
|
||||
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:30: version literal '0.14.0' — the fleet is not uniform, so it is stale within a day. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- **[restic 0.14.0 `--verify` is size+mtime, NOT content](restic-0140-verify-and-lock-sema
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:90: version literal '0.142.0' — the fleet is not uniform, so it is stale within a day. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- [Offsite continuity](offsite-continuity-2026-07-17.md) — ctrl 0.142.0 orphan guard + hub
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:90: version literal '0.60.0' — the fleet is not uniform, so it is stale within a day. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- [Offsite continuity](offsite-continuity-2026-07-17.md) — ctrl 0.142.0 orphan guard + hub
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:97: version literal '0.152.0' — the fleet is not uniform, so it is stale within a day. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- **[Hub operator UI: CC uses its token HUB_TOKEN, not the password](hub-operator-ui-basic
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:101: version literal '0.90.1' — the fleet is not uniform, so it is stale within a day. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- [Agent 0.90.1 is wrapper-only](agent-0901-is-wrapper-only.md) — do NOT publish the binar
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:103: version literal '0.144.0' — the fleet is not uniform, so it is stale within a day. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- [SMB „Megosztás" R-7 slice 1](smb-sharing-r7-slice1-2026-07-18.md) — ctrl 0.144.0 + felh
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md: ... and 22 more version literal(s) — full list from the tally counts above.
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:59: host address '192.168.0.192' — operations/nodes.md is the single home for these. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- [hub.felhom.eu resolves to the LAN here](hub-resolves-to-lan-on-dooplex-network.md) — 19
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:78: host address '167.233.158.164' — operations/nodes.md is the single home for these. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- [Offsite PBS box RAM ceiling](offsite-pbs-box-ram-ceiling-2026-07-27.md) — **root SSH =
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory/MEMORY.md:185: host address '192.168.0.180' — operations/nodes.md is the single home for these. Not a failure: Claude writes this file between sessions, so this warning is aimed at the model that will next edit it, not at whoever is pushing.
|
||||
- **CC runs ON DooPlex** (192.168.0.180) — repos `/mnt/5_hdd/felhom.eu/git/felhom-*`, buil
|
||||
WARNING: /mnt/5_hdd/felhom.eu/git/.claude-memory: 4 top-level topic file(s) are not referenced by MEMORY.md, so nothing will ever read them: f10-demo-hp-offsite-resolved-2026-07-23.md, launcher-v0163-2026-07-24.md, peti-return-p1-stop-2026-07-13.md, stopped-not-fault-v0164-2026-07-24.md
|
||||
|
||||
instructions_gate: OK (11 warning(s))
|
||||
|
||||
==============================================================================
|
||||
== gate: observations (observations_gate.py /mnt/5_hdd/felhom.eu/git/felhom-controller)
|
||||
==============================================================================
|
||||
report : /mnt/5_hdd/felhom.eu/git/felhom-controller/REPORT.md
|
||||
section : ## 4. Observations
|
||||
observation items : 8
|
||||
OK 1. FILED R-1109
|
||||
OK 2. FILED R-1110
|
||||
OK 3. FILED R-1111
|
||||
OK 4. FILED R-1112
|
||||
OK 5. FILED R-1113
|
||||
OK 6. FILED R-1114
|
||||
OK 7. NOT-A-FINDING
|
||||
OK 8. NOT-A-FINDING
|
||||
observations gate OK — every observation is either filed or explicitly declared
|
||||
|
||||
==============================================================================
|
||||
== gate: minagent-header (minagent_header_gate.py)
|
||||
==============================================================================
|
||||
minagent header gate OK — v0.324.0 declares MinAgent 0.158.1
|
||||
|
||||
==============================================================================
|
||||
== gate: i18n (i18n_missing_gate.py)
|
||||
==============================================================================
|
||||
i18n: 2051 markers in 44 templates; hu 2764 keys, en 2776 keys
|
||||
i18n: English missing 0 (ceiling 0); Hungarian formal forms 0 (ceiling 0, R-516)
|
||||
i18n gate OK
|
||||
|
||||
==============================================================================
|
||||
== gate: go-parity (i18n_go_parity.py)
|
||||
==============================================================================
|
||||
go-parity: base capture 736f54b49610 (7467 literals), 773 slice-2 keys listed, 272 pre-existing, 776 named in Go, 585 helper calls judged for arity
|
||||
go-parity gate OK: every Go-side key carries base-commit text, byte for byte, and every judged call passes as many arguments as its message has verbs.
|
||||
|
||||
==============================================================================
|
||||
== gate: gofmt (gofmt_gate.py)
|
||||
==============================================================================
|
||||
gofmt gate OK — every Go file under cmd, internal is gofmt-clean
|
||||
|
||||
==============================================================================
|
||||
== gate: golden-notice (golden_notice.py /mnt/5_hdd/felhom.eu/git/felhom-controller)
|
||||
==============================================================================
|
||||
==============================================================================
|
||||
NOTICE — v0.324.0 OWES A GOLDEN. (this NEVER blocks; see the docstring)
|
||||
==============================================================================
|
||||
newest released controller : 0.324.0 (this repo's CHANGELOG.md)
|
||||
newest golden baked : 0.318.0 (felhom.eu documentation/tests/)
|
||||
|
||||
A machine installed right now would receive 0.318.0, not 0.324.0.
|
||||
|
||||
This is a REMINDER AT THE ONE MOMENT IT IS USEFUL — you are in the repo where the
|
||||
release happens. It does not block, and must not: at the moment a release is
|
||||
committed the golden cannot exist yet.
|
||||
|
||||
WHAT CLEARS IT: bake a golden (felhom.eu documentation/runbooks/RUNBOOK-manual-build.md
|
||||
section 4.1), then vouch it — a THREE-field change: golden_version + agent_version +
|
||||
min_agent. The bake record lands in felhom.eu documentation/tests/golden-<ver>-<date>/.
|
||||
|
||||
If this release deliberately needs no golden, record a waiver row in
|
||||
felhom.eu documentation/backlog/OPEN-ITEMS.md — never a habit of bypassing.
|
||||
==============================================================================
|
||||
|
||||
==============================================================================
|
||||
== summary
|
||||
==============================================================================
|
||||
template-id OK (exit 0)
|
||||
emoji OK (exit 0)
|
||||
native-confirm OK (exit 0)
|
||||
offbox-rename OK (exit 0)
|
||||
app-row-dedup OK (exit 0)
|
||||
mojibake OK (exit 0)
|
||||
docker-v OK (exit 0)
|
||||
secret-markup OK (exit 0)
|
||||
retrieval-promise OK (exit 0)
|
||||
debug-routes OK (exit 0)
|
||||
reuse-refs OK (exit 0)
|
||||
instructions OK (exit 0)
|
||||
observations OK (exit 0)
|
||||
minagent-header OK (exit 0)
|
||||
i18n OK (exit 0)
|
||||
go-parity OK (exit 0)
|
||||
gofmt OK (exit 0)
|
||||
golden-notice ADVISORY (exit 0, advisory)
|
||||
|
||||
all controller gates OK
|
||||
@@ -0,0 +1,178 @@
|
||||
controller_gates — 18 gate(s) [--fast]
|
||||
|
||||
==============================================================================
|
||||
== gate: template-id (template_id_gate.py)
|
||||
==============================================================================
|
||||
integrity gate OK — every JS element-ID reference resolves in the page it renders on
|
||||
|
||||
==============================================================================
|
||||
== gate: emoji (emoji_gate.py)
|
||||
==============================================================================
|
||||
emoji gate OK — no emoji in web templates
|
||||
|
||||
==============================================================================
|
||||
== gate: native-confirm (native_confirm_gate.py)
|
||||
==============================================================================
|
||||
native-confirm gate OK — no native confirm()/prompt()/alert() in templates
|
||||
|
||||
==============================================================================
|
||||
== gate: offbox-rename (offbox_rename_gate.py)
|
||||
==============================================================================
|
||||
offbox rename gate OK — Tier-3 is 'Tavoli mentes' everywhere customer-facing (26 file(s) + 129 bundle value(s) named by them)
|
||||
|
||||
==============================================================================
|
||||
== gate: app-row-dedup (app_row_dedup_gate.py)
|
||||
==============================================================================
|
||||
app_row_dedup_gate: OK (row markup single-sourced in app_row.html; 44 templates scanned)
|
||||
|
||||
==============================================================================
|
||||
== gate: mojibake (mojibake_gate.py)
|
||||
==============================================================================
|
||||
mojibake_gate: OK (1187 files clean — no double-encoding signatures)
|
||||
|
||||
==============================================================================
|
||||
== gate: docker-v (docker_run_volume_path_gate.py)
|
||||
==============================================================================
|
||||
docker -v gate OK — every volume mount is named-volume or proven host-visible
|
||||
|
||||
==============================================================================
|
||||
== gate: secret-markup (secret_in_markup_gate.py)
|
||||
==============================================================================
|
||||
secret-in-markup gate OK — 44 templates, no secret-named expression rendered
|
||||
(NAME-BASED: blind to a secret arriving under a neutral PAGE-DATA key — see the docstring)
|
||||
|
||||
==============================================================================
|
||||
== gate: retrieval-promise (retrieval_promise_gate.py)
|
||||
==============================================================================
|
||||
retrieval-promise gate OK — 45 surface(s) incl. 1 Go handler file(s), 18 registered claim(s) + 16 English, none unregistered
|
||||
(BLIND SPOT: it registers WHERE the claim is made, not whether each conditional is wired
|
||||
to a true predicate — that is what the R-302 render tests are for.)
|
||||
|
||||
==============================================================================
|
||||
== gate: debug-routes (debug_route_gate.py)
|
||||
==============================================================================
|
||||
debug route gate OK - 19 referenced address(es), all dispatched, none orphaned
|
||||
|
||||
==============================================================================
|
||||
== gate: reuse-refs (reuse_refs_check.py /mnt/5_hdd/felhom.eu/wt/b3-gates)
|
||||
==============================================================================
|
||||
note [b3-gates] line 15: backup/appbackup_bridge.go (resolved by suffix → controller/internal/backup/appbackup_bridge.go)
|
||||
note [b3-gates] line 19: appbackup/userdata.go (resolved by suffix → controller/internal/appbackup/userdata.go)
|
||||
note [b3-gates] line 19: stacks/skeleton_derive.go (resolved by suffix → controller/internal/stacks/skeleton_derive.go)
|
||||
note [b3-gates] line 64: internal/report/builder.go (resolved by suffix → controller/internal/report/builder.go)
|
||||
note [b3-gates] line 95: stacks/deploy.go (resolved by suffix → controller/internal/stacks/deploy.go)
|
||||
note [b3-gates] line 155: cmd/controller/main.go (resolved by suffix → controller/cmd/controller/main.go)
|
||||
note [b3-gates] line 172: internal/selfupdate/updater.go (resolved by suffix → controller/internal/selfupdate/updater.go)
|
||||
note [b3-gates] line 180: appbackup/appdata.go (resolved by suffix → controller/internal/appbackup/appdata.go)
|
||||
note [b3-gates] line 206: scripts/secret_in_markup_gate.py (resolved by suffix → controller/scripts/secret_in_markup_gate.py)
|
||||
note [b3-gates] line 258: hub/internal/api/handler.go (cross-repo → felhom.eu/hub/internal/api/handler.go)
|
||||
note [b3-gates] line 258: hub/internal/notify/dispatcher.go (cross-repo → felhom.eu/hub/internal/notify/dispatcher.go)
|
||||
note [b3-gates] line 275: monitor/deadline.go (cross-repo (suffix) → felhom.eu/hub/internal/monitor/deadline.go)
|
||||
note [b3-gates] line 320: wgsync/reconciler.go (cross-repo (suffix) → felhom.eu/hub/internal/wgsync/reconciler.go)
|
||||
note [b3-gates] line 325: templates/app_shell.html (resolved by suffix → controller/internal/web/templates/app_shell.html)
|
||||
note [b3-gates] line 361: api/router.go (resolved by suffix → controller/internal/api/router.go)
|
||||
note [b3-gates] line 378: cmd/controller/r856_wiring_test.go (resolved by suffix → controller/cmd/controller/r856_wiring_test.go)
|
||||
note [b3-gates] line 387: web/netprobe.go (resolved by suffix → controller/internal/web/netprobe.go)
|
||||
note [b3-gates] line 387: web/server.go (resolved by suffix → controller/internal/web/server.go)
|
||||
note [b3-gates] line 411: felhom.eu/scripts/golden_currency_gate.py (cross-repo → felhom.eu/scripts/golden_currency_gate.py)
|
||||
OK [b3-gates]: 231 cited paths — exact 212, suffix 14, ambiguous 0, cross-repo 5, FAILED 0 (siblings searched: app-catalog-felhom.eu, felhom-agent, felhom.eu, felhom.eu-media, felhom.eu-sizing-push, felhom.eu-wt-sizing)
|
||||
|
||||
==============================================================================
|
||||
== gate: instructions (instructions_gate.py /mnt/5_hdd/felhom.eu/wt/b3-gates)
|
||||
==============================================================================
|
||||
instructions_gate: /mnt/5_hdd/felhom.eu/wt/b3-gates
|
||||
CLAUDE.md effective lines : 92 (ceiling 200)
|
||||
version literals : 0
|
||||
TEMPORARY blocks : 0
|
||||
rule files : 5 (4 path-scoped)
|
||||
workspace copy : n/a (not this workspace)
|
||||
memory index : absent (.claude-memory/ not on this host — the auto-memory store is machine-local by design, so a clone elsewhere legitimately has none; PASS with reason)
|
||||
register citations : n/a (no OPEN-ITEMS.md — not this workspace)
|
||||
|
||||
instructions_gate: OK
|
||||
|
||||
==============================================================================
|
||||
== gate: observations (observations_gate.py /mnt/5_hdd/felhom.eu/wt/b3-gates)
|
||||
==============================================================================
|
||||
report : /mnt/5_hdd/felhom.eu/wt/b3-gates/REPORT.md
|
||||
section : ## 4. Observations
|
||||
observation items : 8
|
||||
OK 1. FILED R-1109
|
||||
OK 2. FILED R-1110
|
||||
OK 3. FILED R-1111
|
||||
OK 4. FILED R-1112
|
||||
OK 5. FILED R-1113
|
||||
OK 6. FILED R-1114
|
||||
OK 7. NOT-A-FINDING
|
||||
OK 8. NOT-A-FINDING
|
||||
observations gate OK — every observation is either filed or explicitly declared
|
||||
|
||||
==============================================================================
|
||||
== gate: minagent-header (minagent_header_gate.py)
|
||||
==============================================================================
|
||||
minagent header gate OK — v0.324.0 declares MinAgent 0.158.1
|
||||
|
||||
==============================================================================
|
||||
== gate: i18n (i18n_missing_gate.py)
|
||||
==============================================================================
|
||||
i18n: 2051 markers in 44 templates; hu 2764 keys, en 2776 keys
|
||||
i18n: English missing 0 (ceiling 0); Hungarian formal forms 0 (ceiling 0, R-516)
|
||||
i18n gate OK
|
||||
|
||||
==============================================================================
|
||||
== gate: go-parity (i18n_go_parity.py)
|
||||
==============================================================================
|
||||
go-parity: base capture 736f54b49610 (7467 literals), 773 slice-2 keys listed, 272 pre-existing, 776 named in Go, 585 helper calls judged for arity
|
||||
go-parity gate OK: every Go-side key carries base-commit text, byte for byte, and every judged call passes as many arguments as its message has verbs.
|
||||
|
||||
==============================================================================
|
||||
== gate: gofmt (gofmt_gate.py)
|
||||
==============================================================================
|
||||
gofmt gate OK — every Go file under cmd, internal is gofmt-clean
|
||||
|
||||
==============================================================================
|
||||
== gate: golden-notice (golden_notice.py /mnt/5_hdd/felhom.eu/wt/b3-gates)
|
||||
==============================================================================
|
||||
==============================================================================
|
||||
NOTICE — v0.324.0 OWES A GOLDEN. (this NEVER blocks; see the docstring)
|
||||
==============================================================================
|
||||
newest released controller : 0.324.0 (this repo's CHANGELOG.md)
|
||||
newest golden baked : 0.318.0 (felhom.eu documentation/tests/)
|
||||
|
||||
A machine installed right now would receive 0.318.0, not 0.324.0.
|
||||
|
||||
This is a REMINDER AT THE ONE MOMENT IT IS USEFUL — you are in the repo where the
|
||||
release happens. It does not block, and must not: at the moment a release is
|
||||
committed the golden cannot exist yet.
|
||||
|
||||
WHAT CLEARS IT: bake a golden (felhom.eu documentation/runbooks/RUNBOOK-manual-build.md
|
||||
section 4.1), then vouch it — a THREE-field change: golden_version + agent_version +
|
||||
min_agent. The bake record lands in felhom.eu documentation/tests/golden-<ver>-<date>/.
|
||||
|
||||
If this release deliberately needs no golden, record a waiver row in
|
||||
felhom.eu documentation/backlog/OPEN-ITEMS.md — never a habit of bypassing.
|
||||
==============================================================================
|
||||
|
||||
==============================================================================
|
||||
== summary
|
||||
==============================================================================
|
||||
template-id OK (exit 0)
|
||||
emoji OK (exit 0)
|
||||
native-confirm OK (exit 0)
|
||||
offbox-rename OK (exit 0)
|
||||
app-row-dedup OK (exit 0)
|
||||
mojibake OK (exit 0)
|
||||
docker-v OK (exit 0)
|
||||
secret-markup OK (exit 0)
|
||||
retrieval-promise OK (exit 0)
|
||||
debug-routes OK (exit 0)
|
||||
reuse-refs OK (exit 0)
|
||||
instructions OK (exit 0)
|
||||
observations OK (exit 0)
|
||||
minagent-header OK (exit 0)
|
||||
i18n OK (exit 0)
|
||||
go-parity OK (exit 0)
|
||||
gofmt OK (exit 0)
|
||||
golden-notice ADVISORY (exit 0, advisory)
|
||||
|
||||
all controller gates OK
|
||||
@@ -0,0 +1,9 @@
|
||||
--- FAIL: TestRenderSambaCompose_ConfigHashLabel (0.00s)
|
||||
samba_test.go:125: a same-path rename left the compose byte-identical — compose up -d will not recreate (R-1109):
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/infra 0.007s
|
||||
--- FAIL: TestSambaReconcile_SamePathRenameChangesCompose (0.00s)
|
||||
samba_test.go:204: a same-path rename left docker-compose.yml unchanged — the running container is never recreated (R-1109)
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/stacks 0.018s
|
||||
FAIL
|
||||
@@ -0,0 +1,10 @@
|
||||
--- FAIL: TestNoBareDrivePathToPathHelpers (0.35s)
|
||||
userdata_bare_drive_guard_test.go:124: internal/backup/offbox.go:1307 (discoverOffboxUnit): nr — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
userdata_bare_drive_guard_test.go:124: internal/backup/offbox_placement.go:168 (RecordedUnitForStack): root — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
userdata_bare_drive_guard_test.go:124: internal/backup/removed_units.go:125 (ListRemovedAppUnits): root — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
userdata_bare_drive_guard_test.go:124: internal/backup/removed_units.go:134 (ListRemovedAppUnits): root — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
userdata_bare_drive_guard_test.go:124: internal/stacks/delete.go:913 (GetStackBackupData): drivePath — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
userdata_bare_drive_guard_test.go:124: internal/web/handlers.go:3434 (appDetailsForPath): storagePath — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
FAIL
|
||||
FAIL gitea.dooplex.hu/admin/felhom-controller/internal/appbackup 0.680s
|
||||
FAIL
|
||||
@@ -0,0 +1,32 @@
|
||||
1 CENSUS 42
|
||||
1 internal/api/router.go:removeStack
|
||||
1 internal/appbackup/paths.go:AppDBDumpPath
|
||||
1 internal/appbackup/paths.go:AppVolumeDumpPath
|
||||
1 internal/appbackup/paths.go:RecoveryUnitComposePath
|
||||
1 internal/appbackup/paths.go:RecoveryUnitManifestPath
|
||||
1 internal/backup/appbackup_bridge.go:AppDataDir
|
||||
1 internal/backup/appbackup_bridge.go:PrimaryBackupPath
|
||||
1 internal/backup/appbackup_bridge.go:RecoveryUnitPath
|
||||
1 internal/backup/backup.go:DumpAppVolumes
|
||||
2 internal/backup/backup.go:pruneStalePrimaryDirs
|
||||
1 internal/backup/backup.go:runDBDumpsInternal
|
||||
1 internal/backup/kept_load.go:PrimaryUnitHome
|
||||
1 internal/backup/offbox.go:discoverOffboxUnit
|
||||
1 internal/backup/offbox_placement.go:RecordedUnitForStack
|
||||
2 internal/backup/recovery_unit.go:captureRecoveryUnit
|
||||
2 internal/backup/removed_units.go:ListRemovedAppUnits
|
||||
1 internal/backup/restore_points.go:ListRestorePoints
|
||||
1 internal/backup/restore_unit.go:primaryUnitDirFor
|
||||
1 internal/backup/tier2.go:RunTier2
|
||||
1 internal/backup/tier2.go:Tier2Info
|
||||
1 internal/backup/tier2_capture.go:tier2CaptureSet
|
||||
1 internal/backup/tier2_restore.go:rehydratePrimaryUnit
|
||||
1 internal/backup/update_guard.go:RunAppBackupNow
|
||||
1 internal/stacks/delete.go:GetStackBackupData
|
||||
1 internal/stacks/migrate.go:appDataSkipSet
|
||||
2 internal/stacks/migrate.go:migCleanup
|
||||
4 internal/stacks/migrate.go:migCopy
|
||||
2 internal/stacks/migrate.go:migSourceSize
|
||||
1 internal/stacks/migrate.go:migValidate
|
||||
4 internal/stacks/migrate.go:migVerify
|
||||
1 internal/web/handlers.go:appDetailsForPath
|
||||
@@ -0,0 +1,3 @@
|
||||
--- FAIL: TestNoBareDrivePathToPathHelpers (0.27s)
|
||||
userdata_bare_drive_guard_test.go:124: internal/backup/tier2_restore.go:253 (rehydratePrimaryUnit): drivePath — the first argument is not a namespace root by construction. Put a drive path through appbackup.NamespaceRootFor(drive, systemDataPath) first (R-203, R-1110).
|
||||
FAIL
|
||||
@@ -0,0 +1,5 @@
|
||||
--- FAIL: TestR1112_StartConvertsTheFamilyFile (0.00s)
|
||||
r1111_r1113_test.go:333: family.json still holds the session value after the start: {"members":[],"sessions":[{"id":"0f1e2d3c4b5a69788796a5b4c3d2e1f00f1e2d3c4b5a6978","member":"","gen":0,"exp":"2026-11-06T07:48:09Z"}]}
|
||||
FAIL
|
||||
--- FAIL: TestR1112_MainOpensTheFamilyStore (0.01s)
|
||||
r856_wiring_test.go:83: main.go does not call OpenFamilyStore — an old family.json keeps its session values until a family request
|
||||
@@ -0,0 +1,7 @@
|
||||
ok N1 the normal clone finds ../felhom.eu
|
||||
ok F1 a fixture dir inside a repo keeps its own ../felhom.eu
|
||||
ok G1 no git at all keeps ../felhom.eu
|
||||
ok E1 FELHOM_SHARED_SCRIPTS wins
|
||||
|
||||
FAIL:
|
||||
- W1 a worktree outside git/ finds the MAIN clone's sibling: resolved to /tmp/r1114-hbxrxu0g/wt/felhom.eu/scripts, want /tmp/r1114-hbxrxu0g/git/felhom.eu/scripts
|
||||
@@ -0,0 +1,230 @@
|
||||
== before: family.json sessions 2 household 2 keys ['exp', 'fp', 'gen', 'member']
|
||||
== browser pass 1
|
||||
{
|
||||
"1_sign_in_lands_on": "/launcher",
|
||||
"2_headers": {
|
||||
"status": 200,
|
||||
"xfo": "DENY",
|
||||
},
|
||||
"3_signout_control": {
|
||||
"method": "post",
|
||||
"hasCsrf": true
|
||||
},
|
||||
"4_after_signout": "/login",
|
||||
"5_launcher_after_signout": "/login",
|
||||
"6_sign_in_again": "/launcher",
|
||||
"7_app metube-r1112.enkisfelhom.hu": {
|
||||
"host": "metube-r1112.enkisfelhom.hu",
|
||||
"path": "/",
|
||||
"title": "MeTube",
|
||||
"gatePage": false
|
||||
},
|
||||
"console": [
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
|
||||
]
|
||||
]
|
||||
}
|
||||
== after pass 1: family.json sessions 2 household 2 keys ['exp', 'fp', 'gen', 'member']
|
||||
== browser pass 2
|
||||
rm: cannot remove '<scratch>': Directory not empty
|
||||
{
|
||||
"1_sign_in_lands_on": "/launcher",
|
||||
"2_headers": {
|
||||
"status": 200,
|
||||
"xfo": "DENY",
|
||||
},
|
||||
"3_signout_control": {
|
||||
"method": "post",
|
||||
"hasCsrf": true
|
||||
},
|
||||
"4_after_signout": "/login",
|
||||
"5_launcher_after_signout": "/login",
|
||||
"6_sign_in_again": "/launcher",
|
||||
"7_app metube-r1112.enkisfelhom.hu": {
|
||||
"host": "metube-r1112.enkisfelhom.hu",
|
||||
"path": "/",
|
||||
"title": "MeTube",
|
||||
"gatePage": false
|
||||
},
|
||||
"console": [
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
|
||||
]
|
||||
]
|
||||
}
|
||||
== after pass 2: family.json sessions 2 household 2 keys ['exp', 'fp', 'gen', 'member']
|
||||
== browser pass 3
|
||||
{
|
||||
"1_sign_in_lands_on": "/launcher",
|
||||
"2_headers": {
|
||||
"status": 200,
|
||||
"xfo": "DENY",
|
||||
},
|
||||
"3_signout_control": {
|
||||
"method": "post",
|
||||
"hasCsrf": true
|
||||
},
|
||||
"4_after_signout": "/login",
|
||||
"5_launcher_after_signout": "/login",
|
||||
"6_sign_in_again": "/launcher",
|
||||
"7_app metube-r1112.enkisfelhom.hu": {
|
||||
"host": "metube-r1112.enkisfelhom.hu",
|
||||
"path": "/",
|
||||
"title": "MeTube",
|
||||
"gatePage": false
|
||||
},
|
||||
"console": [
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/adventurelog-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/docmost-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/kimai-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/opengist-logo.svg"
|
||||
],
|
||||
[
|
||||
"log-error",
|
||||
"Failed to load resource: the server responded with a status of 404 ()",
|
||||
"https://felhom.enkisfelhom.hu/static/assets/privatebin-logo.svg"
|
||||
]
|
||||
]
|
||||
}
|
||||
== after pass 3: family.json sessions 2 household 2 keys ['exp', 'fp', 'gen', 'member']
|
||||
10:00:55 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'metube', 'volumes_removed': ['metube_metube_state'], 'hdd_paths_removed': [], 'hdd_paths_preserved': [], 'userdata_kept': ['/m
|
||||
10:01:04 [X] after remove: deployed=False leftovers='/opt/docker/stacks/metube'
|
||||
remove: 200
|
||||
/mnt/felhom-drives/hdd_1/userdata/media/metube
|
||||
rmdir: failed to remove '/mnt/felhom-drives/hdd_1/userdata/media/metube/*': No such file or directory
|
||||
ls: cannot access '/mnt/felhom-drives/hdd_1/userdata/media/metube': No such file or directory
|
||||
@@ -0,0 +1,65 @@
|
||||
09:44:00 POST /sharing/enable {'enabled': 'on', 'server_name': 'FELHOMHP'} -> HTTP/2 303 /sharing?flash=flash.sharing.saved_preparing
|
||||
09:44:01 POST /sharing/password {'smb_password': '<redacted>', 'smb_password_confirm': '<redacted>'} -> HTTP/2 303 /sharing?flash=flash.sharing.pw_set_preparing
|
||||
09:44:06 status: {'data': {'error': '', 'phase': 'running', 'running': True}, 'ok': True}
|
||||
09:44:06 POST /sharing/shares {'name': 'r1109a', 'mode': 'new', 'storage_root': '/mnt/felhom-drives/hdd_1'} -> HTTP/2 303 /sharing?flash=flash.sharing.created
|
||||
09:44:18 samba: created 2026-10-17T07:44:06.208053287Z label=d8c42627eb7f9b1856e142015f267c635968440e0a959ceaecaab30aac3854e8 status=running
|
||||
smb.conf shares: [global] [beolvasas] [r1109a]
|
||||
smb.conf hash: d8c42627eb7f9b18… compose binds: - /mnt/felhom-drives/hdd_1/shares/r1109a:/mnt/felhom-drives/hdd_1/shares/r1109a - /mnt/sys_drive/felhom-data/userdata/import:/mnt/sys_drive/felhom-data/userdata/import
|
||||
inside the container: [global] [beolvasas] [r1109a]
|
||||
09:44:24 read //r1109a from 9202:
|
||||
Can't load /etc/samba/smb.conf - run testparm to debug it
|
||||
putting file /tmp/p.txt as \probe-r1109a.txt (2.1 kB/s) (average 2.1 kB/s)
|
||||
probe-r1109a.txt A 13 Sat Oct 17 07:44:23 2026
|
||||
getting file \probe-r1109a.txt of size 13 as /tmp/b.txt (12.7 KiloBytes/sec) (average 12.7 KiloBytes/sec)
|
||||
read back: NOTHING
|
||||
wrong password: session setup failed: NT_STATUS_LOGON_FAILURE
|
||||
09:44:54 POST /sharing/shares/delete {'name': 'r1109a'} -> HTTP/2 303 /sharing?flash=flash.sharing.deleted
|
||||
09:45:00 POST /sharing/shares {'name': 'r1109b', 'mode': 'existing', 'path': '/mnt/felhom-drives/hdd_1/shares/r1109a'} -> HTTP/2 303 /sharing?flash=flash.sharing.created
|
||||
09:45:14 samba: created 2026-10-17T07:45:00.460658307Z label=22b002052dc48031f97c563d829abdef76fdf67ed517d623967c9a253d0fb8d9 status=running
|
||||
smb.conf shares: [global] [beolvasas] [r1109b]
|
||||
smb.conf hash: 22b002052dc48031… compose binds: - /mnt/felhom-drives/hdd_1/shares/r1109a:/mnt/felhom-drives/hdd_1/shares/r1109a - /mnt/sys_drive/felhom-data/userdata/import:/mnt/sys_drive/felhom-data/userdata/import
|
||||
inside the container: [global] [beolvasas] [r1109b]
|
||||
09:45:18 read //r1109b from 9202:
|
||||
Can't load /etc/samba/smb.conf - run testparm to debug it
|
||||
putting file /tmp/p.txt as \probe-r1109b.txt (12.7 kB/s) (average 12.7 kB/s)
|
||||
probe-r1109b.txt A 13 Sat Oct 17 07:45:17 2026
|
||||
getting file \probe-r1109b.txt of size 13 as /tmp/b.txt (12.7 KiloBytes/sec) (average 12.7 KiloBytes/sec)
|
||||
read back: r1109-r1109b
|
||||
wrong password: session setup failed: NT_STATUS_LOGON_FAILURE
|
||||
09:45:22 read //r1109a from 9202:
|
||||
Can't load /etc/samba/smb.conf - run testparm to debug it
|
||||
tree connect failed: NT_STATUS_BAD_NETWORK_NAME
|
||||
read back: NOTHING
|
||||
wrong password: session setup failed: NT_STATUS_LOGON_FAILURE
|
||||
09:45:29 POST /sharing/shares {'name': 'r1109c', 'mode': 'existing', 'path': '/mnt/felhom-drives/hdd_1/shares/r1109a'} -> HTTP/2 303 /sharing?flash=flash.sharing.created
|
||||
09:45:43 samba: created 2026-10-17T07:45:29.544095301Z label=60c24b9e1dc6d423f2babb4653569601eddd84e8b74b0ef1a577b666f10955b4 status=running
|
||||
smb.conf shares: [global] [beolvasas] [r1109b] [r1109c]
|
||||
smb.conf hash: 60c24b9e1dc6d423… compose binds: - /mnt/felhom-drives/hdd_1/shares/r1109a:/mnt/felhom-drives/hdd_1/shares/r1109a - /mnt/felhom-drives/hdd_1/shares/r1109a:/mnt/felhom-drives/hdd_1/shares/r1109a - /mnt/sys_drive/felhom-data/userdata/import:/mnt/sys_drive/felhom-data/userdata/import
|
||||
inside the container: [global] [beolvasas] [r1109b] [r1109c]
|
||||
09:45:46 controller log: 2026/10/17 07:44:00 samba.go:287: [INFO] [samba] household SMB password applied for user=felhom
|
||||
2026/10/17 07:44:01 samba_ensure_job.go:189: [INFO] [sharing] samba ready after 0s
|
||||
2026/10/17 07:44:06 samba.go:183: [INFO] [samba] applying samba stack: shares=2 config_changed=true
|
||||
2026/10/17 07:44:53 samba.go:183: [INFO] [samba] applying samba stack: shares=1 config_changed=true
|
||||
2026/10/17 07:45:00 samba.go:183: [INFO] [samba] applying samba stack: shares=2 config_changed=true
|
||||
2026/10/17 07:45:29 samba.go:183: [INFO] [samba] applying samba stack: shares=3 config_changed=true
|
||||
|
||||
09:45:50 read //r1109c from 9202:
|
||||
Can't load /etc/samba/smb.conf - run testparm to debug it
|
||||
putting file /tmp/p.txt as \probe-r1109c.txt (12.7 kB/s) (average 12.7 kB/s)
|
||||
probe-r1109c.txt A 13 Sat Oct 17 07:45:49 2026
|
||||
getting file \probe-r1109c.txt of size 13 as /tmp/b.txt (130000.0 KiloBytes/sec) (average inf KiloBytes/sec)
|
||||
read back: r1109-r1109c
|
||||
wrong password: session setup failed: NT_STATUS_LOGON_FAILURE
|
||||
09:45:54 read //r1109b from 9202:
|
||||
Can't load /etc/samba/smb.conf - run testparm to debug it
|
||||
putting file /tmp/p.txt as \probe-r1109b.txt (12.7 kB/s) (average 12.7 kB/s)
|
||||
probe-r1109b.txt A 13 Sat Oct 17 07:45:53 2026
|
||||
getting file \probe-r1109b.txt of size 13 as /tmp/b.txt (130000.0 KiloBytes/sec) (average inf KiloBytes/sec)
|
||||
read back: r1109-r1109b
|
||||
wrong password: session setup failed: NT_STATUS_LOGON_FAILURE
|
||||
09:46:07 POST /sharing/password {'smb_password': '<redacted>', 'smb_password_confirm': '<redacted>'} -> HTTP/2 303 /sharing?flash=flash.sharing.pw_set_preparing
|
||||
09:46:13 POST /sharing/shares/delete {'name': 'r1109b'} -> HTTP/2 303 /sharing?flash=flash.sharing.deleted
|
||||
09:46:13 POST /sharing/shares/delete {'name': 'r1109c'} -> HTTP/2 303 /sharing?flash=flash.sharing.deleted
|
||||
09:46:13 POST /sharing/enable {'enabled': 'off', 'server_name': 'FELHOMHP'} -> HTTP/2 303 /sharing?flash=flash.sharing.disabled
|
||||
09:46:27 teardown: ls: cannot access '/mnt/felhom-drives/hdd_1/shares': No such file or directory
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
08:55:58 [1] deploy -> 202 {'ok': True, 'message': 'Telepítés elindítva – az állapot a kártyán követhető'}
|
||||
08:57:38 [1] deployed, controller state=running, pinned={'docmost': 'docmost/docmost:0.96.0', 'docmost-postgres': 'postgres:18-alpine', 'docmost-redis': 'redis:7-alpine'}
|
||||
08:57:38 install docmost: True
|
||||
08:57:38 state=running pinned={'docmost': 'docmost/docmost:0.96.0', 'docmost-postgres': 'postgres:18-alpine', 'docmost-redis': 'redis:7-alpine'}
|
||||
08:57:50 seed: 100/100 SET OK; expected set sha256=6531ad3781df1b1091d075c7573811355c4cad895618fc36be1443762c9f0262; dbsize now 141
|
||||
08:57:53 app's own keys (non-probe): 41 (approx, scan)
|
||||
08:58:09 check after-seed: 100/100 probe keys returned with their value; dbsize=141
|
||||
08:58:09 INFO persistence: loading:0, rdb_changes_since_last_save:310, rdb_last_save_time:1792220233, rdb_last_bgsave_status:ok, rdb_saves:0, aof_enabled:1, aof_last_write_status:ok
|
||||
08:58:09 container: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 48 seconds (healthy) |
|
||||
08:58:09 /data: /data:
|
||||
total 12
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 08:57 .
|
||||
drwxr-xr-x 1 root root 4096 Oct 17 08:57 ..
|
||||
drwx------ 2 redis redis 4096 Oct 17 08:57 appendonlydir
|
||||
|
||||
/data/appendonlydir:
|
||||
total 52
|
||||
drwx------ 2 redis redis 4096 Oct 17 08:57 .
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 08:57 ..
|
||||
-rw------- 1 redis redis 89 Oct 17 08:57 appendonly.aof.1.base.rdb
|
||||
-rw------- 1 redis redis 32398 Oct 17 08:58 appendonly.aof.1.incr.aof
|
||||
-rw------- 1 redis redis 88 Oct 17 08:57 appendonly.aof.manifest
|
||||
08:58:34 sync: redis before: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up About a minute (healthy) |
|
||||
08:58:48 +14s waiting: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up About a minute (healthy) |
|
||||
09:00:50 +136s waiting: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 3 minutes (healthy) |
|
||||
09:02:53 +259s waiting: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 5 minutes (healthy) |
|
||||
09:04:56 +382s waiting: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 7 minutes (healthy) |
|
||||
09:07:00 +506s waiting: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 9 minutes (healthy) |
|
||||
09:09:05 +631s waiting: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 11 minutes (healthy) |
|
||||
09:10:14 restart: compose files on the box: /opt/docker/stacks/docmost/docker-compose.yml: command: redis-server --appendonly no | /opt/docker/stacks/docmost/applied-compose.yml: command: redis-server --appendonly no |
|
||||
09:10:24 redis before: 2026-10-17T06:57:11.089901155Z ["redis-server","--appendonly","yes"] | Up 13 minutes (healthy) |
|
||||
09:10:36 POST /api/stacks/docmost/restart -> 200 {'ok': True, 'data': {'state': 'starting'}, 'message': 'Stack docmost restart requested — state now: starting'}
|
||||
09:11:15 stack: state=running; redis after: 2026-10-17T07:10:24.527949447Z ["redis-server","--appendonly","no"] | Up 46 seconds (healthy) |
|
||||
09:11:19 redis log: 1:M 17 Oct 2026 09:10:25.520 * Loading RDB produced by version 7.4.11 | 1:M 17 Oct 2026 09:10:25.520 * RDB age 1 seconds | 1:M 17 Oct 2026 09:10:25.520 * RDB memory usage when created 2.57 Mb | 1:M 17 Oct 2026 09:10:25.520 * Done loading RDB, keys loaded: 133, keys expired: 0. | 1:M 17 Oct 2026 09:10:25.521 * DB loaded from disk: 0.001 seconds | 1:M 17 Oct 2026 09:10:25.521 * Ready to accept connections tcp |
|
||||
09:11:35 check after-restart: 100/100 probe keys returned with their value; dbsize=141
|
||||
09:11:35 INFO persistence: loading:0, rdb_changes_since_last_save:266, rdb_last_save_time:1792221025, rdb_last_bgsave_status:ok, rdb_saves:0, aof_enabled:0, aof_last_write_status:ok
|
||||
09:11:35 container: 2026-10-17T07:10:24.527949447Z ["redis-server","--appendonly","no"] | Up About a minute (healthy) |
|
||||
09:11:35 /data: /data:
|
||||
total 28
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 09:10 .
|
||||
drwxr-xr-x 1 root root 4096 Oct 17 09:10 ..
|
||||
drwx------ 2 redis redis 4096 Oct 17 08:57 appendonlydir
|
||||
-rw------- 1 redis redis 14378 Oct 17 09:10 dump.rdb
|
||||
|
||||
/data/appendonlydir:
|
||||
total 352
|
||||
drwx------ 2 redis redis 4096 Oct 17 08:57 .
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 09:10 ..
|
||||
-rw------- 1 redis redis 89 Oct 17 08:57 appendonly.aof.1.base.rdb
|
||||
-rw------- 1 redis redis 337696 Oct 17 09:10 appendonly.aof.1.incr.aof
|
||||
-rw------- 1 redis redis 88 Oct 17 08:57 appendonly.aof.manifest
|
||||
09:13:02 backup: POST /api/backup/run -> 200 {'ok': True, 'message': 'Mentés elindítva'}
|
||||
09:14:27 +85s 2026/10/17 07:14:12 backup.go:707: [INFO] [backup] App-data backup completed: 3 databases (51.6 MB total), 4 volume dump(s) (1m10.829s)
|
||||
09:14:30 volume dumps: 2026/10/17 07:13:08 backup.go:1019: [INFO] [backup] Restarting docmost after volume dump
|
||||
2026/10/17 07:13:08 manager.go:1332: [DEBUG] [stacks] StartStack docmost: current state=stopped deployed=true
|
||||
2026/10/17 07:13:08 manager.go:1335: [INFO] [stacks] Starting stack: docmost
|
||||
2026/10/17 07:13:08 manager.go:1342: [DEBUG] [stacks] StartStack docmost: prepared 10 env vars for compose
|
||||
2026/10/17 07:13:14 manager.go:906: [DEBUG] [stacks] restart-policy of down member "docmost" = "unless-stopped"
|
||||
2026/10/17 07:13:19 manager.go:1350: [INFO] [stacks] Stack docmost started successfully (took 11.5s)
|
||||
2026/10/17 07:13:23 manager.go:1786: [INFO] [stacks] Stack docmost post-start status:
|
||||
2026/10/17 07:13:23 manager.go:1789: [INFO] [stacks] docmost docmost/docmost:0.96.0@sha256:b56947fcfd08aab8fae12a377e1792784786adbf8b96e4281f14ef4fc072685a running Up 3 seconds (health: starting)
|
||||
|
||||
09:14:33 units:
|
||||
dir=
|
||||
total 64
|
||||
drwxr-xr-x 7 root root 4096 06:58:19 .
|
||||
drwxr-xr-x 20 root root 4096 02:52:46 ..
|
||||
-rw-r--r-- 1 root root 0 07:51:38 .bash_history
|
||||
-rw-r--r-- 1 root root 607 09:05:00 .bashrc
|
||||
drwx------ 3 root root 4096 18:14:32 .docker
|
||||
-rw-r--r-- 1 root root 132 09:05:00 .profile
|
||||
drwx------ 2 root root 4096 19:32:40 .ssh
|
||||
-rw-r--r-- 1 root root 2560 14:00:44 S10-box-fresh-768-noswap.txt
|
||||
-rw-r--r-- 1 root root 2358 13:28:40 S2-box-positive.txt
|
||||
-rw------- 1 root root 1944 12:39:10 controller.yaml.pre-lock-probe
|
||||
-rw-r--r-- 1 root root 137 07:19:40 daemon.json.bak-2026-10-04
|
||||
-rwxr-xr-x 1 root root 1779 13:44:59 pgsample.sh
|
||||
drwxr-xr-x 3 root root 4096 07:12:40 r1096
|
||||
-rw-r--r-- 1 root root 218 18:09:33 r626-events.txt
|
||||
-rw-r--r-- 1 root root 999 19:53:14 repoint-night1005.sh
|
||||
drwx------ 6 root root 4096 06:31:38 shots
|
||||
drwxr-xr-x 3 root root 4096 14:07:29 sizing
|
||||
total 68588
|
||||
drwxr-xr-x 2 root root 4096 07:13:08 .
|
||||
drwxr-xr-x 5 root root 4096 07:14:12 ..
|
||||
-rw-r--r-- 1 root root 69860352 07:13:06 docmost_docmost_postgres_data.tar
|
||||
-rw-r--r-- 1 root root 359424 07:13:08 docmost_docmost_redis_data.tar
|
||||
-rw-r--r-- 1 root root 1536 07:13:06 docmost_docmost_storage.tar
|
||||
drwxr-xr-x 999/1000 0 2026-10-17 07:13 ./
|
||||
drwx------ 999/1000 0 2026-10-17 06:57 ./appendonlydir/
|
||||
-rw------- 999/1000 88 2026-10-17 06:57 ./appendonlydir/appendonly.aof.manifest
|
||||
-rw------- 999/1000 337696 2026-10-17 07:10 ./appendonlydir/appendonly.aof.1.incr.aof
|
||||
-rw------- 999/1000 89 2026-10-17 06:57 ./appendonlydir/appendonly.aof.1.base.rdb
|
||||
-rw------- 999/1000 16193 2026-10-17 07:13 ./dump.rdb
|
||||
09:15:06 flush: FLUSHALL -> OK; dbsize 0
|
||||
09:15:22 check after-flush: 0/100 probe keys returned with their value; dbsize=0
|
||||
09:15:22 INFO persistence: loading:0, rdb_changes_since_last_save:0, rdb_last_save_time:1792221302, rdb_last_bgsave_status:ok, rdb_saves:0, aof_enabled:0, aof_last_write_status:ok
|
||||
09:15:22 container: 2026-10-17T07:13:08.586215064Z ["redis-server","--appendonly","no"] | Up 2 minutes (healthy) |
|
||||
09:15:22 /data: /data:
|
||||
total 16
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 09:15 .
|
||||
drwxr-xr-x 1 root root 4096 Oct 17 09:13 ..
|
||||
drwx------ 2 redis redis 4096 Oct 17 08:57 appendonlydir
|
||||
-rw------- 1 redis redis 89 Oct 17 09:15 dump.rdb
|
||||
|
||||
/data/appendonlydir:
|
||||
total 352
|
||||
drwx------ 2 redis redis 4096 Oct 17 08:57 .
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 09:15 ..
|
||||
-rw------- 1 redis redis 89 Oct 17 08:57 appendonly.aof.1.base.rdb
|
||||
-rw------- 1 redis redis 337696 Oct 17 09:10 appendonly.aof.1.incr.aof
|
||||
-rw------- 1 redis redis 88 Oct 17 08:57 appendonly.aof.manifest
|
||||
09:15:23 [R] restoring docmost from snapshot 'helyi' (of 1 offered)
|
||||
09:15:23 [R] POST /backup/restore -> HTTP/2 302 ['location: /backups/restore?flash=flash.restore.started']
|
||||
09:15:23 + 0.0s restore (True, None, None)
|
||||
09:15:53 + 30.4s restore (False, None, None)
|
||||
09:15:53 [R] after restore: state=running hold=None phase=None
|
||||
09:15:57 restore: {"ok": true, "snapshot_id": "helyi", "http": "HTTP/2 302", "location": ["location: /backups/restore?flash=flash.restore.started"], "seconds": 30.4}
|
||||
09:16:33 check after-restore: 100/100 probe keys returned with their value; dbsize=141
|
||||
09:16:33 INFO persistence: loading:0, rdb_changes_since_last_save:266, rdb_last_save_time:1792221328, rdb_last_bgsave_status:ok, rdb_saves:0, aof_enabled:0, aof_last_write_status:ok
|
||||
09:16:33 container: 2026-10-17T07:15:28.643263028Z ["redis-server","--appendonly","no"] | Up 57 seconds (healthy) |
|
||||
09:16:33 /data: /data:
|
||||
total 28
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 09:15 .
|
||||
drwxr-xr-x 1 root root 4096 Oct 17 09:15 ..
|
||||
drwx------ 2 redis redis 4096 Oct 17 09:15 appendonlydir
|
||||
-rw------- 1 redis redis 16193 Oct 17 09:13 dump.rdb
|
||||
|
||||
/data/appendonlydir:
|
||||
total 348
|
||||
drwx------ 2 redis redis 4096 Oct 17 09:15 .
|
||||
drwxr-xr-x 3 redis redis 4096 Oct 17 09:15 ..
|
||||
-rw------- 1 redis redis 89 Oct 17 08:57 appendonly.aof.1.base.rdb
|
||||
-rw------- 1 redis redis 337696 Oct 17 09:10 appendonly.aof.1.incr.aof
|
||||
-rw------- 1 redis redis 88 Oct 17 08:57 appendonly.aof.manifest
|
||||
09:16:44 [X] stop -> 200 {'ok': True, 'message': 'Stack docmost stop completed'}
|
||||
09:17:16 [X] remove (with drive data) -> 200 {'ok': True, 'data': {'removed': 'docmost', 'volumes_removed': ['docmost_docmost_postgres_data', 'docmost_docmost_redis_data', 'docmost_docmost_storage'], 'hdd_
|
||||
09:17:24 [X] after remove: deployed=False leftovers='/opt/docker/stacks/docmost'
|
||||
09:17:24 remove: 200
|
||||
@@ -0,0 +1,49 @@
|
||||
== A1 CONTROL: the old-form copy, undamaged, --appendonly yes
|
||||
state: running exit=0
|
||||
dbsize: 129 probe key 7: v7-7c5…
|
||||
log: 1:M 17 Oct 2026 07:12:20.835 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
|
||||
log: 1:M 17 Oct 2026 07:12:20.836 * DB loaded from incr file appendonly.aof.1.incr.aof: 0.001 seconds
|
||||
log: 1:M 17 Oct 2026 07:12:20.836 * DB loaded from append only file: 0.001 seconds
|
||||
log: 1:M 17 Oct 2026 07:12:20.836 * Ready to accept connections tcp
|
||||
== A2 the old form, damaged the 2026-09-24 way: 64 zero bytes written INTO the AOF, 400 bytes before its end
|
||||
file 35789 bytes, zeros at 35389..35452; size after 35789
|
||||
state: exited exit=1
|
||||
dbsize: Error response from daemon: container 5abf3c47a6d2e027686392724cfe7b5fb4b76c42db45439d70ec283975512e25 is not running probe key 7: Error …
|
||||
log: 1:C 17 Oct 2026 07:12:25.564 * Configuration loaded
|
||||
log: 1:M 17 Oct 2026 07:12:25.567 * Done loading RDB, keys loaded: 0, keys expired: 0.
|
||||
log: 1:M 17 Oct 2026 07:12:25.567 * DB loaded from base file appendonly.aof.1.base.rdb: 0.000 seconds
|
||||
log: 1:M 17 Oct 2026 07:12:25.568 # Bad file format reading the append only file appendonly.aof.1.incr.aof: make a backup of your AOF file, then use ./redis-check-aof --fix <filename.manifest>
|
||||
== R1 the NEW form on a FULL disk (tmpfs 1 MiB): a save that cannot be written
|
||||
OK
|
||||
0b04403f53805a16d01d10b490b70bcc7045c381dedd834acf449317f5f33d74 /data/r/dump.rdb
|
||||
total 4
|
||||
drwxr-xr-x 2 redis root 60 Oct 17 07:12 .
|
||||
drwxr-xr-x 3 redis redis 80 Oct 17 07:12 ..
|
||||
-rw-r--r-- 1 redis redis 1126 Oct 17 07:12 dump.rdb
|
||||
now 1.2 MB of new data, which cannot fit:
|
||||
Background saving started
|
||||
rdb_changes_since_last_save:1
|
||||
rdb_last_bgsave_status:err
|
||||
MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
|
||||
|
||||
0b04403f53805a16d01d10b490b70bcc7045c381dedd834acf449317f5f33d74 /data/r/dump.rdb
|
||||
total 4
|
||||
drwxr-xr-x 2 redis root 60 Oct 17 07:12 .
|
||||
drwxr-xr-x 3 redis redis 80 Oct 17 07:12 ..
|
||||
-rw-r--r-- 1 redis redis 1126 Oct 17 07:12 dump.rdb
|
||||
tmpfs 1024 8 1016 1% /data
|
||||
16:M 17 Oct 2026 07:12:31.495 * Background saving started by pid 91
|
||||
91:C 17 Oct 2026 07:12:31.506 # Write error while saving DB to the disk(rdbSaveRio): No space left on device
|
||||
16:M 17 Oct 2026 07:12:31.560 # Background saving error
|
||||
stop WITHOUT saving (what a kill does), start again on the same folder:
|
||||
dbsize after start: 50 probe 7: v7
|
||||
109:M 17 Oct 2026 07:12:34.604 * Done loading RDB, keys loaded: 50, keys expired: 0.
|
||||
== R2 what a TRUNCATED dump.rdb does (half the file) — the shape the temp-file-and-rename write never leaves behind
|
||||
dump.rdb cut from 14378 to 7189 bytes
|
||||
state: exited exit=1
|
||||
dbsize: Error response from daemon: container 5d3c6d322f4553552f6fdae5e1eea896a8fb9ab9b42a364b7fd0b03099ae9e90 is not running probe key 7: Error …
|
||||
log: 1:M 17 Oct 2026 07:12:36.127 # Internal error in RDB reading offset 0, function at rdb.c:2818 -> Stream listpacks loading failed.
|
||||
log: --- RDB ERROR DETECTED ---
|
||||
log: [offset 6493] Internal error in RDB reading offset 0, function at rdb.c:2818 -> Stream listpacks loading failed.
|
||||
log: [info] 2 already expired
|
||||
== cleanup: 0 r1096-* containers left
|
||||
@@ -0,0 +1,27 @@
|
||||
|
||||
26: repo_url: https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
|
||||
27: sync_interval: 15m
|
||||
-rw------- 1 root root 1944 Oct 12 20:52 /var/lib/docker/volumes/felhom-controller-data/_data/controller.yaml.pre-redis1017
|
||||
mirror main daff3d2 DRILL docmost: redis AOF -> RDB (--appendonly no), R-1096 proof on 9202
|
||||
cache HEAD 33a4b3b The copy gate's credential case convicts again; the decoy suite is a gate (R-1115)
|
||||
https://gitea.dooplex.hu/admin/app-catalog-felhom.eu.git
|
||||
|
||||
0
|
||||
/opt/docker/stacks/docmost
|
||||
immich-server Up 3 minutes (healthy)
|
||||
immich-postgres Up 4 minutes (healthy)
|
||||
immich-machine-learning Up 4 minutes (healthy)
|
||||
immich-redis Up 4 minutes (healthy)
|
||||
filebrowser Up 22 minutes (healthy)
|
||||
felhom-controller Up 19 seconds (healthy)
|
||||
traefik Up 28 hours
|
||||
paperless-webserver Up 4 minutes (healthy)
|
||||
paperless-redis Up 4 minutes (healthy)
|
||||
paperless-postgres Up 4 minutes (healthy)
|
||||
immich-server Up 4 minutes (healthy)
|
||||
immich-postgres Up 4 minutes (healthy)
|
||||
immich-machine-learning Up 4 minutes (healthy)
|
||||
immich-redis Up 4 minutes (healthy)
|
||||
filebrowser Up 23 minutes (healthy)
|
||||
felhom-controller Up 51 seconds (healthy)
|
||||
traefik Up 28 hours
|
||||
@@ -0,0 +1,34 @@
|
||||
09:31:28 POST /api/sync -> 200 {'ok': True, 'data': {'ok': True, 'updated': ['docmost', 'immich', 'nextcloud', 'paperless-ngx', 'romm'], 'message': 'Sablonok frissítve — frissítve: docmost, immich, nextcloud, paperless-ngx, romm',
|
||||
09:31:36 == romm before:
|
||||
compose: command: redis-server --appendonly no| command: redis-server --appendonly no|
|
||||
container: 2026-10-17T02:43:43.44632381Z ["redis-server","--appendonly","yes"] Up 5 hours (healthy)
|
||||
dbsize: 153 rdb_last_bgsave_status:ok aof_enabled:1
|
||||
/data: appendonlydir dump.rdb
|
||||
09:31:53 POST /api/stacks/romm/restart -> 200 {'ok': True, 'data': {'state': 'starting'}, 'message': 'Stack romm restart requested — state now: starting'}
|
||||
09:32:52 == romm after (state=running hold=None):
|
||||
compose: command: redis-server --appendonly no| command: redis-server --appendonly no|
|
||||
container: 2026-10-17T07:31:37.095549596Z ["redis-server","--appendonly","no"] Up About a minute (healthy)
|
||||
dbsize: 150 rdb_last_bgsave_status:ok aof_enabled:0
|
||||
/data: appendonlydir dump.rdb
|
||||
09:32:56 == docmost before:
|
||||
compose: command: redis-server --appendonly no| command: redis-server --appendonly no|
|
||||
container: 2026-10-17T02:43:10.245018058Z ["redis-server","--appendonly","yes"] Up 5 hours (healthy)
|
||||
dbsize: 54 rdb_last_bgsave_status:ok aof_enabled:1
|
||||
/data: appendonlydir dump.rdb
|
||||
09:33:08 POST /api/stacks/docmost/restart -> 200 {'ok': True, 'data': {'state': 'starting'}, 'message': 'Stack docmost restart requested — state now: starting'}
|
||||
09:33:42 == docmost after (state=running hold=None):
|
||||
compose: command: redis-server --appendonly no| command: redis-server --appendonly no|
|
||||
container: 2026-10-17T07:32:56.51476244Z ["redis-server","--appendonly","no"] Up 43 seconds (healthy)
|
||||
dbsize: 58 rdb_last_bgsave_status:ok aof_enabled:0
|
||||
/data: appendonlydir dump.rdb
|
||||
09:33:45 == paperless-ngx before:
|
||||
compose: command: redis-server --appendonly no| command: redis-server --appendonly no|
|
||||
container: 2026-10-17T02:43:27.394575235Z ["redis-server","--appendonly","yes"] Up 5 hours (healthy)
|
||||
dbsize: 2 rdb_last_bgsave_status:ok aof_enabled:1
|
||||
/data: appendonlydir dump.rdb
|
||||
09:34:06 POST /api/stacks/paperless-ngx/restart -> 200 {'ok': True, 'data': {'state': 'starting'}, 'message': 'Stack paperless-ngx restart requested — state now: starting'}
|
||||
09:35:00 == paperless-ngx after (state=running hold=None):
|
||||
compose: command: redis-server --appendonly no| command: redis-server --appendonly no|
|
||||
container: 2026-10-17T07:33:45.874328224Z ["redis-server","--appendonly","no"] Up About a minute (healthy)
|
||||
dbsize: 4 rdb_last_bgsave_status:ok aof_enabled:0
|
||||
/data: appendonlydir dump.rdb
|
||||
@@ -0,0 +1,2 @@
|
||||
/opt/docker/stacks/paperless-ngx/docker-compose.yml: command: redis-server --appendonly no
|
||||
/opt/docker/stacks/immich/docker-compose.yml: command: redis-server --appendonly no
|
||||
@@ -0,0 +1,5 @@
|
||||
read 2026-10-17T07:31:00Z integrity: ok
|
||||
Tester-2 report 2026-10-04 18:06:24: none of the five
|
||||
demo-felhom report 2026-10-17 07:21:53: none of the five
|
||||
demo-hp report 2026-10-17 07:21:53: ['romm', 'docmost', 'paperless-ngx']
|
||||
tester-1 report 2026-10-17 07:21:58: ['paperless-ngx']
|
||||
@@ -0,0 +1,4 @@
|
||||
Tester-2 report 2026-10-04 18:06:24: of the five -> none (deployed 0)
|
||||
demo-felhom report 2026-10-17 07:06:53: of the five -> none (deployed 5)
|
||||
demo-hp report 2026-10-17 07:06:53: of the five -> ['romm', 'docmost', 'paperless-ngx'] (deployed 12)
|
||||
tester-1 report 2026-10-17 07:06:58: of the five -> ['paperless-ngx'] (deployed 10)
|
||||
@@ -0,0 +1,2 @@
|
||||
/opt/docker/stacks/paperless-ngx/docker-compose.yml: command: redis-server --appendonly yes
|
||||
/opt/docker/stacks/paperless-ngx/applied-compose.yml: command: redis-server --appendonly yes
|
||||
@@ -0,0 +1,295 @@
|
||||
ok FACT: docmost-postgres major + 1 (read from the clone) rc=1 (expected 1)
|
||||
ok FACT: docmost-postgres major + 1, alone rc=1 (expected 1)
|
||||
ok FACT: kimai-db 11.6 -> 12.3 BUNDLED with the kimai app bump rc=1 (expected 1)
|
||||
ok FACT: kimai-db mariadb:11.6 -> mariadb:lts (major unreadable) rc=2 (expected 2)
|
||||
ok GENUINE: kimai-db mariadb:11.x -> 11.99 (within major) rc=0 (expected 0)
|
||||
ok GENUINE: kimai-db mariadb:11.6 -> 12.3 ALONE (the R-469 lift) rc=0 (expected 0)
|
||||
ok GENUINE: docmost-postgres major+1 ALONE with its proven two-venue MARKED entry rc=0 (expected 0)
|
||||
ok DECOY: the entry is proven on both venues but carries NO conversion mark rc=1 (expected 1)
|
||||
ok DECOY: the marked entry cites ONE venue only (no box_evidence) rc=1 (expected 1)
|
||||
ok DECOY: the mark sits in a COMMENT, the entry has none rc=1 (expected 1)
|
||||
ok DECOY: the marked entry, but the move is BUNDLED with the app's own bump rc=1 (expected 1)
|
||||
ok FACT: adventurelog's postgis 16 -> 17 (the postgis family was never judged before) rc=1 (expected 1)
|
||||
ok DECOY: major moves only in a comment + serverVersion env rc=0 (expected 0)
|
||||
ok DECOY: the APP image crosses a major (kimai 2.57 -> 3.0) rc=0 (expected 0)
|
||||
ok DECOY: 'mariadb:12.3' lands in README.md, not a template rc=0 (expected 0)
|
||||
ok FACT: kimai image moves, catalog_since untouched rc=1 (expected 1)
|
||||
ok FACT: kimai image moves, catalog_since set to a FUTURE year rc=1 (expected 1)
|
||||
ok GENUINE: kimai image moves AND catalog_since = today rc=0 (expected 0)
|
||||
ok DECOY: image moves; today's date lands in a COMMENT and README, the field stays rc=1 (expected 1)
|
||||
ok DECOY: only a comment + env line change, images untouched, date untouched rc=0 (expected 0)
|
||||
ok FACT: a Hungarian byte changed in a frozen string rc=1 (expected 1)
|
||||
ok FACT: an em dash in a Hungarian string (R-932) rc=1 (expected 1)
|
||||
ok FACT: a Hungarian first_step removed rc=1 (expected 1)
|
||||
ok FACT: a NEW app is not in the freeze rc=1 (expected 1)
|
||||
ok FACT: an unknown key inside the English block rc=1 (expected 1)
|
||||
ok FACT: an English deploy field with no Hungarian twin rc=1 (expected 1)
|
||||
ok FACT: an accented Hungarian letter left in the English rc=1 (expected 1)
|
||||
ok FACT: ASCII-only Hungarian left in the English (no accent to find) rc=1 (expected 1)
|
||||
ok FACT: the product begs ("please") rc=1 (expected 1)
|
||||
ok FACT: an English retrieval promise the Hungarian never made rc=1 (expected 1)
|
||||
ok GENUINE: a REGISTERED true retrieval promise passes rc=0 (expected 0)
|
||||
ok FACT: registered for ANOTHER app - the promise still convicts, the entry is stale rc=1 (expected 1)
|
||||
ok FACT: registered on the path, but the sentence was rewritten (match gone) rc=1 (expected 1)
|
||||
ok FACT: a STALE entry - nothing in the English promises it any more rc=1 (expected 1)
|
||||
ok FACT: a registered promise with a two-word reason rc=1 (expected 1)
|
||||
ok FACT: a credential token rewritten in translation rc=1 (expected 1)
|
||||
ok FACT: a credential value reworded in translation (one digit added) rc=1 (expected 1)
|
||||
ok FACT: an i18n block for a language the controller does not render rc=1 (expected 1)
|
||||
ok FACT: an English list with a different number of steps rc=1 (expected 1)
|
||||
ok FACT: ratchet — fewer strings translated than the ceiling records rc=1 (expected 1)
|
||||
ok FACT: ratchet — more translated than the ceiling records rc=1 (expected 1)
|
||||
ok GENUINE: a correct English block on privatebin rc=0 (expected 0)
|
||||
ok GENUINE: naming an app does not change the coverage count rc=0 (expected 0)
|
||||
ok FACT(no-yaml): a Hungarian byte changed in a frozen string rc=1 (expected 1)
|
||||
ok FACT(no-yaml): a frozen Hungarian line deleted rc=1 (expected 1)
|
||||
ok FACT(no-yaml): a NEW app is not in the freeze rc=1 (expected 1)
|
||||
ok GENUINE(no-yaml): the untouched tree passes, and SAYS what it did not check rc=0 (expected 0)
|
||||
ok GENUINE(no-yaml): romm's escaped-quote help_texts are still found rc=0 (expected 0)
|
||||
ok DECOY: Hungarian rewritten inside a YAML COMMENT rc=0 (expected 0)
|
||||
ok DECOY: a frozen Hungarian sentence pasted into README.md rc=0 (expected 0)
|
||||
ok DECOY: display_name changed - a NAME, never copy rc=0 (expected 0)
|
||||
ok DECOY: docs_url changed - configuration, never copy rc=0 (expected 0)
|
||||
ok DECOY: Hungarian text added to a docker-compose.yml rc=0 (expected 0)
|
||||
|
||||
-- probe-matches-compose: the facts (each MUST be refused)
|
||||
ok FACT: tandoor's real R-618 port fault, re-introduced rc=1 (expected 1)
|
||||
ok FACT: wger's real R-618 port fault, re-introduced rc=1 (expected 1)
|
||||
ok FACT: zipline's real R-618 path fault, re-introduced rc=1 (expected 1)
|
||||
ok GENUINE: the fixed tree passes rc=0 (expected 0)
|
||||
ok FACT: a clean app given a wrong probe port rc=1 (expected 1)
|
||||
ok FACT: api+expect probe given a path the app does not answer rc=1 (expected 1)
|
||||
-- probe-matches-compose: the decoys (the label moves, the fact does not)
|
||||
ok DECOY: the port moves in a COMMENT in .felhom.yml rc=0 (expected 0)
|
||||
ok DECOY: traefik loadbalancer.server.port changed rc=0 (expected 0)
|
||||
ok DECOY: a published `ports:` mapping changed rc=0 (expected 0)
|
||||
ok DECOY: a NON-probed sidecar's healthcheck port changed rc=0 (expected 0)
|
||||
ok DECOY: path mismatch on a probe that CANNOT fail on it -> WARN, not FAIL rc=0 (expected 0)
|
||||
-- probe-matches-compose: the DEGRADED mode CI actually runs (no PyYAML)
|
||||
ok DEGRADED: the fixed tree passes, and SAYS it is degraded rc=0 (expected 0)
|
||||
ok DEGRADED FACT: tandoor's port fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED FACT: wger's port fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED FACT: zipline's path fault still refused rc=1 (expected 1)
|
||||
ok DEGRADED DECOY: traefik label moves, the fact does not rc=0 (expected 0)
|
||||
-- probe-matches-compose: the probe TARGET (R-630)
|
||||
ok FACT: paperless-ngx without its explicit container is refused rc=1 (expected 1)
|
||||
ok FACT: immich's FOUR prefix candidates are an ambiguity, not a pick rc=1 (expected 1)
|
||||
ok FACT: an explicit container no service declares is refused rc=1 (expected 1)
|
||||
ok GENUINE: both explicit containers resolve rc=0 (expected 0)
|
||||
ok DECOY: the container name moves in a COMMENT, not the field rc=0 (expected 0)
|
||||
ok DECOY: a UNIQUE prefix still resolves without the field rc=0 (expected 0)
|
||||
ok DEGRADED: the explicit container is read without PyYAML too rc=0 (expected 0)
|
||||
ok DEGRADED FACT: removing it still refuses rc=1 (expected 1)
|
||||
-- test-record-move: an image move needs its own proven record
|
||||
ok FACT: a bare image move, no entry rc=1 (expected 1)
|
||||
ok GENUINE: a proven entry whose digest the registry serves rc=0 (expected 0)
|
||||
ok FACT: the entry's verdict is failed rc=1 (expected 1)
|
||||
ok FACT: the registry now serves another digest rc=1 (expected 1)
|
||||
ok INCONCLUSIVE: the registry cannot be asked rc=2 (expected 2)
|
||||
ok DECOY: the entry only in a COMMENT under update_ladder rc=1 (expected 1)
|
||||
ok DECOY: the entry only in README.md rc=1 (expected 1)
|
||||
ok FACT: a new move carrying a BACKFILLED entry rc=1 (expected 1)
|
||||
ok FACT: memory_tight and the limit did not move rc=1 (expected 1)
|
||||
ok GENUINE: memory_tight WITH the limit raised rc=0 (expected 0)
|
||||
ok DECOY: a ref moves in a compose COMMENT only rc=0 (expected 0)
|
||||
-- test-record (static): the newest step IS the compose
|
||||
ok GENUINE: a ladder whose head is the compose rc=0 (expected 0)
|
||||
ok FACT: the compose moved past the ladder's head rc=1 (expected 1)
|
||||
ok FACT: a line that is not one JSON entry rc=1 (expected 1)
|
||||
ok FACT: a gap between steps rc=1 (expected 1)
|
||||
ok FACT: a failed verdict sits in the ladder rc=1 (expected 1)
|
||||
-- test-record (static): every intermediate step carries its own definition
|
||||
ok FACT: a two-step ladder with NO steps/ file for the first step rc=1 (expected 1)
|
||||
ok GENUINE: a two-step ladder whose first step carries its definition rc=0 (expected 0)
|
||||
ok DECOY: the steps/ file has the right NAME and names the head's image rc=1 (expected 1)
|
||||
ok DECOY: the step's definition sits beside the template under another name rc=1 (expected 1)
|
||||
ok FACT: the step has its compose but no .felhom.yml rc=1 (expected 1)
|
||||
ok DECOY: the step's .felhom.yml exists by NAME and holds no healthcheck rc=1 (expected 1)
|
||||
-- test-record: a same-tag re-test (decision 52)
|
||||
ok GENUINE: head + a re-test from its digest, both venues rc=0 (expected 0)
|
||||
ok FACT: a re-test with NO new digest rc=1 (expected 1)
|
||||
ok FACT: a re-test without the box venue rc=1 (expected 1)
|
||||
ok FACT: a re-test FROM a digest the previous entry never tested rc=1 (expected 1)
|
||||
ok DECOY: a re-test that names digest_from only in its evidence text rc=1 (expected 1)
|
||||
ok GENUINE: a re-test whose digest the registry serves now rc=0 (expected 0)
|
||||
ok FACT: a re-test whose digest the registry no longer serves rc=1 (expected 1)
|
||||
ok FACT: a re-test with no new digest reaches the move gate too rc=1 (expected 1)
|
||||
ok probe-measured: genuine komga note passes rc=0 (expected 0)
|
||||
ok probe-measured: note moved into the TAGLINE rc=1 (expected 1)
|
||||
ok probe-measured: date but no before/after rc=1 (expected 1)
|
||||
ok probe-measured: before/after but no date rc=1 (expected 1)
|
||||
ok probe-measured: 'read upstream' is not a measurement rc=1 (expected 1)
|
||||
|
||||
-- copy-i18n: the user guide (each FACT must be refused, naming the key)
|
||||
ok GENUINE: a full Hungarian guide with its English overlay rc=0 (expected 0)
|
||||
ok FACT: guide strings that are not in the freeze rc=1 (expected 1)
|
||||
ok FACT: checked_version in the English block rc=1 (expected 1)
|
||||
ok FACT: a section with an empty steps list rc=1 (expected 1)
|
||||
ok FACT: an FAQ entry with a question and no answer rc=1 (expected 1)
|
||||
ok FACT: an unquoted checked_version (YAML reads 4.10 as 4.1) rc=1 (expected 1)
|
||||
ok FACT: more English sections than Hungarian rc=1 (expected 1)
|
||||
ok FACT: an English section with a different step count rc=1 (expected 1)
|
||||
ok FACT: an English guide with no Hungarian guide rc=1 (expected 1)
|
||||
ok FACT: a tracker named in an English step rc=1 (expected 1)
|
||||
ok FACT: a tracker named in a Hungarian answer (folded, any case) rc=1 (expected 1)
|
||||
ok DECOY: a tracker named only in a YAML comment rc=0 (expected 0)
|
||||
ok DECOY: a source-like word only in docs_url (configuration) rc=0 (expected 0)
|
||||
|
||||
-- guide-version (ADVISORY: WARN on the fact, silent on the label, exit 0 always)
|
||||
ok FACT: the app's image moved off the checked tag (4.0.20 -> 4.0.21) rc=0 (advisory)
|
||||
ok GENUINE: the guide is current rc=0 (advisory)
|
||||
ok DECOY: the checked tag survives only on a SIDECAR rc=0 (advisory)
|
||||
ok DECOY: checked_version only in a COMMENT rc=0 (advisory)
|
||||
ok DECOY: checked_version only inside the English block rc=0 (advisory)
|
||||
ok FACT: an empty checked_version is HIDDEN and named rc=0 (advisory)
|
||||
ok image-pins: FACT: untagged rc=1 (expected 1)
|
||||
ok image-pins: FACT: a registry PORT is not a tag rc=1 (expected 1)
|
||||
ok image-pins: FACT: quoted :latest rc=1 (expected 1)
|
||||
ok image-pins: FACT: :LATEST in capitals rc=1 (expected 1)
|
||||
ok image-pins: FACT: a floating alias (:edge) rc=1 (expected 1)
|
||||
ok image-pins: FACT: untagged with a comment saying pinned rc=1 (expected 1)
|
||||
ok image-pins: FACT: a QUOTED key is the same field rc=1 (expected 1)
|
||||
ok image-pins: FACT: an interpolated ref cannot be read rc=1 (expected 1)
|
||||
ok image-pins: FACT: @sha256: with no digest behind it rc=1 (expected 1)
|
||||
ok image-pins: INERT: a commented-out untagged image rc=0 (expected 0)
|
||||
ok image-pins: INERT: an x- extension field (Compose ignores it) rc=0 (expected 0)
|
||||
ok image-pins: INERT: an untagged image in README.md rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a concrete tag rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a registry port WITH a tag rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: a real digest rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: :latest pinned by its digest rc=0 (expected 0)
|
||||
ok image-pins: GENUINE: the real catalog rc=0 (expected 0)
|
||||
ok image-resolvable: GENUINE: every pin resolves rc=0 (expected 0)
|
||||
ok image-resolvable: FACT: the registry says one pin is gone rc=1 (expected 1)
|
||||
ok image-resolvable: LABEL: rc=0 carrying a throttle message rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: rc=0 carrying any error text rc=2 (expected 2)
|
||||
ok image-resolvable: CRY-WOLF: a throttle on rc=1 is not an accusation rc=2 (expected 2)
|
||||
ok image-resolvable: CRY-WOLF: an unrecognised failure is not an accusation rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: a docker that resolves EVERYTHING, the canary too rc=3 (expected 3)
|
||||
ok image-resolvable: LABEL: no docker at all rc=2 (expected 2)
|
||||
ok image-resolvable: LABEL: nothing to judge rc=3 (expected 3)
|
||||
ok volume-persistence: injected-prober suite OK
|
||||
ok volume-persistence: LABEL: a runtime that answers nothing rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: no docker at all rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: nothing to judge rc=3 (expected 3)
|
||||
ok volume-persistence: LABEL: not a scratch host rc=3 (expected 3)
|
||||
|
||||
-- onboarding: the facts (each MUST be refused)
|
||||
ok FACT: a new template with NO record rc=1 (expected 1)
|
||||
ok FACT: a record missing id 1.4 rc=1 (expected 1)
|
||||
ok FACT: 1.4 answered only inside an HTML comment rc=1 (expected 1)
|
||||
ok FACT: done with a path that does not exist rc=1 (expected 1)
|
||||
ok FACT: done with an EMPTY directory (the mkdir shape) rc=1 (expected 1)
|
||||
ok FACT: done naming an absent file in the sibling repo rc=1 (expected 1)
|
||||
ok FACT: n/a with an EMPTY reason rc=1 (expected 1)
|
||||
ok FACT: n/a with a two-word reason rc=1 (expected 1)
|
||||
ok FACT: an OPEN row rc=1 (expected 1)
|
||||
ok FACT: opened: backdated before the checklist rc=1 (expected 1)
|
||||
ok FACT: a checklist id the template a new app copies lacks rc=1 (expected 1)
|
||||
ok FACT: an exempt app's record with a done that points nowhere rc=1 (expected 1)
|
||||
-- onboarding: the genuine articles (each MUST pass)
|
||||
ok GENUINE: a complete record (catalog + sibling evidence) rc=0 (expected 0)
|
||||
ok GENUINE: an id added AFTER opened: does not bind rc=0 (expected 0)
|
||||
ok GENUINE: an exempt app's record may say open rc=0 (expected 0)
|
||||
ok STATED SKIP: sibling repo absent (the CI shape) - printed, not checked rc=0 (expected 0)
|
||||
|
||||
-- family-gate: genuine and decoys
|
||||
ok GENUINE: a family app, literal exceptions, min 0.287.0, golden 0.287.0 rc=0 (expected 0)
|
||||
ok DECOY: family_gate only in a COMMENT -> not gated, nothing owed rc=0 (expected 0)
|
||||
ok DECOY: no sibling -> rule 3 stated NOT CHECKED rc=0 (expected 0)
|
||||
-- family-gate: the facts (each MUST be refused)
|
||||
ok FACT: an exception that is a regex rc=1 (expected 1)
|
||||
ok FACT: the exception '/' (the whole app) rc=1 (expected 1)
|
||||
ok FACT: an exception with '..' rc=1 (expected 1)
|
||||
ok FACT: an exception list with no gate rc=1 (expected 1)
|
||||
ok FACT: min_controller only in a comment rc=1 (expected 1)
|
||||
ok FACT: min_controller below the release rc=1 (expected 1)
|
||||
ok FACT: newest baked golden below the release rc=1 (expected 1)
|
||||
ok FACT: a golden DIRECTORY 0.287.0 with no bake log (a name is not a bake) rc=1 (expected 1)
|
||||
ok FACT: glance (ruled family-gated, decision 221) without family_gate rc=1 (expected 1)
|
||||
ok FACT: glance with family_gate only in a COMMENT (the label without the fact) rc=1 (expected 1)
|
||||
ok FACT: grimmory (ruled, decisions 63/64) with family_gate: false rc=1 (expected 1)
|
||||
ok GENUINE: glance gated, no exceptions rc=0 (expected 0)
|
||||
|
||||
-- mem-limit-sum: genuine and decoys
|
||||
ok GENUINE: 384+256 = 640M, the field says 640M rc=0 (expected 0)
|
||||
ok GENUINE: 1G is 1024M (1G + 256M = 1280M) rc=0 (expected 0)
|
||||
ok DECOY: a steps/ file with an old figure is not judged rc=0 (expected 0)
|
||||
-- mem-limit-sum: the facts (each MUST be refused)
|
||||
ok FACT: the field under the sum; the right figure only in comments rc=1 (expected 1)
|
||||
ok FACT: reservations: memory makes nothing a limit (service w/o limit) rc=1 (expected 1)
|
||||
ok FACT: mem_limit only OUTSIDE resources: (top level) is no declaration rc=1 (expected 1)
|
||||
ok FACT: an unreadable size is INCONCLUSIVE, never a pass rc=2 (expected 2)
|
||||
|
||||
-- db-credentials: genuine and decoys
|
||||
ok GENUINE + DECOYS: comment, app-service ref, redis, literal - all not judged rc=0 (expected 0)
|
||||
-- db-credentials: the facts (each MUST be refused)
|
||||
ok FACT: list form, the variable has no deploy field rc=1 (expected 1)
|
||||
ok FACT: list form, fed by a `type: password` field rc=1 (expected 1)
|
||||
ok FACT: map form, the variable has no deploy field rc=1 (expected 1)
|
||||
|
||||
-- data-key: genuine and decoys
|
||||
ok GENUINE: a flagged *_ENCRYPTION_KEY; a signing key labelled 'Encryption key' unflagged; bookstack registered rc=0 (expected 0)
|
||||
-- data-key: the facts (each MUST be refused)
|
||||
ok FACT: the flag only in a COMMENT rc=1 (expected 1)
|
||||
ok FACT: the flag only inside the i18n: block rc=1 (expected 1)
|
||||
ok FACT: a REGISTERED data key unflagged (bookstack APP_KEY) rc=1 (expected 1)
|
||||
ok FACT: an unexplained flag (a signing key flagged) rc=1 (expected 1)
|
||||
ok FACT: a stale REGISTRY entry (bookstack has no APP_KEY any more) rc=1 (expected 1)
|
||||
ok FACT: a non-boolean flag is INCONCLUSIVE rc=2 (expected 2)
|
||||
|
||||
-- unclean-boot-images: genuine and decoys
|
||||
ok GENUINE: the block lists the server's image rc=0 (expected 0)
|
||||
ok GENUINE: bumped AND the list updated (flow list) rc=0 (expected 0)
|
||||
ok GENUINE: bumped AND the list updated (block list) rc=0 (expected 0)
|
||||
ok DECOY: the new image only in a compose COMMENT rc=0 (expected 0)
|
||||
ok DECOY: ANOTHER service bumped (machine-learning) rc=0 (expected 0)
|
||||
ok DECOY: the block COMMENTED OUT, server bumped (no block, nothing owed) rc=0 (expected 0)
|
||||
ok DECOY: a template with no block rc=0 (expected 0)
|
||||
-- unclean-boot-images: the facts (each MUST be refused)
|
||||
ok FACT: the server bumped, the list unchanged rc=1 (expected 1)
|
||||
ok FACT: the same in a steps/ file (the ladder) rc=1 (expected 1)
|
||||
ok FACT: the block names a service the compose does not run rc=1 (expected 1)
|
||||
ok FACT: the block lists no images rc=1 (expected 1)
|
||||
|
||||
-- login-kind: genuine and decoys
|
||||
ok GENUINE: login_kind first_visit rc=0 (expected 0)
|
||||
ok GENUINE: login_kind email rc=0 (expected 0)
|
||||
ok GENUINE: login_kind none rc=0 (expected 0)
|
||||
ok GENUINE: quoted value rc=0 (expected 0)
|
||||
ok DECOY: a bad value only in a COMMENT rc=0 (expected 0)
|
||||
ok DECOY: a bad value only in the English block rc=0 (expected 0)
|
||||
ok DECOY: the key under ANOTHER mapping rc=0 (expected 0)
|
||||
-- login-kind: the facts (each MUST be refused)
|
||||
ok FACT: an unknown value rc=1 (expected 1)
|
||||
ok FACT: a wrong case rc=1 (expected 1)
|
||||
ok FACT: the key twice rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
-- image-volumes: genuine
|
||||
ok GENUINE: a named volume AT /romm/assets rc=0 (expected 0)
|
||||
ok GENUINE: a bind AT /romm/assets, quoted rc=0 (expected 0)
|
||||
ok GENUINE: an image not in the registry is not judged rc=0 (expected 0)
|
||||
-- image-volumes: decoys and facts (each MUST be refused)
|
||||
ok DECOY: the mount only in a COMMENT rc=1 (expected 1)
|
||||
ok DECOY: the mount on ANOTHER service rc=1 (expected 1)
|
||||
ok DECOY: the PARENT /romm mounted rc=1 (expected 1)
|
||||
ok DECOY: a CHILD /romm/assets/x mounted rc=1 (expected 1)
|
||||
ok DECOY: only a top-level volume, never mounted rc=1 (expected 1)
|
||||
ok FACT: a steps/ file without it rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
-- redis-persistence: genuine and decoys (each passes)
|
||||
ok GENUINE: --appendonly no rc=0 (expected 0)
|
||||
ok GENUINE: no command (the image default is RDB) rc=0 (expected 0)
|
||||
ok DECOY: --appendonly yes only in a COMMENT rc=0 (expected 0)
|
||||
ok DECOY: AOF only in a steps/ file (a tested step, not judged) rc=0 (expected 0)
|
||||
-- redis-persistence: the facts (each MUST be refused)
|
||||
ok FACT: AOF in string form rc=1 (expected 1)
|
||||
ok FACT: AOF in a flow list rc=1 (expected 1)
|
||||
ok FACT: AOF in a block list rc=1 (expected 1)
|
||||
ok FACT: AOF on a valkey image rc=1 (expected 1)
|
||||
ok FACT: no templates/ at all (nothing to judge) rc=3 (expected 3)
|
||||
|
||||
catalog gate decoys OK — 252 case(s), every label judged on its fact (R-421)
|
||||
rc=0
|
||||
@@ -0,0 +1,22 @@
|
||||
=== demo-hp
|
||||
containers: 24 not healthy/running: none
|
||||
2026/10/17 08:20:14 updater.go:855: [INFO] [selfupdate] Post-update startup: update successful (0.325.0-rc.2 → 0.325.0)
|
||||
|
||||
samba: not running (sharing off)
|
||||
paperless-redis: ["redis-server","--appendonly","no"] aof_enabled:0
|
||||
docmost-redis: ["redis-server","--appendonly","no"] aof_enabled:0
|
||||
romm-redis: ["redis-server","--appendonly","no"] aof_enabled:0
|
||||
=== felhom-pve
|
||||
containers: 9 not healthy/running: none
|
||||
2026/10/17 08:20:04 [INFO] [selfupdate] Post-update startup: update successful (0.324.0 → 0.325.0)
|
||||
|
||||
samba: not running (sharing off)
|
||||
=== -J demo-hp root@192.168.0.154
|
||||
containers: 17 not healthy/running: none
|
||||
2026/10/17 08:20:16 [INFO] [selfupdate] Post-update startup: update successful (0.324.0 → 0.325.0)
|
||||
|
||||
samba: not running (sharing off)
|
||||
paperless-redis: ["redis-server","--appendonly","yes"] aof_enabled:1
|
||||
felhom.enkisfelhom.hu /login: 200
|
||||
felhom.demo-felhom.eu /login: 200
|
||||
felhom.enkicsifelhom.hu /login: 200
|
||||
@@ -0,0 +1,4 @@
|
||||
integrity: ok
|
||||
('min_controller_version', '0.325.0')
|
||||
('min_controller_version_declared_min_agent', '0.325.0=0.158.1')
|
||||
per-box floors still set: []
|
||||
@@ -0,0 +1,5 @@
|
||||
global floor 2026-10-17T08:21:31Z: HTTP/1.1 303 See Other Location: /configuration?flash=floor_set
|
||||
clear per-box tester-1: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set
|
||||
clear per-box demo-hp: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set
|
||||
clear per-box demo-felhom: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set
|
||||
hub /configuration page: 5 0.158.1 3 0.325.0
|
||||
@@ -0,0 +1,40 @@
|
||||
control NEGATIVE (a stub answering 200 over plain http): convicted, as it must (200 -)
|
||||
== tester-1 (enkicsifelhom.hu): 13 public name(s)
|
||||
OK control POSITIVE http://felhom.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://files.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://files.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://media.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://media.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://paperless.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paperless.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://paste.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://paste.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://plex.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://plex.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://prowlarr.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://prowlarr.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://radarr.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://radarr.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://sonarr.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://sonarr.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://torrent.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://torrent.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://transmission.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://transmission.enkicsifelhom.hu/r1033-check?q=1
|
||||
OK http://wiki.enkicsifelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkicsifelhom.hu/r1033-check?q=1
|
||||
== demo-hp (enkisfelhom.hu): 14 public name(s)
|
||||
OK http://arcade.enkisfelhom.hu/r1033-check?q=1 -> 301 https://arcade.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://books.enkisfelhom.hu/r1033-check?q=1 -> 301 https://books.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://docs.enkisfelhom.hu/r1033-check?q=1 -> 301 https://docs.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://felhom.enkisfelhom.hu/r1033-check?q=1 -> 301 https://felhom.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://files.enkisfelhom.hu/r1033-check?q=1 -> 301 https://files.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://gist.enkisfelhom.hu/r1033-check?q=1 -> 301 https://gist.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://ha.enkisfelhom.hu/r1033-check?q=1 -> 301 https://ha.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1 -> 301 https://no-such-name-r1033.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://papir.enkisfelhom.hu/r1033-check?q=1 -> 301 https://papir.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://paste.enkisfelhom.hu/r1033-check?q=1 -> 301 https://paste.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://pdf.enkisfelhom.hu/r1033-check?q=1 -> 301 https://pdf.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://plex.enkisfelhom.hu/r1033-check?q=1 -> 301 https://plex.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://travel.enkisfelhom.hu/r1033-check?q=1 -> 301 https://travel.enkisfelhom.hu/r1033-check?q=1
|
||||
OK http://wiki.enkisfelhom.hu/r1033-check?q=1 -> 301 https://wiki.enkisfelhom.hu/r1033-check?q=1
|
||||
== demo-felhom (demo-felhom.eu): 8 public name(s)
|
||||
OK http://felhom.demo-felhom.eu/r1033-check?q=1 -> 301 https://felhom.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://files.demo-felhom.eu/r1033-check?q=1 -> 301 https://files.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://gist.demo-felhom.eu/r1033-check?q=1 -> 301 https://gist.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1 -> 301 https://no-such-name-r1033.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://prowlarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://prowlarr.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://radarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://radarr.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://sonarr.demo-felhom.eu/r1033-check?q=1 -> 301 https://sonarr.demo-felhom.eu/r1033-check?q=1
|
||||
OK http://torrent.demo-felhom.eu/r1033-check?q=1 -> 301 https://torrent.demo-felhom.eu/r1033-check?q=1
|
||||
== every public name redirects http -> https
|
||||
@@ -0,0 +1,3 @@
|
||||
per-box tester-1 2026-10-17T08:20:02Z: HTTP/1.1 303 See Other Location: /customers/tester-1?flash=floor_set
|
||||
per-box demo-hp 2026-10-17T08:20:02Z: HTTP/1.1 303 See Other Location: /customers/demo-hp?flash=floor_set
|
||||
per-box demo-felhom 2026-10-17T08:20:02Z: HTTP/1.1 303 See Other Location: /customers/demo-felhom?flash=floor_set
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
# boxver.sh — the controller image on the three test boxes, one line each (read-only).
|
||||
for h in demo-hp felhom-pve "-J demo-hp root@192.168.0.154"; do
|
||||
printf '%-34s %s\n' "$h" "$(ssh -o ConnectTimeout=15 -o BatchMode=yes $h "LC_ALL=C pct exec 9201 -- docker ps --filter name=^felhom-controller$ --format '{{.Image}} {{.Status}}'" 2>/dev/null | grep -v '^perl')"
|
||||
done
|
||||
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
# damage.sh — R-1096 step 3, inside scratch guest 9202. Throwaway containers named r1096-*, removed at the end.
|
||||
# Input: /root/r1096/aof-copy = docmost-redis's /data copied while it ran the OLD form (AOF), taken before the switch.
|
||||
set -u
|
||||
IMG=redis:7-alpine
|
||||
W=/root/r1096/work; rm -rf $W; mkdir -p $W
|
||||
say() { echo "== $*"; }
|
||||
run_on() { # run_on <dir> <args...>: start redis on a COPY of <dir>, report whether it serves and its last log lines
|
||||
local d=$1; shift
|
||||
docker rm -f r1096-probe >/dev/null 2>&1
|
||||
docker run -d --name r1096-probe -v $d:/data $IMG redis-server "$@" >/dev/null
|
||||
sleep 4
|
||||
echo " state: $(docker inspect -f '{{.State.Status}} exit={{.State.ExitCode}}' r1096-probe)"
|
||||
echo " dbsize: $(docker exec r1096-probe redis-cli DBSIZE 2>&1 | head -1) probe key 7: $(docker exec r1096-probe redis-cli GET felhom:probe:7 2>&1 | cut -c1-6)…"
|
||||
docker logs r1096-probe 2>&1 | grep -iE 'Bad file|Unrecoverable|Short read|corrupt|loaded|fix|Ready|aborting|error|Done loading' | tail -4 | sed 's/^/ log: /'
|
||||
docker rm -f r1096-probe >/dev/null 2>&1
|
||||
}
|
||||
|
||||
say "A1 CONTROL: the old-form copy, undamaged, --appendonly yes"
|
||||
cp -a /root/r1096/aof-copy $W/a1; chown -R 999:1000 $W/a1
|
||||
run_on $W/a1 --appendonly yes
|
||||
|
||||
say "A2 the old form, damaged the 2026-09-24 way: 64 zero bytes written INTO the AOF, 400 bytes before its end"
|
||||
cp -a /root/r1096/aof-copy $W/a2; chown -R 999:1000 $W/a2
|
||||
F=$W/a2/appendonlydir/appendonly.aof.1.incr.aof; S=$(stat -c %s $F)
|
||||
dd if=/dev/zero of=$F bs=1 seek=$((S-400)) count=64 conv=notrunc status=none
|
||||
echo " file $S bytes, zeros at $((S-400))..$((S-337)); size after $(stat -c %s $F)"
|
||||
run_on $W/a2 --appendonly yes
|
||||
|
||||
say "R1 the NEW form on a FULL disk (tmpfs 1 MiB): a save that cannot be written"
|
||||
docker rm -f r1096-full >/dev/null 2>&1
|
||||
docker run -d --name r1096-full --tmpfs /data:rw,size=1m,uid=999,gid=1000 $IMG sleep infinity >/dev/null
|
||||
docker exec r1096-full sh -c 'mkdir -p /data/r && chown redis /data/r && su redis -s /bin/sh -c "redis-server --port 6390 --dir /data/r --appendonly no --daemonize yes --logfile /data/r.log" ' ; sleep 1
|
||||
docker exec r1096-full sh -c 'for i in $(seq 1 50); do redis-cli -p 6390 SET felhom:probe:$i v$i >/dev/null; done; redis-cli -p 6390 SAVE; sha256sum /data/r/dump.rdb; ls -la /data/r'
|
||||
echo " now 1.2 MB of new data, which cannot fit:"
|
||||
docker exec r1096-full sh -c 'head -c 900000 /dev/urandom | base64 -w0 | redis-cli -p 6390 -x SET big >/dev/null; redis-cli -p 6390 BGSAVE; sleep 2; redis-cli -p 6390 INFO persistence | grep -E "rdb_last_bgsave_status|rdb_changes_since"; redis-cli -p 6390 SET after-fail 1; sha256sum /data/r/dump.rdb; ls -la /data/r; df -k /data | tail -1; tail -3 /data/r.log'
|
||||
echo " stop WITHOUT saving (what a kill does), start again on the same folder:"
|
||||
docker exec r1096-full sh -c 'redis-cli -p 6390 SHUTDOWN NOSAVE; sleep 1; su redis -s /bin/sh -c "redis-server --port 6390 --dir /data/r --appendonly no --daemonize yes --logfile /data/r2.log"; sleep 1; echo " dbsize after start: $(redis-cli -p 6390 DBSIZE) probe 7: $(redis-cli -p 6390 GET felhom:probe:7)"; grep -E "Done loading|Short read|Unrecoverable" /data/r2.log | tail -2'
|
||||
docker rm -f r1096-full >/dev/null
|
||||
|
||||
say "R2 what a TRUNCATED dump.rdb does (half the file) — the shape the temp-file-and-rename write never leaves behind"
|
||||
mkdir -p $W/r2; cp /var/lib/docker/volumes/docmost_docmost_redis_data/_data/dump.rdb $W/r2/full.rdb
|
||||
S=$(stat -c %s $W/r2/full.rdb); head -c $((S/2)) $W/r2/full.rdb > $W/r2/dump.rdb; rm $W/r2/full.rdb; chown -R 999:1000 $W/r2
|
||||
echo " dump.rdb cut from $S to $(stat -c %s $W/r2/dump.rdb) bytes"
|
||||
run_on $W/r2 --appendonly no
|
||||
|
||||
rm -rf $W
|
||||
say "cleanup: $(docker ps -a --filter name=r1096- --format '{{.Names}}' | wc -l) r1096-* containers left"
|
||||
@@ -0,0 +1,152 @@
|
||||
#!/usr/bin/env python3
|
||||
"""redis6a.py — R-1096 Part 6a on scratch guest 9202 (demo-hp), THROUGH THE PRODUCT.
|
||||
|
||||
Runs on DooPlex. Env: SC (0600 dir with .ctlpw), EV (evidence dir), TARGET=9202. One step per call:
|
||||
install deploy a throwaway docmost (generated passwords, never printed)
|
||||
seed 100 keys felhom:probe:<n> into docmost-redis (redis-cli inside the container); the expected
|
||||
values go to SC/expected.txt, their sha256 to the log
|
||||
check TAG read the 100 keys back and compare; INFO persistence; the redis container's Created + Cmd
|
||||
restart the dashboard's restart (POST /api/stacks/docmost/restart: up -d --force-recreate)
|
||||
sync POST /api/sync + rescan (the dashboard's „Sablonok frissítése"), then wait until docmost-redis
|
||||
runs the catalog's new command (decision 4: the box applies a template correction itself)
|
||||
backup „Mentés most" (POST /api/backup/run: db dumps + volume dumps with each stack STOPPED), polled
|
||||
flush FLUSHALL in docmost-redis — the state a restore must undo
|
||||
restore the backups page's „Visszaállítás" from docmost's own newest copy (POST /backup/restore)
|
||||
remove remove docmost through the product (stop, remove with drive data + backups)
|
||||
Nothing writes app data except redis-cli SET/FLUSHALL on the probe keys and the product's own buttons.
|
||||
"""
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import secrets
|
||||
import sys
|
||||
import time
|
||||
|
||||
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
|
||||
import box_walk as w # noqa: E402
|
||||
|
||||
EV = os.environ["EV"]
|
||||
LOG = open(os.path.join(EV, "6a-console.txt"), "a", buffering=1)
|
||||
_say = w.say
|
||||
APP, SUB, RC = "docmost", "docmost-r1096", "docmost-redis"
|
||||
N = 100
|
||||
|
||||
|
||||
def say(*a):
|
||||
_say(*a)
|
||||
LOG.write(time.strftime("%H:%M:%S ") + " ".join(str(x) for x in a) + "\n")
|
||||
|
||||
|
||||
w.say = say
|
||||
|
||||
|
||||
def rcli(cmd):
|
||||
return w.guest(f"docker exec -i {RC} redis-cli {cmd} 2>&1").strip()
|
||||
|
||||
|
||||
def redis_facts():
|
||||
info = rcli("INFO persistence")
|
||||
keep = [l for l in info.splitlines() if l.split(":")[0] in (
|
||||
"aof_enabled", "rdb_last_bgsave_status", "rdb_changes_since_last_save", "rdb_last_save_time", "loading",
|
||||
"aof_last_write_status", "rdb_saves")]
|
||||
c = w.guest(f"docker inspect -f '{{{{.Created}}}} {{{{json .Config.Cmd}}}}' {RC} 2>&1; docker ps --filter name=^{RC}$ --format '{{{{.Status}}}}'")
|
||||
files = w.guest(f"docker exec {RC} sh -c 'ls -la /data /data/appendonlydir 2>&1'")
|
||||
return keep, " | ".join(c.split("\n")).strip(), files.strip()
|
||||
|
||||
|
||||
def check(tag):
|
||||
exp = [l.rstrip("\n").split(" ", 1) for l in open(os.path.join(w.SC, "expected.txt"))]
|
||||
script = "".join(f"GET {k}\n" for k, _ in exp)
|
||||
out = w.guest(f"docker exec -i {RC} redis-cli <<'R1096'\n{script}R1096\n").splitlines()
|
||||
got = [o.strip().strip('"') for o in out][:N]
|
||||
match = sum(1 for (k, v), g in zip(exp, got) if v == g)
|
||||
keep, cont, files = redis_facts()
|
||||
say(f"check {tag}: {match}/{N} probe keys returned with their value; dbsize={rcli('DBSIZE')}")
|
||||
say(f" INFO persistence: {', '.join(keep)}")
|
||||
say(f" container: {cont}")
|
||||
say(f" /data: {files}")
|
||||
return match
|
||||
|
||||
|
||||
def main():
|
||||
step, args = sys.argv[1], sys.argv[2:]
|
||||
w.login()
|
||||
if step == "install":
|
||||
ok = w.deploy(APP, SUB)
|
||||
say(f"install {APP}: {ok}")
|
||||
st = w.stack(APP)
|
||||
say(f" state={st.get('state')} pinned={(st.get('app_config') or {}).get('pinned_images')}")
|
||||
elif step == "seed":
|
||||
exp = [(f"felhom:probe:{n}", f"v{n}-{secrets.token_hex(8)}") for n in range(N)]
|
||||
with open(os.path.join(w.SC, "expected.txt"), "w") as fh:
|
||||
for k, v in exp:
|
||||
fh.write(f"{k} {v}\n")
|
||||
script = "".join(f"SET {k} {v}\n" for k, v in exp)
|
||||
out = w.guest(f"docker exec -i {RC} redis-cli <<'R1096'\n{script}R1096\n")
|
||||
sha = hashlib.sha256("".join(f"{k}={v}\n" for k, v in exp).encode()).hexdigest()
|
||||
say(f"seed: {out.count('OK')}/{N} SET OK; expected set sha256={sha}; dbsize now {rcli('DBSIZE')}")
|
||||
say(f" app's own keys (non-probe): {rcli('--scan --count 1000').count(chr(10)) + 1 - N} (approx, scan)")
|
||||
check("after-seed")
|
||||
elif step == "check":
|
||||
check(args[0])
|
||||
elif step == "sync":
|
||||
before = redis_facts()[1]
|
||||
say(f"sync: redis before: {before}")
|
||||
t0 = time.time()
|
||||
w.sync_rescan()
|
||||
for i in range(120):
|
||||
cont = redis_facts()[1]
|
||||
if "appendonly\",\"no" in cont.replace(" ", "") and "Up" in cont:
|
||||
say(f" +{time.time()-t0:.0f}s docmost-redis runs the new command: {cont}")
|
||||
break
|
||||
if i % 6 == 0:
|
||||
say(f" +{time.time()-t0:.0f}s waiting: {cont}")
|
||||
w.sync_rescan()
|
||||
time.sleep(10)
|
||||
else:
|
||||
say(" the new command never reached docmost-redis within 20 min")
|
||||
st = w.stack(APP)
|
||||
say(f" stack: state={st.get('state')} hold={st.get('hold_reason')!r}")
|
||||
elif step == "restart":
|
||||
say("restart: compose files on the box: " + " | ".join(w.guest(
|
||||
f"grep -H 'redis-server' /opt/docker/stacks/{APP}/docker-compose.yml /opt/docker/stacks/{APP}/applied-compose.yml").split(chr(10))))
|
||||
say(f" redis before: {redis_facts()[1]}")
|
||||
code, d = w.ctl("POST", f"/api/stacks/{APP}/restart")
|
||||
say(f" POST /api/stacks/{APP}/restart -> {code} {str(d)[:160]}")
|
||||
for _ in range(60):
|
||||
time.sleep(5)
|
||||
st = w.stack(APP)
|
||||
if st.get("state") == "running" and "healthy" in redis_facts()[1]:
|
||||
break
|
||||
say(f" stack: state={w.stack(APP).get('state')}; redis after: {redis_facts()[1]}")
|
||||
say(" redis log: " + " | ".join(w.guest(f"docker logs {RC} 2>&1 | grep -iE 'DB loaded|Loading|RDB|AOF|Ready' | tail -6").split(chr(10))))
|
||||
check("after-restart")
|
||||
elif step == "backup":
|
||||
code, d = w.ctl("POST", "/api/backup/run")
|
||||
say(f"backup: POST /api/backup/run -> {code} {str(d)[:160]}")
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < 1800:
|
||||
done = w.guest("docker logs --since 30m felhom-controller 2>&1 | grep -E 'App-data backup completed|backup.*(FAILED|failed)' | tail -2")
|
||||
if "completed" in done:
|
||||
say(f" +{time.time()-t0:.0f}s {done.strip()}")
|
||||
break
|
||||
time.sleep(10)
|
||||
else:
|
||||
say(" no completion line in 30 min")
|
||||
say(" volume dumps: " + w.guest("docker logs --since 30m felhom-controller 2>&1 | grep -iE 'docmost' | grep -iE 'volume|dump|stopp|start' | tail -8"))
|
||||
say(" units: " + w.guest("find / -xdev -path '*backups/primary/docmost/volume-dumps/*redis*' -newermt '-40 min' -printf '%TT %s %p\\n' 2>/dev/null | head"))
|
||||
elif step == "flush":
|
||||
say(f"flush: FLUSHALL -> {rcli('FLUSHALL')}; dbsize {rcli('DBSIZE')}")
|
||||
elif step == "restore":
|
||||
r = w.restore(APP)
|
||||
say("restore: " + json.dumps({k: r.get(k) for k in ("ok", "snapshot_id", "http", "location", "seconds")}, ensure_ascii=False))
|
||||
time.sleep(20)
|
||||
check("after-restore")
|
||||
elif step == "remove":
|
||||
say(f"remove: {w.remove(APP)}")
|
||||
else:
|
||||
sys.exit("unknown step " + step)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python3
|
||||
"""redis6c.py — R-1096 6c on a test box after the catalog push: sync, then per app the dashboard's restart, and the
|
||||
Redis facts before/after (DBSIZE, INFO persistence, the container's Created + Cmd). Env SC, EV, TARGET; args: apps.
|
||||
`--no-restart` only reads (a box where CC presses nothing)."""
|
||||
import os, sys, time
|
||||
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
|
||||
import box_walk as w # noqa: E402
|
||||
|
||||
EV = os.environ["EV"]
|
||||
LOG = open(os.path.join(EV, f"6c-{w.TARGET}.txt"), "a", buffering=1)
|
||||
_say = w.say
|
||||
def say(*a):
|
||||
_say(*a); LOG.write(time.strftime("%H:%M:%S ") + " ".join(str(x) for x in a) + "\n")
|
||||
w.say = say
|
||||
|
||||
def facts(app):
|
||||
rc = f"{'paperless' if app == 'paperless-ngx' else app}-redis"
|
||||
out = w.guest(f"""echo "compose: $(grep -h 'redis-server' /opt/docker/stacks/{app}/docker-compose.yml /opt/docker/stacks/{app}/applied-compose.yml | tr -s ' ' | tr '\\n' '|')"
|
||||
echo "container: $(docker inspect -f '{{{{.Created}}}} {{{{json .Config.Cmd}}}}' {rc}) $(docker ps --filter name=^{rc}$ --format '{{{{.Status}}}}')"
|
||||
echo "dbsize: $(docker exec {rc} redis-cli DBSIZE) $(docker exec {rc} redis-cli INFO persistence | grep -E 'aof_enabled|rdb_last_bgsave_status' | tr -d '\\r' | tr '\\n' ' ')"
|
||||
echo "/data: $(docker exec {rc} ls /data | tr '\\n' ' ')" """)
|
||||
return out.strip()
|
||||
|
||||
def main():
|
||||
apps = [a for a in sys.argv[1:] if not a.startswith("--")]
|
||||
w.login()
|
||||
code, d = w.ctl("POST", "/api/sync")
|
||||
say(f"POST /api/sync -> {code} {str(d)[:200]}")
|
||||
time.sleep(5)
|
||||
for app in apps:
|
||||
say(f"== {app} before:\n{facts(app)}")
|
||||
if "--no-restart" in sys.argv:
|
||||
continue
|
||||
c, d = w.ctl("POST", f"/api/stacks/{app}/restart")
|
||||
say(f" POST /api/stacks/{app}/restart -> {c} {str(d)[:120]}")
|
||||
for _ in range(60):
|
||||
time.sleep(5)
|
||||
if w.stack(app).get("state") == "running":
|
||||
break
|
||||
time.sleep(15)
|
||||
st = w.stack(app)
|
||||
say(f"== {app} after (state={st.get('state')} hold={st.get('hold_reason')!r}):\n{facts(app)}")
|
||||
|
||||
main()
|
||||
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env python3
|
||||
"""repoint.py mirror|drill|restore|status — point a box (here scratch 9202, burndown 3) at the drill catalog WITHOUT a credential (R-992).
|
||||
|
||||
WHY A LOCAL MIRROR. `09` §6.5's route needs a catalog credential on the box: the drill repo is private (R-992). This
|
||||
session could not mint a READ-ONLY one — the Gitea credential on DooPlex is itself a token, and Gitea answers 403 to a
|
||||
token asking to list or create tokens (measured 2026-10-14) — and the night of 2026-10-06 put the admin WRITE token
|
||||
into the box's controller.yaml, which this task forbids. The cache-staging workaround of 2026-10-12 does not hold for a
|
||||
test that lasts days: every sync (and every controller start) re-applies the live catalog over the staged templates
|
||||
and over the installed apps' compose files (Syncer.copyTemplates, no deployed check).
|
||||
|
||||
So the drill catalog is MIRRORED onto the box: a bare git repository inside the controller's own data volume, and
|
||||
`git.repo_url: file:///opt/docker/felhom-controller/drill-catalog.git`. The controller's sync runs exactly as for a
|
||||
remote (clone/fetch/reset, the R-615 re-clone on a changed URL); no secret is on the box. DooPlex updates the mirror
|
||||
from the drill repo with a git bundle (`mirror`). The drill repo on Gitea stays the record.
|
||||
|
||||
SC=~/.felhom-tester1 TARGET=tester-1 python3 repoint.py mirror # (re)load the mirror from the drill repo main
|
||||
... repoint.py drill # save controller.yaml (once), set repo_url to the mirror, restart, sync, rescan
|
||||
... repoint.py restore # put the saved controller.yaml back (byte-identical), restart, sync, rescan
|
||||
... repoint.py status
|
||||
"""
|
||||
import os, subprocess, sys, time
|
||||
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
|
||||
import box_walk as w
|
||||
|
||||
DRILL = "/mnt/5_hdd/felhom.eu/drill/app-catalog-drill"
|
||||
VOL = "/var/lib/docker/volumes/felhom-controller-data/_data" # guest path of the controller's data volume
|
||||
CVOL = "/opt/docker/felhom-controller" # the same, inside the controller container
|
||||
SAVE = f"{VOL}/controller.yaml.pre-redis1017"
|
||||
MIRROR_URL = f"file://{CVOL}/drill-catalog.git"
|
||||
|
||||
|
||||
def status():
|
||||
print(w.guest(f"""grep -nE 'repo_url|sync_interval' {VOL}/controller.yaml; ls -l {SAVE} 2>&1 | tail -1
|
||||
docker exec felhom-controller sh -c 'git -C {CVOL}/drill-catalog.git log -1 --format="mirror main %h %s" main 2>&1;
|
||||
git -C {CVOL}/data/catalog-cache log -1 --format="cache HEAD %h %s" 2>&1; git -C {CVOL}/data/catalog-cache remote get-url origin'"""))
|
||||
|
||||
|
||||
def mirror():
|
||||
b = "/tmp/drill-redis1017.bundle"
|
||||
subprocess.run(["git", "-C", DRILL, "bundle", "create", b, "main"], check=True, capture_output=True)
|
||||
head = subprocess.run(["git", "-C", DRILL, "rev-parse", "--short", "main"], capture_output=True, text=True).stdout.strip()
|
||||
ssh = w.ssh_args()
|
||||
# bundle -> PVE host -> guest -> controller volume; the bare repo is made and fetched BY the controller's own user
|
||||
subprocess.run(["scp", "-q", "-o", "StrictHostKeyChecking=accept-new"] + (["-J", w._T["jump"]] if w._T["jump"] else [])
|
||||
+ [b, f"{w._T['ssh']}:{b}"], check=True)
|
||||
subprocess.run(ssh + [f"pct push {w.GUEST} {b} {VOL}/drill-redis1017.bundle && rm -f {b}"], check=True)
|
||||
print(w.guest(f"""set -e
|
||||
docker exec felhom-controller sh -c 'test -d {CVOL}/drill-catalog.git || git init -q --bare -b main {CVOL}/drill-catalog.git
|
||||
git -C {CVOL}/drill-catalog.git fetch -q {CVOL}/drill-redis1017.bundle +main:main && rm -f {CVOL}/drill-redis1017.bundle
|
||||
git -C {CVOL}/drill-catalog.git log -1 --format="mirror main %h %s" main'"""))
|
||||
print("drill repo main:", head)
|
||||
os.remove(b)
|
||||
|
||||
|
||||
def restart_sync():
|
||||
w.guest("docker restart felhom-controller >/dev/null")
|
||||
for _ in range(60):
|
||||
time.sleep(3)
|
||||
try:
|
||||
w.login()
|
||||
break
|
||||
except SystemExit:
|
||||
continue
|
||||
w.sync_rescan()
|
||||
time.sleep(3)
|
||||
print(w.guest("docker logs --since 3m felhom-controller 2>&1 | grep -E '\\[sync\\]' | grep -v DEBUG | tail -8"))
|
||||
|
||||
|
||||
def drill():
|
||||
print(w.guest(f"""set -e
|
||||
test -f {SAVE} || cp -p {VOL}/controller.yaml {SAVE}
|
||||
sed -i -E 's#^(\\s+repo_url: ).*$#\\1{MIRROR_URL}#' {VOL}/controller.yaml
|
||||
grep -n 'repo_url' {VOL}/controller.yaml; diff {SAVE} {VOL}/controller.yaml || true"""))
|
||||
restart_sync()
|
||||
status()
|
||||
|
||||
|
||||
def restore():
|
||||
print(w.guest(f"""set -e
|
||||
cp -p {SAVE} {VOL}/controller.yaml
|
||||
cmp {SAVE} {VOL}/controller.yaml && echo RESTORED-IDENTICAL; grep -n repo_url {VOL}/controller.yaml"""))
|
||||
restart_sync()
|
||||
status()
|
||||
|
||||
|
||||
{"mirror": mirror, "drill": drill, "restore": restore, "status": status}[sys.argv[1]]()
|
||||
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
"""samba1109.py — R-1109 live on demo-hp 9201 through the dashboard's own form posts (the „Megosztás" page).
|
||||
|
||||
Env: SC (0600 dir: .ctlpw, and .smbpw written here — never printed), EV, TARGET=9201. Steps:
|
||||
setup sharing on (server name FELHOMHP), a household SMB password, share r1109a in a NEW folder on hdd_1
|
||||
read NAME smbclient //192.168.0.155/NAME from SCRATCH GUEST 9202 (a throwaway --rm felhom-samba client
|
||||
container there — nothing runs on DooPlex): write, list, read back, delete; plus a wrong password
|
||||
rename A B the household's rename: delete share A, add share B on the SAME folder („existing")
|
||||
add NAME add a second share NAME on the same folder as r1109b
|
||||
delete NAME delete a share
|
||||
facts felhom-samba's Created + label, the smb.conf share sections, the compose's binds
|
||||
teardown delete the test shares, sharing off, remove the test folder
|
||||
"""
|
||||
import os, secrets, subprocess, sys, time
|
||||
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/app-catalog-felhom.eu/scripts")
|
||||
sys.path.insert(0, "/mnt/5_hdd/felhom.eu/git/felhom.eu/documentation/audits/night-restore-2026-10-17/tools")
|
||||
import box_walk as w # noqa: E402
|
||||
EV = os.environ["EV"]
|
||||
LOG = open(os.path.join(EV, "r1109-samba-live.txt"), "a", buffering=1)
|
||||
_say = w.say
|
||||
def say(*a):
|
||||
_say(*a); LOG.write(time.strftime("%H:%M:%S ") + " ".join(str(x) for x in a) + "\n")
|
||||
w.say = say
|
||||
import drill # noqa: E402 (form(): a dashboard FORM post with the session's CSRF)
|
||||
import re # noqa: E402
|
||||
# drill.form logs the fields it posts — a password field is redacted BEFORE the line is written anywhere (2026-10-17:
|
||||
# the first run logged the throwaway test password; scrubbed, and the password replaced at teardown).
|
||||
drill.say = lambda *a: say(*[re.sub(r"('smb_password(?:_confirm)?': )'[^']*'", r"\1'<redacted>'", str(x)) for x in a])
|
||||
ROOT = "/mnt/felhom-drives/hdd_1"
|
||||
DIR = ROOT + "/shares/r1109a"
|
||||
IMG = "gitea.dooplex.hu/admin/felhom-samba:1.2.0"
|
||||
|
||||
def facts():
|
||||
out = w.guest("""docker inspect felhom-samba -f 'samba: created {{.Created}} label={{index .Config.Labels "felhom.smb-conf-sha256"}} status={{.State.Status}}' 2>&1
|
||||
d=/opt/docker/stacks/felhom-samba; [ -d $d ] || d=$(dirname $(ls /opt/docker/stacks/*/smb.conf | head -1))
|
||||
echo "smb.conf shares: $(grep -E '^\\[' $d/smb.conf | tr '\\n' ' ')"
|
||||
echo "smb.conf hash: $(sha256sum $d/smb.conf | cut -c1-16)… compose binds: $(grep -E '^ - /mnt' $d/docker-compose.yml | tr -s ' ' | tr '\\n' ' ')"
|
||||
echo "inside the container: $(docker exec felhom-samba grep -E '^\\[' /etc/samba/smb.conf | tr '\\n' ' ')" """)
|
||||
say(out.strip())
|
||||
|
||||
def read(name):
|
||||
auth = f"/root/r1109-auth-{os.getpid()}"
|
||||
pw = open(f"{w.SC}/.smbpw").read().strip()
|
||||
script = (f"umask 077; printf 'username=felhom\\npassword=%s\\n' \"$(cat)\" > {auth}; "
|
||||
f"printf 'username=felhom\\npassword=not-the-password\\n' > {auth}.bad; docker pull -q {IMG} >/dev/null; "
|
||||
f"docker run --rm --network host -v {auth}:/auth:ro --entrypoint sh {IMG} -c "
|
||||
f"\"echo r1109-{name} > /tmp/p.txt && smbclient //192.168.0.155/{name} -A /auth -m SMB3 -c 'put /tmp/p.txt probe-{name}.txt; ls probe-*; get probe-{name}.txt /tmp/b.txt; rm probe-{name}.txt' 2>&1 | grep -vE '^\\s*$|blocks of size'; echo \\\"read back: \\$(cat /tmp/b.txt 2>/dev/null || echo NOTHING)\\\"\"; "
|
||||
f"echo 'wrong password:' $(docker run --rm --network host -v {auth}.bad:/auth:ro --entrypoint smbclient {IMG} //192.168.0.155/{name} -A /auth -m SMB3 -c ls 2>&1 | tail -1); "
|
||||
f"rm -f {auth} {auth}.bad")
|
||||
# The password travels on STDIN only: the first line is read into a shell variable on the Proxmox host and piped
|
||||
# to the guest script by printf (a builtin — never an argv, never a file); the script follows on the same stdin.
|
||||
r = subprocess.run(w.ssh_args() + ["umask 077; IFS= read -r PW; cat > /tmp/r1109.sh; pct push 9202 /tmp/r1109.sh /root/r1109.sh; "
|
||||
"rm -f /tmp/r1109.sh; printf '%s' \"$PW\" | pct exec 9202 -- bash /root/r1109.sh; "
|
||||
"pct exec 9202 -- rm -f /root/r1109.sh"],
|
||||
input=pw + "\n" + script, capture_output=True, text=True, timeout=300)
|
||||
say(f"read //{name} from 9202:\n" + "\n".join(l for l in (r.stdout + r.stderr).splitlines() if not l.startswith("perl:") and "locale" not in l and "LC_" not in l and "LANG" not in l and "are supported" not in l))
|
||||
|
||||
def main():
|
||||
step, args = sys.argv[1], sys.argv[2:]
|
||||
w.login()
|
||||
if step == "setup":
|
||||
drill.form("/sharing/enable", {"enabled": "on", "server_name": "FELHOMHP"})
|
||||
pw = secrets.token_urlsafe(18)
|
||||
fd = os.open(f"{w.SC}/.smbpw", os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600); os.write(fd, pw.encode()); os.close(fd)
|
||||
drill.form("/sharing/password", {"smb_password": pw, "smb_password_confirm": pw})
|
||||
for _ in range(60):
|
||||
time.sleep(5)
|
||||
c, d = w.ctl("GET", "/sharing/status")
|
||||
if "running" in str(d).lower() and "prepar" not in str(d).lower():
|
||||
break
|
||||
say("status: " + str(d)[:300])
|
||||
drill.form("/sharing/shares", {"name": "r1109a", "mode": "new", "storage_root": ROOT})
|
||||
time.sleep(8); facts()
|
||||
elif step == "read":
|
||||
read(args[0])
|
||||
elif step == "rename":
|
||||
a, b = args
|
||||
drill.form("/sharing/shares/delete", {"name": a}); time.sleep(6)
|
||||
drill.form("/sharing/shares", {"name": b, "mode": "existing", "path": DIR}); time.sleep(10); facts()
|
||||
elif step == "add":
|
||||
drill.form("/sharing/shares", {"name": args[0], "mode": "existing", "path": DIR}); time.sleep(10); facts()
|
||||
say("controller log: " + w.guest("docker logs --since 2m felhom-controller 2>&1 | grep -iE 'samba|sharing' | grep -v DEBUG | tail -6"))
|
||||
elif step == "delete":
|
||||
drill.form("/sharing/shares/delete", {"name": args[0]}); time.sleep(10); facts()
|
||||
elif step == "facts":
|
||||
facts()
|
||||
elif step == "teardown":
|
||||
dead = secrets.token_urlsafe(18) # the household password replaced by an unlogged one before sharing goes off
|
||||
drill.form("/sharing/password", {"smb_password": dead, "smb_password_confirm": dead})
|
||||
time.sleep(5)
|
||||
for n in args:
|
||||
drill.form("/sharing/shares/delete", {"name": n})
|
||||
drill.form("/sharing/enable", {"enabled": "off", "server_name": "FELHOMHP"})
|
||||
time.sleep(10)
|
||||
say("teardown: " + w.guest(f"rm -rf {DIR}; rmdir {ROOT}/shares 2>/dev/null; docker ps -a --filter name=felhom-samba --format '{{{{.Names}}}} {{{{.Status}}}}'; ls {ROOT}/shares 2>&1 | head -2"))
|
||||
os.remove(f"{w.SC}/.smbpw")
|
||||
else:
|
||||
sys.exit("unknown step")
|
||||
|
||||
main()
|
||||
@@ -27,3 +27,23 @@ unchecked); the AOF → RDB switch keeping existing data is likely (Redis 7 writ
|
||||
unproven. Also: R-1096's own history is wrong — `audits/r672-2026-09-24/B7-redis-aof-fix.txt` shows RomM's AOF WAS
|
||||
repaired on 2026-09-24 (cut by 6 631 B, fix_rc=0, romm-redis then running); the 2026-10-16 crash loop has no proven
|
||||
cause (its Redis log was never read).
|
||||
|
||||
## Update 2026-10-17 (day, burndown 3) — DONE for AOF → RDB; the volume removal deferred
|
||||
|
||||
- **Proved first on scratch 9202** (`audits/burndown-3-2026-10-17/P6/`): docmost, 100 probe keys; the RDB line delivered
|
||||
through a catalog (the drill, mirrored into the box) and the dashboard's restart → 100/100 back, `aof_enabled:0`,
|
||||
`rdb_last_bgsave_status:ok` (Redis 7 wrote `dump.rdb` at the AOF instance's shutdown and loaded it); the nightly
|
||||
volume dump + FLUSHALL + the backups page's restore → 100/100 back. Damage: 64 zero bytes in the AOF → „Bad file format
|
||||
… use ./redis-check-aof --fix", exit 1; RDB on a full 1 MiB tmpfs → BGSAVE `err`, old `dump.rdb` byte-identical,
|
||||
restart loads it (50 keys); a HALF-CUT `dump.rdb` also refuses to start („RDB ERROR DETECTED") — the write path never
|
||||
leaves one (temp file + rename).
|
||||
- **Changed:** catalog `5d9450b` — the five templates `--appendonly no`; `steps/` files unchanged (tested definitions,
|
||||
`09` §6.4 part 5; a frozen app is frozen whole, `09` §3 decision 4 / `sync/sync.go` renderSource). Gate
|
||||
`redis-persistence`. A box takes it at the app's next start: demo-hp 9201 restarted through the dashboard 2026-10-17
|
||||
(romm, docmost, paperless — each `aof_enabled:0`, healthy).
|
||||
- **Deferred (R-1117):** removing the Immich/Nextcloud Redis volume (tmpfs) — it leaves the old volume on installed boxes
|
||||
and the nightly dump / old-backup restore behaviour for a removed volume is unchecked; the RDB switch already removes
|
||||
the danger.
|
||||
- The old `appendonlydir/` stays in each volume (ignored with `--appendonly no`; ~0.3 MB on docmost). A box whose AOF is
|
||||
ALREADY damaged should now start from its last snapshot, since `--appendonly no` never reads the AOF (reasoned, NOT
|
||||
measured).
|
||||
Reference in new issue
Block a user