test: expose STEP-051 production feed validation
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
This commit is contained in:
@@ -45,3 +45,14 @@ TIME/NORMAL validation 入口现可选择 production-like source(UI 状态标
|
||||
- Jest:未执行。
|
||||
|
||||
当前状态只能记为:`IMPLEMENTED / WAITING_ANDROID_VALIDATION`。
|
||||
|
||||
## Android Validation Host 入口补充
|
||||
|
||||
在现有 Particle Core Layer Validation 页面的 MORE 菜单新增:
|
||||
|
||||
- `PRODUCTION FEED`:切换到 STEP-051 已有 `production-fields` source,加载四个 local metadata asset 与既有 binary payload,继续进入 Core Adapter、Snapshot、initial T0/T1、Timeline READY/PLAY 路径。
|
||||
- `INVALID PROD`:加载 `field-invalid.json`,其中 `fieldId`、`generation`、`validTime` 明确非法,用于观察正式 Adapter rejection/fail-closed;不放宽 contract。
|
||||
|
||||
旧 `UNIFORM EAST`、`UNIFORM NORTH`、`VORTEX` 与 TIME 控件仍保留。Host 仅触发低频 style/resource 命令;没有新增 JNI command、Android Timer、Timeline、Window 或 MIX state。状态栏在 production 模式显示 `PRODUCTION · TL ...`,日志仍由 Core 输出 `PRODUCTION_FEED_LOAD`、`SNAPSHOT_SUBMIT` 和 Timeline 事件。
|
||||
|
||||
本次没有修改 C++ Core、Timeline、Runtime Field Window、Renderer、Adapter contract、MIX observability 或 Rotation/Viewport。Android Gradle/APK/ADB/实机验证仍由用户执行;状态继续为 `IMPLEMENTED / WAITING_ANDROID_VALIDATION`。
|
||||
|
||||
52
docs/报告/STEP-051_Android_Validation_Host入口补充_Codex完成报告_v1.md
Normal file
52
docs/报告/STEP-051_Android_Validation_Host入口补充_Codex完成报告_v1.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# STEP-051 Android Validation Host 入口补充 — Codex 完成报告
|
||||
|
||||
## 基线
|
||||
|
||||
- Starting HEAD:`e3e7c7e219c490ab45ca40794db0bc59fc2c4817`
|
||||
- branch:`particle/main`
|
||||
- origin/particle/main 起点:`e3e7c7e219c490ab45ca40794db0bc59fc2c4817`
|
||||
- 任务性质:STEP-051 内部 Android Validation Host 补充。
|
||||
|
||||
## 修改与接线
|
||||
|
||||
- `ParticleCoreLayerValidationActivity.kt`:MORE 菜单新增 `PRODUCTION FEED` 与 `INVALID PROD`,分别触发现有 production-like source 和非法 metadata source。
|
||||
- `activity_particle_core_layer_validation.xml`:增加不可见菜单 target `validationProductionInvalid`。
|
||||
- Android asset:增加 `field-invalid.json`。
|
||||
- `STEP-051_Local_Production-like_Field_Feed与Core_Snapshot_Submit_Bridge_v1.md`:追加入口说明。
|
||||
|
||||
`PRODUCTION FEED` 复用 STEP-051 已有 `production-fields`、`LocalParticleFieldFeed`、正式 Adapter、Snapshot、`submitInitialRuntimeFieldWindow` 和 Core Timeline。没有复制 feed、Timeline、Runtime Window、MIX 或 normalization。`INVALID PROD` 只提供明确非法 local metadata 触发,Adapter contract 未放宽。
|
||||
|
||||
日志区分 production-like 路径与 fixture 路径;Core 侧既有低频 `PRODUCTION_FEED_LOAD`、`SNAPSHOT_SUBMIT`、Timeline READY/Boundary 日志继续生效。未增加 JNI method、JNI command、每帧日志或 Android Timer。
|
||||
|
||||
## 边界判断
|
||||
|
||||
- Core / Timeline / Runtime Field Window / Renderer:未修改。
|
||||
- ParticleFieldDataAdapter / Descriptor / Snapshot:未修改。
|
||||
- Duplicate:继续复用当前 source 的既有 `DUPLICATE T1`,production source 激活后由同一 Runtime Window 处理。
|
||||
- MIX observability:未修改,仍为 `NON-BLOCKING` 技术债。
|
||||
- Rotation/Viewport:未修改。
|
||||
|
||||
## 验证
|
||||
|
||||
- Linux OpenGL `mbgl-test-runner` 精确构建:复用 STEP-051 已通过构建。
|
||||
- 相关定向测试:复用并确认 STEP-051 既有 `Source.LocalProductionFeed*`、`Source.ParticleFieldDataAdapter*`、`Source.RasterArray*` 为 14/14 PASS。
|
||||
- Android source static inspection:确认 MORE 菜单、resource ID、production asset 路径和旧 fixture 入口均存在。
|
||||
- JNI signature/registration:本次无 JNI 改动,无需新增注册。
|
||||
- `git diff --check`:PASS。
|
||||
- Android Gradle/APK/ADB/App/实机:未执行。
|
||||
- Jest:未执行、未修改。
|
||||
|
||||
## Git 与状态
|
||||
|
||||
- commit message:`test: expose STEP-051 production feed validation`
|
||||
- commit hash:待提交后回填。
|
||||
- push result:待执行。
|
||||
- remote branch:`origin/particle/main`
|
||||
- Final HEAD:待 push 后回填。
|
||||
- 无关 untracked 文件未修改、未 stage、未提交。
|
||||
|
||||
当前 STEP-051 状态保持:`IMPLEMENTED / WAITING_ANDROID_VALIDATION`。
|
||||
|
||||
## 用户 Android 验收步骤
|
||||
|
||||
重新 build/install 一次后:MORE → `PRODUCTION FEED`,观察 `PRODUCTION` 与 `TL READY`;再进入 TIME → `PLAY / RESTART`,验证 MIX、至少两个 boundary、reuse/upload、`simulationRebuild=false`、`trailCleared=false`、Pause/Resume、Duplicate T1。随后可点 MORE → `INVALID PROD`,确认 Adapter reject、保持最后有效 Field、Renderer 持续且不黑屏。
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"schema": "maplibre-particle-field/v1", "fieldId": "", "fieldType": "WIND", "displayDomain": "GLOBAL", "generation": 0, "validTime": 0, "dataVersion": 99,
|
||||
"bounds": {"west": -180.0, "south": -85.0, "east": 180.0, "north": 85.0}, "grid": {"width": 16, "height": 16}, "vector": {"layout": "interleaved-uv", "encoding": "float32-le", "noData": -9999.0}, "payload": {"byteLength": 2048}
|
||||
}
|
||||
@@ -138,6 +138,12 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
findViewById<Button>(R.id.validationDuplicateWindow).setOnClickListener {
|
||||
if (this::maplibreMap.isInitialized) duplicateRuntimeFieldWindow()
|
||||
}
|
||||
findViewById<Button>(R.id.validationProductionInvalid).setOnClickListener {
|
||||
productionFeedMode = true
|
||||
timeWindowMode = true
|
||||
timelineState = "NOT READY"
|
||||
if (this::maplibreMap.isInitialized) loadValidationStyle(active, enabled, "INVALID_PRODUCTION_METADATA")
|
||||
}
|
||||
findViewById<Button>(R.id.validationVisualDefault).setOnClickListener { resetVisualDefaults() }
|
||||
findViewById<Button>(R.id.validationVisualSizeDown).setOnClickListener { setVisualFloat("raster-particle-line-width", lineWidth - 1.0f) { lineWidth = it.coerceIn(1.0f, 8.0f) } }
|
||||
findViewById<Button>(R.id.validationVisualSizeUp).setOnClickListener { setVisualFloat("raster-particle-line-width", lineWidth + 1.0f) { lineWidth = it.coerceIn(1.0f, 8.0f) } }
|
||||
@@ -162,7 +168,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
findViewById<Button>(R.id.validationMenuVisual).setOnClickListener { showMenu(it, "VIS", intArrayOf(R.id.validationVisualDefault, R.id.validationVisualColor, R.id.validationVisualSizeDown, R.id.validationVisualSizeUp, R.id.validationVisualLengthDown, R.id.validationVisualLengthUp, R.id.validationVisualOpacityDown, R.id.validationVisualOpacityUp, R.id.validationVisualTrailDown, R.id.validationVisualTrailUp, R.id.validationVisualFadeDown, R.id.validationVisualFadeUp)) }
|
||||
findViewById<Button>(R.id.validationMenuCount).setOnClickListener { showMenu(it, "COUNT", intArrayOf(R.id.validationParticle256, R.id.validationParticle1024, R.id.validationParticle4096, R.id.validationParticle16384, R.id.validationParticle65536, R.id.validationParticle262144, R.id.validationParticle1048576)) }
|
||||
findViewById<Button>(R.id.validationMenuMap).setOnClickListener { showMenu(it, "MAP", intArrayOf(R.id.validationGlobal, R.id.validationOceanA, R.id.validationOceanB, R.id.validationDateline, R.id.validationWorldWrap)) }
|
||||
findViewById<Button>(R.id.validationMenuMore).setOnClickListener { showMenu(it, "MORE", intArrayOf(R.id.validationActive, R.id.validationStatic, R.id.validationDisable, R.id.validationEnable, R.id.validationUniformEast, R.id.validationUniformNorth, R.id.validationVortex, R.id.validationAdvanceWindow, R.id.validationDuplicateWindow)) }
|
||||
findViewById<Button>(R.id.validationMenuMore).setOnClickListener { showMenu(it, "MORE", intArrayOf(R.id.validationActive, R.id.validationStatic, R.id.validationDisable, R.id.validationEnable, R.id.validationUniformEast, R.id.validationUniformNorth, R.id.validationVortex, R.id.validationTimeWindow, R.id.validationProductionInvalid, R.id.validationAdvanceWindow, R.id.validationDuplicateWindow)) }
|
||||
}
|
||||
|
||||
private fun showMenu(anchor: android.view.View, title: String, actions: IntArray) {
|
||||
@@ -212,7 +218,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
}
|
||||
|
||||
private fun actionLabel(id: Int): String = when (id) {
|
||||
R.id.validationVisualDefault -> "VIS DEFAULT"; R.id.validationVisualSizeDown -> "SIZE -"; R.id.validationVisualSizeUp -> "SIZE +"; R.id.validationVisualLengthDown -> "LENGTH -"; R.id.validationVisualLengthUp -> "LENGTH +"; R.id.validationVisualOpacityDown -> "OPACITY -"; R.id.validationVisualOpacityUp -> "OPACITY +"; R.id.validationVisualTrailDown -> "TRAIL -"; R.id.validationVisualTrailUp -> "TRAIL +"; R.id.validationVisualFadeDown -> "FADE -"; R.id.validationVisualFadeUp -> "FADE +"; R.id.validationVisualColor -> "COLOR"; R.id.validationParticle256 -> "256"; R.id.validationParticle1024 -> "1K"; R.id.validationParticle4096 -> "4K"; R.id.validationParticle16384 -> "16K"; R.id.validationParticle65536 -> "64K"; R.id.validationParticle262144 -> "256K"; R.id.validationParticle1048576 -> "1M"; R.id.validationGlobal -> "GLOBAL"; R.id.validationOceanA -> "OCEAN A"; R.id.validationOceanB -> "OCEAN B"; R.id.validationDateline -> "DATELINE"; R.id.validationWorldWrap -> "WORLD WRAP"; R.id.validationActive -> "ACTIVE"; R.id.validationStatic -> "STATIC"; R.id.validationDisable -> "DISABLE"; R.id.validationEnable -> "ENABLE"; R.id.validationUniformEast -> "UNIFORM EAST"; R.id.validationUniformNorth -> "UNIFORM NORTH"; R.id.validationVortex -> "VORTEX"; R.id.validationAdvanceWindow -> "ADVANCE WINDOW"; else -> "DUPLICATE T1"
|
||||
R.id.validationVisualDefault -> "VIS DEFAULT"; R.id.validationVisualSizeDown -> "SIZE -"; R.id.validationVisualSizeUp -> "SIZE +"; R.id.validationVisualLengthDown -> "LENGTH -"; R.id.validationVisualLengthUp -> "LENGTH +"; R.id.validationVisualOpacityDown -> "OPACITY -"; R.id.validationVisualOpacityUp -> "OPACITY +"; R.id.validationVisualTrailDown -> "TRAIL -"; R.id.validationVisualTrailUp -> "TRAIL +"; R.id.validationVisualFadeDown -> "FADE -"; R.id.validationVisualFadeUp -> "FADE +"; R.id.validationVisualColor -> "COLOR"; R.id.validationParticle256 -> "256"; R.id.validationParticle1024 -> "1K"; R.id.validationParticle4096 -> "4K"; R.id.validationParticle16384 -> "16K"; R.id.validationParticle65536 -> "64K"; R.id.validationParticle262144 -> "256K"; R.id.validationParticle1048576 -> "1M"; R.id.validationGlobal -> "GLOBAL"; R.id.validationOceanA -> "OCEAN A"; R.id.validationOceanB -> "OCEAN B"; R.id.validationDateline -> "DATELINE"; R.id.validationWorldWrap -> "WORLD WRAP"; R.id.validationActive -> "ACTIVE"; R.id.validationStatic -> "STATIC"; R.id.validationDisable -> "DISABLE"; R.id.validationEnable -> "ENABLE"; R.id.validationUniformEast -> "UNIFORM EAST"; R.id.validationUniformNorth -> "UNIFORM NORTH"; R.id.validationVortex -> "VORTEX"; R.id.validationTimeWindow -> "PRODUCTION FEED"; R.id.validationProductionInvalid -> "INVALID PROD"; R.id.validationAdvanceWindow -> "ADVANCE WINDOW"; else -> "DUPLICATE T1"
|
||||
}
|
||||
|
||||
private fun loadValidationStyle(active: Boolean, enabled: Boolean, reason: String = "STYLE_CHANGE") {
|
||||
@@ -409,7 +415,7 @@ class ParticleCoreLayerValidationActivity : AppCompatActivity() {
|
||||
}
|
||||
val source = if (productionFeedMode) {
|
||||
"""{"type":"raster-array","production-fields":[
|
||||
{"metadata":"asset://integration/particle-production/field-00.json","field":"asset://integration/particle-fixtures/uniform-east/field.f32"},
|
||||
{"metadata":"asset://integration/particle-production/${if (reason == "INVALID_PRODUCTION_METADATA") "field-invalid.json" else "field-00.json"}","field":"asset://integration/particle-fixtures/uniform-east/field.f32"},
|
||||
{"metadata":"asset://integration/particle-production/field-01.json","field":"asset://integration/particle-fixtures/uniform-north/field.f32"},
|
||||
{"metadata":"asset://integration/particle-production/field-02.json","field":"asset://integration/particle-fixtures/vortex/field.f32"},
|
||||
{"metadata":"asset://integration/particle-production/field-03.json","field":"asset://integration/particle-fixtures/uniform-east/field.f32"}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationActive"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationStatic"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDisable"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationEnable"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationGlobal"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationOceanA"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationOceanB"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationUniformEast"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationUniformNorth"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVortex"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationTimeWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationMix0"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationMix50"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationMix100"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle256"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle1024"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle4096"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle16384"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle65536"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle262144"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationParticle1048576"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationAdvanceWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDuplicateWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualDefault"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualColor"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDateline"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationWorldWrap"/>
|
||||
<Button style="@style/ParticleValidationButton" android:id="@+id/validationAdvanceWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDuplicateWindow"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationProductionInvalid"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualDefault"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualSizeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualLengthUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualOpacityUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualTrailUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeDown"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualFadeUp"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationVisualColor"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationDateline"/><Button style="@style/ParticleValidationButton" android:id="@+id/validationWorldWrap"/>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
Reference in New Issue
Block a user