Free lesson · GenAI Solutions & Delivery
ADR ગવર્નન્સ ડેશબોર્ડ અને કમ્પ્લાયન્સ ઓડિટ બનાવો
તમે એક ADRGovernanceDashboard બનાવશો જે આર્કિટેક્ચર ડિસિઝન હેલ્થ, કવરેજ ગેપ્સ અને કમ્પ્લાયન્સ સ્ટેટસમાં સંસ્થા-વ્યાપી દૃશ્યતા પૂરી પાડે છે. CoverageAnalyzer ને compute_coverage() સાથે અમલમાં મૂકો, જે deployed_services PostgreSQL ટેબલમાંથી સિસ્ટમની ડિપ્લોય થયેલી સર્વિસિસ સ્કેન કરે છે — જેના કૉલમ્સ service_id VARCHAR(64) PRIMARY KEY, service_name VARCHAR(128), team VARCHAR(64), deployed_at TIMESTAMPTZ, technology_stack JSONB, has_llm_integration BOOLEAN છે — અને architecture_decisions સાથે ક્રોસ-રેફરન્સ કરીને એવી સર્વિસિસ ઓળખે છે જેના માટે કોઈ અનુરૂપ ADRs નથી, અને ADRCoverageReport Pydantic મોડેલ પરત કરે છે જેમાં total_services: int, covered_services: int, coverage_pct: float, uncovered_services: list[UncoveredService] હોય, જ્યાં દરેકમાં service_name: str, team: str, risk_level: str હોય — જે એ આધારે નક્કી થાય કે સર્વિસમાં દસ્તાવેજીકૃત નિર્ણયો વિના LLM ઇન્ટિગ્રેશન છે કે નહીં. એક Grafana પેનલ બનાવો જે કવરેજ ટકાવારીને gauge તરીકે દર્શાવે, જેમાં 60% (પીળો) અને 80% (લીલો) પર થ્રેશોલ્ડ હોય, ઉપરાંત એક ટેબલ જેમાં અનકવર્ડ સર્વિસિસ જોખમ મુજબ સૉર્ટ કરીને સૂચિબદ્ધ હોય. ReviewWorkflowEngine ને submit_for_review() સાથે અમલમાં મૂકો, જે ADR ને PROPOSED થી PENDING_REVIEW માં ટ્રાન્ઝિશન કરે છે અને adr_reviews ટેબલમાં એક એન્ટ્રી બનાવે છે, જેના કૉલમ્સ review_id VARCHAR(64) PRIMARY KEY, adr_id VARCHAR(64), reviewer VARCHAR(64), due_date TIMESTAMPTZ, status VARCHAR(16) (PENDING, APPROVED, REJECTED, EXPIRED), review_comment TEXT, reviewed_at TIMESTAMPTZ છે. check_expiry() બનાવો જે asyncio બેકગ્રાઉન્ડ ટાસ્ક દ્વારા દૈનિક શેડ્યૂલ્ડ ટાસ્ક તરીકે ચાલે છે, જે due_date વીતી ગયા પછી પણ રિવ્યૂ એક્ટિવિટી વિનાના ADRs ને EXPIRED તરીકે માર્ક કરે છે અને adr_reviews_expired_total Prometheus કાઉન્ટર એમિટ કરે છે. POST /api/v1/adrs/{adr_id}/approve અમલમાં મૂકો જે reviewer: str, review_comment: str સાથે ApprovalRequest સ્વીકારે છે, અને POST /api/v1/adrs/{adr_id}/reject જે reviewer: str, review_comment: str, required_changes: list[str] સાથે RejectionRequest સ્વીકારે છે. ComplianceReportGenerator ને generate_report() સાથે બનાવો જે નીચેનાને એકત્રિત કરે છે: SELECT status, COUNT(*) FROM architecture_decisions GROUP BY status નો ઉપયોગ કરીને સ્ટેટસ મુજબ કુલ ADRs, AVG(accepted_at - created_at) નો ઉપયોગ કરીને PROPOSED થી ACCEPTED સુધીનો સરેરાશ સમય, કવરેજ ટકાવારી, સ્ટેલ ADR ગણતરી, ડિપેન્ડન્સી ગ્રાફમાંથી ઓપન કૉન્ફ્લિક્ટ્સની ગણતરી, અને GovernanceComplianceReport Pydantic મોડેલ આઉટપુટ કરે છે જેમાં report_id: str, generated_at: datetime, total_adrs: int, adrs_by_status: dict[str, int], avg_review_time_days: float, coverage_pct: float, stale_count: int, conflict_count: int, governance_score: float હોય. રિપોર્ટ પરત કરતો GET /api/v1/governance/report એન્ડપોઇન્ટ એક્સપોઝ કરો. નીચેની પેનલ્સ સાથે એક વ્યાપક Grafana ડેશબોર્ડ બનાવો: ADR સ્ટેટસ ડિસ્ટ્રિબ્યુશન પાઇ ચાર્ટ, કવરેજ gauge, 90 દિવસ પરની સ્ટેલનેસ ટ્રેન્ડ લાઇન, રિવ્યૂ પાઇપલાઇન ફનલ (PROPOSED -> PENDING -> APPROVED), અને કૉન્ફ્લિક્ટ કાઉન્ટ ટાઇમ સિરીઝ. adr_governance_score Prometheus gauge એમિટ કરો, જે કવરેજ (40%), ફ્રેશનેસ (30%) અને કૉન્ફ્લિક્ટ-ફ્રી રેશિયો (30%) ના વેઇટેડ એવરેજ તરીકે ગણવામાં આવે છે.
Course: GenAI Architecture & Design Patterns · Chapter 1 · GenAI ADR Engine
Free to read — no subscription required.
પરિચય
જ્યારે તમે ADR મશીનરી બનાવો છો પરંતુ તેને બે અલગ વાચકો — એક ઓપરેટર જેને લાઇવ સ્થિતિ જોઈએ છે અને એક ઓડિટર જેને અપરિવર્તનીય સ્નેપશોટ જોઈએ છે — દ્વારા સપાટી પર લાવતા નથી, ત્યારે ગવર્નન્સ પ્રોગ્રામ એક જ લાઇવ પેજમાં સમેટાઈ જાય છે જેને ત્રણ મહિના પછી કોઈ ટાંકી શકતું નથી, અને SOC 2 પુરાવા એકત્રીકરણ એક પુરાતત્વીય પ્રોજેક્ટ બની જાય છે. જે ટીમો લાઇવ ડેશબોર્ડને કમ્પ્લાયન્સ આર્ટિફેક્ટ સાથે ભેળવી દે છે તે પહેલી વાર જ વિશ્વાસ ગુમાવે છે જ્યારે બે વાચકો એક અઠવાડિયાના અંતરે નોંધોની સરખામણી કરે છે અને અલગ-અલગ આંકડા જુએ છે. અંત સુધીમાં તમે એક જ કમ્પ્લાયન્સ ઇવેલ્યુએટરને ઓપરેટરો માટે Prometheus સ્ક્રેપ પાથ અને ઓડિટરો માટે હેશ કરેલા JSON-વત્તા-markdown આર્ટિફેક્ટમાં વિભાજિત કરી શકશો, અને એ બે સપાટીઓ શા માટે ક્યારેય એક કોડ પાથ વહેંચવી ન જોઈએ તે વિશે તર્ક કરી શકશો.
મુખ્ય પરિભાષા
- ComplianceReport:
findings, બહુ-અક્ષીયfleet_countsઅનેsnapshot_hashધરાવતો સિરિયલાઇઝ કરી શકાય તેવો ઓડિટ આર્ટિફેક્ટ; તે CI આર્કાઇવ માટે કેનોનિકલ JSON અને નેતૃત્વના ઇમેઇલ માટે markdown માં રેન્ડર થાય છે. - snapshot_hash: સોર્ટ-કી કરેલા રિપોર્ટ બોડી પર ગણવામાં આવેલો SHA-256 ડાઇજેસ્ટ, જેથી કોઈપણ વાચક ચકાસી શકે કે આર્કાઇવ કરેલો આર્ટિફેક્ટ નેતૃત્વે જે જોયું તેની સાથે મેળ ખાય છે.
- ઓપરેશનલ/ઓડિટ સીમા: લાઇવ Prometheus એક્સપોર્ટર (ઓપરેટર માટે સત્યનો સ્રોત) અને હેશ કરેલા JSON-વત્તા-markdown આર્ટિફેક્ટ (ઓડિટર માટે સત્યનો સ્રોત) વચ્ચેનું કઠોર વિભાજન — આ બે સપાટીઓએ ક્યારેય એક કોડ પાથ વહેંચવો ન જોઈએ.
ખ્યાલો
ઓડિટ કેડન્સ અને ઓપરેશનલ/ઓડિટ સીમા
સંપૂર્ણ ComplianceAuditor.audit બે સંદર્ભોમાં ચાલે છે. પહેલું, ADR રજિસ્ટ્રી ડિરેક્ટરીને સ્પર્શતા main પરના દરેક મર્જ પર CI સ્ટેપ તરીકે—પરિણામી JSON બિલ્ડ આર્ટિફેક્ટ તરીકે અપલોડ થાય છે અને markdown PR કમેન્ટ તરીકે પોસ્ટ થાય છે જેથી સમીક્ષકો મર્જ પહેલાં કમ્પ્લાયન્સ અસર જોઈ શકે. બીજું, Kubernetes CronJob તરીકે જે દરરોજ રાત્રે 02:00 UTC એ ચાલે છે, હેશ કરેલા JSON ને ઓડિટ આર્કાઇવ બકેટમાં લખે છે, અને દરેક મહિનાની પહેલી તારીખે વધારામાં markdown ને ટીમ અને માલિક મુજબ રોલ-અપ કરેલા નેતૃત્વ ઇમેઇલમાં રેન્ડર કરે છે. CronJob ઓડિટર માટે સત્યનો સ્રોત છે; લાઇવ એક્સપોર્ટર ઓપરેટર માટે સત્યનો સ્રોત છે.
નેતૃત્વનો ઇમેઇલ સંપૂર્ણપણે ઓડિટ રિપોર્ટમાંથી ઉદ્ભવે છે—લાઇવ એક્સપોર્ટરમાંથી નહીં—જેથી CEO ના ઇનબોક્સમાંના આંકડા બકેટમાં આર્કાઇવ કરેલા JSON અને ઇમેઇલના તળિયે છાપેલા હેશ સાથે મેળ ખાય. માલિક મુજબનું રોલ-અપ ટેબલ fleet_counts["reviewer"] માંથી ઉતરતા ક્રમમાં સોર્ટ કરીને આવે છે, જેમાં દરેક પંક્તિ એ સમીક્ષકના કેટલા ADR SLA-ભંગ થયેલા છે તેની નોંધ સાથે હોય છે. આ એક જ ટેબલ એ બોટલનેક એન્જિનિયરને સપાટી પર લાવે છે જે ચૂપચાપ અડધા ગવર્નન્સ પ્રોગ્રામને અટકાવી રહ્યો છે.
ઓપરેટિંગ શિસ્ત
- ComplianceReport.snapshot_hash ને લોડ-બેરિંગ ગણો. ચકાસી શકાય તેવા હેશ વિના આર્કાઇવ બકેટમાં પહોંચતો કોઈપણ આર્ટિફેક્ટ ભ્રષ્ટ છે; માસિક ઇમેઇલમાં હેશ છાપવો જ જોઈએ જેથી કોઈપણ વાચક ચકાસી શકે કે આર્કાઇવમાંથી ખેંચેલું JSON નેતૃત્વે જે જોયું તેની સાથે મેળ ખાય છે.
- ઓડિટર સપાટીને ક્યારેય લાઇવ એક્સપોર્ટર એન્ડપોઇન્ટમાંથી સર્વ ન કરો. જો કોઈ નિયામક ગયા માર્ચની કમ્પ્લાયન્સ સ્થિતિ માંગે, તો આર્કાઇવ કરેલા હેશ કરેલા JSON તરફ નિર્દેશ કરો, Grafana ટાઇમ-રેન્જ ક્વેરી તરફ નહીં—એકવાર તમે ડાઉનસેમ્પલિંગ સીમા પાર કરો પછી Grafana રિટેન્શન વિન્ડો ઐતિહાસિક ચોકસાઈ વિશે ખોટું બોલે છે.
- ત્રણ મુખ્ય કમ્પ્લાયન્સ ચેક (C-001, C-002, C-003) ને રિલીઝ દરમ્યાન અપરિવર્તનીય રાખો. નવા ચેક (C-004 અને આગળ) મુક્તપણે ઉમેરો, પરંતુ હાલના ચેકનું નામ બદલવું કે નંબર બદલવો દરેક ઐતિહાસિક રિપોર્ટ સરખામણી અને check_id દ્વારા ફિલ્ટર કરતી દરેક ઓડિટ-ટ્રેઇલ ક્વેરીને તોડી નાખે છે.
- નેતૃત્વનો ઇમેઇલ માસિક હોવા છતાં સંપૂર્ણ ઓડિટ દરરોજ રાત્રે ચલાવો. રાત્રિ કેડન્સ ચોવીસ કલાકની અંદર રિગ્રેશન પકડે છે; માસિક કેડન્સ ફક્ત રિપોર્ટિંગ લય છે. બે કેડન્સ સ્વતંત્ર છે અને સ્વતંત્ર જ રહેવી જોઈએ.
- adr_review_sla_breach_total > 0 પર ચેતવણી માટે એક-અઠવાડિયું, પેજ માટે ચોવીસ-કલાક ની ગંભીરતા સીડી સાથે એલર્ટ કરો. એક જ SLA ભંગ માટે ઓન-કોલને પેજ કરવું એ ઘોંઘાટ છે; જ્યારે ભંગ ટીમની સમીક્ષા ક્ષમતાથી આગળ એકઠા થાય ત્યારે પેજ કરવું એ સિગ્નલ છે.
- એક્સપોર્ટર સ્ક્રેપ પાથને 500 ms પર ટાઇમઆઉટ થાય તે રીતે વાયર કરો. એગ્રિગેટર ઇન-મેમરી રજિસ્ટ્રી પરનું શુદ્ધ ફંક્શન છે, તેથી તેનાથી ધીમું કંઈપણ સૂચવે છે કે રજિસ્ટ્રી મેમરીમાં સમાય તેના કરતાં મોટી થઈ ગઈ છે અને તેને પેજિનેટેડ કેશ લેયરની જરૂર છે—ધીમા સ્ક્રેપને ચૂપચાપ ટાઇમ સિરીઝમાંથી મેટ્રિક્સ છોડી દેવા ન દો.
- ઓડિટ આર્કાઇવ બકેટને object-lock સક્ષમ કરીને અને ઓછામાં ઓછા સાત વર્ષની રિટેન્શન પોલિસી સાથે સંગ્રહિત કરો. કમ્પ્લાયન્સ રિપોર્ટ પુરાવો છે; પુરાવાએ તેને બનાવનાર એન્જિનિયરો કરતાં વધુ લાંબું જીવવું જોઈએ, અને બકેટ પોલિસી જ એ વચનને માત્ર આકાંક્ષા નહીં પણ અમલયોગ્ય બનાવે છે.
કોડ વૉકથ્રૂ
હમણાં જ ઓપરેશનલ/ઓડિટ સીમા દોર્યા પછી, હવે તમે બંને સપાટીઓને ફીડ કરતો એક જ ઇવેલ્યુએટર અમલમાં મૂકો છો. ComplianceAuditor મશીન-ચકાસી શકાય તેવા પ્રશ્નોના જવાબ આપે છે — અહીં, શું ત્રિમાસિક સમીક્ષા SLA નું પાલન થઈ રહ્યું છે? — અને એક ComplianceReport બહાર પાડે છે જે CI આર્ટિફેક્ટ માટે JSON માં અને નેતૃત્વના ઇમેઇલ માટે markdown માં નિર્ધારિત રીતે સિરિયલાઇઝ થાય છે. બે ડિઝાઇન મુદ્દા લોડ-બેરિંગ છે: બહુ-અક્ષીય fleet_counts (સ્થિતિ, શ્રેણી, સમીક્ષક, SLA ભંગ) અને snapshot_hash જે સાબિત કરે છે કે આર્કાઇવ કરેલા આર્ટિફેક્ટ સાથે છેડછાડ થઈ નથી.
Code snippetpython
1from dataclasses import dataclass, field, asdict 2from datetime import datetime, timedelta 3from hashlib import sha256 4import json 5 6@dataclass 7class ComplianceFinding: 8 check_id: str 9 description: str 10 passed: bool 11 failing_items: list[str] = field(default_factory=list) 12 severity: str = "info" 13 14@dataclass 15class ComplianceReport: 16 generated_at: datetime 17 findings: list[ComplianceFinding] 18 fleet_counts: dict[str, dict[str, int]] 19 snapshot_hash: str = "" 20 21 def to_json(self) -> str: 22 body = asdict(self) 23 body["generated_at"] = self.generated_at.isoformat() 24 return json.dumps(body, sort_keys=True, indent=2) 25 26class ComplianceAuditor: 27 def __init__(self, sla_days: int = 90): 28 self.sla_days = sla_days 29 30 def audit(self, adrs: list[dict]) -> ComplianceReport: 31 now = datetime.utcnow() 32 breached = { 33 a["reviewer"] for a in adrs 34 if (now - datetime.fromisoformat(a["last_reviewed_at"])) 35 > timedelta(days=self.sla_days) 36 } 37 by_reviewer: dict[str, int] = {} 38 for a in adrs: 39 by_reviewer[a["reviewer"]] = by_reviewer.get(a["reviewer"], 0) + 1 40 findings = [ 41 ComplianceFinding( 42 "C-002", 43 f"Every accepted ADR reviewed within {self.sla_days} days", 44 not breached, sorted(breached), "high", 45 ), 46 ] 47 report = ComplianceReport( 48 generated_at=now, 49 findings=findings, 50 fleet_counts={"reviewer": by_reviewer}, 51 ) 52 report.snapshot_hash = sha256(report.to_json().encode()).hexdigest() 53 return report
માસિક નેતૃત્વ ઇમેઇલ જે માલિક મુજબનું રોલ-અપ ટેબલ છાપે છે તે બરાબર fleet_counts["reviewer"] ઉતરતા ક્રમમાં સોર્ટ કરેલું છે, જેમાં દરેક પંક્તિ એ સમીક્ષકના કેટલા ADR breached સેટમાં આવે છે તેની નોંધ સાથે હોય છે — આ જ અડધા ગવર્નન્સ પ્રોગ્રામને ચૂપચાપ અટકાવી રહેલા બોટલનેક એન્જિનિયરને સપાટી પર લાવે છે. કારણ કે snapshot_hash કેનોનિકલ, સોર્ટ-કી કરેલા JSON પર ગણવામાં આવે છે, ઇમેઇલ એ ડાઇજેસ્ટ છાપી શકે છે જેથી કોઈપણ વાચક ચકાસી શકે કે આર્કાઇવ બકેટમાંથી ખેંચેલું JSON નેતૃત્વે જોયેલા ચોક્કસ રિપોર્ટ સાથે મેળ ખાય છે. નોંધ લો કે હેશ generated_at સહિત આખા બોડીને આવરી લે છે, તેથી તે એક જ રિપોર્ટ માટે છેડછાડ-પુરાવા સીલ છે, ક્રોસ-રન આઇડમ્પોટન્સી ગેરંટી નહીં: યથાવત રજિસ્ટ્રી પર બે audit કૉલ હજુ પણ તેમના generated_at ટાઇમસ્ટેમ્પમાં અલગ પડે છે અને તેથી અલગ ડાઇજેસ્ટ ઉત્પન્ન કરે છે. બે રનની કન્ટેન્ટ ડ્રિફ્ટ માટે સરખામણી કરવા, કાચા snapshot_hash મૂલ્યોની સરખામણી કરવાને બદલે હેશ કરેલા બોડીમાંથી generated_at બાકાત રાખો (અથવા findings અને fleet_counts નો સીધો diff કરો).
શિસ્ત અનુપ્રયોગ
શું કરવું અને શું ન કરવું
શું કરવું
- Prometheus સ્ક્રેપ પાથ અને હેશ કરેલા JSON આર્ટિફેક્ટને અલગ કોડ પાથ પર રાખો —
ComplianceReport.to_json()મેથડ કેનોનિકલ સ્નેપશોટ ઉત્પન્ન કરે છે જે આર્કાઇવ થાય છે અને ઓડિટરો દ્વારા ટાંકવામાં આવે છે; જો લાઇવ ઓપરેટર સપાટી એ જ કોડ પાથ વહેંચે, તો "અપરિવર્તનીય" આર્ટિફેક્ટ હવે અપરિવર્તનીય રહેતો નથી અને બે વાચકો એક અઠવાડિયાના અંતરે હેશની સરખામણી કરે ત્યારે પહેલી વાર જ SOC 2 પુરાવા એકત્રીકરણ તૂટી પડે છે. snapshot_hashનેsha256વડે સોર્ટ-કી કરેલા JSON બોડી પર ગણો —to_json()ની અંદરjson.dumpsનેsort_keys=Trueપાસ કરવાથી આપેલા બોડી માટે સિરિયલાઇઝેશન નિર્ધારિત બને છે, તેથી ડાઇજેસ્ટ એક વિશ્વસનીય છેડછાડ-પુરાવા સીલ છે: આર્કાઇવ કરેલા JSON પર હેશ ફરી ગણતો કોઈપણ વાચક એ જ મૂલ્ય મેળવે છે જે ઇમેઇલે છાપ્યું હતું. બોડીમાંgenerated_atસમાવિષ્ટ હોવાથી, ડાઇજેસ્ટ ડિઝાઇન મુજબ દરેક રનમાં બદલાય છે; બે રન વચ્ચે કન્ટેન્ટ ડ્રિફ્ટ શોધવા, કાચા ડાઇજેસ્ટની સરખામણી કરવાને બદલેgenerated_atબાકાત રાખેલા બોડીને હેશ કરો.fleet_countsને સમીક્ષક-કી કરેલા રોલ-અપથી ભરો અને દરેક પંક્તિને તેના SLA-ભંગ કાઉન્ટ સાથે નોંધો —ComplianceAuditor.auditલૂપમાંથી આવતોbreachedસેટ જ એ એકમાત્ર એન્જિનિયરને સપાટી પર લાવે છે જેનો સમીક્ષા બેકલોગ ચૂપચાપ અડધા ગવર્નન્સ પ્રોગ્રામને અટકાવી રહ્યો છે; ફક્ત સ્થિતિ-આધારિત કાઉન્ટ એ બોટલનેકને સંપૂર્ણપણે છુપાવે છે.
શું ન કરવું
- ઓપરેટર ડેશબોર્ડ અને ઓડિટર આર્ટિફેક્ટ વચ્ચે એક જ લાઇવ સ્ટેટ ઑબ્જેક્ટ વહેંચશો નહીં — નક્કર નિષ્ફળતા મોડ એ છે કે બે વાચકો એક અઠવાડિયાના અંતરે રિપોર્ટ ખેંચે છે, લાઇવ રજિસ્ટ્રી બદલાઈ હોવાથી અલગ-અલગ
fleet_countsઆંકડા જુએ છે, અને ઓડિટ સમયે શું સાચું હતું તેના પર હવે સહમત થઈ શકતા નથી, જે કમ્પ્લાયન્સ રેકોર્ડની વિશ્વસનીયતાનો નાશ કરે છે. - હેશ કરતા પહેલાં
ComplianceReportસિરિયલાઇઝ કરતી વખતેsort_keys=Trueછોડશો નહીં — Python નું ડિફૉલ્ટ dict ઓર્ડરિંગ ઇન્સર્શન-ઓર્ડર છે, તેથીsort_keys=Trueવિના એ જ તાર્કિક બોડી Python વર્ઝન કે dict-રિબિલ્ડ પાથ દરમ્યાન અલગ JSON સ્ટ્રિંગમાં સિરિયલાઇઝ થઈ શકે છે, અને આર્કાઇવ કરેલા JSON પર ડાઇજેસ્ટ ફરી ગણતો વાચક મેળ ખવડાવવામાં નિષ્ફળ જશે — જે ચૂપચાપ છેડછાડ-પુરાવા ગેરંટીને તોડી નાખે છે. (બે રન પહેલેથીgenerated_atદ્વારા અલગ પડે છે;sort_keysનિશ્ચિત બોડી માટે પુનઃઉત્પાદનક્ષમતા વિશે છે, ક્રોસ-રન સમાનતા વિશે નહીં.) - રિપોર્ટ બોડી સંપૂર્ણપણે ભરાય તે પહેલાં
snapshot_hashગણશો નહીં —ComplianceAuditor.auditમાંનો કોડ પહેલાંComplianceReportબનાવે છે અને પછીreport.snapshot_hash = sha256(report.to_json().encode()).hexdigest()સેટ કરે છે;fleet_countsકેfindingsજોડાય તે પહેલાં હેશ કરવાથી એવો ડાઇજેસ્ટ ઉત્પન્ન થાય છે જે આર્કાઇવ બકેટ સંગ્રહિત કરે છે તે સંપૂર્ણ આર્ટિફેક્ટ સાથે મેળ ખાતો નથી, અને દરેક પુલ પર CI ચકાસણી નિષ્ફળ જાય છે.
3 hands-on labs come with this lesson — real code, in a cloud IDE. Create a free account to run them. No card.
Free account · no card · straight to the labs
Or get the full path — from
Listen to this lesson
Audio overviews of this lesson's labs and its chapter, from GenBodha Bytes.
More free lessons in GenAI Architecture & Design Patterns
- Ch 1Build ADR schema and decision taxonomy for GenAI technology choices
- Ch 1Validate ADR decisions against production telemetry
- Ch 1Implement ADR recommendation engine using historical outcomes
- Ch 1Create ADR governance dashboard and compliance auditYou are here
- Ch 4Build eval gate component with pluggable evaluator registry
- Ch 4Measure eval gate effectiveness with precision-recall tracking
- Ch 4Create eval architecture audit report with coverage analysis