3"""Independent must-fire mutations for the HIL convergence safety gate."""
5from __future__
import annotations
7from hil_convergence_safety_image_lock_fixtures
import (
8 mutations
as split_image_lock_mutations,
10from hil_convergence_safety_image_lock_fixtures
import (
11 runtime_loader_mutations,
12 runtime_readiness_mutations,
13 runtime_selftest_tail_mutations,
14 runtime_worker_mutations,
17Mutation = tuple[str, str, str, str]
18Reorder = tuple[str, str, str]
21def _helper_mutations() -> tuple[Mutation, ...]:
22 """Return executable idle-stop helper mutations."""
25 "freeze token stranded in a comment",
27 'control.command("freeze", service)',
28 'control.command("thaw", service)\n # control.command("freeze", service)',
31 "transport-loss thaw removal",
33 "signal.signal(signal.SIGHUP, _interrupt)",
34 "signal.signal(signal.SIGTERM, _interrupt)",
37 "semantic helper selftest stranded in a comment",
39 " python3 infra/ansible/roles/dev_box/files/"
40 "ra8-hil-runner-idle-stop.py --selftest ignored.service",
41 " # python3 infra/ansible/roles/dev_box/files/"
42 "ra8-hil-runner-idle-stop.py --selftest ignored.service",
45 "absent-unit distinction removal",
47 'if load_state == "not-found":',
48 'if load_state == "inactive":',
53def _runner_dispatch_mutations() -> tuple[Mutation, ...]:
54 """Return native dispatcher mutations."""
57 "whole-apply wrapper token stranded in a comment",
59 "guard = _bench_guard_argv(host, plays, args)",
60 "# guard = _bench_guard_argv(host, plays, args)\n guard = []",
63 "native-runner preflight removal",
65 "maintenance = _prepare_native_runner(",
66 "maintenance = frm.MaintenanceDecision(",
69 "no-op preflight bypass",
71 "if not has_changes:",
72 "if False and not has_changes:",
75 "no-op token stranded in a comment",
77 " if not has_changes:",
78 " # if not has_changes:\n if False:",
81 "native Ansible sanitizer stranded in a comment",
83 "env=frm.ansible_environment(os.environ, fm.ANSIBLE_DIR),",
84 "env=None, # env=frm.ansible_environment(os.environ, fm.ANSIBLE_DIR),",
89def _bench_boundary_mutations() -> tuple[Mutation, ...]:
90 """Return bench lock, authentication, and refusal mutations."""
93 "bench privileged Bash boundary removal",
95 '"/bin/bash",\n "-p",\n str(request.repo_root / "scripts/hil/bench.sh"),',
96 'str(request.repo_root / "scripts/hil/bench.sh"),',
99 "bench live-lock privileged Bash boundary removal",
101 '"--norc",\n "-p",\n "-c",\n script,',
102 '"--norc",\n "-c",\n script,',
105 "bench privileged Bash execution probe order invalid",
107 '"/bin/bash",\n "--noprofile",\n "--norc",\n'
108 ' "-p",\n "-c",\n probe,',
109 '"/bin/bash",\n "-p",\n "--noprofile",\n'
110 ' "--norc",\n "-c",\n probe,',
113 "bench privileged Bash execution probe stranded",
115 "failures = _privileged_bash_selftest()",
116 "failures = [] # _privileged_bash_selftest()",
119 "bench tag refusal bypass",
121 "if request.tags and not request.trusted_tags:",
122 "if False and request.tags and not request.trusted_tags:",
125 "bench extra-var refusal bypass",
127 "if request.extra_vars:",
128 "if False and request.extra_vars:",
131 "well-formed inherited lock accepted without authentication",
133 "if not authenticate(request.repo_root, capability):",
134 "if False and not authenticate(request.repo_root, capability):",
139def _runner_boundary_mutations() -> tuple[Mutation, ...]:
140 """Return native environment and transport mutations."""
143 "native child PATH inheritance restored",
145 '"LC_ALL": "C.UTF-8",\n "PATH": "/usr/bin:/bin",',
146 '"LC_ALL": "C.UTF-8",\n "PATH": environment.get("PATH", "/usr/bin:/bin"),',
149 "collection link census stranded",
151 "link_errors = fpa.confined_link_errors(collections)",
152 "link_errors = [] # fpa.confined_link_errors(collections)",
155 "absolute SSH authority removed",
157 '["/usr/bin/ssh", *SSH_OPTIONS]',
158 '["ssh", *SSH_OPTIONS]',
163def _wsl_mode_mutations() -> tuple[Mutation, ...]:
164 """Return managed WSL environment and operation-mode mutations."""
167 "WSL sanitizer stranded as inert text",
169 '\' case "$name" in ANSIBLE_*) unset "$name" ;; esac\',',
170 '\'# case "$name" in ANSIBLE_*) unset "$name" ;; esac\',',
173 "WSL uv sanitizer stranded as inert text",
175 '\' case "$name" in UV_*) unset "$name" ;; esac\',',
176 '\'# case "$name" in UV_*) unset "$name" ;; esac\',',
179 "WSL apply-only sync decision bypassed",
181 '"authority_digest=${authority_digest%% *}",\n'
182 " 'if [ \"$mode\" = apply ]; then',",
183 '"authority_digest=${authority_digest%% *}",\n'
184 " 'if [ \"$mode\" != apply ]; then',",
187 "WSL operation mode forced to apply",
189 " request.args.mode,",
190 ' "apply", # request.args.mode',
193 "WSL check-mode verification made mutating",
195 'f"{sync_flags} --check || sync_status=$?",',
196 'f"{sync_flags} || sync_status=$?",',
201def _wsl_transport_mutations() -> tuple[Mutation, ...]:
202 """Return WSL stage, cache, shell-boundary, and archive mutations."""
205 "WSL owned-stage selftest stranded",
207 "stage_failures = fws.run_selftest()",
208 "stage_failures = [] # fws.run_selftest()",
211 "WSL exclusive cache receiver weakened",
217 "WSL cache ownership proof stranded",
219 "stdin=fws.cache_prepare_script(),",
220 'stdin="true\\n", # fws.cache_prepare_script()',
223 "WSL Bash env-empty boundary removed",
224 "fleet_runner_model",
225 "HOME=/root PATH=/usr/bin:/bin /bin/bash -s",
226 "HOME=/root PATH=/hostile /bin/bash -s",
229 "WSL archive PATH lookup restored",
231 'tar_tool = Path("/usr/bin/tar")',
232 'tar_tool = Path("tar")',
237def _wsl_durability_mutations() -> tuple[Mutation, ...]:
238 """Return crash-durable publication mutations."""
241 "stage publication parent fsync removed",
243 '\' mv -- "$stage" "$previous"\',\n'
244 ' \' sync_dir "$(dirname -- "$stage")"\',',
245 '\' mv -- "$stage" "$previous"\',\n'
246 ' \' true # sync_dir "$(dirname -- "$stage")"\',',
249 "cache publication parent fsync removed",
251 "'sync_file \"$part\"',",
252 "'true # sync_file \"$part\"',",
255 "WSL managed lock marker parent fsync removed",
257 "' sync_dir \"$managed_root\"',",
258 "' true # sync_dir \"$managed_root\"',",
263def _role_decision_mutations() -> tuple[Mutation, ...]:
264 """Return Ansible service and holder-decision mutations."""
267 "restart without idle proof",
273 "J-Link token stranded behind true",
275 'JLinkExe -device "$device" -if SWD',
276 'true # JLinkExe -device "$device" -if SWD',
279 "J-Link contract device authority replaced",
281 "--default JLINK_DEVICE",
285 "J-Link duplicate role default introduced",
287 "hil_bench_jlink_speed: 1000",
288 'hil_bench_jlink_device: "literal"\nhil_bench_jlink_speed: 1000',
291 "bench kernel verifier source replaced",
293 "bench_lock_verify.py",
294 "bench_lock_verify_disabled.py",
297 "delegated kernel verifier source replaced",
299 "bench_lock_verify.py",
300 "bench_lock_verify_disabled.py",
303 "listener decision or-true bypass",
305 "dev_box_hil_runner_initial_activity.stdout | trim in ['inactive', 'failed'])))",
306 "dev_box_hil_runner_initial_activity.stdout | trim in "
307 "['inactive', 'failed']))) or true",
312def _context_authority_mutations() -> tuple[Mutation, ...]:
313 """Return lock-verifier and staged-context authority mutations."""
316 "lock verifier regular-fd filter removed",
318 "if not stat.S_ISREG(before.st_mode):\n continue",
319 "if stat.S_ISREG(before.st_mode):\n pass",
322 "lock verifier live descriptor selftest stranded",
324 "+ _live_descriptor_selftest()",
325 "+ [] # live descriptor selftest stranded",
328 "dev context root lock scope removed",
331 " # uv.lock scope removed",
334 "dev context consumed pin renamed away from its authority",
336 " - HADOLINT_SHA256_ARM64",
337 " - HADOLINT_SHA256_AARCH64",
340 "dev context consumed root input omitted from assertion",
343 " # .dockerignore assertion removed",
345 *_image_lock_mutations(),
349def _image_lock_mutations() -> tuple[Mutation, ...]:
350 """Return managed image-lock ownership and fail-closed mutations."""
352 *split_image_lock_mutations(),
353 *_image_lock_ansible_object_mutations(),
354 *_image_lock_runtime_authority_mutations(),
355 *_image_lock_runtime_selftest_mutations(),
359def _image_lock_ansible_object_mutations() -> tuple[Mutation, ...]:
360 """Return Ansible refusal and object-mode mutations."""
362 *_image_lock_ansible_refusal_mutations(),
363 *_image_lock_ansible_permission_mutations(),
364 *_image_lock_ansible_marker_mutations(),
368def _image_lock_ansible_refusal_mutations() -> tuple[Mutation, ...]:
369 """Return numeric-group and unsafe-object refusal mutations."""
372 "managed image lock numeric group resolution changed users",
374 ' - --\n - "{{ dev_box_user }}"\n register: dev_box_image_lock_gid',
375 " - --\n - root\n register: dev_box_image_lock_gid",
378 "unsafe managed image lock directory refusal removed",
380 " not dev_box_image_lock_dir_before.stat.exists or\n",
384 "unsafe managed image lock file refusal removed",
386 " not dev_box_image_lock_before.stat.exists or\n",
392def _image_lock_ansible_permission_mutations() -> tuple[Mutation, ...]:
393 """Return managed directory and lock permission mutations."""
396 "managed image lock directory made group-replaceable",
398 ' mode: "0750"\n\n- name: Reinspect the converged managed image lock directory',
399 ' mode: "0770"\n\n- name: Reinspect the converged managed image lock directory',
402 "managed image lock file made world-writable",
404 ' mode: "0660"\n access_time: preserve',
405 ' mode: "0666"\n access_time: preserve',
408 "managed image lock directory numeric group drifted",
410 ' group: "{{ dev_box_image_lock_gid.stdout }}"\n mode: "0750"',
411 ' group: root\n mode: "0750"',
414 "managed image lock file numeric group drifted",
416 ' group: "{{ dev_box_image_lock_gid.stdout }}"\n mode: "0660"',
417 ' group: root\n mode: "0660"',
422def _image_lock_ansible_marker_mutations() -> tuple[Mutation, ...]:
423 """Return managed numeric-group marker mutations."""
426 "managed image lock group marker refusal removed",
428 " not dev_box_image_lock_gid_marker_before.stat.exists or\n",
432 "managed image lock group marker made writable",
434 ' mode: "0444"\n unsafe_writes: false',
435 ' mode: "0644"\n unsafe_writes: false',
438 "managed image lock group marker owner drifted",
440 ' owner: root\n group: root\n mode: "0444"',
441 ' owner: nobody\n group: root\n mode: "0444"',
444 "managed image lock group marker content drifted",
446 ' content: "{{ dev_box_image_lock_gid.stdout }}\\n"',
450 "managed image lock group marker loses atomic writes",
452 " unsafe_writes: false",
453 " unsafe_writes: true",
458def _image_lock_runtime_authority_mutations() -> tuple[Mutation, ...]:
459 """Return runtime metadata and discovery mutations."""
461 *_image_lock_runtime_discovery_mutations(),
462 *_image_lock_runtime_marker_mutations(),
463 *runtime_loader_mutations(),
467def _image_lock_runtime_discovery_mutations() -> tuple[Mutation, ...]:
468 """Return managed metadata and canonical discovery mutations."""
471 "runtime managed directory metadata validation weakened",
472 "devcontainer_image",
473 ' [[ "$owner" == "0" && "$mode" == "750" ]] ||',
474 ' [[ "$owner" == "0" ]] ||',
477 "runtime managed lock mode validation weakened",
478 "devcontainer_image",
479 ' [[ "$group" == "$IMAGE_LOCK_GROUP_GID" ]] ||',
480 ' [[ "$group" == "0" ]] ||',
483 "canonical non-login image lock discovery removed",
484 "devcontainer_image",
485 ' elif [[ -e "$canonical_dir" || -L "$canonical_dir" ||\n'
486 ' -e "$canonical_dir/devcontainer-image.lock" ||\n'
487 ' -L "$canonical_dir/devcontainer-image.lock" ||\n'
488 ' -e "$canonical_dir/devcontainer-image.gid" ||\n'
489 ' -L "$canonical_dir/devcontainer-image.gid" ]]; then',
495def _image_lock_runtime_marker_mutations() -> tuple[Mutation, ...]:
496 """Return managed marker identity and content mutations."""
499 "managed image lock group marker hardlink check removed",
500 "devcontainer_image",
501 ' [[ "$links" == "1" && "$owner" == "0" && "$group" == "0" '
502 '&& "$mode" == "444" ]] ||',
503 ' [[ "$owner" == "0" && "$group" == "0" && "$mode" == "444" ]] ||',
506 "managed image lock group marker owner check removed",
507 "devcontainer_image",
508 '"$links" == "1" && "$owner" == "0" && "$group" == "0"',
509 '"$links" == "1" && "$owner" != "" && "$group" == "0"',
512 "managed image lock group marker mode check weakened",
513 "devcontainer_image",
514 '&& "$mode" == "444" ]] ||',
515 '&& "$mode" == "644" ]] ||',
518 "managed image lock group marker allows root group content",
519 "devcontainer_image",
520 '[[ "$marker_gid" =~ ^[0-9]+$ && "$marker_gid" != "0" ]] ||',
521 '[[ "$marker_gid" =~ ^[0-9]+$ ]] ||',
524 "managed image lock group marker trailing content check removed",
525 "devcontainer_image",
526 " if IFS= read -r -n 1 extra <&7; then",
530 "managed image lock group marker exact size proof removed",
531 "devcontainer_image",
532 " ((size == ${#marker_gid} + 1)) ||",
536 "managed image lock group marker opened-inode check removed",
537 "devcontainer_image",
538 ' [[ "$opened" == "$identity" && "$current" == "$opened" ]] ||',
544def _image_lock_runtime_selftest_mutations() -> tuple[Mutation, ...]:
545 """Return bounded contention-selftest mutations."""
547 *runtime_readiness_mutations(),
548 *runtime_worker_mutations(),
549 *_image_lock_selftest_cleanup_mutations(),
550 *_image_lock_selftest_lock_control_mutations(),
551 *_image_lock_selftest_dispatch_mutations(),
552 *_image_lock_selftest_completion_mutations(),
553 *_image_lock_selftest_trap_mutations(),
554 *runtime_selftest_tail_mutations(),
558def _image_lock_selftest_cleanup_mutations() -> tuple[Mutation, ...]:
559 """Return group termination, lock release, and reap mutations."""
562 "image lock cleanup group TERM removed",
563 "devcontainer_image_lock_selftest",
564 " if worker_group_signal_is_authorized 2>/dev/null; then\n"
565 " group_signal_authorized=1\n"
566 ' kill -TERM -- "-$SELFTEST_WORKER_PGID" 2>/dev/null || cleanup_failed=1',
567 " if worker_group_signal_is_authorized 2>/dev/null; then\n true",
570 "image lock cleanup group KILL escalation removed",
571 "devcontainer_image_lock_selftest",
572 ' if [[ "$group_signal_authorized" == "1" ]] &&\n'
573 " worker_group_signal_is_authorized 2>/dev/null; then\n"
574 ' kill -KILL -- "-$SELFTEST_WORKER_PGID" 2>/dev/null || cleanup_failed=1',
575 ' if [[ "$group_signal_authorized" == "1" ]] &&\n true; then\n true',
578 "image lock cleanup unlock removed",
579 "devcontainer_image_lock_selftest",
580 " flock -u 8 || release_failed=1\n if exec 8>&-; then",
581 " true || release_failed=1\n if exec 8>&-; then",
584 "image lock cleanup descriptor close removed",
585 "devcontainer_image_lock_selftest",
586 " if exec 8>&-; then\n SELFTEST_PARENT_LOCK_OPEN=0",
587 " if true; then\n SELFTEST_PARENT_LOCK_OPEN=0",
590 "image lock bounded reap terminal proof removed",
591 "devcontainer_image_lock_selftest",
592 ' bounded_process_terminal "$pid" || return 1\n if wait "$pid"; then',
593 ' true\n if wait "$pid"; then',
598def _image_lock_selftest_lock_control_mutations() -> tuple[Mutation, ...]:
599 """Return lock-probe mutations and their two-sided controls."""
602 "image lock fresh lock probe bypassed",
603 "devcontainer_image_lock_selftest",
604 " if ! flock -n 7; then\n if ! exec 7>&-; then",
605 " if ! true; then\n if ! exec 7>&-; then",
608 "image lock held-lock negative control removed",
609 "devcontainer_image_lock_selftest",
610 " if fresh_lock_probe; then\n"
611 ' die "selftest: fresh lock probe accepted a held lock"',
612 ' if false; then\n die "selftest: fresh lock probe accepted a held lock"',
615 "image lock released-lock positive control removed",
616 "devcontainer_image_lock_selftest",
617 ' fresh_lock_probe || die "selftest: fresh lock probe failed after worker completion"',
623def _image_lock_selftest_dispatch_mutations() -> tuple[Mutation, ...]:
624 """Return mutations that strand individual attack dispatchers."""
627 "image lock early-exit attack removed",
628 "devcontainer_image_selftest_cases",
629 ' run_image_lock_scenario early-exit selftest_early_exit "$tmp"',
633 "image lock pre-ready-hang attack removed",
634 "devcontainer_image_selftest_cases",
635 ' run_image_lock_scenario pre-ready-hang selftest_pre_ready_hang "$tmp"',
639 "image lock post-ready-hang attack removed",
640 "devcontainer_image_selftest_cases",
641 ' run_image_lock_scenario post-ready-hang selftest_post_ready_hang "$tmp"',
645 "image lock signal cleanup attack removed",
646 "devcontainer_image_selftest_cases",
647 ' run_image_lock_scenario signal-cleanup selftest_signal_cleanup "$tmp"',
651 "image lock unready signal cleanup attack removed",
652 "devcontainer_image_selftest_cases",
653 ' run_image_lock_scenario signal-ready-timeout selftest_signal_ready_timeout "$tmp"',
659def _image_lock_selftest_completion_mutations() -> tuple[Mutation, ...]:
660 """Return completion, descendant, and final-group proof mutations."""
663 "image lock successful child reap removed",
664 "devcontainer_image_lock_selftest",
665 ' reap_worker || die "selftest: normal child did not finish"',
669 "image lock successful done-status wait removed",
670 "devcontainer_image_lock_selftest",
671 ' wait_for_status_file "$SELFTEST_CASE_DIR/done.status" '
672 '"$SELFTEST_WORKER_PID" ||\n'
673 ' die "selftest: forced rebuild did not complete after release"',
677 "image lock cleanup descendant assertion removed",
678 "devcontainer_image_lock_selftest",
679 " assert_no_surviving_descendants || cleanup_failed=1",
683 "image lock cleanup fresh-lock assertion removed",
684 "devcontainer_image_lock_selftest",
685 " fresh_lock_probe || cleanup_failed=1",
689 "image lock cleanup final group-gone assertion removed",
690 "devcontainer_image_lock_selftest",
691 ' bounded_group_gone "$SELFTEST_WORKER_PGID" || cleanup_failed=1',
695 "image lock cleanup descendant-absence assertion removed",
696 "devcontainer_image_lock_selftest",
697 ' bounded_process_absent "$pid" || return 1',
703def _image_lock_selftest_trap_mutations() -> tuple[Mutation, ...]:
704 """Return signal and trap-lifecycle mutations."""
707 "image lock HUP cleanup trap removed",
708 "devcontainer_image_lock_selftest",
709 " trap 'image_lock_case_signal 129' HUP",
713 "image lock INT cleanup trap removed",
714 "devcontainer_image_lock_selftest",
715 " trap 'image_lock_case_signal 130' INT",
719 "image lock TERM cleanup trap removed",
720 "devcontainer_image_lock_selftest",
721 " trap 'image_lock_case_signal 143' TERM",
725 "image lock cleanup trap clear removed",
726 "devcontainer_image_lock_selftest",
727 "clear_image_lock_case_traps() {\n restore_selftest_root_traps",
728 "clear_image_lock_case_traps() {\n true",
733def _role_entry_mutations() -> tuple[Mutation, ...]:
734 """Return independently selectable role and workflow mutations."""
737 "dev role prefix guard removed",
739 "Authenticate the HIL and bench mutation boundary before this role",
740 "Skip the HIL and bench mutation boundary before this role",
743 "direct HIL task guard removed",
745 "Re-authenticate the mutation boundary for direct HIL task inclusion",
746 "Skip the mutation boundary for direct HIL task inclusion",
749 "direct bench role guard removed",
751 "Authenticate the whole-bench transaction before this role",
752 "Skip the whole-bench transaction before this role",
755 "direct C6 role guard removed",
757 "Authenticate the whole-bench transaction before the C6 role",
758 "Skip the whole-bench transaction before the C6 role",
761 "direct AD2 role guard removed",
763 "Authenticate the whole-bench transaction before the AD2 role",
764 "Skip the whole-bench transaction before the AD2 role",
767 "dev play start-at-task front door bypass",
769 "when: dev_box_hil_mutation_authenticated | default(false) | bool",
773 "bench play start-at-task front door bypass",
775 "- name: Converge the bench host beneath its authenticated front door\n"
776 " when: hil_bench_transaction_authenticated | default(false) | bool",
777 "- name: Converge the bench host beneath its authenticated front door\n"
781 "default nproc escape",
784 "RA8_MAX_JOBS: ${{ nproc }}",
789 "CMAKE_BUILD_PARALLEL_LEVEL: 4",
790 "CMAKE_BUILD_PARALLEL_LEVEL: 8",
795def _transaction_entry_mutations() -> tuple[Mutation, ...]:
796 """Return dynamic transaction-entry mutations for direct selector attacks."""
799 "dev role dynamic transaction entry replaced by static import",
801 "ansible.builtin.include_tasks:",
802 "ansible.builtin.import_tasks:",
805 "dev dynamic transaction entry replaced by static import",
807 "ansible.builtin.include_tasks:",
808 "ansible.builtin.import_tasks:",
811 "bench dynamic transaction entry replaced by static import",
813 "ansible.builtin.include_tasks:",
814 "ansible.builtin.import_tasks:",
817 "C6 dynamic transaction entry replaced by static import",
819 "ansible.builtin.include_tasks:",
820 "ansible.builtin.import_tasks:",
823 "AD2 dynamic transaction entry replaced by static import",
825 "ansible.builtin.include_tasks:",
826 "ansible.builtin.import_tasks:",
831def mutations() -> tuple[Mutation, ...]:
832 """Return every independent must-fire mutation."""
834 *_helper_mutations(),
835 *_runner_dispatch_mutations(),
836 *_bench_boundary_mutations(),
837 *_runner_boundary_mutations(),
838 *_wsl_mode_mutations(),
839 *_wsl_transport_mutations(),
840 *_wsl_durability_mutations(),
841 *_role_decision_mutations(),
842 *_context_authority_mutations(),
843 *_role_entry_mutations(),
844 *_transaction_entry_mutations(),
848def reorders() -> tuple[Reorder, ...]:
849 """Return task reorderings that must violate the HIL convergence boundary."""
852 "managed image lock directory creation moved before refusal",
853 "Create the managed image lock directory",
854 "Refuse an unsafe managed image lock directory",
857 "managed image lock file creation moved before refusal",
858 "Create the stable managed image lock file",
859 "Refuse an unsafe managed image lock file",
862 "managed image lock marker creation moved before refusal",
863 "Create the managed image lock numeric group marker atomically",
864 "Refuse an unsafe managed image lock group marker",
867 "managed image lock file creation moved before directory refusal",
868 "Create the stable managed image lock file",
869 "Refuse an unsafe managed image lock directory",
872 "managed image lock marker creation moved before directory refusal",
873 "Create the managed image lock numeric group marker atomically",
874 "Refuse an unsafe managed image lock directory",
877 "managed image lock directory creation moved before file refusal",
878 "Create the managed image lock directory",
879 "Refuse an unsafe managed image lock file",
882 "managed image lock marker creation moved before file refusal",
883 "Create the managed image lock numeric group marker atomically",
884 "Refuse an unsafe managed image lock file",
887 "managed image lock directory creation moved before marker refusal",
888 "Create the managed image lock directory",
889 "Refuse an unsafe managed image lock group marker",
892 "managed image lock file creation moved before marker refusal",
893 "Create the stable managed image lock file",
894 "Refuse an unsafe managed image lock group marker",
897 "managed image lock group refusal moved after directory creation",
898 "Create the managed image lock directory",
899 "Refuse an unsafe managed image lock numeric primary group",
902 "real image build moved before its staleness selftest",
903 "Build the gate image unless the cached one matches this context",
904 "Prove the staleness check itself works, before trusting its verdict",