meta.language.envelopes.direct_calls

Each invocation clause grants a direct dependency. Transitive reachability is derived from those direct edges and does not grant the caller permission to invoke an indirect dependency directly.

Read in specification context · design/meta/language.md

Implementation

Implemented crates/sage-meta/src/contracts.rs:234–239

sage_meta::contracts · lib:sage_meta

#![allow(unused)]
fn main() {
    // {anchor}`meta.language.envelopes.direct_calls`
    fn check_request(&mut self, invocation: &Invocation) {
        if let Some(caller) = self.active.last().cloned() {
            if let Some(contract) = self.model.operations.get(&caller.operation) {
                // {anchor}`meta.language.envelopes.permissions`
                let permissions: Vec<_> = contract

}

See more source ↗

Implemented crates/sage-meta/src/validate.rs:89–94

sage_meta::validate · lib:sage_meta

#![allow(unused)]
fn main() {
                                // {anchor}`meta.language.envelopes.direct_calls`
                                operation.invokes.push(rule);
                            } else {
                                operation.prohibits.push(rule);
                            }
                        }

}

See more source ↗

Tests and review

Indexed tests and the implementation-completeness and test-adequacy review; no test run is implied.

Implemented sage_meta::indirect_reachability_does_not_grant_a_direct_call_permission

crates/sage-meta/tests/envelopes.rs · test:envelopes

#![allow(unused)]
fn main() {
#[test]
#[sage::test(meta.language.envelopes.direct_calls)]
#[sage::test(meta.language.model.forbidden_paths)]
fn indirect_reachability_does_not_grant_a_direct_call_permission() {
    let source = r#"class Root { """Root.""" fn run() -> u32 { """Run.""" envelope {
            invokes crate::Helper::work();
        } } }
        class Helper { """Helper.""" fn work() -> u32 { """Work.""" envelope {
            invokes crate::Leaf::read();
        } } }
        class Leaf { """Leaf.""" fn read() -> u32 { """Read.""" envelope {} } }"#;
    let model = Arc::new(ContractModel::new(&[valid(source)]).unwrap());
    assert_eq!(
        model.operations()["demo::Root::run"].invokes[0].targets,
        ["demo::Helper::work".into()].into_iter().collect()
    );
    let mut session = ContractSession::new(model, ["demo::Root::run".into()]);
    let root = session.enter("demo::Root::run", None);
    let indirect = session.enter("demo::Leaf::read", None);
    session.exit(indirect);
    session.exit(root);
    assert_eq!(
        session.finish().violations[0].kind,
        ViolationKind::UndeclaredCall
    );

    let prohibited = source.replace(
        "invokes crate::Helper::work();",
        "invokes crate::Helper::work(); forbid transitive crate::Leaf::read;",
    );
    let errors = sage_meta::validate(&[parse(&prohibited)]);
    assert!(errors.iter().any(|error| {
        error
            .message
            .contains("demo::Root::run -> demo::Helper::work -> demo::Leaf::read")
    }));
    valid(&prohibited.replace("invokes crate::Helper::work();", ""));
}
}

See more source ↗

Review: Accepted · Codex /root/anchor_195.

Reassessed all three requirements: invocation clauses grant direct edges, reachability derives from those edges, and indirect reachability does not authorize a direct request. Both ordinary implementation entries are covered: validate.rs resolves each explicit invocation into its own CallPermission without traversing callees, and independently builds/traverses the direct graph for forbidden transitive paths; contracts.rs check_request checks only the active caller contract targets (with declared dispatch handling), never a transitive permission closure. The sole ordinary associated test, indirect_reachability_does_not_grant_a_direct_call_permission, asserts Root has only Helper as its invocation target, observes UndeclaredCall for Root directly entering Leaf, asserts the derived Root -> Helper -> Leaf forbidden path, and removes Root’s direct edge to demonstrate that the prohibition no longer has reachable evidence. Captured parse/valid helpers confirm the final case actually asserts successful validation. These assertions would detect flattening indirect reachability into Root’s permissions or ignoring the direct edges in graph derivation. No TODO/N/A entries or deferred prerequisites exist. Baseline verification: contracts.rs, validate.rs, and envelopes.rs exactly match the historical source arrays byte for byte; the supplied earlier independent rationale remains supported by current complete claim, both implementation files, complete associated test, and captured helpers. This is source review, not fresh behavior execution. I ran review start, review read, and the baseline comparison; no tests or build were rerun. The coordinator separately reports 321 passing functional tests and a successful root build. No source edits requested.

Browse meta anchors

116 anchors

Specification anchors and declared coverage
AnchorImplementationTests
meta (116)102 Implemented24 TODO103 Implemented36 TODO
meta.anchors (22)22 Implemented21 Implemented12 TODO
anchor_pagesImplementedImplementedTODO
book_explorerImplementedImplementedTODO
canonical_sourcesImplementedImplementedTODO
meta.anchors.content (7)7 Implemented7 Implemented
blocksImplementedImplemented
explicit_endImplementedImplemented
headingImplementedImplemented
literal_syntaxImplementedImplemented
next_anchorImplementedImplemented
source_endImplementedImplemented
unmatched_endImplementedImplemented
context_navigationImplementedImplementedTODO
evidence_statusImplementedImplementedTODO
explorer_navigationImplementedTODO
implementation_coverageImplementedImplementedTODO
implementation_referencesImplementedImplementedTODO
placeholder_statusImplementedImplementedTODO
point_excerptsImplementedImplementedTODO
region_balanceImplementedImplemented
region_excerptsImplementedImplementedTODO
test_coverageImplementedImplemented
test_referencesImplementedImplemented
unique_namesImplementedImplementedTODO
meta.book (21)10 Implemented18 TODO12 Implemented18 TODO
anchor_movesImplementedTODOImplementedTODO
authorityImplementedTODOImplementedTODO
browser_deliveryTODOImplementedTODO
browser_dependenciesTODOTODO
browser_rust_sourceTODOTODO
browser_searchTODOTODO
browser_serveTODOTODO
browser_structureTODOTODO
chapter_namesImplementedTODOImplementedTODO
crate_ownershipImplementedImplemented
crates_landingImplementedImplemented
entity_linksTODOTODO
index_groupsImplementedTODOImplementedTODO
index_namespace_pagesImplementedImplemented
index_rowsImplementedTODOImplementedTODO
index_statusImplementedTODOImplementedTODO
rfd_changesTODOTODO
sage_chaptersTODOImplementedTODO
self_descriptionTODOTODO
shared_modelImplementedTODOImplementedTODO
source_rolesTODOTODO
meta.contracts (4)4 Implemented3 TODO4 Implemented3 TODO
cache_invocationsImplementedTODOImplementedTODO
correspondenceImplementedImplemented
observation_coverageImplementedTODOImplementedTODO
validated_sessionImplementedTODOImplementedTODO
meta.language (39)39 Implemented39 Implemented
meta.language.calls (2)2 Implemented2 Implemented
declaredImplementedImplemented
forbiddenImplementedImplemented
meta.language.classes (3)3 Implemented3 Implemented
abstract_completeImplementedImplemented
override_signatureImplementedImplemented
single_inheritanceImplementedImplemented
meta.language.contexts (1)1 Implemented1 Implemented
inheritanceImplementedImplemented
meta.language.envelopes (7)7 Implemented7 Implemented
class_callsImplementedImplemented
createsImplementedImplemented
direct_callsImplementedImplemented
leafImplementedImplemented
permissionsImplementedImplemented
readsImplementedImplemented
receiver_callsImplementedImplemented
meta.language.fields (2)2 Implemented2 Implemented
context_stateImplementedImplemented
kindsImplementedImplemented
meta.language.methods (2)2 Implemented2 Implemented
kindsImplementedImplemented
proseImplementedImplemented
meta.language.model (3)3 Implemented3 Implemented
forbidden_pathsImplementedImplemented
inherited_prohibitionsImplementedImplemented
virtual_dispatchImplementedImplemented
meta.language.types (19)19 Implemented19 Implemented
argument_arityImplementedImplemented
declaration_proseImplementedImplemented
enum_variantsImplementedImplemented
field_proseImplementedImplemented
generic_parametersImplementedImplemented
member_commasImplementedImplemented
name_resolutionImplementedImplemented
opaque_representationImplementedImplemented
preludeImplementedImplemented
qualified_namesImplementedImplemented
recursive_valuesImplementedImplemented
struct_fieldsImplementedImplemented
tuplesImplementedImplemented
type_expressionsImplementedImplemented
unique_fieldsImplementedImplemented
unique_parametersImplementedImplemented
unique_variantsImplementedImplemented
unknown_namesImplementedImplemented
variant_proseImplementedImplemented
meta.reviews (27)27 Implemented27 Implemented
claim_textImplementedImplemented
complete_test_setImplementedImplemented
decisionsImplementedImplemented
fragment_associationsImplementedImplemented
fragment_formatImplementedImplemented
fragment_freshnessImplementedImplemented
gateImplementedImplemented
input_formatImplementedImplemented
input_fragmentsImplementedImplemented
output_formatImplementedImplemented
preparationImplementedImplemented
record_requiredImplementedImplemented
recorded_readsImplementedImplemented
recordingImplementedImplemented
review_delegationImplementedImplemented
review_diagnosticsImplementedImplemented
review_instructionsImplementedImplemented
review_scopeImplementedImplemented
selector_claimImplementedImplemented
selector_line_rangeImplementedImplemented
selector_testImplementedImplemented
selector_whole_fileImplementedImplemented
source_representationImplementedImplemented
stalenessImplementedImplemented
summary_formatImplementedImplemented
test_sourceImplementedImplemented
validation_layoutImplementedImplemented
meta.validation (3)3 TODO3 TODO
claim_specific_evidenceTODOTODO
independent_inspectionTODOTODO
review_packetsTODOTODO