본문으로 건너뛰기

하드웨어 테스트 소유권

테스트 제한 시간은 실패를 판정하는 기준이지, DMA 소유자를 강제 종료할 권한이 아닙니다. 감독자를 사용하는 하드웨어 검증에서는 DevKit의 tools/hardware_test_supervisor.py를 사용합니다. 지속 실행되는 감독자가 실제 가속기 프로세스를 소유합니다. CTest, SSH 및 Python 클라이언트는 보고 연결만 소유합니다.

감독자를 사용하는 검증 선택​

표준 CI는 CTest와 성능 하위 프로세스를 직접 실행하며 감독자나 소켓이 필요하지 않습니다. 필수 적용 범위 검사는 선택한 테스트가 누락되거나, 비활성화되거나, 건너뛰어지거나, 실패하면 계속 실패로 판정합니다. 다음 절차는 명시적으로 선택하는 검증 모드이며 표준 CI의 필수 조건이 아닙니다.

NEAT_GUARDED_HARDWARE_TESTS=ON으로 Core를 빌드하거나 CMake에서 SIMANEAT_GUARDED_HARDWARE_TESTS=ON을 설정하세요. 네이티브 CTest 타깃은 보고 프록시가 됩니다. 테스트 인수, 환경, 레이블, 리소스 잠금 및 기존 TIMEOUT 속성은 유지됩니다. 설치된 추가 항목에도 같은 감독자 클라이언트가 포함됩니다. SIMA_HARDWARE_SUPERVISOR_SOCKET을 설정하면 성능 매트릭스도 같은 감독자 기반 검증 모드를 사용합니다. 소켓이 비어 있거나, 사용할 수 없거나, 요청이 거부되면 실행은 실패하며 직접 실행으로 전환하지 않습니다. DevKit에서 일반 성능 하위 프로세스를 실행하려면 이 변수를 설정하지 마세요.

권한이 있는 검증 소유자가 새로운 비공개 일회용 상태 폴더와 설정을 제공합니다. 감독자는 이전 실행 허가/실패 정지 폴더를 거부합니다. 설정에는 다음을 고정합니다.

  • identity: admission_id, boot_id, cohort_sha256, lease_pid, lease_start_ticks, observer_id.
  • state_dir, 해당 디렉터리 안의 socket, supervisor_sha256.
  • checker: 루트가 소유하는 읽기 전용 검사기의 정확한 command, 실행 파일 sha256 및 리소스를 점유하지 않는 프로브의 timeout_sec.
  • executables: 일반 파일의 절대 경로와 SHA256 식별 정보, 정확한 arguments, deadline_sec 및 보호된 required_env 값. 허가된 여러 명령/제한 시간 변형은 variants에 지정합니다.

원래 테스트에 시간 제한이 없는 경우에만 deadline_sec: null을 사용하세요. CTest 프록시는 허가된 정확한 제한 시간을 요청합니다. 매트릭스는 기존의 180초 제한 시간을 요청합니다. 로더 주입을 거부하고 required_env에 표준 런타임/플러그인 경로와 수치 검증 기준 설정을 고정하세요.

검사기는 --phase launch|active|retired --owner-json PATH를 받습니다. schema: 1, status: "ready", 고정된 정확한 identity 및 checked_at_epoch를 포함하는 최신 JSON을 반환해야 합니다. 가속기 작업을 시작하거나 하드웨어를 변경해서는 안 됩니다.

소유자 기록은 PID, 시작 틱, 부팅 ID, 세션 ID, 실행 ID 및 전체 요청 SHA256을 연결합니다. exec를 허용하기 전에 감독자는 소유권을 영속적으로 기록하고, 리소스를 점유하지 않는 자식이 실행 장벽에서 기다리는 동안 실행 허가와 클라이언트 생존 상태를 다시 확인합니다. 활성 루프는 세션 구성원을 기록하고 식별 정보를 검증하며, 실시간 실행 허가를 확인하고 영속 로그에서 작업 종료가 확인되지 않았거나 격리된 상태를 검사합니다.

실제 음수가 아닌 종료 코드가 관찰되면 exit.json은 소유자, 반환 코드, 제한 시간, 요청 해시 및 관찰된 완료 시각을 연결합니다. retired 검사기는 다음을 추가해야 합니다.

  • retirement.proven: true;
  • kind: "authoritative-driver-retirement" 또는 "reviewed-graceful-exit";
  • 비어 있지 않은 증거 token;
  • scope: "whole-owner-process-tree-and-dma";
  • owner: 정확한 소유자 기록.

검사기 구현은 검토된 실행 및 전송 완료 계약, 실제 소유권/하위 프로세스 검사, 최신 오류 관찰자 및 현재 드라이버/펌웨어/구성 집합 식별 정보를 사용하여 그 증거를 정당화해야 합니다. 샘플링된 작업 수가 0이라는 사실, 프로세스 종료, 경과 시간 또는 정상적인 SSH 연결만으로는 증거가 되지 않습니다. 순수 CPU 픽스처는 별도로 검토된 안전한 종료 계약을 사용할 수 있습니다. 이러한 픽스처에 대해 드라이버 증거를 꾸며내지 마세요.

시간 초과 및 복구​

감독자는 시간 초과, 연결 끊김, 취소, 작업 종료 여부 불명 또는 관찰자 실패 시 TERM/KILL을 보내지 않습니다. 되돌릴 수 없는 실패 정지 상태를 확정하고, 소유자와 영속 로그를 유지하며 후속 실행을 거부합니다. 매트릭스는 ENV_BROKEN / ENV_TIMEOUT을 유지하고 나머지 시나리오를 실행하지 않음으로 기록합니다. 통과나 허용된 건너뛰기를 꾸며내지 않습니다. 늦게 도착한 출력으로 시간 초과를 되돌릴 수 없습니다. 자연스럽게 종료되고 작업 종료까지 완전히 확인된 수치 검증 실패는 소유권 불명 상태와 혼동하지 않고 실패한 케이스로 유지합니다.

출력 파일의 완료 조건은 작업 종료 증거가 아닙니다. 선택적인 애플리케이션 중지 요청에는 정확하게 허가된 완료/인수 변형 및 고정된 핸들러/드레인 검토 기록이 필요합니다. 명시적으로 검토된 해당 SIGTERM 요청만 허용됩니다. 이는 정리 작업이 아니며 SIGKILL로 확대되지 않습니다. 결과를 승인하려면 여전히 실제 종료 및 권위 있는 작업 종료 증거가 필요합니다.

remoteproc를 중지하거나, 드라이버를 언로드/바인딩 해제하거나, 대여한 버퍼를 삭제하거나, 불확실한 소유자를 강제 종료하지 마세요. 디바이스의 기존 보호된 복구 절차를 사용하세요. 복구 후에는 새로운 실행 허가를 설정해야 하며, 이전 허가는 다시 열리지 않습니다. 임시 펌웨어 시험 후에는 원래 펌웨어, 서비스 및 복구 정책을 복원하고 검증하세요.

클라이언트 및 증거​

Python 클라이언트는 run_owned(command, cwd, env, deadline_sec, evidence_dir, socket_path, completion=None, graceful_stop=None)을 사용합니다. CLI는 run-json --request FILE --result FILE --socket PATH를 지원합니다. 결과에는 completed, timeout, fail_stop 또는 refused, 소유자 식별 정보, 실제 반환 코드, 작업 종료 증거 및 영속 stdout/stderr 경로가 포함됩니다. 클라이언트 종료로 실제 하드웨어 자식 프로세스가 종료되어서는 안 됩니다. 데몬은 세션 정리의 영향을 받는 SSH 포그라운드 프로세스가 아니라 타깃에서 독립적으로 실행되어야 합니다.

하드웨어 실행 허가 전에 무해한 네이티브 호스트 테스트를 실행하세요. 검증 보고서는 검토된 안전 장치 아래에서 작업/검증 기준/제한 시간을 그대로 유지한 실행과, 수정되지 않은 이전 실행 장치 또는 실제 호스팅된 CI 워크플로의 실행을 구분해야 합니다.

Python 3.13 이상에서는 PyNeat 메타데이터가 NumPy >=2.1,<3을 선택하고, 이전 Python에서는 >=1.24,<2를 선택합니다. 메타데이터 해석만으로 ndarray의 수치적 동등성이 입증되지는 않습니다. 해당 Python/NumPy 구성 집합을 검증하기 전에 설치된 타깃의 dtype, 스트라이드, 복사/제로 카피 및 수명 테스트를 실행하세요.