CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V026dev.developer.ana.cai2026-07-27T12:24:00+08:00CODE-DESIGN-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-V025 / 9328/b088f8b08da6479f7027ef06a285bf10db565caffa112dbe3baa1e427a97f58aAUDIT-DEV-ANA-SEMI-ROOT-PREFLIGHT-ORCHESTRATION-V007-PYTHON-SOURCE-FREEZE-PLAN-V025=PASS/0/0 / 248700/ee0677ed787f8e7df1da5c3e9b815654e854a77a72400fb9d91ad48eb15cc042 / line 1906AUTH-DEV-ANA-SEMI-ROOT-PREFLIGHT-V007-PYTHON-STAGE-S-SOURCE-FREEZE-20260726-001/A001HANDOFF-MGADMIN-DEV-ANA-SEMI-ROOT-PREFLIGHT-V007-PYTHON-STAGE-S-SOURCE-FREEZE-PRECONSUMPTION-STOP-CLOSE-20260727-001TERMINATED_PRECONSUMPTION_UNCONSUMED_PERMANENTLY_CLOSEDBLOCK-MGMT-PROJECT-INFO-ANA-V007-STAGE-S-PREIMAGE-EVIDENCE-MISSINGPENDING_INDEPENDENT_STAGE_S_READ_EVIDENCE_PLAN_REVIEWNOT_ISSUEDNOT_ISSUEDNOT_ISSUEDV026 只修复上一条 Stage S 授权在消费前暴露的证据机制缺口。旧 A001 未消费、Y01—Y04 零物化并已由 management 永久关闭;本版不复用、扩展、重试或续期旧授权。V025 的两阶段结构、Y01—Y04 源码边界、Y03 精确字节、Stage V 独立静态审核门和数据库后置边界全部保持。
本版选择 management close receipt 允许的第二条路径:在全新 Stage S 授权中加入一个严格只读、非候选、无文件写入的证据器。证据器仅负责写前状态/旧 P03→Y03 精确派生和每个 Add File 后的 ordinary-file/encoding/bytes/SHA-256 验真;它不 import、runpy、exec 或解析候选 Python,不创建文件,不连接网络或数据库。
未来管理链必须生成全新的 item/plan/audit/authorization/attempt,并重新绑定有效时窗。不得使用旧 A001/A002/retry/replacement/renewal/resend。
Stage S 唯一可写目标继续为以下四个 absent 文件,顺序不变:
| id | project-root relative path | profile |
|---|---|---|
| Y01 | dev/ana-dev/ana_semi_preconsumption_v002.py |
PY_SOURCE |
| Y02 | dev/ana-dev/test/test_ana_semi_preconsumption_v002.py |
PY_SOURCE |
| Y03 | dev/ana-dev/test/ana_semi_preconsumption_vectors_v002.json |
JCS_VECTOR |
| Y04 | dev/ana-dev/test/run_ana_semi_preconsumption_validation_v002.py |
PY_SOURCE |
apply_patch 的 Add File 语义;禁止 shell/Python/PowerShell writer。4016/86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca,strict UTF-8/JCS、no BOM/CR/NUL/trailing LF、final byte=0x7D。任何 Add File 失败、pre-existence、path/reparse/ordinary-file/encoding/hash 不确定均立即 STOP;保留实际子集,不得删除、覆盖、截断、重命名、修补、补造或重试。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeexec_command(shell=上述绝对路径, login=false, tty=false, workdir=<project_root>, cmd=<本节冻结脚本 + 单一 RequestBase64>)evidence_powershell=exactly 8;依次 E01 PRE、E02 PAYLOAD-Y01、E03 POST-Y01、E04 PAYLOAD-Y02、E05 POST-Y02、E06 POST-Y03、E07 PAYLOAD-Y04、E08 POST-Y04。0/0/0/0/0/0/0/false。10000ms;不允许 background process、child process、pipeline、临时文件或重定向。以下 code fence 内 UTF-8、LF、无 BOM/CR、恰好一个 final LF 的内容是唯一 EVIDENCE-READER-V001 脚本 preimage。未来授权须绑定其 bytes/SHA-256 和实际命令构造;__REQUEST_BASE64__ 只能替换为第 2.3 节对应 canonical request 的 RFC4648 Base64,不能改变其余字符。
Set-StrictMode -Version Latest
$ErrorActionPreference='Stop'
$RequestBase64='__REQUEST_BASE64__'
function Stop-Evidence([string]$Code){[Console]::Error.Write("STOP`t"+$Code);exit 27}
function Get-Hex([byte[]]$Bytes){$h=[Security.Cryptography.SHA256]::Create();try{return (($h.ComputeHash($Bytes)|ForEach-Object{$_.ToString('x2')})-join '')}finally{$h.Dispose()}}
function Read-Ordinary([string]$Path){if(-not [IO.File]::Exists($Path)){Stop-Evidence 'FILE_ABSENT'};$i=[IO.FileInfo]::new($Path);if(($i.Attributes-band[IO.FileAttributes]::Directory)-ne 0){Stop-Evidence 'NOT_FILE'};if(($i.Attributes-band[IO.FileAttributes]::ReparsePoint)-ne 0){Stop-Evidence 'REPARSE_POINT'};try{return [IO.File]::ReadAllBytes($Path)}catch{Stop-Evidence 'READ_FAILED'}}
function Get-TrailingLf([byte[]]$Bytes){$n=0;for($i=$Bytes.Length-1;$i-ge 0-and$Bytes[$i]-eq 10;$i--){$n++};return $n}
function Test-Profile([byte[]]$Bytes,[string]$Id,[string]$Profile){try{$text=[Text.UTF8Encoding]::new($false,$true).GetString($Bytes)}catch{Stop-Evidence 'STRICT_UTF8'};$bom=($Bytes.Length-ge 3-and$Bytes[0]-eq 239-and$Bytes[1]-eq 187-and$Bytes[2]-eq 191);$cr=@($Bytes|Where-Object{$_-eq 13}).Count;$nul=@($Bytes|Where-Object{$_-eq 0}).Count;$trail=Get-TrailingLf $Bytes;$hash=Get-Hex $Bytes;if($Profile-eq'PY_SOURCE'){if($bom-or$cr-ne 0-or$nul-ne 0-or$trail-ne 1){Stop-Evidence 'SOURCE_ENCODING'}}elseif($Profile-eq'JCS_VECTOR'){if($Id-ne'Y03'-or$Bytes.Length-ne 4016-or$hash-ne'86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca'-or$Bytes[$Bytes.Length-1]-ne 125-or$trail-ne 0){Stop-Evidence 'Y03_PROFILE'}}else{Stop-Evidence 'PROFILE'};return [pscustomobject]@{text=$text;bytes=[int64]$Bytes.Length;sha256=$hash;trailing_lf_count=[int]$trail}}
try{$requestBytes=[Convert]::FromBase64String($RequestBase64)}catch{Stop-Evidence 'REQUEST_BASE64'}
if($requestBytes.Length-eq 0-or$requestBytes[0]-eq 239-or$requestBytes-contains 0-or$requestBytes-contains 13-or$requestBytes[$requestBytes.Length-1]-eq 10){Stop-Evidence 'REQUEST_ENCODING'}
try{$requestText=[Text.UTF8Encoding]::new($false,$true).GetString($requestBytes);$r=$requestText|ConvertFrom-Json}catch{Stop-Evidence 'REQUEST_JSON'}
$mode=[string]$r.mode
if($mode-eq'PRE'){
$keys=@($r.PSObject.Properties.Name);if(($keys-join '|')-ne'authorized_at|contract_files|expires_at|future_run_path|mode|old_p03_path|process_paths|project_root|target_paths'){Stop-Evidence 'PRE_KEYS'}
try{$a=[DateTimeOffset]::ParseExact([string]$r.authorized_at,"yyyy-MM-dd'T'HH:mm:ss.fffffffK",[Globalization.CultureInfo]::InvariantCulture,[Globalization.DateTimeStyles]::None);$e=[DateTimeOffset]::ParseExact([string]$r.expires_at,"yyyy-MM-dd'T'HH:mm:ss.fffffffK",[Globalization.CultureInfo]::InvariantCulture,[Globalization.DateTimeStyles]::None);$now=[DateTimeOffset]::Now}catch{Stop-Evidence 'TIME_PARSE'}
if(-not($a-le$now-and$now-lt$e)){Stop-Evidence 'TIME_WINDOW'}
$root=[IO.Path]::GetFullPath([string]$r.project_root);if([IO.Path]::GetFullPath((Get-Location).Path)-ne$root){Stop-Evidence 'CWD'}
foreach($c in @($r.contract_files)){$b=Read-Ordinary ([string]$c.path);if($b.Length-ne[int64]$c.bytes-or(Get-Hex $b)-ne[string]$c.sha256){Stop-Evidence 'CONTRACT_DRIFT'}}
foreach($p in @($r.target_paths)){if([IO.File]::Exists([string]$p)-or[IO.Directory]::Exists([string]$p)){Stop-Evidence 'TARGET_EXISTS'}}
if([IO.File]::Exists([string]$r.future_run_path)-or[IO.Directory]::Exists([string]$r.future_run_path)){Stop-Evidence 'RUN_EXISTS'}
foreach($wanted in @($r.process_paths)){$leaf=[IO.Path]::GetFileNameWithoutExtension([string]$wanted);foreach($p in @(Get-Process -Name $leaf -ErrorAction SilentlyContinue)){try{$actual=$p.MainModule.FileName}catch{Stop-Evidence 'PROCESS_PATH_UNKNOWN'};if([IO.Path]::GetFullPath($actual)-eq[IO.Path]::GetFullPath([string]$wanted)){Stop-Evidence 'PROCESS_PRESENT'}}}
$old=Read-Ordinary ([string]$r.old_p03_path);if($old.Length-ne 4038-or(Get-Hex $old)-ne'6b404e64d902ced1398664b2df50cb2f021512c6587b6bd5e513790db03377e1'){Stop-Evidence 'OLD_P03_DRIFT'}
try{$oldText=[Text.UTF8Encoding]::new($false,$true).GetString($old)}catch{Stop-Evidence 'OLD_P03_UTF8'}
$from='RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PRECONSUMPTION-REPAIR-IMPLEMENTATION-20260726-001';$to='RUN-DEV-ANA-SEMI-ROOT-PREFLIGHT-PYTHON-STAGE-P-20260726-001'
if(([regex]::Matches($oldText,[regex]::Escape($from))).Count-ne 1){Stop-Evidence 'OLD_RUN_COUNT'}
$y=[Text.UTF8Encoding]::new($false).GetBytes($oldText.Replace($from,$to));if($y.Length-ne 4016-or(Get-Hex $y)-ne'86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca'-or$y[$y.Length-1]-ne 125){Stop-Evidence 'Y03_DERIVATION'}
[Console]::Out.Write("mode`tPRE`nstatus`tPASS`ny03_bytes`t4016`ny03_sha256`t86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca`ny03_text`t"+[Text.UTF8Encoding]::new($false,$true).GetString($y));exit 0
}
if($mode-eq'PAYLOAD'){
$keys=@($r.PSObject.Properties.Name);if(($keys-join '|')-ne'artifact_id|mode|path|payload_base64|profile|project_root'){Stop-Evidence 'PAYLOAD_KEYS'}
$allow=@{Y01='dev/ana-dev/ana_semi_preconsumption_v002.py';Y02='dev/ana-dev/test/test_ana_semi_preconsumption_v002.py';Y04='dev/ana-dev/test/run_ana_semi_preconsumption_validation_v002.py'}
$id=[string]$r.artifact_id;if(-not$allow.ContainsKey($id)){Stop-Evidence 'PAYLOAD_ID'};$root=[IO.Path]::GetFullPath([string]$r.project_root);$expected=[IO.Path]::GetFullPath((Join-Path $root $allow[$id]));if([IO.Path]::GetFullPath([string]$r.path)-ne$expected){Stop-Evidence 'PAYLOAD_PATH'}
try{$b=[Convert]::FromBase64String([string]$r.payload_base64)}catch{Stop-Evidence 'PAYLOAD_BASE64'};if([Convert]::ToBase64String($b)-ne[string]$r.payload_base64){Stop-Evidence 'PAYLOAD_BASE64_CANONICAL'};$v=Test-Profile $b $id ([string]$r.profile)
[Console]::Out.Write("artifact_id`t"+$id+"`nmode`tPAYLOAD`nbytes`t"+$v.bytes+"`nsha256`t"+$v.sha256+"`nprofile`t"+[string]$r.profile+"`npayload_text`t"+$v.text);exit 0
}
if($mode-eq'POST'){
$keys=@($r.PSObject.Properties.Name);if(($keys-join '|')-ne'artifact_id|mode|path|profile|project_root'){Stop-Evidence 'POST_KEYS'}
$allow=@{Y01='dev/ana-dev/ana_semi_preconsumption_v002.py';Y02='dev/ana-dev/test/test_ana_semi_preconsumption_v002.py';Y03='dev/ana-dev/test/ana_semi_preconsumption_vectors_v002.json';Y04='dev/ana-dev/test/run_ana_semi_preconsumption_validation_v002.py'}
$id=[string]$r.artifact_id;if(-not$allow.ContainsKey($id)){Stop-Evidence 'ARTIFACT_ID'};$root=[IO.Path]::GetFullPath([string]$r.project_root);$expected=[IO.Path]::GetFullPath((Join-Path $root $allow[$id]));if([IO.Path]::GetFullPath([string]$r.path)-ne$expected){Stop-Evidence 'ARTIFACT_PATH'}
$b=Read-Ordinary $expected;$v=Test-Profile $b $id ([string]$r.profile)
[Console]::Out.Write("artifact_id`t"+$id+"`nbytes`t"+$v.bytes+"`nsha256`t"+$v.sha256+"`nstrict_utf8`ttrue`nbom`tfalse`ncr_count`t0`nnul_count`t0`ntrailing_lf_count`t"+$v.trailing_lf_count+"`nordinary_file`ttrue`nreparse`tfalse");exit 0
}
Stop-Evidence 'MODE'
Request 是 UTF-8 strict JSON/JCS object,无 BOM/CR/NUL/trailing LF;转换为 RFC4648 Base64 后替换脚本唯一 __REQUEST_BASE64__。禁止把 request 放入环境变量、临时文件或 stdin。
PRE ordered keys:
authorized_at,contract_files,expires_at,future_run_path,mode,old_p03_path,process_paths,project_root,target_paths
mode=PRE。contract_files 恰好 V025 plan、V025 audit、未来新计划、未来新 plan audit 四项,每行 ordered keys=bytes,path,sha256;未来 management 授权必须填入其已独立审核快照。target_paths 恰好 Y01→Y04 absolute paths;future_run_path 是 V025 冻结 future run。old_p03_path 只能是 immutable old P03;其 bytes/hash 在脚本内硬编码复核。process_paths 恰好 bundled Python、csc、mysql、mysql_config_editor 四个审核绝对路径;不得加入 PowerShell evidence reader 自身。[authorized_at,expires_at)。PAYLOAD ordered keys:artifact_id,mode,path,payload_base64,profile,project_root。仅允许 Y01/Y02/Y04;payload_base64 是 parent 拟写入正文的唯一 RFC4648 preimage,证据器不接触文件系统,只在内存中 decode→canonical Base64 roundtrip→strict UTF-8/profile→bytes/hash,并返回唯一 payload_text。Add File 必须逐字符复制该 payload_text;对应 POST 的 bytes/hash 必须与 PAYLOAD 完全相等,否则 STOP。Y03 不使用 PAYLOAD;其 preimage 仅来自 PRE 的已复算 y03_text。
POST ordered keys:artifact_id,mode,path,profile,project_root。每个 POST request 只对应刚创建的一个 artifact;Y01/Y02/Y04 profile=PY_SOURCE,Y03=JCS_VECTOR。
每次 stdout 必须严格匹配脚本的固定 LF/tab schema、exit=0、stderr=0 bytes。PRE 的 y03_text 是唯一允许复制到 Y03 Add File 的正文;PAYLOAD 的 payload_text 是 Y01/Y02/Y04 唯一允许复制的正文。POST stdout 只作为 parent native terminal/reviewer handoff 的实际证据,不写 evidence file。
提交审核前复算登记如下:
__REQUEST_BASE64__、UTF-8/LF/final LF):6946/2ebabcb7c95215160e66a32ecc352f19d3f0479509f19b3a6f2e4d2f2d7d5c5e;placeholder occurrence=1;CR/NUL=0/0;Windows PowerShell 5.1 parser errors=0。C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,455680/9785001b0dcf755eddb8af294a373c0b87b2498660f724e76c4d53f9c217c7a3。exec_command,shell 必须是上述绝对路径、login=false、tty=false、workdir=E:\mb-ms-doc\project-info、yield_time_ms=10000;每次只允许一个前台证据 PowerShell,无 stdin、environment、重定向或 child。以下 sentinel 只冻结 request 的 key/order/type/UTF-8/Base64 构造,**不是可执行授权输入**;未来实际 request 必须用独立审核后、management 授权内的真实绝对路径/快照/时窗替换,并在 dispatch 前绑定逐 request script/cmd/Arguments/Win32 CommandLine bytes/SHA-256。
PRE-SCHEMA-SENTINEL-001 canonical JSON(ordered keys 与四行/四路径数组均固定):
{"authorized_at":"2030-01-01T00:00:00.0000000+08:00","contract_files":[{"bytes":1,"path":"E:\\c1","sha256":"0000000000000000000000000000000000000000000000000000000000000000"},{"bytes":2,"path":"E:\\c2","sha256":"1111111111111111111111111111111111111111111111111111111111111111"},{"bytes":3,"path":"E:\\c3","sha256":"2222222222222222222222222222222222222222222222222222222222222222"},{"bytes":4,"path":"E:\\c4","sha256":"3333333333333333333333333333333333333333333333333333333333333333"}],"expires_at":"2030-01-01T02:00:00.0000000+08:00","future_run_path":"E:\\r","mode":"PRE","old_p03_path":"E:\\o","process_paths":["C:\\p1.exe","C:\\p2.exe","D:\\p3.exe","D:\\p4.exe"],"project_root":"E:\\p","target_paths":["E:\\y1","E:\\y2","E:\\y3","E:\\y4"]}
745/eb2e16ea22b3f8c98433288f085135e1991f844dae4deb470f7ff0756901f488,final=0x7D、CR/LF/NUL=0/0/0。eyJhdXRob3JpemVkX2F0IjoiMjAzMC0wMS0wMVQwMDowMDowMC4wMDAwMDAwKzA4OjAwIiwiY29udHJhY3RfZmlsZXMiOlt7ImJ5dGVzIjoxLCJwYXRoIjoiRTpcXGMxIiwic2hhMjU2IjoiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9LHsiYnl0ZXMiOjIsInBhdGgiOiJFOlxcYzIiLCJzaGEyNTYiOiIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIn0seyJieXRlcyI6MywicGF0aCI6IkU6XFxjMyIsInNoYTI1NiI6IjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIifSx7ImJ5dGVzIjo0LCJwYXRoIjoiRTpcXGM0Iiwic2hhMjU2IjoiMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyJ9XSwiZXhwaXJlc19hdCI6IjIwMzAtMDEtMDFUMDI6MDA6MDAuMDAwMDAwMCswODowMCIsImZ1dHVyZV9ydW5fcGF0aCI6IkU6XFxyIiwibW9kZSI6IlBSRSIsIm9sZF9wMDNfcGF0aCI6IkU6XFxvIiwicHJvY2Vzc19wYXRocyI6WyJDOlxccDEuZXhlIiwiQzpcXHAyLmV4ZSIsIkQ6XFxwMy5leGUiLCJEOlxccDQuZXhlIl0sInByb2plY3Rfcm9vdCI6IkU6XFxwIiwidGFyZ2V0X3BhdGhzIjpbIkU6XFx5MSIsIkU6XFx5MiIsIkU6XFx5MyIsIkU6XFx5NCJdfQ==。PAYLOAD-PY-SENTINEL-001 canonical JSON:
{"artifact_id":"Y01","mode":"PAYLOAD","path":"E:\\p\\y1","payload_base64":"eD0xCg==","profile":"PY_SOURCE","project_root":"E:\\p"}
130/8a9834f6653231fbe0885204a6bc3f772cc12c977dc41e72471dbfbde4a3c5a4;Base64=eyJhcnRpZmFjdF9pZCI6IlkwMSIsIm1vZGUiOiJQQVlMT0FEIiwicGF0aCI6IkU6XFxwXFx5MSIsInBheWxvYWRfYmFzZTY0IjoiZUQweENnPT0iLCJwcm9maWxlIjoiUFlfU09VUkNFIiwicHJvamVjdF9yb290IjoiRTpcXHAifQ==。eD0xCg== 解码为精确 x=1\n:4/98752ee28d5484bdc2814fb70adb6a0b2fb31f6a9b8ee7ae81fd2fc9cf300b3b。POST-Y03-SENTINEL-001 canonical JSON:
{"artifact_id":"Y03","mode":"POST","path":"E:\\p\\y3","profile":"JCS_VECTOR","project_root":"E:\\p"}
100/b36c3f764b4f74e4417cb71e7843c54ae5c1255ef143dd441556ff07591add8a;Base64=eyJhcnRpZmFjdF9pZCI6IlkwMyIsIm1vZGUiOiJQT1NUIiwicGF0aCI6IkU6XFxwXFx5MyIsInByb2ZpbGUiOiJKQ1NfVkVDVE9SIiwicHJvamVjdF9yb290IjoiRTpcXHAifQ==。上述任一项没有经 dev.reviewer.ana.cai 独立 PASS,不得向 management 请求新 Stage S 授权。management 授权不得临时发明或修改脚本、request、process count、target universe 或 STOP 规则。
唯一流程:
new plan/review/management authorization → E01 PRE PASS → E02 PAYLOAD-Y01 PASS → Y01 Add File(consumes) → E03 POST-Y01(equal payload hash) → E04 PAYLOAD-Y02 → Y02 Add File → E05 POST-Y02(equal) → Y03 Add File(copy exact PRE y03_text) → E06 POST-Y03 → E07 PAYLOAD-Y04 → Y04 Add File → E08 POST-Y04(equal) → one management terminal → one independent static source-review handoff
E01/E02 在 Y01 前失败:TERMINATED_PRECONSUMPTION_UNCONSUMED,Y01—Y04=0。Y01 后任一 Add File/E03—E08 失败:CONSUMED_FAIL_CLOSED_SOURCE_FREEZE_INCOMPLETE,保留实际已物化子集,未到达目标 absent。任何终态均 no retry/resend/A002/replacement/renewal。
成功只可声明 SOURCE_FREEZE_COMPLETED_PENDING_STATIC_REVIEW,不能声明 implementation PASS。静态 reviewer 仍须逐字读取 Y01—Y04、复算 hashes/Y03 JCS,审核 V020 wire、receiver/module、Win32 ABI、目录/writer lifecycle、C00—C40、no-secret/no-network/no-database。只有 PASS/0/0 才可另立 Stage V;Stage V 也不能自动连接数据库。
ABSENT_4_OF_4;future run absent。4038/6b404e64d902ced1398664b2df50cb2f021512c6587b6bd5e513790db03377e1;唯一 run-id transform=4016/86f563b43d934cb0828e395f557ded328ad2abcfb2c1ef7bdbc8a4c32c12cbca,final=0x7D。NOT_ISSUED/NOT_ISSUED/NOT_ISSUED。HELD;darkline_restored=false。