From 18cfaae2c4c0b4e01494fee148676d38838a18cc Mon Sep 17 00:00:00 2001 From: Enrico Piovesan Date: Tue, 14 Jul 2026 23:51:29 -0600 Subject: [PATCH] Add doc-approval app and component manifests (#112) Author manifests/doc-approval for analyze + recommend with pipeline workflow reference, extend phase2_link_traverse for both apps, and gate structure checks. Validated with traverse-cli app validate. Co-authored-by: Cursor --- .gitignore | 1 + AGENTS.md | 4 +- docs/embedded-runtime-plan.md | 2 +- manifests/doc-approval/app.manifest.json | 93 +++++++++++++++++++ .../analyze/component.manifest.json | 25 +++++ .../recommend/component.manifest.json | 25 +++++ scripts/ci/phase2_link_traverse.sh | 25 +++-- scripts/ci/repository_checks.sh | 6 ++ 8 files changed, 171 insertions(+), 10 deletions(-) create mode 100644 manifests/doc-approval/app.manifest.json create mode 100644 manifests/doc-approval/components/analyze/component.manifest.json create mode 100644 manifests/doc-approval/components/recommend/component.manifest.json diff --git a/.gitignore b/.gitignore index 5792028..589e8b5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ coverage/ # Traverse checkout symlink for Phase 2 manifest validation manifests/traverse-starter/_traverse +manifests/doc-approval/_traverse .traverse/ apps/traverse-starter/TraverseCore/.build/ diff --git a/AGENTS.md b/AGENTS.md index 5ce9872..cb70c5c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,9 +12,9 @@ gh project item-list 2 --owner traverse-framework --format json --limit 300 \ ### Blocked work summary - **Phase 3 embedded runtime** ([#114](https://github.com/traverse-framework/reference-apps/issues/114)–[#116](https://github.com/traverse-framework/reference-apps/issues/116)) — blocked on remaining consumable embedder SDKs: Traverse [#647](https://github.com/traverse-framework/Traverse/issues/647) (Swift), [#648](https://github.com/traverse-framework/Traverse/issues/648) (Kotlin), [#649](https://github.com/traverse-framework/Traverse/issues/649) (.NET). Rust (#650) and Web/TS (#646) embedder SDKs shipped; App-Refs [#117](https://github.com/traverse-framework/reference-apps/issues/117) Linux/CLI and [#113](https://github.com/traverse-framework/reference-apps/issues/113) web-react embed shipped. -- **doc-approval multi-capability showcase** ([#111](https://github.com/traverse-framework/reference-apps/issues/111), [#112](https://github.com/traverse-framework/reference-apps/issues/112)) — Ready after Traverse [#555](https://github.com/traverse-framework/Traverse/issues/555) (`recommend`). Spec 069: pipeline is `analyze → recommend` (no extract). +- **doc-approval multi-capability showcase** ([#111](https://github.com/traverse-framework/reference-apps/issues/111)) — Ready after Traverse [#555](https://github.com/traverse-framework/Traverse/issues/555) (`recommend`) and manifests [#112](https://github.com/traverse-framework/reference-apps/issues/112). Spec 069: pipeline is `analyze → recommend` (no extract). -Ready: [#111](https://github.com/traverse-framework/reference-apps/issues/111), [#112](https://github.com/traverse-framework/reference-apps/issues/112) (after #113 merges). +Ready: [#111](https://github.com/traverse-framework/reference-apps/issues/111) (after #112 merges). Update this section when a PR changes platform status (see PR template checklist). diff --git a/docs/embedded-runtime-plan.md b/docs/embedded-runtime-plan.md index ac0c540..70d6e25 100644 --- a/docs/embedded-runtime-plan.md +++ b/docs/embedded-runtime-plan.md @@ -130,7 +130,7 @@ Until (1–2) exist, platform migration tickets stay **Blocked**. | [110](https://github.com/traverse-framework/reference-apps/issues/110) | traverse-starter.pipeline multi-capability workflow | Blocked | | [111](https://github.com/traverse-framework/reference-apps/issues/111) | doc-approval.pipeline multi-capability workflow | Blocked | | [112](https://github.com/traverse-framework/reference-apps/issues/112) | doc-approval manifests | Blocked | -| [113](https://github.com/traverse-framework/reference-apps/issues/113) | Embed runtime — web-react | Done (this PR) | +| [113](https://github.com/traverse-framework/reference-apps/issues/113) | Embed runtime — web-react | Done | | [114](https://github.com/traverse-framework/reference-apps/issues/114) | Embed runtime — Swift (iOS + macOS) | Blocked | | [115](https://github.com/traverse-framework/reference-apps/issues/115) | Embed runtime — Android | Blocked | | [116](https://github.com/traverse-framework/reference-apps/issues/116) | Embed runtime — Windows | Blocked | diff --git a/manifests/doc-approval/app.manifest.json b/manifests/doc-approval/app.manifest.json new file mode 100644 index 0000000..09e853c --- /dev/null +++ b/manifests/doc-approval/app.manifest.json @@ -0,0 +1,93 @@ +{ + "app_id": "doc-approval", + "version": "1.0.0", + "schema_version": "1.0.0", + "workspace_defaults": { + "workspace_id": "local-default", + "registry_scope": "private" + }, + "components": [ + { + "component_id": "doc-approval.analyze-component", + "version": "1.0.0", + "digest": "sha256:5647c39a1d25d8728350f9619025292a62e78a602068a2ad9b6f075751c93d99", + "manifest_path": "components/analyze/component.manifest.json" + }, + { + "component_id": "doc-approval.recommend-component", + "version": "1.0.0", + "digest": "sha256:5647c39a1d25d8728350f9619025292a62e78a602068a2ad9b6f075751c93d99", + "manifest_path": "components/recommend/component.manifest.json" + } + ], + "workflows": [ + { + "workflow_id": "doc-approval.pipeline", + "workflow_version": "1.0.0", + "path": "_traverse/workflows/examples/doc-approval/pipeline/workflow.json" + } + ], + "model_dependencies": [], + "config_schema": { + "type": "object", + "required": ["workspace_id"], + "properties": { + "workspace_id": { "type": "string" }, + "analysis_mode": { + "type": "string", + "enum": ["deterministic"] + } + }, + "additionalProperties": false + }, + "default_config": { + "workspace_id": "local-default", + "analysis_mode": "deterministic" + }, + "placement_policy": { + "preferred_targets": ["local"], + "allow_fallback": false + }, + "public_surfaces": ["cli", "http_json"], + "state_machine": { + "initial_state": "idle", + "list_context_fields": [ + "output.analysis.docType", + "output.analysis.parties", + "output.analysis.amounts", + "output.analysis.confidence", + "output.analysis.recommendation", + "output.recommendation.recommendation", + "output.recommendation.rationale", + "output.recommendation.confidence" + ], + "states": [ + { + "id": "idle", + "transitions": [{ "on": "submit", "to": "processing" }] + }, + { + "id": "processing", + "invoke": { + "capability_id": "doc-approval.analyze", + "input_from": "command.payload" + }, + "transitions": [ + { "on": "capability_succeeded", "to": "results" }, + { "on": "capability_failed", "to": "error" } + ] + }, + { + "id": "results", + "transitions": [{ "on": "reset", "to": "idle" }] + }, + { + "id": "error", + "transitions": [ + { "on": "retry", "to": "processing", "with_last_payload": true }, + { "on": "reset", "to": "idle" } + ] + } + ] + } +} diff --git a/manifests/doc-approval/components/analyze/component.manifest.json b/manifests/doc-approval/components/analyze/component.manifest.json new file mode 100644 index 0000000..5c3ca8e --- /dev/null +++ b/manifests/doc-approval/components/analyze/component.manifest.json @@ -0,0 +1,25 @@ +{ + "component_id": "doc-approval.analyze-component", + "version": "1.0.0", + "schema_version": "1.0.0", + "capability_id": "doc-approval.analyze", + "capability_version": "1.0.0", + "contract_path": "../../_traverse/contracts/examples/doc-approval/capabilities/analyze/contract.json", + "wasm_binary_path": "../../_traverse/examples/doc-approval/analyze-agent/artifacts/analyze-agent.wasm", + "wasm_digest": "sha256:5647c39a1d25d8728350f9619025292a62e78a602068a2ad9b6f075751c93d99", + "runtime_constraints": { + "host_api_access": "none", + "network_access": "forbidden", + "filesystem_access": "none" + }, + "permitted_targets": ["local", "device"], + "dependencies": [], + "connector_requirements": [], + "validation_evidence": [ + { + "evidence_type": "checked_in_fixture", + "status": "passed", + "produced_by": "doc_approval_example_smoke" + } + ] +} diff --git a/manifests/doc-approval/components/recommend/component.manifest.json b/manifests/doc-approval/components/recommend/component.manifest.json new file mode 100644 index 0000000..e8b6cf9 --- /dev/null +++ b/manifests/doc-approval/components/recommend/component.manifest.json @@ -0,0 +1,25 @@ +{ + "component_id": "doc-approval.recommend-component", + "version": "1.0.0", + "schema_version": "1.0.0", + "capability_id": "doc-approval.recommend", + "capability_version": "1.0.0", + "contract_path": "../../_traverse/contracts/examples/doc-approval/capabilities/recommend/contract.json", + "wasm_binary_path": "../../_traverse/examples/doc-approval/recommend-agent/artifacts/recommend-agent.wasm", + "wasm_digest": "sha256:5647c39a1d25d8728350f9619025292a62e78a602068a2ad9b6f075751c93d99", + "runtime_constraints": { + "host_api_access": "none", + "network_access": "forbidden", + "filesystem_access": "none" + }, + "permitted_targets": ["local", "device"], + "dependencies": [], + "connector_requirements": [], + "validation_evidence": [ + { + "evidence_type": "checked_in_fixture", + "status": "passed", + "produced_by": "doc_approval_example_smoke" + } + ] +} diff --git a/scripts/ci/phase2_link_traverse.sh b/scripts/ci/phase2_link_traverse.sh index 8e96cc8..e4286f0 100755 --- a/scripts/ci/phase2_link_traverse.sh +++ b/scripts/ci/phase2_link_traverse.sh @@ -1,15 +1,14 @@ #!/usr/bin/env bash -# Ensures manifests/traverse-starter/_traverse symlink points at TRAVERSE_REPO. +# Ensures manifests//_traverse symlinks point at TRAVERSE_REPO. # Required for app validate/register — WASM, contracts, and workflows live in Traverse. set -euo pipefail REPO_ROOT="${REPO_ROOT:-$(git rev-parse --show-toplevel)}" -LINK="$REPO_ROOT/manifests/traverse-starter/_traverse" if [ -z "${TRAVERSE_REPO:-}" ]; then echo "FAIL: TRAVERSE_REPO is not set." echo "" - echo "Clone Traverse v0.6.0+ (minimum v0.5.0 for Phase 2) with traverse-starter example and export:" + echo "Clone Traverse main (with traverse-starter + doc-approval examples) and export:" echo " export TRAVERSE_REPO=/path/to/Traverse" exit 1 fi @@ -21,10 +20,22 @@ fi if [ ! -f "$TRAVERSE_REPO/examples/traverse-starter/process-agent/artifacts/process-agent.wasm" ]; then echo "FAIL: traverse-starter WASM not found in TRAVERSE_REPO." - echo " Ensure TRAVERSE_REPO is Traverse main with issue #499 merged." exit 1 fi -mkdir -p "$(dirname "$LINK")" -ln -sfn "$TRAVERSE_REPO" "$LINK" -echo "OK: linked $LINK -> $TRAVERSE_REPO" +if [ ! -f "$TRAVERSE_REPO/examples/doc-approval/analyze-agent/artifacts/analyze-agent.wasm" ]; then + echo "FAIL: doc-approval WASM not found in TRAVERSE_REPO." + echo " Ensure TRAVERSE_REPO includes issue #555 recommend + analyze agents." + exit 1 +fi + +link_app() { + local app="$1" + local link="$REPO_ROOT/manifests/$app/_traverse" + mkdir -p "$(dirname "$link")" + ln -sfn "$TRAVERSE_REPO" "$link" + echo "OK: linked $link -> $TRAVERSE_REPO" +} + +link_app "traverse-starter" +link_app "doc-approval" diff --git a/scripts/ci/repository_checks.sh b/scripts/ci/repository_checks.sh index d0a16f2..e008037 100644 --- a/scripts/ci/repository_checks.sh +++ b/scripts/ci/repository_checks.sh @@ -64,6 +64,12 @@ check "apps/doc-approval/DocApprovalCore/Package.swift" "doc-a check "apps/doc-approval/doc-approval-core-rs/Cargo.toml" "doc-approval-core-rs Cargo crate" check "apps/doc-approval/Cargo.toml" "doc-approval Cargo workspace" +# Application manifests +check "manifests/traverse-starter/app.manifest.json" "traverse-starter app manifest" +check "manifests/doc-approval/app.manifest.json" "doc-approval app manifest" +check "manifests/doc-approval/components/analyze/component.manifest.json" "doc-approval analyze component" +check "manifests/doc-approval/components/recommend/component.manifest.json" "doc-approval recommend component" + # meeting-notes clients check "apps/meeting-notes/web-react/package.json" "meeting-notes web-react package" check "apps/meeting-notes/web-react/README.md" "meeting-notes web-react README"