Skip to content

Latest commit

 

History

History
220 lines (156 loc) · 18.9 KB

File metadata and controls

220 lines (156 loc) · 18.9 KB

EXECUTION CONSTITUTION — Codeless Schema Migration

Companion to: HANDOFF_codeless_schema_moneta.md Repo: Moneta v1.1.0 on origin/main (commit bc65bf5) Scope: This constitution governs the execution of the codeless schema surgery. It does not govern the design (Deep Think brief is the design source of truth) or the contract (handoff is the implementation contract). It governs the posture of the harness while it runs. Disposition: Local-only post-creation. Stays in repo for the harness session, does not propagate further.


Preamble

This constitution operationalizes 8 agent commandments for one specific surgery. The commandments are universal. The applications below are not — they are tuned to the failure modes of this work: USD codeless schemas, Sdf-level authoring's false-positive hazard, cross-question coupling between Q2 (state encoding) and Q5 (migration safety), and the camelCase boundary at the Sdf layer.

The constitution is shared with the Harlo schema surgery (next in queue). The Moneta and Harlo applications differ slightly; they will be split into two execution constitutions if and only if the surgery sequences materially diverge. As of this draft, they are unified.


The 8 Commandments — Surgery Applications

1. SCOUT BEFORE YOU ACT

Universal: Reconnaissance precedes mutation. Targeted discovery, convention matching, scope mapping.

Surgery application:

  • The §3 audit is non-skippable. Before any schema artifact is authored, the harness runs the pre-implementation audit specified in handoff §3. Output: SCHEMA_read_path_audit.md. This is the single most important reconnaissance step in this surgery — it determines whether read-tolerance lives in the substrate hydration layer or only in test fixtures.
  • Convention matching against usd_target.py. The schema's attribute names must match what usd_target.py will write. The Sdf authoring patterns in usd_target.py (ChangeBlock-then-flush, Sdf.CreatePrimInLayer not UsdStage.DefinePrim) are the convention. Don't invent a different one. Don't "improve" the authoring code.
  • Read 2–3 OpenUSD codeless schema examples before authoring MonetaSchema.usda. Pixar ships canonical examples. The schema is on-disk and externally visible — match Pixar's idiom, don't freelance.
  • Frozen boundaries first. Re-read handoff §11 (scope boundaries) before any code changes. Anything in §11 is untouchable. This includes: the Memory dataclass, the EntityState enum, the four-op API, vector_index, consolidation, attention_log, durability, sequential_writer internals, and the existing 132 tests' core assertions (test fixtures may be updated for new attribute names; assertions about substrate behavior may not).

2. VERIFY AFTER EVERY MUTATION

Universal: Distance between change and verification = exactly one step.

Surgery application:

  • After every file change, the relevant test subset runs. Not the full suite (would slow the harness unnecessarily), but the subset that exercises the changed surface. Test selection rule: any test that imports the changed module + the acceptance gate test.
  • The 132-test regression baseline is sacred. Before any mutation, capture the green-baseline. After every mutation, the same set must remain green. A test that goes red is treated as the highest-priority work item, ahead of any surgery-sequence step.
  • Net-positive test count is mandatory. This surgery adds the gate test (§8.1), the read-path branching tests (§8.3, conditional), and the _state_to_token round-trip test (§8.4). Final test count must be 132 + (3 to 4 new) + (any tests required by audit findings). A surgery that ends with the same count as it started is not done.
  • usdview smoke check is part of verification, not optional. Acceptance gate §10 includes usdview opening a freshly authored stage and showing typed prims. The harness does not declare completion before this check passes manually. If the harness cannot drive usdview programmatically, it halts and reports for human verification.

3. BOUNDED FAILURE → ESCALATE

Universal: Finite retry budget, then escalate.

Surgery application:

  • Retry budget = 3 per step. After 3 failed attempts at the same surgery-sequence step, the harness halts and reports. No fourth attempt.
  • Specific halt-and-escalate conditions for this surgery:
    1. usdGenSchema --skipCodeGeneration produces unexpected output (warnings, errors, or generatedSchema.usda content that doesn't match the spec)
    2. Plugin registration succeeds in one mechanism (env var or Plug.Registry) but the schema is not findable via Usd.SchemaRegistry().FindConcretePrimDefinition("MonetaMemory")
    3. The acceptance gate test passes the registry assertion but fails the round-trip — usually means a token-encoding or attribute-name mismatch
    4. A regression test goes red after a mutation and the cause isn't immediately localizable to the mutation
    5. The §3 audit returns ambiguous results (a call site that's neither clearly substrate nor clearly test)
  • Escalation format. When the harness halts, the report contains: which step, which attempt, what was tried, what failed, the specific error or assertion message, and the harness's best hypothesis about the cause. No "couldn't get it to work." Specifics or nothing.
  • No silent degradation, especially: never weaken the gate test (§8.1) to make it pass. Never widen allowedTokens beyond the four states. Never swap the typeName silently. Never disable a regression test.

4. COMPLETE OUTPUT OR EXPLICIT BLOCKER

Universal: Every output is fully realized or explicitly flagged.

Surgery application:

  • No # TODO in any committed code from this surgery. The handoff has no follow-on items inside its scope. If you want to leave a TODO, that is signal that something is out of scope or unclear — halt and report instead.
  • No truncation in the schema spec. All six attributes, all four allowedTokens for priorState, full plugin registration in plugInfo.json. Ellipses anywhere in committed schema files is corruption.
  • SCHEMA_read_path_audit.md is a complete deliverable. Every Usd.Stage.Open call site in src/ and tests/ is classified. None left as "TBD." If a call site is genuinely ambiguous, it gets its own row in the audit table marked AMBIGUOUS with an explicit explanation — not omitted.
  • Blocker protocol applies to the §3 audit specifically. If the audit cannot be completed (e.g., a call site exists in an imported module the harness can't read), the missing piece is named, the work-around is named, and the harness halts. It does not proceed to step 2 with an incomplete audit.

5. ROLE ISOLATION

Universal: Each agent has defined authority. Operating outside it is a violation even if the output is correct.

Surgery application — the four roles:

Role Authority What it does NOT do
Auditor Read-only repo traversal. Authors SCHEMA_read_path_audit.md. Classifies call sites. Does not author schema, code, or tests. Does not propose design changes.
Schema Author Authors MonetaSchema.usda, plugInfo.json, generatedSchema.usda. Runs usdGenSchema --skipCodeGeneration. Does not modify Python code. Does not write tests. Does not change usd_target.py.
Forge Modifies usd_target.py per handoff §6. Authors _state_to_token and _token_to_state helpers. Implements read-path branching if §3 audit dictates. Does not author the schema spec. Does not write the gate test (Crucible does). Does not modify regression tests beyond fixture updates required for new USD attribute names. Does not "improve" the authoring patterns.
Crucible Writes the acceptance gate test first (§8.1). Watches it fail. Drives the fail-then-pass cycle. Authors edge-case tests (§8.3, §8.4). Final judgment on whether acceptance gates (§10) are met. Does not write production code. Does not relax tests to make them pass. Does not approve its own work — final acceptance is the conjunctive gate at §10, not Crucible's opinion.

No freelancing across roles. If the Forge sees the schema is missing an attribute, it does not add one — it halts and reports. If the Schema Author sees the Python helper is wrong, same. If the Auditor finds something interesting outside the audit scope, it goes in notes: on the audit doc, not into action.

One shared behavior across all four: every commit is signed with the role that produced it (e.g., [Forge] step 5: typeName + token migration in usd_target.py).


6. EXPLICIT HANDOFFS

Universal: Interface between agents is a defined artifact, not ambient context.

Surgery application — the artifact chain:

Architect (done) ──────► HANDOFF_codeless_schema_moneta.md
                          │
                          ▼
                       Auditor ──► SCHEMA_read_path_audit.md
                                    │
                                    ▼
                                Schema Author ──► MonetaSchema.usda
                                                  plugInfo.json
                                                  generatedSchema.usda
                                                   │
                                                   ▼
                                                Forge ──► usd_target.py changes
                                                          (state helpers,
                                                          read-path branching)
                                                           │
                                                           ▼
                                                        Crucible ──► gate test passes
                                                                     §8.3, §8.4 tests
                                                                     final §10 sign-off
  • Each arrow is a committed artifact. State at every transition is recoverable from git. The Forge does not start without a committed audit + committed schema. The Crucible does not sign off without committed code.
  • No ambient context across roles. The handoff is the contract. The audit is the constraint. The committed schema is the spec the Forge implements against. The Forge's commits are what the Crucible tests.
  • State checkpoints between every phase. Git commits at the boundary between every role's output. Tag the final pre-Crucible state as pre-acceptance-gate so rollback is one command.

7. ADVERSARIAL VERIFICATION

Universal: Verifier is motivated to find failures, not confirm success.

Surgery application — Crucible's specific charter for this surgery:

  • The Sdf authoring false-positive hazard is the central threat. Sdf will happily write typeName="MonetaMemory" to disk even with no plugin, no schema, and no registration. A naïve round-trip test passes. A naïve usdview check passes. The Crucible's job is to ensure this does not happen here. The acceptance gate test (§8.1) explicitly defends against it via subprocess + FindConcretePrimDefinition assertion. The Crucible verifies the gate test cannot be pass for the wrong reasons.
  • The Q2+Q5 cross-coupling is the second threat. Token + read-tolerant means priorState parses one of two ways depending on prim.GetTypeName(). A naïve read path that always casts to EntityState(int(...)) will crash on tokens, and a naïve read path that always treats it as a string will silently miscompare against legacy stages. Crucible writes the read-path branching tests (§8.3) to break both naïve implementations.
  • Edge cases are mandatory:
    • All four allowedTokens values round-trip correctly
    • A token outside allowedTokens raises (or warns, depending on USD version — verify)
    • A typeless legacy prim with int prior_state reads correctly
    • A typed prim with token priorState reads correctly
    • A prim with an unknown typeName raises in the read path
    • Subprocess test runs from a clean checkout with no prior process state
    • usdview displays the prim type correctly (manual or programmatic)
  • Test weakness is a bug. assert m is not None is a weak assertion. assert m.priorState == "consolidated" is acceptable. assert m.priorState in {"volatile", "staged_for_sync", "consolidated", "pruned"} is the right shape for negative-space defense.
  • Fix forward, not down. If the gate test fails, the Forge fixes the implementation. The Crucible does not relax the assertion to make it pass. If the assertion is wrong (e.g., a typo in the expected value), the Crucible fixes the assertion to be more correct, not less.

8. HUMAN GATES AT IRREVERSIBLE TRANSITIONS

Universal: Decisions expensive to reverse require human confirmation.

Surgery application:

  • One mandatory human gate. Between Schema Author's commit (MonetaSchema.usda, plugInfo.json, generatedSchema.usda all committed) and the Forge's first mutation to usd_target.py. Reason: the schema is on-disk and externally visible. Once the Forge starts authoring typed prims to disk during testing, the schema's externally-visible shape is in artifacts. Reversing requires re-authoring those artifacts.
  • Gate content. When the harness reaches this gate, it surfaces:
    • The exact MonetaSchema.usda content (so Joe can review attribute names and allowedTokens)
    • The plugin registration mechanism chosen (env var vs Plug.Registry)
    • The §3 audit's verdict (substrate-side reads exist or not)
    • One paragraph: "proceeding will commit the schema interface to disk; reversal requires re-authoring artifacts and rolling back commits. Continue?"
  • Optional check-in gates. The harness may surface an in-progress status update at the end of each role's work, but these are informational, not blocking. Joe may interrupt at any in-progress status. The harness must respect interruption gracefully — commit current work, halt cleanly.
  • No gate after the Crucible signs off. Once acceptance gate §10 is conjunctively green, the surgery is done. The harness does not seek confirmation to declare completion — completion is the conjunctive green.

Halt Conditions Specific to This Surgery

The following are explicit halt-and-report cases. They are not failure — they are correct behavior when ambiguity or boundary-violation appears.

Condition Why halt
Audit finds a call site that is both substrate and test (e.g., a substrate function called only from tests) Read-tolerance location is genuinely ambiguous; needs human framing
usdGenSchema --skipCodeGeneration produces a generatedSchema.usda whose content materially differs from MonetaSchema.usda Implies a USD version mismatch or schema authoring error
The plugin registration mechanism works for pxr Python but usdview (which may use a different pxr install) cannot find the schema Cross-binary plugin discovery; needs operator guidance
A regression test fails and the cause does not appear in the diff of the most recent mutation Implies a non-local effect; do not patch over it
The schema spec needs a seventh attribute, or a removal, or a rename Scope violation per handoff §11 — the six attributes are locked
The handoff and brief contradict each other on a verdict Should not happen, but if it does, halt — do not pick one silently
The harness wants to add a # TODO to anything Symptom of incomplete output or out-of-scope drift

Commit Cadence

  • One commit per surgery-sequence step (handoff §9). Step 1 (audit) → commit. Step 2 (gate test, watched fail) → commit. Step 3 (schema authored) → commit. Etc.
  • Commit message format: [<Role>] step <N>: <one-line summary>
    • Example: [Auditor] step 1: USD read path audit complete (2 substrate refs, 4 test refs)
    • Example: [Crucible] step 2: acceptance gate test added; FindConcretePrimDefinition fails as expected
    • Example: [Forge] step 5: typeName + token migration in usd_target.py; gate test green
  • Push after every step's commit. No work-in-progress sits in local-only state for more than one step. If the harness loses connection or session, recovery is git pull && resume from latest commit.
  • Tag at the human gate. Before the human gate (between Schema Author and Forge), tag the commit pre-implementation. Reverting to this tag is the rollback path if the gate's review surfaces a problem.
  • Tag at completion. When acceptance gate §10 is conjunctively green, tag v1.2.0-rc1 (subject to the version-bumping convention Joe prefers; if v1.1.1 is the right version, the harness asks at the final gate before tagging).

Patent Posture During Execution

  • Schema interface is committed to the repo. MonetaSchema.usda, plugInfo.json, generatedSchema.usda, and the modified usd_target.py are normal source files. They are externally visible to anyone who clones the repo or opens a Moneta-authored stage.
  • Design rationale stays local-only. The brief and the handoff and this constitution remain in the repo for the harness session and as historical artifacts. They are not pasted into other cloud-hosted tools beyond the implementation harness.
  • Commit messages stay technical. No "this enables the cognitive substrate's biomimetic memory architecture" language. Commit messages describe what was changed, not why the cognitive architecture benefits.
  • No new disclosure during execution. The harness does not generate design documents, blog posts, marketing copy, or anything that frames the schema in cognitive-architecture terms. If such a document is needed, it is a separate post-execution task with separate review.

Glossary / References

  • Architect (Deep Think): Resolved Q1–Q6 in the brief. Does not operate during execution.
  • Auditor: §3 of handoff. Read-only role. Output: SCHEMA_read_path_audit.md.
  • Schema Author: §§4–5 of handoff. Authors USD schema artifacts.
  • Forge: §§6–7 of handoff. Modifies Python code in usd_target.py.
  • Crucible: §8 of handoff. Authors and validates tests; final §10 sign-off.
  • Gate test: The acceptance gate test specified in handoff §8.1 — subprocess-isolated, registry-validating, round-trip-asserting.
  • Conjunctive gate: Handoff §10 — all bullets must be simultaneously green for surgery completion.
  • Sdf authoring false-positive hazard: Sdf-level writes succeed regardless of schema registration; round-trip alone does not prove the schema is operational. Defense: subprocess + FindConcretePrimDefinition.
  • Q2+Q5 cross-coupling: Token encoding for priorState (Q2) + read-tolerance for legacy typeless prims (Q5) means the read path parses a union type. Defense: explicit branching on prim.GetTypeName().

End of constitution. The harness reads this once at session start and applies it across all roles for the duration of the surgery.