Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
// SPDX-License-Identifier: CC-BY-SA-4.0
= Mapping spec — `AGENTIC.a2ml` / `NEUROSYM.a2ml` / `PLAYBOOK.a2ml` → `repo-deed` (family 4)
Campaign: standards#837 · Frame: link:README.adoc[mappings/README] ·
Status: PROPOSAL pending owner review

Three small contractile-profile surfaces, one spec: they share the same
shape (sparse sections, heavy booleans, `@profile` header). They are
behavioural permissions/config for agents and tooling — genuine repo state,
so `repo-deed` clauses are the correct home (not praxis-deed: no rules,
no priorities).

== 1. Source surface

`<repo>/.machine_readable/descriptiles/{AGENTIC,NEUROSYM,PLAYBOOK}.a2ml`,
plus older spellings. All three observed instances carry a leading
`@profile(id=a2ml/<name>)` annotation line (AGENTIC/PLAYBOOK confirmed;
NEUROSYM confirmed as `a2ml/neurosym`) — handled in §3. Translator refuses
any field not tabulated below (frame fail-closed rule).

== 2. Target form

Clauses `(agentic …)`, `(neurosym …)`, `(playbook …)` on the repo's single
`<canonical-name>_chora.deed` (same deed as families 1–2).

== 3. Field tables

=== The `@profile` line (all three files)

[cols="2,3,4"]
|===
| a2ml surface | deed path | transform

| `@profile(id=a2ml/agentic)` etc. | `(profile :id "a2ml/agentic")` as FIRST clause inside the corresponding family clause | verbatim STRING. Kept as a string, not migrated into the BaseRecord `profileDecl` bridge — v0.1 conformance does not parse profileDecl through this surface, and silent re-homings are exactly the drift this campaign is against. Explicit revival decision rides with the typed-core bridge work, not this campaign.
|===

=== AGENTIC.a2ml → `(agentic …)`

[cols="2,3,4"]
|===
| a2ml surface | deed path | transform

| `[metadata] version` / `last-updated` | `(agentic :version "…" :last-updated "…")` | verbatim STRINGs
| `[agent-permissions] can-edit-source/tests/docs/config/create-files` | `(agentic (permissions :source #t :tests #t :docs #t :config #t :create-files #t))` | BOOLEANs → `#t`/`#f`
| `[agent-constraints]` | `(constraints …)` if populated, else slot dropped | fail-closed if any unknown key (see §4)
| `[maintenance-integrity] fail-closed`, `require-evidence-per-step`, `allow-silent-skip`, `require-rerun-after-fix`, `release-claim-requires-hard-pass` | `(agentic (integrity :fail-closed #t :require-evidence-per-step #t :allow-silent-skip #f :require-rerun-after-fix #t :release-claim-requires-hard-pass #t))` | BOOLEANs → `#t`/`#f` — **including `#f` for `allow-silent-skip`**: the negative must survive verbatim, it is load-bearing security behaviour (a flipped "false" is how silent-skip escapes happen)
| `[automation-hooks]` | `(hooks …)` if populated, else dropped | fail-closed if unknown key shape
|===

=== NEUROSYM.a2ml → `(neurosym …)`

[cols="2,3,4"]
|===
| a2ml surface | deed path | transform

| `[metadata] version` / `last-updated` | `(neurosym :version "…" :last-updated "…")` | verbatim STRINGs
| `[hypatia-config] scan-enabled` | `(neurosym (hypatia :scan-enabled #t))` | BOOLEAN → `#t`/`#f`
| `… scan-depth` | `(neurosym (hypatia :scan-depth standard))` | enum → SYMBOL; closed set `quick standard deep`
| `… report-format` | `(neurosym (hypatia :report-format "logtalk"))` | verbatim STRING
| `[symbolic-rules]`, `[neural-config]` | populated → fail-closed pending table rows; unpopulated → section dropped | —
|===

=== PLAYBOOK.a2ml → `(playbook …)`

Observed instance: all five sections (`deployment`, `incident-response`,
`release-process`, `docs-format`, `maintenance-operations`) are empty.

[cols="2,3,4"]
|===
| a2ml surface | deed path | transform

| `[metadata] version` / `last-updated` | `(playbook :version "0.1.0" :last-updated "…")` | verbatim STRINGs
| the five operational sections | **slot-preserved as empty clauses**: `(playbook (deployment)(incident-response)(release-process)(docs-format)(maintenance-operations))` | the family-1 slot doctrine applies: operations contracts exist to be greppable *as positions*, even before contents. Empty CLI with content-shaped fails-closed.
|===

== 4. Provenance & validation (extends P-1..P-8)

* **P-9 (profile literal):** each emitted deed's profile string equals the
source `@profile(id=…)` payload byte-for-byte inside the quotes — the
conformance lane greps for exactly three values estate-wide
(`a2ml/agentic`, `a2ml/neurosym`, `a2ml/playbook`) and any FOURTH string in
that position is a propagation bug, flagged automatically.
* **P-2a (table-closed):** applies per the frame; PLAYBOOK populated
sections and NEUROSYM rule/config content fail closed for table
extension rather than translate by guess.
* Boolean transform is total here (14 of the boolean-carrying fields in
the recon): the checker asserts ZERO literal `true`/`false` tokens in
these three clauses.

== 5. Acceptance greps

* `grep -rn ':allow-silent-skip #f' --include='*_chora.deed'` returns the
same repo count as `grep -rln 'allow-silent-skip = false'` over the
old a2ml corpus. Same for `#t` fields — all five integrity axioms
count-preserved per repo.
* `@profile` strings: exactly three distinct `:id` values estate-wide.
*`scan-depth` symbols are exactly from the closed three-set (validator,
not eyeballs).
Loading