27 KiB
Generated Scene Skill Platform Design
Goal: Evolve sgClaw from one-off business-scene integrations into a platform that can generate, register, and invoke staged scene skills through a generic runtime path, while keeping v1 implementation strictly limited to report/collection-oriented browser_script scenes.
Status: Approved brainstorming direction for formal specification.
Decision Summary
sgClawshould become a scene-skill platform, not a growing set of per-scene Rust branches.- V1 should support only report/collection-oriented
browser_scriptscenes generated from existing scenario directories. - The generated output must include both the staged skill package and a platform registration manifest so that new scenes can be discovered and invoked with minimal or zero per-scene Rust changes.
- In the intranet near term, deterministic mode remains the explicit
。。。suffix path; no model is required for v1 invocation. - The design must preserve the existing main architecture, stay close to the current
browser_scriptand artifact pipeline, and avoid platform changes that drift into a general workflow engine. - The implementation should happen on a new branch copied from
ws, not directly inside the currentwsbranch. - The generator and runtime must be separated by explicit contracts so the generator can later be extracted into a standalone project.
- The platform design must turn the full
tq-lineloss-reportlessons learned into durable documentation and generator input rules so future generated skills do not repeat the same mistakes.
Hard Constraints
1. Extensibility is mandatory
The platform must support future extension without forcing redesign of the core contracts. The design must leave clean seams for:
- additional scene types
- additional deterministic matchers
- additional parameter resolver types
- additional tool invokers beyond
browser_script - future LLM semantic routing on top of the same registered scene contracts
- future extraction of the generator into a separate project
2. Stay on the main line
The core objective is:
- generate staged scene skills from existing scenario directories
- register them automatically
- invoke them through a generic deterministic runtime path
The design must not drift into:
- a full low-code workflow engine
- a general browser RPA authoring platform
- a full login/session orchestration platform in v1
- a broad runtime rewrite unrelated to generated scene skill support
3. Preserve the current architecture theme
The design should reuse and generalize the parts of sgClaw that already look platform-like:
- skills discovery/loading
browser_scriptexecution seams- artifact interpretation
- export/postprocess seams
- bootstrap target resolution seams
It must avoid large theme-breaking rewrites of the runtime unless a generic platform seam truly requires them.
4. Execution branch strategy
This work is large enough that implementation should not land directly on the active ws branch. The future implementation plan must explicitly require:
- start from the current
wsbranch state - create a new branch copied from
ws - perform platform conversion there
- preserve
wsas the stable reference baseline during the migration
5. Generator extraction must remain possible
The generator should not be tightly coupled to claw-new internals. The boundary between runtime and generator must be a stable package/manifest contract so the generator can later move into a separate project without redesigning registered scene skills.
6. tq-lineloss-report lessons learned must become first-class inputs
The design must require a durable lessons-learned document derived from the full tq-lineloss-report path, including deterministic routing, canonical parameterization, bootstrap targets, pipe/ws differences, timeout chains, artifact contracts, and Rust-side export constraints.
This document is not an appendix. It is a required generator-design input and future template hardening source.
The document must be split into two layers so it remains enforceable instead of becoming loose prose:
- a structured machine-consumable lessons artifact that generator templates can read or reference deterministically
- a human-oriented narrative/analysis document explaining the why, trade-offs, and debugging history behind those lessons
7. Use the superpowers process end-to-end
This design must be carried through the superpowers flow:
- brainstorming
- formal spec
- review loop
- user review
- implementation planning
8. Think through the details before implementation
The spec must make the critical details explicit now so execution does not discover foundational contract problems halfway through.
Why This Platform Exists
The current line-loss integration proves that sgClaw can support a staged business scene, but it also exposes the current architecture problem:
- the staged skill package exists and is useful
- the
browser_scriptexecution seam exists and is useful - the runtime has some generic pieces already
- but deterministic routing, parameter normalization, bootstrap target selection, and scene-specific invocation are still too tied to one-off Rust code
Examples visible in the current code:
src/compat/deterministic_submit.rshardcodes the line-loss suffix route, target URL, host, scene matcher, org resolver, and period resolversrc/service/server.rs:453already has a more general bootstrap-target seam, but it still delegates deterministic planning to scene-specific logicsrc/compat/direct_skill_runtime.rs:148already knows how to resolve and execute abrowser_scripttool from the skills directory, which is a strong existing platform primitivesrc/runtime/engine.rs:232already has multi-directory runtime skill loading and browser-surface-aware filtering, which is another platform primitive
The design goal is to promote the reusable parts into a stable platform and move scene-specific behavior into generated packages plus scene manifests.
V1 Scope
In scope
V1 is strictly limited to report/collection-oriented browser_script scenes generated from existing scenario directories.
That means:
- input source is an existing scenario directory containing page assets and business JS logic
- generated output is a staged skill package plus a platform registration manifest
- runtime invocation uses deterministic
。。。routing only - execution reuses the existing
browser_scriptinvocation chain - output is a structured report artifact plus optional generic report postprocessing such as local XLSX export/open
Out of scope
V1 does not include:
- generic action/authoring scenes such as navigation, form filling, publishing, or editor automation
- arbitrary multi-step workflow orchestration
- session/login orchestration as a generic platform capability
- non-
browser_scripttool generation - full LLM semantic scene routing implementation
- a universal low-code engine
Spec-level future seams
The spec must define extension interfaces for future use, but those extensions are not part of v1 implementation:
- matcher extension seam for future LLM semantic selection
- resolver extension seam for more complex domain parsing
- invoker extension seam for new tool kinds
- artifact interpreter extension seam for non-report results
- postprocessor extension seam beyond report export/open
- generator packaging seam for future project extraction
Platform Architecture
The recommended platform has five units.
1. Scene Source Analyzer
Input:
- an existing scenario directory
- typical source artifacts such as
index.html,js/*, business requests, export calls, state dictionaries, and target pages
Responsibility:
- inspect source structure and collect candidate scene metadata
- identify the likely business page URL/domain
- identify likely collection mode (report/collection in v1)
- extract request-shape hints, output table hints, export/report-log hints, and page dependencies
- record uncertainty instead of guessing when source evidence is incomplete
This unit is analysis-only. It does not perform runtime registration or invocation.
2. Skill Generator
Input:
- analyzed scene source description
- generator templates
- lessons-learned rules derived from existing scenes such as
tq-lineloss-report
Output:
- staged skill package
- platform registration manifest
- generated references and contract docs
Generated package contents for v1:
SKILL.tomlSKILL.mdreferences/collection-flow.mdreferences/data-quality.mdscripts/*.jsscripts/*.test.js- optional scene snapshot assets
scene.toml
The generator is responsible for producing complete registration-ready output, not just scaffolding files.
3. Scene Registry Loader
Responsibility:
- scan staged skill directories
- locate
scene.toml - validate scene registration contracts
- register scenes into a unified runtime registry
This replaces the long-term need for per-scene Rust wiring.
The existing runtime already has useful loading primitives in src/runtime/engine.rs:361 and skill-dir normalization in src/compat/config_adapter.rs:90. V1 should build on those instead of replacing them.
4. Generic Deterministic Dispatcher
Responsibility:
- activate only when the raw instruction ends with
。。。 - iterate registered scenes, not hardcoded scene branches
- evaluate deterministic match rules declared in
scene.toml - resolve required canonical parameters using platform resolver types
- produce either:
- mismatch / unsupported-scene prompt
- missing/ambiguous parameter prompt
- executable scene invocation plan
Multi-match and precedence rules
Extensibility means multiple registered scenes may match the same deterministic request. The platform must define this explicitly instead of allowing hidden first-match behavior.
Design rules:
- deterministic dispatch must score candidate scenes through declared match signals rather than raw file-load order
- higher-confidence signals may include page URL/title context, explicit include/exclude keyword fit, and resolver success for required parameters
- plain keyword overlap alone is not sufficient justification for silently choosing one scene when another remains plausible
- if two or more scenes remain materially plausible after deterministic scoring and required-parameter evaluation, the dispatcher must fail closed with an explicit ambiguity prompt rather than guessing
- the future implementation plan must lock the scoring and tie-break order in tests
- bootstrap/page-context signals are allowed to participate in disambiguation, but they must be declared and explainable
This keeps the system extensible without turning new scenes into routing contradictions.
This should replace scene-specific logic currently concentrated in src/compat/deterministic_submit.rs.
5. Generic Execution Pipeline
Responsibility:
- invoke the resolved tool through the existing
browser_scriptseam - reuse bootstrap target resolution
- interpret the artifact according to the registered artifact contract
- run generic report postprocessing such as Rust-side XLSX export
- keep business-specific interpretation out of the platform core
The strong requirement is to preserve the already-validated common path in:
src/compat/direct_skill_runtime.rssrc/compat/browser_script_skill_tool.rs- the existing report-artifact and export seams
Scene Registration Contract
The central platform contract is a per-scene registration manifest, named scene.toml in this design.
Why a separate manifest is needed
SKILL.toml describes tools. It does not fully describe:
- deterministic routing rules
- scene identity
- platform parameter resolution contracts
- bootstrap target rules
- artifact interpretation rules
- generic postprocessing declarations
Without this manifest, the generator would only create files while the runtime would still need scene-specific Rust changes.
Manifest responsibilities
Each generated scene manifest must declare:
- scene identity and runtime entrypoint
- bootstrap/page context requirements
- deterministic matching rules
- parameter schema and resolver mapping
- execution contract
- artifact contract
- postprocess contract
- schema/version metadata sufficient for long-term generator/runtime evolution
Manifest versioning and registry rules
The manifest contract must be explicit and versioned from the start.
Required rules:
- every
scene.tomlmust declare a manifest schema version independent from the scene version - the runtime must validate schema compatibility before registration
- scene registration must require globally unique
scene.idvalues across all loaded scene roots - duplicate scene IDs must fail registration deterministically rather than silently overriding an earlier scene
- the future implementation plan must decide and test the duplicate policy explicitly, but the default design rule is fail-fast with a clear error describing both conflicting manifest locations
- manifest evolution must prefer additive compatibility where possible so a future standalone generator can target the same runtime contract intentionally rather than by coincidence
This versioned contract is part of the extraction seam: it is what allows the runtime and a future standalone generator to evolve without private coupling.
Recommended manifest shape
[scene]
id = "tq-lineloss-report"
skill = "tq-lineloss-report"
tool = "collect_lineloss"
kind = "browser_script"
version = "0.1.0"
category = "report_collection"
[manifest]
schema_version = "1"
[bootstrap]
expected_domain = "20.76.57.61"
target_url = "http://20.76.57.61:18080/gsllys/tqLinelossStatis/tqQualifyRateMonitor"
page_title_keywords = ["线损"]
requires_target_page = true
[deterministic]
suffix = "。。。"
include_keywords = ["线损", "月累计", "周累计"]
exclude_keywords = ["知乎"]
[[params]]
name = "org"
resolver = "dictionary_entity"
required = true
prompt_missing = "已命中台区线损报表技能,但缺少供电单位。"
prompt_ambiguous = "已命中台区线损报表技能,但供电单位存在歧义,请补充更完整名称。"
[params.resolver_config]
dictionary_ref = "references/org-dictionary.json"
output_label_field = "org_label"
output_code_field = "org_code"
[[params]]
name = "period"
resolver = "month_week_period"
required = true
prompt_missing = "已命中台区线损报表技能,但缺少统计周期。"
prompt_ambiguous = "已命中台区线损报表技能,但统计周期存在歧义,请补充更明确表达。"
[artifact]
type = "report-artifact"
success_status = ["ok", "partial", "empty"]
failure_status = ["blocked", "error"]
[postprocess]
exporter = "xlsx_report"
auto_open = "excel"
Design rule
scene.toml declares behavior. It does not contain business JS code.
- business collection logic stays in
scripts/*.js - platform match/resolver selection stays in the manifest
- generic runtime execution stays in the platform
Platform-Provided Generic Capabilities
The platform should expose a small, explicit set of reusable capability types.
1. Scene Matchers
V1 deterministic matcher types should stay simple and declarative:
- include keywords
- exclude keywords
- required suffix
- optional page URL/title constraints
This is enough for v1 report scenes and avoids overbuilding NLP into deterministic mode.
Future seam:
- add a semantic matcher interface for model-based routing later without changing the rest of the scene contract
2. Parameter Resolvers
The platform should provide reusable resolver types instead of scene-specific branches.
Recommended v1 resolver types:
dictionary_entity- maps aliases to canonical label/code pairs using scene-provided dictionary data
month_week_period- parses month/week intent and canonical time payloads
fixed_enum- maps deterministic text options into fixed internal values
literal_passthrough- preserves an already explicit literal value
Design rule:
If a new scene needs a new resolver type, add a reusable platform capability. Do not add a scene-specific Rust branch.
3. Bootstrap Resolvers
The platform must be able to produce:
expected_domaintarget_url- page-context validation hints
These should come from registration metadata, not from per-scene hardcoded constants.
This generalizes the existing bootstrap-target seam already present in src/service/server.rs:453.
4. Tool Invokers
V1 supports one invoker type only:
browser_script
This is intentionally narrow. It keeps the platform close to the existing main architecture and avoids broad redesign.
Future seam:
- later add invokers for other tool kinds without changing scene registration concepts
5. Artifact Interpreters and Postprocessors
V1 should provide generic handling for report-style results:
report-artifactinterpreterxlsx_reportexporter/postprocessor- open-after-export policies
The platform should not know about line-loss business fields specifically. It should only know the generic artifact contract.
Generated Skill Package Contract
V1 generated scenes must follow a predictable staged package shape.
Required generated files
SKILL.tomlSKILL.mdscene.tomlreferences/collection-flow.mdreferences/data-quality.mdscripts/<entry>.jsscripts/<entry>.test.js- optional support assets such as scene snapshots
V1 generated skill assumptions
Generated report/collection skills must:
- accept normalized canonical args only
- validate expected page context before collection
- avoid re-parsing raw user language inside the script
- return one structured artifact object
- keep page/API collection logic inside the script
- leave generic interpretation/export policy to the platform where possible
Separation rule
The generated skill package owns:
- page inspection
- page-side state usage
- page/API calls
- row normalization
- scene-local docs and references
The platform owns:
- scene discovery and registration
- deterministic scene selection
- canonical parameter resolution using generic resolver types
- tool invocation
- artifact interpretation
- generic postprocessing
Migration Path from tq-lineloss One-Off to Platform Sample
The current line-loss implementation should not be discarded. It should become the first migration sample and platform proof point.
Why line-loss is the right sample
It already exercised most of the hard problems:
- deterministic routing via
。。。 - canonical org resolution
- canonical month/week resolution
- staged
browser_scriptpackaging - bootstrap target selection
- report artifact shaping
- local export needs
- pipe/ws transport differences
- real browser/runtime timeout and callback-host issues
Phase A: Extract generic registry and invocation seams
First, add:
- scene registry loader
- manifest reader/validator
- generic deterministic dispatch planning
while preserving the existing browser_script execution seam.
Phase B: Convert tq-lineloss into the first manifest-driven scene
Move line-loss specific declarations out of hardcoded Rust branches and into registration data:
- scene identity
- target URL and expected domain
- deterministic scene match rules
- resolver mapping
- artifact/postprocess declarations
Keep the business collection script in the skill package.
Phase C: Build the generator on top of the stabilized contract
Once line-loss runs through the manifest-driven platform path, define generator templates that produce the same contracts automatically from scenario directories.
Phase D: Add future semantic routing later
When model access is available, layer semantic routing onto the same registered scene contracts.
The LLM should eventually help with:
- selecting a scene
- filling unresolved parameters
But it should not replace the registered execution contract.
Generator Extraction Boundary
The design must support eventually moving the generator out of sgClaw.
Required extraction seam
The generator and runtime should communicate only through generated artifacts and contracts:
- staged skill package layout
scene.toml- any scene-local dictionaries/reference data
Consequence
The runtime must not depend on internal generator implementation details.
This means:
- do not let the runtime call generator internals directly
- do not let the generator rely on private runtime types as its only output format
- keep manifest and package contracts explicit and versionable
This is what makes later extraction into a separate repository practical.
tq-lineloss-report Lessons-Learned Document Requirement
The platform design requires a dedicated lessons-learned document based on the full tq-lineloss-report implementation and debugging path.
Why this document is required
The line-loss path uncovered issues that a naive generator would recreate immediately.
These include:
- deterministic routing and prompt semantics
- strict canonical org/period normalization
- no hidden page-default fallback
- target URL / expected-domain / bootstrap-target contracts
browser_scripttarget URL requirements- artifact shape discipline
- Rust-side XLSX export necessity because browser-side localhost export can fail under remote page origin constraints
- pipe vs ws differences
- callback-host and helper bootstrap timeout risks
- real-world service-console runtime validation gaps
Required sections
The lessons document should at minimum cover:
- source-scene assumptions that must be surfaced explicitly
- deterministic routing pitfalls
- canonical parameterization pitfalls
- bootstrap target and page-context pitfalls
- execution transport pitfalls (pipe/ws)
- artifact and export pitfalls
- testing pitfalls
- manual runtime validation pitfalls
- what should become generator template rules
- what should remain scene-specific manual work
Required format and location
The design requires both artifacts to live in a stable, versioned location under the project docs so future plans and a future standalone generator can depend on them intentionally.
Recommended shape:
docs/superpowers/references/tq-lineloss-lessons-learned.md- human-oriented narrative and rationale
docs/superpowers/references/tq-lineloss-lessons-learned.toml- structured generator input rules
The TOML artifact should be organized as reusable rule sections such as:
- deterministic routing rules
- canonical parameter rules
- bootstrap/target-url rules
- artifact/postprocess rules
- validation/test checklist rules
The generator should consume the structured TOML rules as template constraints or generation-time validation inputs, while the Markdown document remains the explainability companion for human reviewers.
How it should be used
This document becomes:
- template hardening input for the generator
- a checklist for reviewing generated scenes
- a planning artifact for deciding which pieces can be automated safely
Existing Code Surfaces to Reuse
The design should explicitly build on these current platform-adjacent surfaces rather than replacing them wholesale.
Skills discovery and loading
src/runtime/engine.rs:232load skills for surface from configurable directoriessrc/runtime/engine.rs:361load runtime skills across multiple rootssrc/compat/config_adapter.rs:90skill-dir normalization
Generic browser_script execution
src/compat/direct_skill_runtime.rs:91raw output execution helpersrc/compat/direct_skill_runtime.rs:148tool resolution from staged skillssrc/compat/browser_script_skill_tool.rsscript loading/wrapping/invocation pipeline
Bootstrap target resolution seam
src/service/server.rs:453submit bootstrap target resolution
Current one-off deterministic branch that should be generalized
src/compat/deterministic_submit.rs
The line-loss-specific pieces in that file are the main migration targets for platform conversion.
Failure Semantics
The platform must preserve explicit, business-safe failure semantics.
Deterministic mismatch
If the request ends with 。。。 but no registered scene matches, the runtime must return an explicit deterministic mismatch response.
Missing / ambiguous parameters
If a registered scene matches but required parameters cannot be resolved uniquely, the runtime must prompt rather than guess.
Execution failure
Execution failures should be interpreted according to the registered artifact contract and generic report semantics, not through per-scene special cases in the platform core.
Design rule
The platform should never silently recover by using page defaults when the scene contract requires canonical inputs.
Verification Requirements for the Future Implementation Plan
The future implementation plan must verify:
- registry loading from generated scene manifests
- deterministic dispatch through registered scenes instead of per-scene branches
- manifest-driven bootstrap target selection
- manifest-driven parameter resolver dispatch
- generic
browser_scriptinvocation of generated scenes - generic report artifact interpretation
- generic XLSX postprocessing compatibility
- unchanged behavior for existing non-scene core flows outside v1 scope
- migration of
tq-linelossfrom hardcoded branch to manifest-driven sample - branch strategy based on a new branch copied from
ws - lessons-learned document completeness and reuse as generator input
- separation seam sufficient for future generator extraction
Out of Scope for the V1 Implementation Plan
The future implementation plan should explicitly avoid:
- generic login/session capability as a first-class v1 platform subsystem
- full semantic routing implementation with models
- generalized action workflows
- a full scene DSL runtime
- direct implementation of multiple non-report scene kinds
- replacing the validated core
browser_scriptexecution path with a new protocol - broad architectural rewrites unrelated to generated scene skill support
Recommended First Implementation Slice
The most stable first slice is:
- create the scene manifest contract and validator
- build a registry loader over existing staged skill directories
- generalize deterministic dispatch to use registered scenes
- migrate
tq-linelossinto the first manifest-driven scene - document all line-loss lessons learned
- only then build the scenario-directory-to-skill generator
This keeps the platform grounded in a working runtime contract before the generator is asked to automate against it.
Final Recommendation
Build sgClaw into a generated scene skill platform by separating it into:
- a generic runtime platform that discovers, matches, resolves, invokes, and postprocesses scenes using manifest-driven contracts
- a scenario-directory-to-skill generator that emits staged skill packages and scene registration manifests
Implement v1 only for report/collection-oriented browser_script scenes, keep deterministic invocation on the explicit 。。。 suffix, migrate tq-lineloss into the first manifest-driven sample, and preserve a clean extraction seam so the generator can later become its own project.