7.7 KiB
id, type, title, domain, status, owner, topic_slug, planning_priority, planning_order, depends_on_workplans, related_workplans, created, updated, state_hub_workstream_id
| id | type | title | domain | status | owner | topic_slug | planning_priority | planning_order | depends_on_workplans | related_workplans | created | updated | state_hub_workstream_id | |||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MKTT-WP-0005 | workplan | Runtime Context, Form, and Assessment Engines | markitect | done | markitect-tool | markitect | complete | 70 |
|
|
2026-05-03 | 2026-05-04 | 7918687e-2364-46b1-ab7e-65aa77cb8449 |
MKTT-WP-0005: Runtime Context, Form, and Assessment Engines
Purpose
Turn the contract framework extension points into executable runtime engines: context loading, field prefill, form state evaluation, dynamic rules, and provider-neutral LLM assessment execution.
This workplan picks up the deferred runtime scope from
MKTT-WP-0004-practical-contract-framework.md.
Decision
This workplan is implemented. It was picked up after the workflow and internal extension framework work made runtime form/context evaluation useful and cleanly integrable.
The original trigger conditions were:
- We are implementing template/generation flows that need reliable field prefill and pre-render validation.
- We need document checks that depend on case-specific external context.
- Deterministic assertions are no longer enough to assess whether sections do their semantic job.
- A user-facing or agent-facing workflow needs structured form state, defaults, conditional requiredness, or guided repair.
Implemented sequencing:
- Implement context and form runtime first.
- Add deterministic context-aware rules.
- Add provider-neutral assessment execution after the diagnostic/caching boundary was stable.
Background
The deterministic contract framework already supports:
- field declarations
- deterministic section assertions
- metric bands
- provider-neutral rubric declarations as contract vocabulary
- one shared diagnostic model
It does not yet execute:
- context resolvers
- form state evaluation
- dynamic requiredness or visibility
- calculated values
- prefill
- provider-neutral LLM assessment requests
- assessment result caching
P5.1 - Define runtime context model
id: MKTT-WP-0005-T001
status: done
priority: high
state_hub_task_id: "e24e6238-efef-41c4-9f1e-ca677c1be89b"
Define how external context is supplied to contract checks and generation:
- inline YAML/JSON files
- named context objects
- typed context schemas
- explicit source paths
- conflict behavior when frontmatter and context both provide a value
- diagnostic behavior for missing or malformed context
Expected output: design notes and tests for context loading.
P5.2 - Implement context resolver API and CLI input
id: MKTT-WP-0005-T002
status: done
priority: high
state_hub_task_id: "d180bb6d-dae8-4305-88de-64c80b708b8a"
Add a small runtime API and CLI option such as:
mkt contract check <document.md> --contract <contract.md> --context <context.yaml>
Resolvers must be deterministic, local-first, and provider-neutral. Network or application-specific data access belongs in adapters outside the core package.
P5.3 - Implement field prefill and validation runtime
id: MKTT-WP-0005-T003
status: done
priority: high
state_hub_task_id: "b954984a-6f67-4e5b-8744-35e3c4fcc992"
Evaluate field specs against document frontmatter and context:
- required fields
- defaults
- source paths
- enum/pattern/range validation
- type coercion policy
- diagnostics for missing, ambiguous, or conflicting values
Expected utility: contracts become useful before generation, not only after a document exists.
P5.4 - Implement form state model
id: MKTT-WP-0005-T004
status: done
priority: medium
state_hub_task_id: "cccdf868-2308-42a1-b564-8b54fccd3c8b"
Represent form state without binding to a UI framework:
- field id
- value
- defaulted/prefilled/manual/calculated origin
- visible/hidden
- enabled/disabled
- required/optional
- validation diagnostics
- display hints as metadata, not behavior
This should support future UI adapters while remaining useful from the CLI.
P5.5 - Implement dynamic rules
id: MKTT-WP-0005-T005
status: done
priority: medium
state_hub_task_id: "6e420e1e-2465-40d3-8e64-d8681a294e63"
Add deterministic dynamic rules for field and section behavior:
if/then/else- requiredness
- visibility
- allowed values
- calculated values
- context-dependent assertions
Keep the expression language intentionally small. Prefer JSON/YAML paths and a small set of operators over embedding a general programming language.
P5.6 - Define LLM assessment execution interface
id: MKTT-WP-0005-T006
status: done
priority: medium
state_hub_task_id: "24b22b3a-e89e-4946-81f4-94f971a11979"
Define provider-neutral request/response models for rubric execution:
- contract id
- rule id
- scope: document, section, or field
- text and structured inputs
- context snapshot
- rubric criteria
- cache key material
- pass/fail
- score
- reason
- model/provider metadata
- diagnostics
Core package should define the protocol and result model, not a provider implementation.
P5.7 - Add assessment runner and cache boundary
id: MKTT-WP-0005-T007
status: done
priority: medium
state_hub_task_id: "b09b77e2-59c0-4d31-b246-685b742d111f"
Implement a runner that can invoke an injected assessment adapter and normalize results into diagnostics.
Add deterministic cache key calculation but keep storage pluggable. The default cache may be local file-based only if it remains transparent and easy to reset.
P5.8 - Add examples and failure diagnostics
id: MKTT-WP-0005-T008
status: done
priority: high
state_hub_task_id: "2efb8233-3154-4824-a898-6fcde37330c5"
Create examples that show the practical value:
- business letter with context-prefilled recipient/sender data
- PRD/FRS with context-dependent product metadata
- workplan where task requirements depend on status
- concept note with LLM rubric declaration and mocked assessment output
Each example should include expected diagnostics for missing context, ambiguous prefill, invalid dynamic rules, and assessment failures.
Open Questions
- Resolved: document/frontmatter values win over context; conflicts are diagnostics and can be escalated per field.
- Resolved: dynamic rules use a smaller Markitect-native vocabulary over JSON/YAML paths instead of embedding JSON Schema conditionals.
- Resolved: provider execution remains external; core defines request/result, runner, diagnostics, and cache boundary only.
- Resolved for core: assessment cache keys include contract/rule/scope/text, criteria, context, structured inputs, provider/model metadata, threshold, and metadata. Persistent cache invalidation remains a backend concern.
Implementation Notes
- Added
markitect_tool.runtimewith context loading, path resolution, deterministic condition evaluation, form state, dynamic rules, assessment request/result models, runner, and in-memory cache boundary. mkt contract checknow accepts--context.- Added
mkt contract form-state. - Workflow
contract_checkaccepts context and workflowform_stateexposes runtime field state as a step result. - Built-in extension descriptors now include
runtime.context,runtime.form-state, andruntime.assessment. - Documentation lives in
docs/runtime-context-forms-assessments.md. - Examples live in
examples/runtime/.
Exit Criteria
- Runtime context can be supplied to contract checks.
- Field prefill and validation produce unified diagnostics.
- Form state can be rendered by a future adapter without changing core models.
- Dynamic rules cover common requiredness, visibility, and context assertions.
- LLM rubric execution has a provider-neutral protocol and mocked test adapter.
- Examples demonstrate utility beyond static document validation.