Assistant: codex Assistant-Model: gpt-5.6-luna Assistant-Session: 01a087b0-7b1e-7531-8ef3-6525ebaf7ee7
38 lines
2.6 KiB
Python
Executable file
38 lines
2.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
"""Add one evidence-backed property assertion to a FIAM model.
|
|
|
|
Useful for governed declarations/expectations that live outside interface-description
|
|
formats, e.g. an operational architecture profile declaring an expected protocol.
|
|
"""
|
|
from __future__ import annotations
|
|
import argparse, copy
|
|
from pathlib import Path
|
|
import yaml
|
|
|
|
def parse_value(s):
|
|
try:return yaml.safe_load(s)
|
|
except Exception:return s
|
|
|
|
def main():
|
|
ap=argparse.ArgumentParser(description=__doc__)
|
|
ap.add_argument('input',type=Path); ap.add_argument('-o','--output',type=Path,required=True)
|
|
ap.add_argument('--subject',required=True); ap.add_argument('--predicate',required=True); ap.add_argument('--value',required=True)
|
|
ap.add_argument('--source',type=Path,required=True); ap.add_argument('--source-type',default='architecture-declaration')
|
|
ap.add_argument('--locator',default='declaration'); ap.add_argument('--confidence',type=float,default=1.0)
|
|
args=ap.parse_args()
|
|
d=yaml.safe_load(args.input.read_text()); src=yaml.safe_load(args.source.read_text()) or {}
|
|
aid='artifact.declaration.'+args.source.stem.replace('_','-')
|
|
artifacts=d.setdefault('artifacts',[])
|
|
if not any(x.get('id')==aid for x in artifacts):
|
|
artifacts.append({'id':aid,'kind':'artifact','name':args.source.name,'artifact_type':'fiam.artifact.architecture-declaration','locator':str(args.source),
|
|
'facets':{'source_note':src.get('source_note') or src.get('statement') or 'Governed architecture declaration.'}})
|
|
n=1; existing={x.get('id') for x in d.get('assertions',[]) or []}
|
|
while f'assertion.declaration.{n:04d}' in existing:n+=1
|
|
a={'id':f'assertion.declaration.{n:04d}','assertion_kind':'property','subject':args.subject,'predicate':args.predicate,'polarity':'asserted','value':parse_value(args.value),
|
|
'evidence':{'mode':'fiam.evidence.declared','source':{'type':args.source_type,'ref':aid,'locator':args.locator,'metadata':{'source_file':args.source.name}},
|
|
'observer':'governed-declaration/v0.2-draft.2','confidence':args.confidence,'stance':'supports'}}
|
|
d.setdefault('assertions',[]).append(a)
|
|
d['instance']=dict(d.get('instance',{})); d['instance']['id']=d['instance'].get('id','model')+'.expectation'; d['instance']['title']=d['instance'].get('title','FIAM model')+' + declared expectation'
|
|
args.output.parent.mkdir(parents=True,exist_ok=True); args.output.write_text(yaml.safe_dump(d,sort_keys=False,allow_unicode=True,width=120))
|
|
print(f'wrote {args.output}: {a["id"]}')
|
|
if __name__=='__main__':main()
|