generated from coulomb/repo-seed
Define Markitect resource namespace
This commit is contained in:
76
docs/markitect-resource-namespace.md
Normal file
76
docs/markitect-resource-namespace.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Markitect Resource Namespace
|
||||||
|
|
||||||
|
This document defines the Markitect protected-system namespace consumed by
|
||||||
|
flex-auth. It is the P3.1 contract between Markitect resource metadata and the
|
||||||
|
generic flex-auth registry.
|
||||||
|
|
||||||
|
The namespace is intentionally Markitect-specific at the edge and generic once
|
||||||
|
registered. Markitect may keep its local frontmatter and backend metadata
|
||||||
|
names, but emitted resource manifests should normalize them into the resource
|
||||||
|
types and CARING dimensions below.
|
||||||
|
|
||||||
|
## Hierarchy
|
||||||
|
|
||||||
|
```text
|
||||||
|
knowledge_base
|
||||||
|
-> repository
|
||||||
|
-> document
|
||||||
|
-> section
|
||||||
|
-> span
|
||||||
|
-> context_package
|
||||||
|
-> workflow_artifact
|
||||||
|
-> export
|
||||||
|
```
|
||||||
|
|
||||||
|
Markitect may emit a partial tree. For example, a document can be parented
|
||||||
|
directly to a knowledge base when the repository boundary is not material to a
|
||||||
|
policy decision. flex-auth treats `parent` as a stable relationship hint; P3.2
|
||||||
|
and P3.4 add importer and check fixtures that make inherited behavior explicit.
|
||||||
|
|
||||||
|
## CARING Mapping
|
||||||
|
|
||||||
|
| Markitect resource type | Parent types | CARING scope | CARING planes | Notes |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `knowledge_base` | none | `Workspace` | `Intent`, `Data` | Top-level user-visible knowledge container. |
|
||||||
|
| `repository` | `knowledge_base` | `Project` | `Build`, `Data` | Versioned source or storage boundary behind a knowledge base. |
|
||||||
|
| `document` | `repository`, `knowledge_base` | `Resource` | `Data` | Renderable document or page. Markitect `path` maps to resource `path`. |
|
||||||
|
| `section` | `document` | `Subresource` | `Data` | Stable heading or block region inside a document. |
|
||||||
|
| `span` | `section`, `document` | `Field` | `Data` | Fine-grained text range, cell, token span, or field-level surface. |
|
||||||
|
| `context_package` | `knowledge_base`, `repository`, `document` | `Dataset` | `Intent`, `Data`, `Policy` | Bundled context prepared for model/tool use. |
|
||||||
|
| `workflow_artifact` | `context_package`, `document` | `Process` | `Execution`, `Data`, `Audit` | Generated workflow output, review artifact, or intermediate. |
|
||||||
|
| `export` | `workflow_artifact`, `context_package`, `document` | `Record` | `Data`, `Audit` | Materialized package, file, archive, or external transfer. |
|
||||||
|
|
||||||
|
## Frontmatter Compatibility
|
||||||
|
|
||||||
|
Markitect document frontmatter can remain local, but manifests should preserve
|
||||||
|
the following mappings:
|
||||||
|
|
||||||
|
- `id` or stable slug -> `resources[].id`
|
||||||
|
- document kind -> `resources[].type`
|
||||||
|
- source path -> `resources[].path`
|
||||||
|
- parent knowledge base, repository, or document -> `resources[].parent`
|
||||||
|
- labels, classification, or visibility -> `resources[].labels`
|
||||||
|
- tenant/customer boundary -> `resources[].attributes.tenant` when it is not
|
||||||
|
already represented by the request subject/resource tenant
|
||||||
|
- owner team or steward -> `resources[].owner`
|
||||||
|
- freshness, workflow state, and source revision -> `resources[].attributes`
|
||||||
|
|
||||||
|
## Backend Metadata Compatibility
|
||||||
|
|
||||||
|
Backend metadata can be richer than the flex-auth contract. The manifest should
|
||||||
|
keep durable values in `attributes` and avoid embedding backend-only transient
|
||||||
|
state in resource ids.
|
||||||
|
|
||||||
|
Recommended backend metadata keys:
|
||||||
|
|
||||||
|
- `markitect_path`
|
||||||
|
- `frontmatter_visibility`
|
||||||
|
- `source_revision`
|
||||||
|
- `workflow_state`
|
||||||
|
- `freshness_seconds`
|
||||||
|
- `data_classes`
|
||||||
|
- `tenant`
|
||||||
|
|
||||||
|
The examples in `examples/markitect/protected_system_manifest.yaml` and
|
||||||
|
`examples/markitect/namespace_resource_manifest.yaml` are the pinned schema
|
||||||
|
examples for this namespace.
|
||||||
83
examples/markitect/namespace_resource_manifest.yaml
Normal file
83
examples/markitect/namespace_resource_manifest.yaml
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
id: markitect-namespace-example
|
||||||
|
system: markitect-tool
|
||||||
|
caring_profile: caring-0.4.0-rc2
|
||||||
|
resources:
|
||||||
|
- id: knowledge-base:markitect-example
|
||||||
|
type: knowledge_base
|
||||||
|
labels:
|
||||||
|
- internal
|
||||||
|
trust_zone: internal
|
||||||
|
owner: team:platform-architecture
|
||||||
|
- id: repository:markitect-policy
|
||||||
|
type: repository
|
||||||
|
parent: knowledge-base:markitect-example
|
||||||
|
path: repos/markitect-policy
|
||||||
|
labels:
|
||||||
|
- internal
|
||||||
|
trust_zone: internal
|
||||||
|
owner: team:platform-architecture
|
||||||
|
- id: document:internal-note
|
||||||
|
type: document
|
||||||
|
parent: repository:markitect-policy
|
||||||
|
path: examples/policy/private/internal-note.md
|
||||||
|
labels:
|
||||||
|
- internal
|
||||||
|
- pii
|
||||||
|
trust_zone: internal
|
||||||
|
owner: team:platform-architecture
|
||||||
|
attributes:
|
||||||
|
markitect_path: examples/policy/private/internal-note.md
|
||||||
|
frontmatter_visibility: internal
|
||||||
|
source_revision: rev:example
|
||||||
|
- id: section:internal-note#risk
|
||||||
|
type: section
|
||||||
|
parent: document:internal-note
|
||||||
|
path: examples/policy/private/internal-note.md#risk
|
||||||
|
labels:
|
||||||
|
- internal
|
||||||
|
trust_zone: internal
|
||||||
|
- id: span:internal-note#risk:customer-email
|
||||||
|
type: span
|
||||||
|
parent: section:internal-note#risk
|
||||||
|
labels:
|
||||||
|
- pii
|
||||||
|
trust_zone: restricted
|
||||||
|
attributes:
|
||||||
|
data_classes:
|
||||||
|
- email
|
||||||
|
- id: context-package:internal-note-review
|
||||||
|
type: context_package
|
||||||
|
parent: document:internal-note
|
||||||
|
labels:
|
||||||
|
- internal
|
||||||
|
- generated
|
||||||
|
trust_zone: internal
|
||||||
|
attributes:
|
||||||
|
freshness_seconds: 900
|
||||||
|
workflow_state: prepared
|
||||||
|
- id: workflow-artifact:internal-note-review-run
|
||||||
|
type: workflow_artifact
|
||||||
|
parent: context-package:internal-note-review
|
||||||
|
labels:
|
||||||
|
- generated
|
||||||
|
trust_zone: internal
|
||||||
|
attributes:
|
||||||
|
workflow_state: completed
|
||||||
|
- id: export:internal-note-review-bundle
|
||||||
|
type: export
|
||||||
|
parent: workflow-artifact:internal-note-review-run
|
||||||
|
labels:
|
||||||
|
- export
|
||||||
|
trust_zone: external
|
||||||
|
actions:
|
||||||
|
- read
|
||||||
|
- query
|
||||||
|
- search
|
||||||
|
- package
|
||||||
|
- activate_context
|
||||||
|
- export
|
||||||
|
- workflow_run
|
||||||
|
- admin
|
||||||
|
metadata:
|
||||||
|
source: examples/markitect/namespace_resource_manifest.yaml
|
||||||
|
flex_auth_contract: resource-registration-v0
|
||||||
69
examples/markitect/protected_system_manifest.yaml
Normal file
69
examples/markitect/protected_system_manifest.yaml
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
id: markitect-tool
|
||||||
|
name: Markitect Tool
|
||||||
|
description: Markitect protected-system namespace for flex-auth.
|
||||||
|
caring_profiles:
|
||||||
|
- caring-0.4.0-rc2
|
||||||
|
resource_types:
|
||||||
|
- name: knowledge_base
|
||||||
|
scope_level: Workspace
|
||||||
|
planes:
|
||||||
|
- Intent
|
||||||
|
- Data
|
||||||
|
- name: repository
|
||||||
|
parent_types:
|
||||||
|
- knowledge_base
|
||||||
|
scope_level: Project
|
||||||
|
planes:
|
||||||
|
- Build
|
||||||
|
- Data
|
||||||
|
- name: document
|
||||||
|
parent_types:
|
||||||
|
- repository
|
||||||
|
- knowledge_base
|
||||||
|
scope_level: Resource
|
||||||
|
planes:
|
||||||
|
- Data
|
||||||
|
- name: section
|
||||||
|
parent_types:
|
||||||
|
- document
|
||||||
|
scope_level: Subresource
|
||||||
|
planes:
|
||||||
|
- Data
|
||||||
|
- name: span
|
||||||
|
parent_types:
|
||||||
|
- section
|
||||||
|
- document
|
||||||
|
scope_level: Field
|
||||||
|
planes:
|
||||||
|
- Data
|
||||||
|
- name: context_package
|
||||||
|
parent_types:
|
||||||
|
- knowledge_base
|
||||||
|
- repository
|
||||||
|
- document
|
||||||
|
scope_level: Dataset
|
||||||
|
planes:
|
||||||
|
- Intent
|
||||||
|
- Data
|
||||||
|
- Policy
|
||||||
|
- name: workflow_artifact
|
||||||
|
parent_types:
|
||||||
|
- context_package
|
||||||
|
- document
|
||||||
|
scope_level: Process
|
||||||
|
planes:
|
||||||
|
- Execution
|
||||||
|
- Data
|
||||||
|
- Audit
|
||||||
|
- name: export
|
||||||
|
parent_types:
|
||||||
|
- workflow_artifact
|
||||||
|
- context_package
|
||||||
|
- document
|
||||||
|
scope_level: Record
|
||||||
|
planes:
|
||||||
|
- Data
|
||||||
|
- Audit
|
||||||
|
metadata:
|
||||||
|
source: examples/markitect/protected_system_manifest.yaml
|
||||||
|
namespace_doc: docs/markitect-resource-namespace.md
|
||||||
@@ -87,3 +87,55 @@ resources:
|
|||||||
t.Fatalf("minimal manifest did not round-trip: %+v", m)
|
t.Fatalf("minimal manifest did not round-trip: %+v", m)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMarkitectProtectedSystemNamespaceExampleParses(t *testing.T) {
|
||||||
|
path := filepath.Join("..", "..", "examples", "markitect", "protected_system_manifest.yaml")
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read %s: %v", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var got api.ProtectedSystemManifest
|
||||||
|
if err := yaml.Unmarshal(data, &got); err != nil {
|
||||||
|
t.Fatalf("unmarshal: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got.ID != "markitect-tool" {
|
||||||
|
t.Fatalf("ID = %q; want markitect-tool", got.ID)
|
||||||
|
}
|
||||||
|
if len(got.ResourceTypes) != 8 {
|
||||||
|
t.Fatalf("ResourceTypes len = %d; want 8", len(got.ResourceTypes))
|
||||||
|
}
|
||||||
|
if got.ResourceTypes[0].Name != "knowledge_base" || got.ResourceTypes[0].ScopeLevel != api.ScopeLevelWorkspace {
|
||||||
|
t.Fatalf("first ResourceType = %+v; want knowledge_base Workspace", got.ResourceTypes[0])
|
||||||
|
}
|
||||||
|
if got.ResourceTypes[7].Name != "export" || got.ResourceTypes[7].ScopeLevel != api.ScopeLevelRecord {
|
||||||
|
t.Fatalf("last ResourceType = %+v; want export Record", got.ResourceTypes[7])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMarkitectNamespaceResourceManifestExampleParses(t *testing.T) {
|
||||||
|
path := filepath.Join("..", "..", "examples", "markitect", "namespace_resource_manifest.yaml")
|
||||||
|
data, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("read %s: %v", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var got api.ResourceManifest
|
||||||
|
if err := yaml.Unmarshal(data, &got); err != nil {
|
||||||
|
t.Fatalf("unmarshal: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if got.CaringProfile != api.CaringProfileCaring040RC2 {
|
||||||
|
t.Fatalf("CaringProfile = %q; want %q", got.CaringProfile, api.CaringProfileCaring040RC2)
|
||||||
|
}
|
||||||
|
if len(got.Resources) != 8 {
|
||||||
|
t.Fatalf("Resources len = %d; want 8", len(got.Resources))
|
||||||
|
}
|
||||||
|
if got.Resources[4].Type != "span" || got.Resources[4].TrustZone != "restricted" {
|
||||||
|
t.Fatalf("resources[4] = %+v; want restricted span", got.Resources[4])
|
||||||
|
}
|
||||||
|
if got.Resources[7].Type != "export" || got.Resources[7].Parent != "workflow-artifact:internal-note-review-run" {
|
||||||
|
t.Fatalf("resources[7] = %+v; want export child of workflow artifact", got.Resources[7])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ Markitect-specific assumptions part of the generic core.
|
|||||||
|
|
||||||
```task
|
```task
|
||||||
id: FLEX-WP-0003-T001
|
id: FLEX-WP-0003-T001
|
||||||
status: todo
|
status: done
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "53f2fa67-780b-4e40-bbda-e669e4cecc32"
|
state_hub_task_id: "53f2fa67-780b-4e40-bbda-e669e4cecc32"
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user