7 मिनट पढ़ें

Agent action ticket references जो review के बाद भी भरोसेमंद रहें

Agent action ticket references approved change intent को API और SSH execution से जोड़ते हैं, ताकि reviewers incidents के दौरान सत्यापित किए जा सकने वाले evidence देख सकें।

Agent action ticket references जो review के बाद भी भरोसेमंद रहें

जो एजेंट production API को call कर सकता है या SSH session खोल सकता है, उसके लिए केवल यह रिकॉर्ड काफी नहीं है कि उसने कार्रवाई की। Reviewers को यह भी पता होना चाहिए कि उस समय वह कार्रवाई क्यों अनुमत थी। Change ticket reference उन्हें किसी देखे गए command या API call से वापस स्वीकृत इरादे तक पहुँचने का रास्ता देता है।

यह रास्ता तभी काम करता है जब execution से पहले reference action evidence का हिस्सा बन जाए। Incident शुरू होने के बाद comment में ticket number चिपकाना paperwork है, control नहीं। जो teams दोनों को एक समझ लेती हैं, उन्हें अंततः पता चलता है कि हर जोखिम वाली कार्रवाई के साथ एक टिकट जुड़ा है, लेकिन कोई भी टिकट उसे समझाता नहीं है।

Ticket reference इरादे को execution से जोड़ता है

Change ticket audit event से अलग सवाल का जवाब देता है। टिकट बताता है कि किसी ने क्या माँगा, क्यों माँगा, कौन-से systems प्रभावित हो सकते हैं और risk किसने स्वीकार किया। Event बताता है कि agent ने किसी खास target पर, किसी खास identity के तहत, वास्तव में क्या करने की कोशिश की और क्या हुआ।

इन records को अलग रखें और फिर stable reference से जोड़ें। हर event में पूरे टिकट का body न डालें। टिकट का text बदल सकता है, उसमें अक्सर confidential material होता है और इससे event search खराब होती है। Canonical ticket identifier के साथ उन authorization facts का छोटा snapshot रखें जो dispatch के समय महत्वपूर्ण थे।

Production database migration के लिए इस snapshot में ticket reference, उसका revision या update timestamp, approved maintenance window और change owner शामिल हो सकते हैं। किसी account को disable करने वाली API call के लिए इसमें reference, requested account identifier और request स्वीकार करने वाला व्यक्ति शामिल हो सकता है। Action record में अपने request details और result फिर भी होने चाहिए।

यह अंतर एक परिचित failure पकड़ता है। Team planned cache configuration change के लिए CHG-418 खोलती है। बाद में engineer agent से कहता है कि «change से जुड़े resources साफ़ करो», और agent CHG-418 का उपयोग करते हुए storage bucket delete कर देता है। टिकट मौजूद है। Agent action में reference भी है। फिर भी reference target या operation को सही नहीं ठहराता। Reviewer को chat transcript पढ़े बिना structured context से यह mismatch दिखना चाहिए।

OWASP Logging Cheat Sheet security-relevant events के लिए when, where, who और what रिकॉर्ड करने की सलाह देती है। यह guidance यहाँ सीधे लागू होती है, लेकिन agent actions में पाँचवाँ हिस्सा भी जुड़ता है: घोषित authorization context। केवल ticket reference बहुत कम जानकारी है, जबकि पूरे टिकट की copy बहुत अधिक है। Reference और उन सीमित facts को रिकॉर्ड करें जिनके आधार पर तय किया गया कि कार्रवाई उससे मेल खाती है।

संवेदनशील काम के लिए लिखित सीमा चाहिए

उन कार्रवाइयों के लिए ticket reference अनिवार्य करें जिनके परिणामों को वापस लेना कठिन हो, जिनका पता लगाना कठिन हो या जिन्हें बाद में समझाना महँगा पड़े। हर harmless read से पहले agents को टिकट माँगने पर मजबूर न करें। यदि कोई rule routine investigation को बाधित करेगा, तो लोग उसके आसपास रास्ता बना लेंगे और महत्वपूर्ण कार्रवाइयाँ exceptions में गायब हो जाएँगी।

हर खतरनाक command का अनुमान लगाने के बजाय action classes से शुरुआत करें। अधिकांश teams को इन कार्रवाइयों को शामिल करना चाहिए:

  • production infrastructure, application configuration या deployed code में बदलाव
  • user और service access बनाना, रद्द करना या बदलना
  • regulated या customer data को export, delete या move करना
  • payment, billing, notification या public-facing behavior बदलना
  • emergency path या व्यापक authority वाले credential का उपयोग

एक environment में SSH connection संवेदनशील हो सकता है और दूसरे में सामान्य। Classification इस बात पर निर्भर होनी चाहिए कि connection क्या कर सकता है और कहाँ पहुँचता है। Read-only production diagnostic session के लिए session record चाहिए हो सकता है, लेकिन ticket नहीं। Production host group पर firewall rules बदलने वाले SSH command को reference चाहिए, भले ही command केवल एक line का हो।

किसी category को «high risk» नाम देकर रुक न जाएँ। Control point पर observable test तय करें। उदाहरण के लिए, production credential का उपयोग करने वाली हर request जो non-GET HTTP method भेजती है, उसमें reference आवश्यक हो; production host group के विरुद्ध हर SSH invocation में reference आवश्यक हो, जब तक command documented diagnostic allowlist से मेल न खाए। Exact rules अलग हो सकते हैं, लेकिन test ऐसा होना चाहिए जिसे program और reviewer लगातार एक ही तरह लागू कर सकें।

हर action के लिए ticket अनिवार्य करने की सलाह लोकप्रिय है, क्योंकि यह disciplined सुनाई देती है। आम तौर पर इससे blanket tickets का ढेर, copied references और ऐसी approvals बनती हैं जिन्हें कोई पढ़ता नहीं। जहाँ ticket requirement decision point बनाती है, वहीं उसका उपयोग करें। बाकी सभी चीज़ों के लिए complete logs रखें, क्योंकि missing ticket का अर्थ missing event नहीं होना चाहिए।

Request जाने से पहले reference capture करें

Enforcement point को ऐसा sensitive request, जिसमें valid reference न हो, HTTP call भेजने या SSH command शुरू करने से पहले अस्वीकार कर देना चाहिए। बाद की log enrichment job इस कमी को ठीक नहीं कर सकती। External system request स्वीकार कर लेने के बाद आपका local record उसी failure के दौरान delayed, बदला हुआ या अनुपस्थित हो सकता है जिसे investigators को reconstruct करना है।

Request flow का क्रम स्पष्ट होना चाहिए:

  1. Agent target, operation और ticket reference के साथ action प्रस्तावित करता है।
  2. Control point जाँचता है कि reference का format सही है और आवश्यक ticket facts प्राप्त करता है।
  3. जहाँ आवश्यक हो, human approval proposed action और reference दोनों को कवर करती है।
  4. Control point intent event लिखता है, action dispatch करता है और फिर result event लिखता है।

Intent event लिखना महत्वपूर्ण है। मान लें कि API provider के DELETE /v1/projects/acme-prod प्राप्त करने के बाद network timeout हो जाता है। यदि आप केवल successful responses log करते हैं, तो action journal झूठा संकेत देगा कि कुछ हुआ ही नहीं। Intent record reviewer को बताता है कि system ने request भेजने की कोशिश की थी। unknown result audit trail की कमी नहीं है। जब तक कोई destination system की जाँच न कर ले, यही ईमानदार result है।

यही सिद्धांत SSH पर भी लागू होता है। Process शुरू करने से पहले target host identity, command या approved command digest, ticket reference और execution start रिकॉर्ड करें। उसके बाद exit status, captured output policy और completion time रिकॉर्ड करें। यदि process का connection टूट जाए, तो उस outcome को रखें, उसे clean failure में न बदलें।

Client को change_note नाम का mutable free-text field भेजकर काम पूरा घोषित न करने दें। Structured ticket_ref field validation, reporting और reconciliation की सुविधा देता है। Free text agent को paragraph में plausible number छिपाने की जगह देता है।

Ticket number requested scope से मेल खाना चाहिए

सही दिखने वाला reference यह साबित नहीं करता कि action approved work के दायरे में है। जहाँ जानकारी उपलब्ध हो, control point को ticket के ज्ञात scope की तुलना request से करनी चाहिए। जहाँ जानकारी उपलब्ध न हो, उसे human decision आवश्यक बनाना चाहिए।

कम से कम यह जाँचें कि ticket मौजूद है, cancel नहीं हुआ है और execution के लिए आपकी organization द्वारा स्वीकार की गई state में है। कई teams current change window और approved owner भी अनिवार्य करती हैं। ये checks पुराने ticket के आसान दुरुपयोग को रोकते हैं, लेकिन target drift नहीं पकड़ते।

Target drift तब होता है जब ticket एक service, account, environment या region का वर्णन करता है, जबकि request किसी दूसरे को प्रभावित करती है। इसका सबसे अच्छा बचाव ticket system में structured scope है। यदि ticket में environment, service, repository, account या maintenance window के machine-readable fields हैं, तो उनकी तुलना request attributes से करें। Prose से scope का अनुमान लगाने की कोशिश न करें। Natural-language descriptions इंसानों के लिए उपयोगी हैं, लेकिन parser प्रभावशाली confidence के साथ nonsense approve कर सकता है।

जब ticket में केवल prose हो, तो action और ticket reference को साथ में approval के लिए दिखाएँ। Human को destination और verb सरल शब्दों में दिखाई देने चाहिए: «CHG-418 के तहत production service billing-api पर configuration update लागू करें।» केवल «CHG-418 के तहत agent action approve करें» न दिखाएँ। यह wording उस exact decision को छिपा देती है जो व्यक्ति से माँगा जा रहा है।

हर ticket nuance को संभालने के लिए बहुत बड़ी rules language न बनाएँ। कुछ ऐसी comparisons से शुरुआत करें जिन्हें incident के दौरान समझाया जा सके: environment, target identifier, requested time और requester या owner। अनिश्चित मामलों को explicit approval के लिए भेजें। बंद होकर fail होने वाला छोटा check उस clever interpretation layer से बेहतर है जिसका audit कोई नहीं कर सकता।

ऐसा event contract उपयोग करें जिसे reviewers query कर सकें

SSH निष्पादन अलग से रिकॉर्ड करें
Sallyport SSH को अपने stateless sp-ssh helper के माध्यम से भेजता है और हर कॉल को अलग से रिकॉर्ड करता है।

Action event को stable fields चाहिए, terminal output से जोड़ी गई narrative नहीं। यह action attempt के लिए generic JSON record है। इसमें declared reference को execution के दौरान देखे गए facts से जानबूझकर अलग रखा गया है।

{
  "event_id": "act_01J8M7FQ6F2Y3K9D",
  "event_type": "action.intent",
  "occurred_at": "2025-03-08T14:32:11Z",
  "agent_run_id": "run_7e9d2",
  "actor": {
    "agent_process": "release-agent",
    "human_requester": "ops-204"
  },
  "ticket": {
    "system": "changes",
    "reference": "CHG-418",
    "observed_state": "approved",
    "observed_at": "2025-03-08T14:31:58Z",
    "scope_digest": "sha256:4ea4..."
  },
  "action": {
    "channel": "http",
    "operation": "PATCH",
    "target": "prod/billing-api/config",
    "request_digest": "sha256:35b9...",
    "idempotency_id": "chg-418-billing-01"
  },
  "decision": {
    "reference_required": true,
    "authorized_by": "ops-204",
    "decision_at": "2025-03-08T14:32:07Z"
  }
}

Completion event में parent reference के रूप में event_id को फिर इस्तेमाल करें या अलग attempt_id रखें। इसमें HTTP status, SSH exit code, उपलब्ध होने पर provider request ID और succeeded, failed या unknown जैसा outcome दर्ज करें। Raw authorization headers, session cookies, secrets वाले request bodies या SSH private material इस record में न रखें।

Digest तब उपयोगी है जब आप sensitive content को हर log reader के लिए searchable बनाए बिना exact payload का प्रमाण रख सकते हों। Hash करने से पहले data को canonicalize करें। Field ordering, encoding और redaction rules तय करें। अन्यथा दो equivalent requests अलग digests बनाएँगी और comparison केवल दिखावा रह जाएगा।

Long-term storage तक events पहुँचने से पहले newline-delimited JSON में missing references पकड़े जा सकते हैं। यह jq check बिना reference वाली sensitive action के लिए nonzero exit status लौटाता है:

jq -e '
  select(.event_type == "action.intent")
  | select(.decision.reference_required == true)
  | select((.ticket.reference // "") | length == 0)
  | error("sensitive action has no ticket reference")
' actions.ndjson

ऐसी complementary query भी चलाएँ जो बिना completion event वाले references खोजे। Ticket link तभी उपयोगी है जब journal दिखाए कि requested execution हुआ या नहीं।

Agent को अपना evidence खुद बनाने न दें

Agent ticket reference प्रस्तावित कर सकता है, लेकिन उसे यह घोषित करने का अधिकार नहीं होना चाहिए कि reference approved और scope के भीतर है। यह वैसी ही गलती है जैसे किसी process से यह attest करने को कहना कि उसके credentials उचित हैं।

Agent को दो में से एक path दें। पहले path में human work assign करते समय reference देता है और agent को उस reference तथा अनुमत target scope वाला short-lived work context मिलता है। दूसरे path में agent reference से trusted ticket lookup service से ticket माँगता है और control point dispatch से पहले response की स्वतंत्र जाँच करता है। Agent को केवल वे facts दिखें जिनकी उसे request बनाने के लिए आवश्यकता है।

Signed work context कुछ इस तरह दिख सकता है:

{
  "ticket_ref": "CHG-418",
  "allowed_targets": ["prod/billing-api/config"],
  "allowed_operations": ["PATCH"],
  "expires_at": "2025-03-08T15:00:00Z",
  "issued_for_run": "run_7e9d2"
}

Issuer serialized context पर sign करता है। Control point signature, expiration, target, operation और run identity verify करता है। Signature invalid किए बिना agent expiry बढ़ा या दूसरा target नहीं जोड़ सकता। यदि आपका ticket system signed contexts जारी नहीं कर सकता, तो यही logic server side रखें और lookup response के facts event में रिकॉर्ड करें।

Context को किसी खास agent run से bind करें। इस binding के बिना compromised process एक task की approved reference को दूसरे task में copy कर सकता है। जहाँ environment यह जानकारी दे सके, वहाँ call करने वाले code identity या process identity को भी रिकॉर्ड करें। Ticket में human name और log में anonymous local process एक भरोसेमंद chain स्थापित नहीं करते।

Retries और batches के लिए अलग-अलग evidence चाहिए

टिकट को कॉल के प्रमाण से जोड़ें
इरादे के लिए अपने चेंज रिकॉर्ड का और निष्पादित कॉल के लिए Sallyport के Activity journal का उपयोग करें।

एक ticket सीमित change window को authorize कर सकता है, लेकिन एक ticket को कई actions को एक अस्पष्ट audit entry में समेटना नहीं चाहिए। Reviewers को planned sequence, repeated failure, partial completion और agent के scope से बाहर जाने के बीच अंतर समझना आवश्यक है।

हर attempt को अपना action ID दें। हर attempt के साथ shared ticket reference जोड़ें और related attempts को run ID या change execution ID से group करें। Destination support करे तो idempotency identifier रिकॉर्ड करें। Idempotency identifier यह समझने में मदद करता है कि retry ने दूसरा change बनाया या नहीं, लेकिन यह attempt record का स्थान नहीं लेता।

मान लें agent दस service configurations update करता है। पहली सात calls successful हैं, आठवीं timeout होती है और agent उसे दो बार retry करता है। उपयोगी journal यही साफ़-साफ़ बताएगा: दस intended targets, सात confirmed results, एक unknown result और दो retries। केवल «configuration update completed» कहने वाला ticket comment उस अकेली service को छिपा देता है जिसे manual inspection की ज़रूरत हो सकती है।

Batches के लिए ticket में bounded population या attached manifest का नाम होना चाहिए। उस manifest का digest run के साथ रखें। यदि change शुरू होने के बाद agent को ग्यारहवाँ target मिलता है, तो रुकें और नया scope decision माँगें। Discovery को permission मानना maintenance work को unreviewed migration में बदल देता है।

Emergency work के लिए भी reference रखें, भले ही पहला protective action करने के बाद reference बनाया जाए। Emergency marker, कारण, approving person और normal ticket खोले जाने का समय रिकॉर्ड करें। Incident record खोलना धीमा लगता है, इसलिए routine ticket को चुपचाप reuse न करें। Emergencies में कम नहीं, अधिक evidence चाहिए।

Tickets और actions को दोनों दिशाओं में reconcile करें

दिखाएँ कि रन को किसने मंज़ूरी दी
Sallyport की पहली-कॉल स्वीकृति नए प्रोसेस की पहचान उसके कोड-साइनिंग प्राधिकरण से करती है।

Logs में उल्लिखित tickets की weekly report पर्याप्त नहीं है। आपको दो अलग tests चाहिए। पहला, हर ऐसा sensitive action खोजें जिसमें valid ticket reference नहीं है। दूसरा, हर ऐसे completed या approved ticket को खोजें जो execution का दावा करता है, लेकिन उसके साथ matching action evidence नहीं है।

पहला test bypasses खोजता है। दूसरा false completion notes, agent path से बाहर किया गया manual work और integration failures खोजता है। कोई भी report अपने-आप wrongdoing साबित नहीं करती। दोनों operator को यह बताती हैं कि context उपलब्ध रहते हुए कहाँ सटीक प्रश्न पूछना चाहिए।

Stable join rule उपयोग करें। यदि change system में कई projects हैं, तो system name और reference दोनों रखें। यदि archival के बाद references reuse हो सकते हैं, तो immutable ticket record ID या snapshot revision शामिल करें। यदि execution के बाद ticket edit किया जा सकता है, तो action authorize होने के समय देखी गई state और scope digest सुरक्षित रखें। अन्यथा बाद का edit पुराने execution evidence को approved दिखा सकता है, जबकि वह था नहीं।

Exceptions को first-class records की तरह review करें। Exception में यह दर्ज होना चाहिए कि उसे किसने स्वीकार किया, normal linkage क्यों विफल हुआ, कौन-सी action हुई और exception कब समाप्त होगी। Informal exceptions की spreadsheet कुछ महीनों में एक दूसरी, कमजोर change system बन जाती है।

Sallyport का documented Activity journal individual calls रिकॉर्ड करता है, लेकिन teams को ticket linkage अपने change records या companion immutable event में रखना चाहिए, जब तक documented ticket-reference field उपलब्ध न हो। Free-text note को dispatch से पहले capture और validate किए गए field के समान evidentiary value वाला न बताएं।

Ticket contents उजागर किए बिना evidence सुरक्षित रखें

Ticket systems में अक्सर customer names, incident details, architecture notes और access information होती है। Operations और review के दौरान action logs को अक्सर अधिक लोग पढ़ते हैं। Reference और authorization snapshot रखें, फिर authorized reviewers को full text के लिए ticket system खोलने दें।

Searchable representation बनाने से पहले request data redact करें और केवल तभी access-controlled original सुरक्षित रखें जब investigation requirements इसे उचित ठहराएँ। Digest यह पुष्टि कर सकता है कि retained payload बदला नहीं है, लेकिन जिस payload को reviewer प्राप्त ही नहीं कर सकता उसे समझने में मदद नहीं करेगा। सोच-समझकर तय करें कि protected original किस system में रहेगा और उसे कौन प्राप्त कर सकेगा।

Ticket system source record को delete या archive कर दे, तब भी ticket reference रखें। Reference investigators को शुरुआत देता है, जबकि captured state, target, decision और result action record को अपने-आप समझने योग्य बनाए रखते हैं। यदि retention rules deletion की माँग करते हैं, तो यह तथ्य रिकॉर्ड करें। ऐसा broken link न छोड़ें जो error जैसा दिखे।

एक सरल पहला control ही gaps सामने लाने के लिए पर्याप्त है: structured reference के बिना sensitive actions reject करें, dispatch से पहले intent लिखें और dispatch के बाद result सुरक्षित रखें। इसके बाद scope comparison और reconciliation जोड़ें। Ticket number reviewer को अधिक तेज़ और निश्चित बनाए, agent को risky work के साथ जोड़ने के लिए केवल सजावटी string न दे।

सामान्य प्रश्न

क्या change ticket reference और approval एक ही चीज़ हैं?

टिकट ID कार्रवाई का दावा किया गया कारण दर्ज करती है। Authorization यह दर्ज करता है कि किस व्यक्ति या सिस्टम को उसे करने की अनुमति थी। दोनों रिकॉर्ड रखें, क्योंकि स्वीकृत प्रक्रिया भी असंबंधित, पुराना या जाली टिकट उद्धृत कर सकती है।

किन agent actions के लिए टिकट नंबर अनिवार्य होना चाहिए?

उन कार्रवाइयों के लिए reference अनिवार्य करें जो production state बदलती हैं, पैसे या डेटा को स्थानांतरित करती हैं, access बदलती हैं, credentials को rotate करती हैं, सार्वजनिक exposure बनाती हैं या सामान्य deployment path को bypass करती हैं। केवल पढ़ने वाली calls को आम तौर पर टिकट की ज़रूरत नहीं होती, जब तक डेटा स्वयं संवेदनशील न हो।

एजेंट को कार्रवाई के साथ ticket reference कब जोड़ना चाहिए?

टिकट reference कार्रवाई के control point से बाहर जाने से पहले लें और उसे immutable action record से जोड़ दें। बाद में reference जोड़ने से केवल यह साबित होता है कि घटना के बाद किसी ने कहानी में बदलाव किया।

क्या संवेदनशील काम को मंज़ूरी देने के लिए केवल ticket ID पर्याप्त है?

नहीं। टिकट नंबर आसानी से कॉपी किए जा सकते हैं और काम बंद होने के बाद भी अक्सर उपलब्ध रहते हैं। जाँचें कि टिकट मौजूद है, target से मेल खाता है, स्वीकार्य स्थिति में है और उसमें ऐसा requester या owner दर्ज है जो कार्रवाई को मंज़ूरी दे सकता है।

क्या टिकट में एजेंट द्वारा चलाया गया exact command होना चाहिए?

नहीं। टिकट व्यापक बदलाव का वर्णन कर सकता है, जबकि action event में सटीक endpoint, command, target, actor, result और समय चाहिए। टिकट इरादा समझाता है, event निष्पादन का प्रमाण देता है।

AI agent सुरक्षित तरीके से ticket reference कैसे प्राप्त कर सकता है?

Short-lived, signed work context का उपयोग करें या server-side lookup करें, जो reference और अनुमत scope लौटाए। एजेंट को कोई string गढ़कर उसे इस बात का प्रमाण मानने न दें कि change system ने किसी चीज़ को मंज़ूरी दी है।

Retries के लिए ticket references कैसे काम करने चाहिए?

Retry को मूल attempt की ओर संकेत करने वाले नए attempt के रूप में दर्ज करें। रिकॉर्ड में एक ही ticket reference हो सकता है, लेकिन हर रिकॉर्ड में अपना action ID, timestamp, result और idempotency marker होना चाहिए।

क्या एक टिकट agent actions के batch को कवर कर सकता है?

स्वीकृत window के लिए parent change ticket रखें और उसके बाहर के काम के लिए अलग reference अनिवार्य करें। यदि window में कई कार्रवाइयाँ शामिल हैं, तो action sequence रिकॉर्ड करें और हर result सुरक्षित रखें। एक अस्पष्ट completion note न बनाएँ।

यदि टिकट पहले ही बंद हो चुका है, तो क्या होगा?

बंद टिकट पूर्ण हो चुकी कार्रवाई को समझा सकता है, लेकिन सामान्यतः उसे नई कार्रवाई का authorization नहीं देना चाहिए। आपका control point बंद या रद्द references को अस्वीकार करे, जब तक कोई स्पष्ट emergency process अपवाद की अनुमति न दे और यह दर्ज न करे कि उसे किसने स्वीकार किया।

Reviewers को टिकट देखना चाहिए या audit log?

Intent के लिए ticket system और वास्तव में क्या हुआ, इसके प्रमाण के लिए action journal का उपयोग करें। दोनों दिशाओं में reconciliation करें: हर संवेदनशील event में reference होना चाहिए और हर पूर्ण टिकट के साथ execution evidence या उसके न होने का स्पष्ट कारण होना चाहिए।

Sallyport

Sallyport आपके AI एजेंट के लिए API कॉल और SSH कमांड चलाता है। कुंजियाँ आपके Mac पर एक लोकल वॉल्ट में रहती हैं; आप हर रन को स्वीकृत करते हैं और हर क्रिया एक सीलबंद जर्नल में दर्ज होती है।

© 2026 Sallyport · Apache-2.0 के तहत ओपन सोर्स · Oleg Sotnikov