26 рдорд╛рд░реНрдЪ 2025┬╖8 рдорд┐рдирдЯ рдкрдврд╝рдиреЗ рдореЗрдВ

рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ: рд╕рд╛рдлрд╝ рдкрд░рд┐рд╡рд░реНрддрди рдЗрддрд┐рд╣рд╛рд╕ рдкреИрдЯрд░реНрди

рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ: рд╣рд░ CRUD рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдпрд╣ рдЯреНрд░реИрдХ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕рдиреЗ рдХреНрдпрд╛ рдФрд░ рдХрдм рдХрд┐рдпрд╛, рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдЕрдВрддрд░ (diffs) рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦреЗрдВ, рдФрд░ рдПрдХ рдПрдбрдорд┐рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдлрд╝реАрдб рджрд┐рдЦрд╛рдПрдБред

рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ: рд╕рд╛рдлрд╝ рдкрд░рд┐рд╡рд░реНрддрди рдЗрддрд┐рд╣рд╛рд╕ рдкреИрдЯрд░реНрди

рдХреНрдпреЛрдВ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ (рдФрд░ рдХрд╣рд╛рдБ рдЕрдХреНрд╕рд░ рдлреЗрд▓ рд╣реЛрддреЗ рд╣реИрдВ)

рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдЯреАрдореЗрдВ рддрдм рдСрдбрд┐рдЯ рд▓реЙрдЧ рдЬреЛрдбрд╝рддреА рд╣реИрдВ рдЬрдм рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрддрд╛ рд╣реИред рдХреЛрдИ рдЧреНрд░рд╛рд╣рдХ рдХрд┐рд╕реА рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд╡рд┐рд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдлрд╝рд╛рдЗрдиреЗрдВрд╕ рдирдВрдмрд░ рд╣рд┐рд▓рддрд╛ рд╣реИ, рдпрд╛ рдСрдбрд┐рдЯрд░ рдкреВрдЫрддрд╛ рд╣реИ, "рдпрд╣ рдХрд┐рд╕рдиреЗ рдордВрдЬрд╝реВрд░ рдХрд┐рдпрд╛?" рдЕрдЧрд░ рдЖрдк рддрднреА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЖрдВрд╢рд┐рдХ рд╕реБрд░рд╛рдЧреЛрдВ рд╕реЗ рдЕрддреАрдд рдХреЛ рдлрд┐рд░ рд╕реЗ reconstruct рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ: рдбреЗрдЯрд╛рдмреЗрд╕ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреНрд╕, Slack рд╕рдВрджреЗрд╢ рдФрд░ рдЕрдиреБрдорд╛рдиред

рдЬреНрдпрд╛рджрд╛рддрд░ рдЖрдВрддрд░рд┐рдХ рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП "рдХрдореНрдкреНрд▓рд╛рдпрдВрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА" рдХрд╛ рдорддрд▓рдм рдкрд░рдлрд╝реЗрдХреНрдЯ рдлреЙрд░реЗрдВрд╕рд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдирд╣реАрдВ рд╣реЛрддрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдЫреЛрдЯреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рддреЗрдЬрд╝ рдФрд░ рд╕реБрд╕рдВрдЧрдд рдЬрд╡рд╛рдм рджреЗ рд╕рдХреЗрдВ: рдХрд┐рд╕рдиреЗ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛, рдХреМрди рд╕рд╛ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ, рдХреНрдпрд╛ рдмрджрд▓рд╛, рдХрдм рд╣реБрдЖ, рдФрд░ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдпрд╛ (UI, import, API, automation)ред рдпрд╣реА рд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ рдЬреЛ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдкрд░ рднрд░реЛрд╕рд╛ рдмрдирд╛рддреА рд╣реИред

рдЬрд╣рд╛рдБ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдЕрдХреНрд╕рд░ рдлреЗрд▓ рд╣реЛрддреЗ рд╣реИрдВ рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрд╡рд░реЗрдЬ рд╣реИред рдЗрддрд┐рд╣рд╛рд╕ рд╕рд╛рджреЗ рдПрдбрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдХрд╛рдо рддреЗрдЬрд╝реА рд╕реЗ рд╣реЛрддрд╛ рд╣реИ рдЧреИрдк рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЖрдо рджреЛрд╖реА рд╣реИрдВ: рдмрд▓реНрдХ рдПрдбрд┐рдЯреНрд╕, рдЗрдореНрдкреЛрд░реНрдЯреНрд╕, рд╢реЗрдбреНрдпреВрд▓реНрдб рдЬреЙрдмреНрд╕, рдПрдбрдорд┐рди рдХреНрд░рд┐рдпрд╛рдПрдБ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреНрд░реАрди рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреА рд╣реИрдВ (рдЬреИрд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рд░реАрд╕реЗрдЯ рдпрд╛ рд░реЛрд▓ рдмрджрд▓рдирд╛), рдФрд░ рдбрд┐рд▓реАрдЯреНрд╕ (рдЦрд╝рд╛рд╕рдХрд░ рд╣рд╛рд░реНрдб рдбрд┐рд▓реАрдЯ)ред

рдПрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдлрд▓рддрд╛ рдбрд┐рдмрдЧ рд▓реЙрдЧреНрд╕ рдФрд░ рдСрдбрд┐рдЯ рд▓реЙрдЧреНрд╕ рдХреЛ рдорд┐рд▓рд╛рдирд╛ рд╣реИред рдбрд┐рдмрдЧ рд▓реЙрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ: рд╢реЛрд░ рд╡рд╛рд▓реЗ, рддрдХрдиреАрдХреА рдФрд░ рдЕрдХреНрд╕рд░ рдЕрдирд┐рдпрдорд┐рддред рдСрдбрд┐рдЯ рд▓реЙрдЧ рдЬрд╡рд╛рдмрджреЗрд╣реА рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ: рд╕реБрд╕рдВрдЧрдд рдлрд╝реАрд▓реНрдб, рд╕реНрдкрд╖реНрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ рдлрд╝реЙрд░реНрдореИрдЯ рдЬрд┐рд╕реЗ рдЖрдк рдЧреИрд░-рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЛ рднреА рджрд┐рдЦрд╛ рд╕рдХреЗрдВред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд╕рдкреЛрд░реНрдЯ рдореИрдиреЗрдЬрд░ рдЧреНрд░рд╛рд╣рдХ рдХреА рдпреЛрдЬрдирд╛ рдмрджрд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рдСрдЯреЛрдореЗрд╢рди рдмрд┐рд▓рд┐рдВрдЧ рд╡рд┐рд╡рд░рдг рдЕрдкрдбреЗрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдкрдиреЗ рд╕рд┐рд░реНрдл "updated customer" рд▓реЙрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд╣реАрдВ рдмрддрд╛ рдкрд╛рдПрдБрдЧреЗ рдХрд┐ рдХрд┐рд╕рдиреЗ рдХрд┐рдпрд╛тАФрдЗрдВрд╕рд╛рди рдиреЗ, рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдиреЗ, рдпрд╛ рдХрд┐рд╕реА рдЗрдореНрдкреЛрд░реНрдЯ рдиреЗ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ред

рд╡реЗ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдлрд╝реАрд▓реНрдб рдЬреЛ рдмрддрд╛ рджреЗрддреЗ рд╣реИрдВ рдХрд┐рд╕рдиреЗ, рдХреНрдпрд╛ рдФрд░ рдХрдм

рдЕрдЪреНрдЫрд╛ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдПрдХ рд▓рдХреНрд╖реНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ: рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рдПрдВрдЯреНрд░реА рдкрдврд╝рдХрд░ рдЕрдВрджрд╛рдЬрд╝рд╛ рд▓рдЧрд╛рдП рдмрд┐рдирд╛ рд╕рдордЭ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред

рдХрд┐рд╕рдиреЗ рдХрд┐рдпрд╛

рд╣рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ actor рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЗрдВ рдХреЗрд╡рд▓ "user id" рддрдХ рд░реБрдХ рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ рдЯреВрд▓ рдЕрдХреНрд╕рд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВред

actor_type рдФрд░ actor_identifier рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рд╕реНрдЯрд╛рдл рд╕рджрд╕реНрдп, рд╕рд░реНрд╡рд┐рд╕ рдЕрдХрд╛рдЙрдиреНрдЯ, рдпрд╛ рдПрдХреНрд╕рдЯрд░реНрдирд▓ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдореЗрдВ рдлрд░реНрдХ рдмрддрд╛ рд╕рдХреЗрдВред рдЕрдЧрд░ рдЖрдкрдХреА рдРрдк рдореЗрдВ рдЯреАрдореЗрдВ рдпрд╛ рдЯреЗрдиреЗрдВрдЯреНрд╕ рд╣реИрдВ, рддреЛ organization рдпрд╛ workspace id рднреА рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдШрдЯрдирд╛рдПрдБ рдХрднреА рдорд┐рдХреНрд╕ рди рд╣реЛрдВред

рдХреНрдпрд╛ рд╣реБрдЖ рдФрд░ рдХрд┐рд╕ рд░рд┐рдХреЙрд░реНрдб рдкрд░

рдПрдХреНрд╢рди (create, update, delete, restore) рдХреЗ рд╕рд╛рде рдЯрд╛рд░рдЧреЗрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВред "Target" рджреЛрдиреЛрдВ рдорд╛рдирд╡-рдкрдардиреАрдп рдФрд░ рд╕рдЯреАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рддрд╛рд▓рд┐рдХрд╛ рдпрд╛ рдПрдВрдЯрд┐рдЯреА рдирд╛рдо, рд░рд┐рдХреЙрд░реНрдб id, рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдмрд▓ (рдЬреИрд╕реЗ order рдирдВрдмрд░) рдЬрд▓реНрджреА рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдиреНрдпреВрдирддрдо рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ:

  • actor_type, actor_id (рдФрд░ actor_display_name рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ)
  • action рдФрд░ target_type, target_id
  • happened_at_utc (UTC рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк)
  • source (screen, endpoint, job, import) рдФрд░ ip_address (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)
  • reason (рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдЯрд┐рдкреНрдкрдгреА)

рдХрдм рд╣реБрдЖ

рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣рдореЗрд╢рд╛ UTC рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред рдлрд┐рд░ рдПрдбрдорд┐рди UI рдореЗрдВ рдЗрд╕реЗ рд╡реНрдпреВрдЕрд░ рдХреЗ рд▓реЛрдХрд▓ рд╕рдордп рдореЗрдВ рджрд┐рдЦрд╛рдПрдБред рдЗрд╕рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рджреМрд░рд╛рди "рджреЛ рд▓реЛрдЧреЛрдВ рдиреЗ рдЕрд▓рдЧ рд╕рдордп рджреЗрдЦрд╛" рдЬреИрд╕реЗ рддрд░реНрдХ рдмрдЪрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдЙрдЪреНрдЪ рдЬреЛрдЦрд┐рдо рдХреА рдХреНрд░рд┐рдпрд╛рдПрдБ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рд░реЛрд▓ рдЪреЗрдВрдЬ, рд░рд┐рдлрдВрдб рдпрд╛ рдбреЗрдЯрд╛ рдПрдХреНрд╕рдкреЛрд░реНрдЯ, рддреЛ рдПрдХ "reason" рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реЗрдВред рдПрдХ рдЫреЛрдЯрд╛ рдиреЛрдЯ рднреАтАФ"Ticket 1842 рдореЗрдВ рдореИрдиреЗрдЬрд░ рдиреЗ рдордВрдЬрд╝реВрд░ рдХрд┐рдпрд╛"тАФрдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓ рдХреЛ рд╢реЛрд░ рд╕реЗ рд╕рдмреВрдд рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдЪреБрдиреЗрдВ: рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдмрдирд╛рдо рд╡рд░реНрд╢рдирдб рд╣рд┐рд╕реНрдЯреНрд░реА

рдкрд╣рд▓рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдЗрддрд┐рд╣рд╛рд╕ рдХреА "рд╕рдЪреНрдЪрд╛рдИ" рдХрд╣рд╛рдБ рд░рд╣рддреА рд╣реИред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЯреАрдореЗрдВ рджреЛ рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рдЖрддреА рд╣реИрдВ: рдПрдХ append-only рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ, рдпрд╛ рдкреНрд░рддрд┐-рдПрдВрдЯрд┐рдЯреА рд╡рд░реНрд╢рди рд╣рд┐рд╕реНрдЯреНрд░реА рдЯреЗрдмрд▓реНрд╕ред

рд╡рд┐рдХрд▓реНрдк 1: рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ (append-only actions table)

рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдЯреЗрдмрд▓ рд╣реИ рдЬреЛ рд╣рд░ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреА рд╣реИред рд╣рд░ рдкрдВрдХреНрддрд┐ рдмрддрд╛рддреА рд╣реИ рдХрд┐рд╕рдиреЗ рдХрд┐рдпрд╛, рдХрдм рд╣реБрдЖ, рдХрд┐рд╕ рдПрдВрдЯрд┐рдЯреА рдХреЛ рдЫреБрдЖ рдЧрдпрд╛, рдФрд░ рдПрдХ payload (рдЕрдХрд╕рд░ JSON) рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдореЙрдбрд▓ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕реАрдзрд╛ рдФрд░ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдкрд░ рд▓рдЪреАрд▓рд╛ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдбрдорд┐рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдлрд╝реАрдб рд╕реЗ рднреА рдиреИрдЪреБрд░рд▓ рдореИрдк рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлрд╝реАрдб рдореВрд▓рддрдГ "рдиреНрдпреВрдПрд╕реНрдЯ рдЗрд╡реЗрдВрдЯреНрд╕ рдкрд╣рд▓реЗ" рд╣реЛрддрд╛ рд╣реИред

рд╡рд┐рдХрд▓реНрдк 2: рд╡рд░реНрд╢рдирдб рд╣рд┐рд╕реНрдЯреНрд░реА (рдкреНрд░рддрд┐-рдПрдВрдЯрд┐рдЯреА рд╡рд░реНрд╢рди)

рд╡рд░реНрд╢рдирдб рд╣рд┐рд╕реНрдЯреНрд░реА рдЕрдкреНрд░реЛрдЪ рдкреНрд░рддрд┐ рдПрдВрдЯрд┐рдЯреА рд╣рд┐рд╕реНрдЯреНрд░реА рдЯреЗрдмрд▓ рдмрдирд╛рддреА рд╣реИ, рдЬреИрд╕реЗ Order_history рдпрд╛ User_versions, рдЬрд╣рд╛рдБ рд╣рд░ рдЕрдкрдбреЗрдЯ рдПрдХ рдирдпрд╛ рдкреВрд░рд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ (рдпрд╛ рдмрджрд▓реЗ рдЧрдП рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рд╕рдВрд░рдЪрд┐рдд рд╕реЗрдЯ) рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд░реНрд╢рди рдирдВрдмрд░ рдЬреБрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдкреЙрдЗрдВрдЯ-рдЗрди-рдЯрд╛рдЗрдо рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ ("рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдкрд┐рдЫрд▓реЗ рдордВрдЧрд▓рд╡рд╛рд░ рдХреЛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛?")ред рдпрд╣ рдСрдбрд┐рдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╛рдлрд╝ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рд░рд┐рдХреЙрд░реНрдб рдХреА рдЯрд╛рдЗрдорд▓рд╛рдЗрди рд╕реНрд╡рдпрдВ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд░рд╣рддреА рд╣реИред

рдЪреБрдирдиреЗ рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛:

  • рдЕрдЧрд░ рдЖрдк рдПрдХ рд╣реА рдЬрдЧрд╣ рд╕реЗ рд╕рд░реНрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрд╕рд╛рди рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдлрд╝реАрдб рдФрд░ рдирдП рдПрдВрдЯрд┐рдЯреАрдЬрд╝ рдЖрдиреЗ рдкрд░ рдХрдо friction рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдЪреБрдиреЗрдВред
  • рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рд░рд┐рдХреЙрд░реНрдб-рд╕реНрддрд░реАрдп рдЯрд╛рдЗрдорд▓рд╛рдЗрди, рдкреЙрдЗрдВрдЯ-рдЗрди-рдЯрд╛рдЗрдо рд╡реНрдпреВрдЬрд╝ рдпрд╛ рдкреНрд░рддрд┐-рд░рд┐рдХреЙрд░реНрдб рдЖрд╕рд╛рди diffs рдЪрд╛рд╣рд┐рдП рддреЛ рд╡рд░реНрд╢рдиреНрдб рд╣рд┐рд╕реНрдЯреНрд░реА рдЪреБрдиреЗрдВред
  • рдпрджрд┐ рд╕реНрдЯреЛрд░реЗрдЬ рдЪрд┐рдВрддрд╛ рд╣реИ, рддреЛ рдлреАрд▓реНрдб-рд╕реНрддрд░реАрдп diffs рдХреЗ рд╕рд╛рде рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдЖрдорддреМрд░ рдкрд░ рдкреВрд░реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реЗ рд╣рд▓реНрдХрд╛ рд╣реЛрддрд╛ рд╣реИред
  • рдЕрдЧрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╣реИ, рддреЛ рд╡рд░реНрд╢рди рдЯреЗрдмрд▓реНрд╕ рдЗрд╡реЗрдВрдЯ payloads рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рд╕рд░рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрд┐рд╕реЗ рднреА рдЖрдк рдЪреБрдиреЗрдВ, рдСрдбрд┐рдЯ рдПрдВрдЯреНрд░реАрдЬрд╝ рдХреЛ immutable рд░рдЦреЗрдВ: рдХреЛрдИ updates, рдХреЛрдИ deletes рдирд╣реАрдВред рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ рдерд╛, рддреЛ рдПрдХ рдирдИ рдПрдВрдЯреНрд░реА рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рд╕реБрдзрд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗред

рдПрдХ correlation_id (рдпрд╛ operation id) рдЬреЛрдбрд╝рдирд╛ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЕрдХреНрд╕рд░ рдХрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг: "Deactivate user" рдпреВрдЬрд╝рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рд╕рддреНрд░ рд░рд┐рд╡реЛрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреЗрдВрдбрд┐рдВрдЧ рдЯрд╛рд╕реНрдХ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИ)ред рдПрдХ рд╕рд╛рдЭрд╛ correlation id рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдкрдардиреАрдп рдСрдкрд░реЗрд╢рди рдореЗрдВ рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред

CRUD рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ (рдбрд┐рд▓реАрдЯреНрд╕ рдФрд░ рдмрд▓реНрдХ рдПрдбрд┐рдЯреНрд╕ рд╕рд╣рд┐рдд)

рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ рдПрдХ рдирд┐рдпрдо рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ: рд╣рд░ write рдПрдХ рд╣реА рдкрде рд╕реЗ рд╣реЛрдХрд░ рдЬрд╛рдП рдЬреЛ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рднреА рд▓рд┐рдЦрддрд╛ рд╣реИред рдЕрдЧрд░ рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЙрдм, рдЗрдореНрдкреЛрд░реНрдЯ рдпрд╛ рддреЗрдЬрд╝-рдПрдбрд┐рдЯ рд╕реНрдХреНрд░реАрди рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрд╡ рдлрд╝реНрд▓реЛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рд▓реЙрдЧреНрд╕ рдореЗрдВ рдЫреЗрдж рд╣реЛрдВрдЧреЗред

Creates рдХреЗ рд▓рд┐рдП actor рдФрд░ source (UI, API, import) рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВред рдЗрдореНрдкреЛрд░реНрдЯреНрд╕ рд╡рд╣ рдЬрдЧрд╣ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЯреАрдореЗрдВ рдЕрдХреНрд╕рд░ "рдХрд┐рд╕рдиреЗ рдХрд┐рдпрд╛" рдЦреЛ рджреЗрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ "performed by" рдорд╛рди рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рднрд▓реЗ рд╣реА рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рд╕реЗ рдЖрдпрд╛ рд╣реЛред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди (рдпрд╛ рддреЛ рдкреВрд░рд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдпрд╛ рдХреБрдЫ рдкреНрд░рдореБрдЦ рдлрд╝реАрд▓реНрдбреНрд╕) рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдмрддрд╛ рд╕рдХреЗрдВ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдХреНрдпреЛрдВ рдореМрдЬреВрдж рд╣реИред

Updates рдЬрд╝реНрдпрд╛рджрд╛ рдЭрдЯрд┐рд▓ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ рдмрджрд▓реЗ рд╣реБрдП рдлрд╝реАрд▓реНрдбреНрд╕ рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЫреЛрдЯрд╛, рдкрдардиреАрдп рдФрд░ рддреЗрдЬрд╝), рдпрд╛ рд╣рд░ рд╕реЗрд╡ рдХреЗ рдмрд╛рдж рдПрдХ рдкреВрд░рд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╛рдж рдореЗрдВ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдореЗрдВ рд╕рд░рд▓, рдкрд░ рднрд╛рд░реА)ред рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдордзреНрдп рдорд╛рд░реНрдЧ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрд╛рджрдиреЛрдВ рдХреЗ рд▓рд┐рдП diffs рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдЬреИрд╕реЗ permissions, рдмреИрдВрдХ рд╡рд┐рд╡рд░рдг, рдпрд╛ рдкреНрд░рд╛рдЗрд╕рд┐рдВрдЧ рдирд┐рдпрдо) рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдлрд╝ рд╕реНрдиреИрдкрд╢реЙрдЯ рд░рдЦреЗрдВред

Deletes рд╕рд╛рдХреНрд╖реНрдп рдорд┐рдЯрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред рдПрдХ soft delete рдкрд╕рдВрдж рдХрд░реЗрдВ (рдПрдХ is_deleted рдлрд╝реНрд▓реИрдЧ рдкреНрд▓рд╕ рдПрдХ рдСрдбрд┐рдЯ рдПрдВрдЯреНрд░реА)ред рдЕрдЧрд░ рдЖрдкрдХреЛ рд╣рд╛рд░реНрдб рдбрд┐рд▓реАрдЯ рдХрд░рдиреА рд╣реА рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рд▓рд┐рдЦреЗрдВ рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдПрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

Undelete рдХреЛ рдЕрдкрдиреА рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдорд╛рдиреЗрдВред "Restore" рдХреЛ "Update" рдХреЗ рд╕рдорд╛рди рди рд╕рдордЭреЗрдВтАФрдЗрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд░рдЦрдиреЗ рд╕реЗ рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдЕрдиреБрдкрд╛рд▓рди рдЬрд╛рдВрдЪ рдЖрд╕рд╛рди рд╣реЛрддреА рд╣реИред

рдмрд▓реНрдХ рдПрдбрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рдПрдВрдЯреНрд░реА рдЬреИрд╕реЗ "updated 500 records" рд╕реЗ рдмрдЪреЗрдВред рдмрд╛рдж рдореЗрдВ рдпрд╣ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реЛрдЧрд╛ рдХрд┐ "рдХреМрди рд╕реЗ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдмрджрд▓реЗ?" рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреИрдЯрд░реНрди рдкреИрд░реЗрдВрдЯ рдЗрд╡реЗрдВрдЯ рдФрд░ рдкреНрд░рддрд┐-рд░рд┐рдХреЙрд░реНрдб рдЪрд╛рдЗрд▓реНрдб рдЗрд╡реЗрдВрдЯ рд╣реИ:

  • рдкреИрд░реЗрдВрдЯ рдЗрд╡реЗрдВрдЯ: actor, tool/screen, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕, рдФрд░ рдмреИрдЪ рд╕рд╛рдЗрдЬ
  • рдкреНрд░рддрд┐-рд░рд┐рдХреЙрд░реНрдб рдЪрд╛рдЗрд▓реНрдб рдЗрд╡реЗрдВрдЯ: record id, before/after (рдпрд╛ рдмрджрд▓реЗ рдЧрдП рдлрд╝реАрд▓реНрдбреНрд╕), рдФрд░ рдкрд░рд┐рдгрд╛рдо (success/fail)
  • рд╡реИрдХрд▓реНрдкрд┐рдХ: рдПрдХ рд╕рд╛рдЭрд╛ reason рдлрд╝реАрд▓реНрдб (policy update, cleanup, migration)

рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд╕рдкреЛрд░реНрдЯ рд▓реАрдб 120 рдЯрд┐рдХрдЯреНрд╕ рдмрд▓реНрдХ-рдХреНрд▓реЛрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдкреИрд░реЗрдВрдЯ рдПрдВрдЯреНрд░реА рдореЗрдВ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрдкреНрдЪрд░ рд╣реЛрддрд╛ рд╣реИ "status=open, older than 30 days," рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХрдЯ рдХреЛ рдПрдХ рдЪрд╛рдЗрд▓реНрдб рдПрдВрдЯреНрд░реА рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддреА рд╣реИ status open -> closedред

рдХреНрдпрд╛ рдмрджрд▓рд╛тАФрд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдмрдЧреИрд░ рдкреНрд░рд╛рдЗрд╡реЗрд╕реА рдпрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рд╕рдорд╕реНрдпрд╛ рдмрдирд╛рдП

рддреЗрдЬреА рд╕реЗ рдЕрдкрдирд╛ рдСрдбрд┐рдЯ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд░реЗрдВ
PostgreSQL рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдХрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓реА рдСрдбрд┐рдЯ рдЯреЗрдмрд▓ рдФрд░ рд░рд┐рд▓реЗрд╢рдирд╢рд┐рдк рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВред
рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХрд░реЗрдВ

рдСрдбрд┐рдЯ рд▓реЙрдЧ рддрдм рдЬрд▓реНрджреА рдмреЗрдХрд╛рд░ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдпрд╛ рддреЛ рдмрд╣реБрдд рдЬрд╝реНрдпрд╛рджрд╛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд░ рдкреВрд░рд╛ рд░рд┐рдХреЙрд░реНрдб, рд╣рдореЗрд╢рд╛) рдпрд╛ рдмрд╣реБрдд рдХрдо (рд╕рд┐рд░реНрдл "edited user")ред рд▓рдХреНрд╖реНрдп рдРрд╕рд╛ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдмрдЪрд╛рд╡ рдпреЛрдЧреНрдп рдФрд░ рдПрдбрдорд┐рди рджреНрд╡рд╛рд░рд╛ рдкрдардиреАрдп рд╣реЛред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдкрдбреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб-рд╕реНрддрд░реАрдп diff рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред рдХреЗрд╡рд▓ рдмрджрд▓реЗ рдЧрдП рдлрд╝реАрд▓реНрдб рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ, рд╕рд╛рде рдореЗрдВ "before" рдФрд░ "after" рд╡реИрд▓реНрдпреВред рдЗрд╕рд╕реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдХрдо рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдлрд╝реАрдб рд╕реНрдХреИрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ: "Status: Pending -> Approved" рдмрдбрд╝реА blob рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рд╡реЛ рдХреНрд╖рдг рдЬрдм рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИтАФcreates, deletes рдФрд░ рдмрдбрд╝реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рдиреНрд╕тАФрдЙрдирдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реНрдиреИрдкрд╢реЙрдЯ рд░рдЦреЗрдВред рд╕реНрдиреИрдкрд╢реЙрдЯ рднрд╛рд░реА рд╣реЛрддреЗ рд╣реИрдВ, рдкрд░ рдЬрдм рдХреЛрдИ рдкреВрдЫреЗ "рдЧреНрд░рд╛рд╣рдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╣рдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд┐рд▓реНрдХреБрд▓ рдХреИрд╕реА рджрд┐рдЦрддреА рдереА?" рддрдм рд╡реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рд╕реНрдХрд┐рдВрдЧ рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдирд╣реАрдВ рддреЛ рдЖрдкрдХреА рдСрдбрд┐рдЯ рддрд╛рд▓рд┐рдХрд╛ рд░рд╛рдЬрд╝реЛрдВ рд╕реЗ рднрд░ рдЬрд╛рдПрдЧреАред рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо:

  • рдХрднреА рднреА рдкрд╛рд╕рд╡рд░реНрдб, API рдЯреЛрдХрди, рдпрд╛ рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдХреАрдЬрд╝ рд╕реНрдЯреЛрд░ рди рдХрд░реЗрдВ (рд╕рд┐рд░реНрдлрд╝ "changed" рд▓реЙрдЧ рдХрд░реЗрдВ)
  • рдИрдореЗрд▓/рдлреЛрди рдЬреИрд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдХреЛ рдорд╛рд╕реНрдХ рдпрд╛ рдЖрдВрд╢рд┐рдХ/рд╣реИрд╢реНрдб рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ
  • рдиреЛрдЯреНрд╕ рдпрд╛ рдлреНрд░реА-рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реАрд╡реНрдпреВ рдФрд░ "changed" рдлрд╝реНрд▓реИрдЧ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ
  • рд╕рдВрдмрдВрдзрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдкреВрд░реА рдХреЙрдкреА рдХреА рдмрдЬрд╛рдп рд░реЗрдлрд╝рд░реЗрдВрд╕ (user_id, order_id) рд▓реЙрдЧ рдХрд░реЗрдВ

рд╕реНрдХреАрдорд╛ рдЪреЗрдВрдЬреЗрд╕ рднреА рдСрдбрд┐рдЯ рдЗрддрд┐рд╣рд╛рд╕ рддреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдмрд╛рдж рдореЗрдВ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рд░реАрдиреИрдо рдпрд╛ рд░рд┐рдореВрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдлреЙрд▓рдмреИрдХ рд░рдЦреЗрдВ рдЬреИрд╕реЗ "unknown field" рд╕рд╛рде рд╣реА рдУрд░рд┐рдЬрд┐рдирд▓ рдлрд╝реАрд▓реНрдб рдХреА-ред рд╣рдЯрд╛рдП рдЧрдП рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдЬреНрдЮрд╛рдд рдорд╛рди рд░рдЦреЗрдВ рдкрд░ рдЙрд╕реЗ "field removed from schema" рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдлрд╝реАрдб рдИрдорд╛рдирджрд╛рд░ рд░рд╣реЗред

рдЕрдВрдд рдореЗрдВ, рдПрдВрдЯреНрд░реАрдЬрд╝ рдХреЛ рдорд╛рдирд╡-рдкрдардиреАрдп рдмрдирд╛рдПрдВред raw keys ("assignee_id") рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдкреНрд▓реЗ рд▓реЗрдмрд▓ ("Assigned to") рд░рдЦреЗрдВ, рдФрд░ рдорд╛рдиреЛрдВ рдХреЛ рдлрд╝реЙрд░реНрдореИрдЯ рдХрд░реЗрдВ (рддрд┐рдерд┐рдпрд╛рдБ, рдореБрджреНрд░рд╛, рд╕реНрдЯреЗрдЯрд╕ рдирд╛рдо)ред

рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкреИрдЯрд░реНрди: рдЕрдкрдиреЗ рдРрдк рдлрд╝реНрд▓реЛ рдореЗрдВ рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдПрдХ рднрд░реЛрд╕реЗрдордВрдж рдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓ рдЬреНрдпрд╛рджрд╛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рдПрдХ рд╣реА рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рдпреЛрдЧреНрдп рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЧреИрдкреНрд╕ рдЬреИрд╕реЗ "рдмрд▓реНрдХ рдЗрдореНрдкреЛрд░реНрдЯ рд▓реЙрдЧ рдирд╣реАрдВ рд╣реБрдЖ" рдпрд╛ "рдореЛрдмрд╛рдЗрд▓ рдПрдбрд┐рдЯреНрд╕ рдЕрдирд╛рдо рджрд┐рдЦрддреЗ рд╣реИрдВ" рд╕реЗ рдмрдЪ рд╕рдХреЗрдВред

1) рдСрдбрд┐рдЯ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЙрдбрд▓ рдХрд░реЗрдВ

рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдореЗрдВ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ рд╕реЗрдЯ рдЯреЗрдмрд▓ рдмрдирд╛рдПрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░ рд╕рдХреЗред

рдЗрд╕реЗ рд╕рд░рд▓ рд░рдЦреЗрдВ: рдПрдХ рдЯреЗрдмрд▓ рдЗрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреЗрдмрд▓ рдмрджрд▓реЗ рдЧрдП рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП, рдФрд░ рдПрдХ рдЫреЛрдЯрд╛ actor contextред

  • audit_event: id, entity_type, entity_id, action (create/update/delete/restore), created_at, request_id
  • audit_event_item: id, audit_event_id, field_name, old_value, new_value
  • actor_context (рдпрд╛ audit_event рдкрд░ рдлрд╝реАрд▓реНрдбреНрд╕): actor_type (user/system), actor_id, actor_email, ip, user_agent

2) рдПрдХ рд╕рд╛рдЭрд╛ "Write + Audit" рд╕рдм-рдкреНрд░реЛрд╕реЗрд╕ рдЬреЛрдбрд╝реЗрдВ

рдПрдХ рдкреБрди:рдЙрдкрдпреЛрдЧреА рд╕рдм-рдкреНрд░реЛрд╕реЗрд╕ рдмрдирд╛рдПрдВ рдЬреЛ:

  1. рдПрдВрдЯрд┐рдЯреА рдирд╛рдо, рдПрдВрдЯрд┐рдЯреА id, рдПрдХреНрд╢рди, рдФрд░ before/after рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
  2. рдореБрдЦреНрдп рдЯреЗрдмрд▓ рдореЗрдВ рдмрд┐рдЬрд╝рдиреЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд┐рдЦрддрд╛ рд╣реИред
  3. рдПрдХ audit_event рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рддрд╛ рд╣реИред
  4. рдмрджрд▓реЗ рдЧрдП рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ audit_event_item рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдбрд╛рд▓рддрд╛ рд╣реИред

рдХрдареЛрд░ рдирд┐рдпрдо: рд╣рд░ write рдкрд╛рде рдХреЛ рдЗрд╕ рд╣реА рд╕рдм-рдкреНрд░реЛрд╕реЗрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдореЗрдВ UI рдмрдЯрди, API рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕, рд╢реЗрдбреНрдпреВрд▓реНрдб рдСрдЯреЛрдореЗрд╢рдиреНрд╕ рдФрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рдиреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

3) рд╕рд░реНрд╡рд░ рдкрд░ actor рдФрд░ рд╕рдордп рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ

"рдХрд┐рд╕рдиреЗ" рдФрд░ "рдХрдм" рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рднрд░реЛрд╕рд╛ рди рдХрд░реЗрдВред actor рдХреЛ рдЕрдкрдиреЗ auth session рд╕реЗ рдкрдврд╝реЗрдВ, рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред рдЕрдЧрд░ рдХреЛрдИ рдСрдЯреЛрдореЗрд╢рди рдЪрд▓ рд░рд╣реА рд╣реИ, рддреЛ actor_type рдХреЛ system рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЬреЙрдм рдХрд╛ рдирд╛рдо actor label рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред

4) рдПрдХ рдареЛрд╕ рдкрд░рд┐рджреГрд╢реНрдп рд╕реЗ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ

рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдЪреБрдиреЗрдВ (рдЬреИрд╕реЗ рдЧреНрд░рд╛рд╣рдХ рдЯрд┐рдХрдЯ): рдЗрд╕реЗ рдмрдирд╛рдПрдВ, рджреЛ рдлрд╝реАрд▓реНрдб рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (status рдФрд░ assignee), рдлрд┐рд░ рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ restore рдХрд░реЗрдВред рдЖрдкрдХрд╛ рдСрдбрд┐рдЯ рдлрд╝реАрдб рдкрд╛рдБрдЪ рдЗрд╡реЗрдВрдЯ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рддрд╣рдд рджреЛ update рдЖрдЗрдЯрдо, рдФрд░ рд╣рд░ рдмрд╛рд░ actor рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЙрд╕реА рддрд░рд╣ рднрд░реЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рдПрдХ рдРрд╕рд╛ рдПрдбрдорд┐рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдлрд╝реАрдб рдмрдирд╛рдПрдВ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рд╕рдЪрдореБрдЪ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ

рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯреНрд╕ рдорд╛рдирдХреАрдХреГрдд рдХрд░реЗрдВ
рдХреМрди рдХреНрдпрд╛ рдФрд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛, рдпрд╣ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдмрд┐рдЬрд╝рдиреЗрд╕ рдкреНрд░реЛрд╕реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рд▓реЙрдЬрд┐рдХ рдмрдирд╛рдПрдВ

рдПрдХ рдСрдбрд┐рдЯ рд▓реЙрдЧ рддрднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдХреЛрдИ рд╕рдореАрдХреНрд╖рд╛ рдпрд╛ рдШрдЯрдирд╛ рдХреЗ рджреМрд░рд╛рди рдЙрд╕реЗ рддреЗрдЬрд╝реА рд╕реЗ рдкрдврд╝ рд╕рдХреЗред рдПрдбрдорд┐рди рдлрд╝реАрдб рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рд░рд▓ рд╣реИ: рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ "рдХреНрдпрд╛ рд╣реБрдЖ?" рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВ, рдлрд┐рд░ рдмрд┐рдирд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рдХрдЪреНрдЪреЗ JSON рдореЗрдВ рдбреБрдмреЛрдП рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдЯрд╛рдЗрдорд▓рд╛рдЗрди рд▓реЗрдЖрдЙрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: рдиреНрдпреВрдПрд╕реНрдЯ рдкрд╣рд▓реЗ, рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рддрд┐ рдЗрд╡реЗрдВрдЯ, рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреНрд░рд┐рдпрд╛рдПрдБ рдЬреИрд╕реЗ Created, Updated, Deleted, Restoredред рд╣рд░ рд░реЛ рдореЗрдВ actor (рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо), рдЯрд╛рд░рдЧреЗрдЯ (рд░рд┐рдХреЙрд░реНрдб рдЯрд╛рдЗрдк рдФрд░ рдорд╛рдирд╡-рдкрдардиреАрдп рдирд╛рдо), рдФрд░ рд╕рдордп рджрд┐рдЦрд╛рдПрдБред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реЛ рдлрд╝реЙрд░реНрдореИрдЯ:

  • рдХреНрд░рд┐рдпрд╛ + рд╡рд╕реНрддреБ: "Updated Customer: Acme Co."
  • Actor: "Maya (Support)" рдпрд╛ "System: Nightly Sync"
  • рд╕рдордп: рдкреВрд░реНрдг рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк (рдЯрд╛рдЗрдордЬрд╝реЛрди рд╕рд╣рд┐рдд)
  • рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╛рд░рд╛рдВрд╢: "status: Pending -> Approved, limit: 5,000 -> 7,500"
  • рдЯреИрдЧреНрд╕: Updated, Deleted, Integration, Job

"рдХреНрдпрд╛ рдмрджрд▓рд╛" рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рдЦреЗрдВред 1тАУ3 рдлрд╝реАрд▓реНрдб рдЗрдирд▓рд╛рдЗрди рджрд┐рдЦрд╛рдПрдБ, рдлрд┐рд░ рдПрдХ рдбреНрд░рд┐рд▓-рдбрд╛рдЙрди рдкреИрдирд▓ (drawer/modal) рджреЗрдВ рдЬреЛ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдкреНрд░рдХрдЯ рдХрд░реЗ: before/after рд╡реИрд▓реНрдпреВрдЬрд╝, request source (web, mobile, API), рдФрд░ рдХреЛрдИ reason/comment рдлрд╝реАрд▓реНрдбред

рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдлрд╝реАрдб рдХреЛ рдкрд╣рд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧреА рдмрдирд╛рддреА рд╣реИред рдЙрди рдлрд╝рд┐рд▓реНрдЯрд░реНрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдЬреЛ рдЕрд╕рд▓реА рд╕рд╡рд╛рд▓реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ:

  • Actor (user рдпрд╛ system)
  • Object type (Customers, Orders, Permissions)
  • Action type (Create/Update/Delete/Restore)
  • Date range
  • Text search (record name рдпрд╛ ID)

рд▓рд┐рдВрдХрд┐рдВрдЧ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИ, рдкрд░ рдХреЗрд╡рд▓ рдЬрдм рдЕрдиреБрдорддрд┐ рд╣реЛред рдЕрдЧрд░ рд╡реНрдпреВрдЕрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдПрдХреНрд╕реЗрд╕ рд╣реИ, рддреЛ "View record" рдПрдХреНрд╢рди рджрд┐рдЦрд╛рдПрдБред рдЕрдЧрд░ рдирд╣реАрдВ, рддреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рджрд┐рдЦрд╛рдПрдБ (рдЙрджрд╛., "Restricted record") рдЬрдмрдХрд┐ рдСрдбрд┐рдЯ рдПрдВрдЯреНрд░реА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд░рд╣реЗред

рд╕рд┐рд╕реНрдЯрдо рдПрдХреНрд╢рдиреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдПрдВред рд╢реЗрдбреНрдпреВрд▓реНрдб рдЬреЙрдмреНрд╕ рдФрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рдиреНрд╕ рдХреЛ рдЕрд▓рдЧ рд▓реЗрдмрд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдПрдбрдорд┐рдиреНрд╕ рдмрддрд╛ рд╕рдХреЗрдВ "Dana рдиреЗ рд╣рдЯрд╛рдпрд╛" рдФрд░ "Nightly billing sync рдиреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛" рдореЗрдВ рдлрд░реНрдХред

рдСрдбрд┐рдЯ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рдорд┐рд╢рдиреНрд╕ рдФрд░ рдкреНрд░рд╛рдЗрд╡реЗрд╕реА рдирд┐рдпрдо

рдорд╛рдирд╡реЛрдВ рдХреЛ рдСрдЯреЛрдореЗрд╢рди рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ
рд╕реНрдЯрд╛рдл, рд╕рд┐рд╕реНрдЯрдо рдЬреЙрдмреНрд╕ рдФрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рдиреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ actor рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯреНрд░реИрдХ рдХрд░реЗрдВред
рдЕрднрд┐рд▓реЗрдЦ рдЬреЛрдбрд╝реЗрдВ

рдСрдбрд┐рдЯ рд▓реЙрдЧ рд╕рдмреВрдд рд╣реЛрддреЗ рд╣реИрдВ, рдкрд░ рд╡реЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рднреА рд╣реЛрддреЗ рд╣реИрдВред рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рдЕрдкрдиреА рдРрдк рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░реЛрдбрдХреНрдЯ рдХреА рддрд░рд╣ рдЯреНрд░реАрдЯ рдХрд░реЗрдВ: рд╕реНрдкрд╖реНрдЯ рдПрдХреНрд╕реЗрд╕ рдирд┐рдпрдо, рд╕реНрдкрд╖реНрдЯ рд╕реАрдорд╛рдПрдБ, рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╣реИрдВрдбрд▓рд┐рдВрдЧред

рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреМрди рдХреНрдпрд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рднрд╛рдЬрди рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рд╕рд┐рд╕реНрдЯрдо рдПрдбрдорд┐рди рд╕рдм рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ; рд╡рд┐рднрд╛рдЧреАрдп рдореИрдиреЗрдЬрд░ рдЕрдкрдиреА рдЯреАрдо рдХреЗ рдЗрд╡реЗрдВрдЯреНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ; рд░рд┐рдХреЙрд░реНрдб рдорд╛рд▓рд┐рдХ рдХреЗрд╡рд▓ рдЙрди рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ рдЗрд╡реЗрдВрдЯреНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд░рдЦрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк рдЧрддрд┐рд╡рд┐рдзрд┐ рдлрд╝реАрдб рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рд░реЛ рдкрд░ рд╡рд╣реА рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рди рдХрд┐ рд╕рд┐рд░реНрдлрд╝ рд╕реНрдХреНрд░реАрди рдкрд░ред

рдорд▓реНрдЯреА-рдЯреЗрдиреЗрдВрдЯ рдпрд╛ рдХреНрд░реЙрд╕-рдбрд┐рдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдЯреВрд▓реНрд╕ рдореЗрдВ рд░реЛ-рд╕реНрддрд░реАрдп рджреГрд╢реНрдпрддрд╛ рд╕рдмрд╕реЗ рдЬрд╝рд░реВрд░реА рд╣реИред рдЖрдкрдХреА рдСрдбрд┐рдЯ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╣реА рд╕реНрдХреЛрдкрд┐рдВрдЧ рдХреАрдЬрд╝ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдмрд┐рдЬрд╝рдиреЗрд╕ рдбреЗрдЯрд╛ рдореЗрдВ (tenant_id, department_id, project_id), рддрд╛рдХрд┐ рдЖрдк рд▓рдЧрд╛рддрд╛рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХреЗрдВред рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд╕рдкреЛрд░реНрдЯ рдореИрдиреЗрдЬрд░ рдЕрдкрдиреЗ рдХреНрдпреВ рдХреЗ рдЯрд┐рдХрдЯреНрд╕ рдХреЗ рдмрджрд▓рд╛рд╡ рджреЗрдЦ рд╕рдХреЗ, рдкрд░ HR рдореЗрдВ рд╣реБрдП рд╕реИрд▓рд░реА рд╕рдорд╛рдпреЛрдЬрдиреЛрдВ рдХреЛ рдирд╣реАрдВ, рднрд▓реЗ рд╣реА рджреЛрдиреЛрдВ рдЙрд╕реА рдРрдк рдореЗрдВ рд╣реЛрдВред

рдПрдХ рд╕рд░рд▓ рдиреАрддрд┐ рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ:

  • Admin: tenants рдФрд░ рдбрд┐рдкрд╛рд░реНрдЯрдореЗрдВрдЯреНрд╕ рдореЗрдВ рдкреВрд░рд╛ рдСрдбрд┐рдЯ рдПрдХреНрд╕реЗрд╕
  • Manager: department_id рдпрд╛ project_id рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдСрдбрд┐рдЯ рдПрдХреНрд╕реЗрд╕
  • Record owner: рдХреЗрд╡рд▓ рдЙрди рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рдПрдХреНрд╕реЗрд╕ рдЬрд┐рдирдореЗрдВ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╡реНрдпреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • Auditor/compliance: рд░реАрдб-рдУрдирд▓реА рдПрдХреНрд╕реЗрд╕, рдПрдХреНрд╕реНрдкреЛрд░реНрдЯ рдХреА рдЕрдиреБрдорддрд┐, рдПрдбрд┐рдЯ рдмреНрд▓реЙрдХ
  • рдмрд╛рдХреА рд╣рд░ рдХреЛрдИ: рдбрд┐рдлреЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдИ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ

рдкреНрд░рд╛рдЗрд╡реЗрд╕реА рдиреАрддрд┐ рдЗрд╕рдХрд╛ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ, рдкрд░ рд▓реЙрдЧ рдХреЛ рдЕрдкрдиреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рджреВрд╕рд░реА рдХреЙрдкреА рди рдмрдирд╛рдПрдВред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдбреНрд╕ (SSNs, рдореЗрдбрд┐рдХрд▓ рдиреЛрдЯреНрд╕, рдкреЗрдореЗрдВрдЯ рдбрд┐рдЯреЗрд▓реНрд╕) рдХреЗ рд▓рд┐рдП рд░реЗрдбреИрдХреНрд╢рди рдкрд╕рдВрдж рдХрд░реЗрдВ: рдмрддрд╛рдЗрдП рдХрд┐ рдлрд╝реАрд▓реНрдб рдмрджрд▓рд╛ рдкрд░ рдкреБрд░рд╛рдиреА/рдирдИ рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░ рди рдХрд░реЗрдВред рдЖрдк "email changed" рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реИрд▓реНрдпреВ рдорд╛рд╕реНрдХ рдХреА рд╣реБрдИ рд╣реЛ, рдпрд╛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢реНрдб рдлрд╝рд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рдмрд┐рдЬрд╝рдиреЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рд╕реЗ рдЕрд▓рдЧ рд░рдЦреЗрдВред рд▓реЙрдЧрд┐рди рдкреНрд░рдпрд╛рд╕, MFA рд░реАрд╕реЗрдЯ, API рдХреА рдХреНрд░рд┐рдПрд╢рди рдФрд░ рд░реЛрд▓ рдЪреЗрдВрдЬрд▓реЙрдЧреНрд╕ tighter access рдФрд░ рд▓рдВрдмреА retenion рд╡рд╛рд▓реЗ security_audit рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЬрд╛рдПрдБред рдмрд┐рдЬрд╝рдиреЗрд╕ рдПрдбрд┐рдЯреНрд╕ (status updates, approvals, workflow changes) рд╕рд╛рдорд╛рдиреНрдп audit рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдорд╛рдВрдЧ рдХрд░реЗ, рддреЛ рдкреВрд░рд╛ рдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓ рдорд┐рдЯрд╛рдПрдБ рдорддред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп:

  • рдпреВрдЬрд╝рд░ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдбреЗрдЯрд╛ рд╣рдЯрд╛ рджреЗрдВ рдпрд╛ рдЕрдиреЙрдирд┐рдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВ
  • рд▓реЙрдЧреНрд╕ рдореЗрдВ actor identifiers рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ pseudonym рд╕реЗ рдмрджрд▓реЗрдВ (рдЙрджрд╛., "deleted-user-123")
  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рд╡реИрд▓реНрдпреВрдЬрд╝ рд░реЗрдбреИрдХреНрдЯ рдХрд░реЗрдВ
  • рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк, рдПрдХреНрд╢рди рдЯрд╛рдЗрдк рдФрд░ рд░рд┐рдХреЙрд░реНрдб рд░реЗрдлрд╝рд░реЗрдВрд╕ рд░рдЦреЗрдВ

рд░рд┐рдЯреЗрдВрд╢рди, рдЗрдВрдЯреАрдЧреНрд░рд┐рдЯреА рдФрд░ рдкреНрд░рджрд░реНрд╢рди (рдХрдореНрдкреНрд▓рд╛рдпрдВрд╕ рдХреЗ рд▓рд┐рдП)

рдПрдХ рдЙрдкрдпреЛрдЧреА рдСрдбрд┐рдЯ рд▓реЙрдЧ рд╕рд┐рд░реНрдлрд╝ "рд╣рдо рдЗрд╡реЗрдВрдЯ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддреЗ рд╣реИрдВ" рд╕реЗ рдЖрдЧреЗ рдЬрд╛рддрд╛ рд╣реИред рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рддреАрди рдмрд╛рддреЛрдВ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдЖрдкрдиреЗ рдбреЗрдЯрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рддрдХ рд░рдЦрд╛, рдЙрд╕реЗ рдмрд╛рдж рдореЗрдВ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЧрдпрд╛, рдФрд░ рдЬрдм рдкреВрдЫрд╛ рдЬрд╛рдП рддреЛ рдЖрдк рдЬрд▓реНрджреА рдирд┐рдХрд╛рд▓ рд╕рдХреЗрдВред

рд░рд┐рдЯреЗрдВрд╢рди: рдПрдХ рдиреАрддрд┐ рддрдп рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рд╕рдордЭрд╛ рд╕рдХреЗрдВ

рдЕрдкрдиреЗ рдЬреЛрдЦрд┐рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдХрдИ рдЯреАрдореЗрдВ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдЯреНрд░рдмрд▓рд╢реВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП 90 рджрд┐рди, рдЖрдВрддрд░рд┐рдХ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП 1тАУ3 рд╕рд╛рд▓ рдФрд░ рдХреЗрд╡рд▓ рд╡рд┐рдирд┐рдпрдорди рд╡рд╛рд▓реЗ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛ рд░рдЦрддреА рд╣реИрдВред рд▓рд┐рдЦреЗрдВ рдХрд┐ рдХреНрд▓реЙрдХ рдХреНрдпрд╛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ (рдЕрдХрд╕рд░: рдШрдЯрдирд╛ рдХрд╛ рд╕рдордп) рдФрд░ рдХреНрдпрд╛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛., рд╡реЗ рд▓реЙрдЧреНрд╕ рдЬрд┐рдирдореЗрдВ рдЖрдк рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ)ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИрдВ, рддреЛ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрд▓рдЧ рд░рд┐рдЯреЗрдВрд╢рди рд╕реЗрдЯ рдХрд░реЗрдВред рдкреНрд░реЛрдбрдХреНрд╢рди рд▓реЙрдЧреНрд╕ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рд▓рдВрдмреА рд░рд┐рдЯреЗрдВрд╢рди рдЪрд╛рд╣рд┐рдП; рдЯреЗрд╕реНрдЯ рд▓реЙрдЧреНрд╕ рдЕрдХреНрд╕рд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрддреЗред

рдЗрдВрдЯреАрдЧреНрд░рд┐рдЯреА: рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рдХрдард┐рди рдмрдирд╛рдПрдВ

рдСрдбрд┐рдЯ рд▓реЙрдЧреНрд╕ рдХреЛ append-only рдорд╛рдиреЗрдВред рд░реЙрдЬрд╝ рдХреЛ рдЕрдкрдбреЗрдЯ рди рдХрд░реЗрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдПрдбрдорд┐рдиреНрд╕ рдХреЛ рдЙрдиреНрд╣реЗрдВ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗрдВред рдЕрдЧрд░ рдХрд┐рд╕реА рдбрд┐рд▓реАрдЯ рдХреА рдЕрд╕рд▓реА рдЬрд╝рд░реВрд░рдд рд╣реИ (рдХрд╛рдиреВрдиреА рдЕрдиреБрд░реЛрдз, рдбреЗрдЯрд╛ рдХреНрд▓реАрдирдЕрдк), рддреЛ рдЙрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рднреА рдПрдХ рдЗрд╡реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВред

рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкреИрдЯрд░реНрди:

  • рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рд▓рд┐рдЦреЗ, рдХрднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ
  • рд╕рд╛рдорд╛рдиреНрдп рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рдЯреЗрдмрд▓ рдкрд░ UPDATE/DELETE рдЕрдиреБрдорддрд┐ рди рджреЗрдВ
  • рджреБрд░реНрд▓рдн purge рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ "break glass" рднреВрдорд┐рдХрд╛
  • рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдореБрдЦреНрдп рдРрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдирд┐рд░реНрдпрд╛рдд рд╕реНрдиреИрдкрд╢реЙрдЯ рд░рдЦреЗрдВ

рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕, рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ

рдСрдбрд┐рдЯрд░реНрд╕ рдЕрдХреНрд╕рд░ CSV рдпрд╛ JSON рдорд╛рдВрдЧрддреЗ рд╣реИрдВред рдПрдХ рдРрд╕рд╛ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдкреНрд▓рд╛рди рдХрд░реЗрдВ рдЬреЛ рддрд╛рд░реАрдЦрд╝ рд░реЗрдВрдЬ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯрд╛рдЗрдк (рдЬреИрд╕реЗ Invoice, User, Ticket) рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХреЗ рддрд╛рдХрд┐ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕рдордп рдкрд░ рд╣рд╛рде рд╕реЗ рдХреНрд╡реЗрд░реА рди рдХрд░ рд░рд╣реЗ рд╣реЛрдВред

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рдЙрд╕реА рддрд░рд╣ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░реЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рдЖрдк рдЦреЛрдЬрддреЗ рд╣реИрдВ:

  • created_at (рдЯрд╛рдЗрдо рд░реЗрдВрдЬ рдХреНрд╡реЗрд░реАрдЬрд╝)
  • object_type + object_id (рдХрд┐рд╕реА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкреВрд░рд╛ рдЗрддрд┐рд╣рд╛рд╕)
  • actor_id (рдХрд┐рд╕рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛)

рд╕рд╛рдЗрд▓реЗрдВрдЯ рдлрд╝реЗрд▓рд┐рдпрд░ рдкрд░ рдирдЬрд░ рд░рдЦреЗрдВред рдЕрдЧрд░ рдСрдбрд┐рдЯ рд░рд╛рдЗрдЯ рд╡рд┐рдлрд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рд╛рдХреНрд╖реНрдп рдЦреЛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрд▓рд░реНрдЯ рдЬреЛрдбрд╝реЗрдВ: рдЕрдЧрд░ рдРрдк рд▓рд┐рдЦрддрд╛ рд╣реИ рдкрд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯреНрд╕ рдПрдХ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╢реВрдиреНрдп рдкрд░ рдЧрд┐рд░ рдЬрд╛рдПрдБ, рддреЛ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЛ рдиреЛрдЯрд┐рдлрд╝рд╛рдИ рдХрд░реЗрдВ рдФрд░ рдПрд░рд░ рдХреЛ рдЬреЛрд░ рд╕реЗ рд▓реЙрдЧ рдХрд░реЗрдВред

рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдСрдбрд┐рдЯ рд▓реЙрдЧреНрд╕ рдХреЛ рдмреЗрдХрд╛рд░ рдмрдирд╛рддреА рд╣реИрдВ

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕реЗ рдкреНрд░реЛрдбрдХреНрд╢рди рддрдХ рдЬрд╛рдПрдБ
рдЬрдм рдЖрдкрдХреЛ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рдЪрд╛рд╣рд┐рдП рддреЛ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЙрдб рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ рдпрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░реЗрдВред
рдРрдк рддреИрдирд╛рдд рдХрд░реЗрдВ

рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХрд╛ рд╣реИ рдмрд╣реБрдд рд╕реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЬреЛ рдЕрд╕рд▓реА рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддреАрдВ: рдХрд┐рд╕рдиреЗ рдХреНрдпрд╛ рдмрджрд▓рд╛, рдХрдм рдФрд░ рдХрд╣рд╛рдБ рд╕реЗред

рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд▓ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреНрд░рд┐рдЧрд░реНрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рдирд╛ рд╣реИред рдЯреНрд░рд┐рдЧрд░реНрд╕ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкрдВрдХреНрддрд┐ рдмрджрд▓реА, рдкрд░ рд╡реЗ рдЕрдХреНрд╕рд░ рдмрд┐рдЬрд╝рдиреЗрд╕ рд╕рдВрджрд░реНрдн рдЪреВрдХ рдЬрд╛рддреЗ рд╣реИрдВ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХреМрди рд╕рд╛ рд╕реНрдХреНрд░реАрди рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдХрд┐рд╕ рдЕрдиреБрд░реЛрдз рдиреЗ рдЗрд╕реЗ рдХрд┐рдпрд╛, рдХрд┐рд╕ рд░реЛрд▓ рдХреЗ рд╕рд╛рде рдерд╛, рдФрд░ рдХреНрдпрд╛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдПрдбрд┐рдЯ рдерд╛ рдпрд╛ рдХреЛрдИ рдСрдЯреЛрдореЗрдЯреЗрдб рдирд┐рдпрдоред

рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рд╕рдмрд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдЕрдиреБрдкрд╛рд▓рди рдФрд░ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдЙрдкрдпреЛрдЧрд┐рддрд╛ рддреЛрдбрд╝рддреА рд╣реИрдВ:

  • рд╕рдВрд╡реЗрджрдирд╢реАрд▓ payloads (рдкрд╛рд╕рд╡рд░реНрдб рд░рд┐рд╕реЗрдЯреНрд╕, рдЯреЛрдХрди, рдкреНрд░рд╛рдЗрд╡реЗрдЯ рдиреЛрдЯреНрд╕) рдХреА рдкреВрд░реА рдХреЙрдкреА рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рдмрдЬрд╛рдп рдПрдХ рдорд┐рдирд┐рдорд▓ рдбрд┐рдлрд╝ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣рдЪрд╛рди рдХреЗ
  • рд▓реЛрдЧреЛрдВ рдХреЛ рдСрдбрд┐рдЯ рд░рд┐рдХреЙрд░реНрдбреНрд╕ "рд╕рд╣реА рдХрд░рдиреЗ" рдХреЗ рд▓рд┐рдП рдПрдбрд┐рдЯ рдпрд╛ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рджреЗрдирд╛
  • рдЧреИрд░-UI рд░рд╛рдЗрдЯ рдкрд╛рдереНрд╕ рдЬреИрд╕реЗ CSV рдЗрдореНрдкреЛрд░реНрдЯреНрд╕, рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рдиреНрд╕, рдФрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЙрдмреНрд╕ рднреВрд▓ рдЬрд╛рдирд╛
  • inconsistent action names ("Updated," "Edit," "Change," "Modify") рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд┐рд╕рд╕реЗ рдлрд╝реАрдб рд╢реЛрд░ рдЬреИрд╕рд╛ рдкрдврд╝реЗ
  • рд╕рд┐рд░реНрдл рдСрдмреНрдЬреЗрдХреНрдЯ ID рд▓реЙрдЧ рдХрд░рдирд╛, рдЙрд╕ рд╕рдордп рдХрд╛ рдорд╛рдирд╡-рдкрдардиреАрдп рдирд╛рдо рди рд▓реЙрдЧ рдХрд░рдирд╛ (рдХреНрдпреЛрдВрдХрд┐ рдирд╛рдо рдмрд╛рдж рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ)

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдЕрдкрдиреЗ рдЗрд╡реЗрдВрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░реЗрдВ (рдЙрджрд╛.: user.created, user.updated, invoice.voided, access.granted) рдФрд░ рд╣рд░ write рдкрд╛рде рд╕реЗ рдПрдХ рдЗрд╡реЗрдВрдЯ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд░рдЦреЗрдВред рдСрдбрд┐рдЯ рдбреЗрдЯрд╛ рдХреЛ write-once рдорд╛рдиреЗрдВ: рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдЧрд▓рдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛, рддреЛ рдПрдХ рдирдпрд╛ corrective action рд▓реЙрдЧ рдХрд░реЗрдВ рдмрдЬрд╛рдп рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗред

рддреНрд╡рд░рд┐рдд рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдФрд░ рдЕрдЧрд▓реЗ рдХрджрдо

рдЦрддреНрдо рдХрд╣рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рддреЗрдЬрд╝ рдЬрд╛рдВрдЪреЗрдВред рдПрдХ рдЕрдЪреНрдЫрд╛ рдСрдбрд┐рдЯ рд▓реЙрдЧ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рддрд░реАрдХреЗ рд╕реЗ рдмреЛрд░рд┐рдВрдЧ рд╣реЛрддрд╛ рд╣реИ: рдкреВрд░рд╛, рд╕реБрд╕рдВрдЧрдд, рдФрд░ рдЬрдм рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рддреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиред

рд░рд┐рдпрд▓рд┐рд╕реНрдЯрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдпрд╣ рдЪреЗрдХрд▓рд┐рд╕реНрдЯ рдЪрд▓рд╛рдПрдБ:

  • рд╣рд░ create, update, delete, restore рдФрд░ bulk edit рдкреНрд░рднрд╛рд╡рд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рдареАрдХ рдПрдХ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ (рдХреЛрдИ рдЧреИрдк рдирд╣реАрдВ, рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ)ред
  • рд╣рд░ рдЗрд╡реЗрдВрдЯ рдореЗрдВ actor (user рдпрд╛ system), timestamp (UTC), action, рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд░реЗрдлрд╝рд░реЗрдВрд╕ (type + ID) рд╢рд╛рдорд┐рд▓ рд╣реИред
  • "рдХреНрдпрд╛ рдмрджрд▓рд╛" рд╡реНрдпреВ рдкрдардиреАрдп рд╣реИ: рдлрд╝реАрд▓реНрдб рдирд╛рдо рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, old/new рд╡реИрд▓реНрдпреВрдЬрд╝ рджрд┐рдЦрддреА рд╣реИрдВ, рдФрд░ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдб рдорд╛рд╕реНрдХ рдпрд╛ рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рд╣реИрдВред
  • рдПрдбрдорд┐рди рд╕рдордп рд░реЗрдВрдЬ, actor, action, рдФрд░ object рджреНрд╡рд╛рд░рд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд░рд┐рд╡реНрдпреВрдЬрд╝ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рд▓реЙрдЧ рдЫреЗрдбрд╝рдЫрд╛рдбрд╝ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ: рдЕрдзрд┐рдХрд╛рдВрд╢ рднреВрдорд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП write-only, рдФрд░ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдпрд╛ рддреЛ рд░реЛрдХреЗ рд╣реБрдП рд╣реИрдВ рдпрд╛ рдЕрд▓рдЧ рд╕реЗ рдСрдбрд┐рдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрдЧрд░ рдЖрдк рдЖрдВрддрд░рд┐рдХ рдЯреВрд▓ AppMaster (appmaster.io) рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХрд╡рд░реЗрдЬ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ UI рдПрдХреНрд╢рдиреНрд╕, API рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕, рдЗрдореНрдкреЛрд░реНрдЯреНрд╕ рдФрд░ рдСрдЯреЛрдореЗрд╢рдиреНрд╕ рдХреЛ рдЙрд╕реА Business Process рдкреИрдЯрд░реНрди рдХреЗ рдЬрд░рд┐рдП рд░реВрдЯ рдХрд░реЗрдВ рдЬреЛ рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рджреЛрдиреЛрдВ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдкрдХрд╛ CRUD рдСрдбрд┐рдЯ рдЯреНрд░реЗрд▓ рд╕реНрдХреНрд░реАрди рдФрд░ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдмрджрд▓рдиреЗ рдкрд░ рднреА рд╕реБрд╕рдВрдЧрдд рд░рд╣рддрд╛ рд╣реИред

рдПрдХ workflow рд╕реЗ рдЫреЛрдЯреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ рдЬреЛ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИ (tickets, approvals, billing changes), рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдлрд╝реАрдб рдХреЛ рдкрдардиреАрдп рдмрдирд╛рдПрдВ, рдлрд┐рд░ рддрдм рддрдХ рдмрдврд╝рд╛рдПрдБ рдЬрдм рддрдХ рд╣рд░ рд░рд╛рдЗрдЯ рдкрд╛рде рдПрдХ рдкреВрд░реНрд╡рд╛рдиреБрдореЗрдп, рд╕рд░реНрдЪреЗрдмрд▓ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╢реНрди

When should we add audit logs to an internal tool?

рдЬрдм рднреА рдЯреВрд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реЛ, рдЙрд╕реА рд╕рдордп рдСрдбрд┐рдЯ рд▓реЙрдЧ рдЬреЛрдбрд╝ рджреЗрдВред рдкрд╣рд▓рд╛ рд╡рд┐рд╡рд╛рдж рдпрд╛ рдСрдбрд┐рдЯ рдЕрдиреБрд░реЛрдз рдЕрдХреНрд╕рд░ рддрдм рдЖрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк тАЬрддреИрдпрд╛рд░тАЭ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрддрд┐рд╣рд╛рд╕ рднрд░рдирд╛ рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдВрдзрд╛рдзреБрдВрдз рдЕрдиреБрдорд╛рди рд╣реЛрддрд╛ рд╣реИред

WhatтАЩs the minimum an audit log should tell us?

рдПрдХ рдЙрдкрдпреЛрдЧреА рдСрдбрд┐рдЯ рд▓реЙрдЧ рдпрд╣ рддреБрд░рдВрдд рдмрддрд╛ рд╕рдХреЗ рдХрд┐ рдХрд┐рд╕рдиреЗ рдХрд┐рдпрд╛, рдХреМрди рд╕рд╛ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ, рдХреНрдпрд╛ рдмрджрд▓рд╛, рдХрдм рд╣реБрдЖ, рдФрд░ рдХрд╣рд╛рдБ рд╕реЗ рдЖрдпрд╛ (UI, API, import, рдпрд╛ job)ред рдЕрдЧрд░ рдЖрдк рдЗрди рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХрд╛ рдЬрд▓реНрджреА рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рдкрд╛рддреЗ рддреЛ рд▓реЛрдЧ рд▓реЙрдЧ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

WhatтАЩs the difference between debug logs and audit logs?

рдбрд┐рдмрдЧ рд▓реЙрдЧ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЕрдХреНрд╕рд░ рд╢реЛрд░ рд╡рд╛рд▓реЗ рд╡ рдЕрдирд┐рдпрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдСрдбрд┐рдЯ рд▓реЙрдЧ рдЬрд╡рд╛рдмрджреЗрд╣реА рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВтАФрдЗрдирдореЗрдВ рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдб, рд╕реНрдкрд╖реНрдЯ рд╢рдмреНрджрд╛рд╡рд▓реА рдФрд░ рдПрдХ рдРрд╕рд╛ рдлрд╝реЙрд░реНрдореИрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЧреИрд░-рдЗрдВрдЬреАрдирд┐рдпрд░реНрд╕ рдХреЗ рд▓рд┐рдП рднреА рд╕рдордп рдХреЗ рд╕рд╛рде рдкрдардиреАрдп рд░рд╣реЗред

Why do audit logs have gaps even when we log normal edits?

рдХрд╡рд░реЗрдЬ рддрдм рдлреЗрд▓ рд╣реЛрддреА рд╣реИ рдЬрдм рдкрд░рд┐рд╡рд░реНрддрди рд╕рд╛рдорд╛рдиреНрдп рдПрдбрд┐рдЯ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддреЗ рд╣реИрдВред рдмрд▓реНрдХ рдПрдбрд┐рдЯреНрд╕, рдЗрдореНрдкреЛрд░реНрдЯреНрд╕, рд╢реЗрдбреНрдпреВрд▓реНрдб рдЬреЙрдмреНрд╕, рдПрдбрдорд┐рди рд╢реЙрд░реНрдЯрдХрдЯ рдФрд░ рдбрд┐рд▓реАрдЯреНрд╕ рд╡реЗ рдЖрдо рдЬрдЧрд╣реЗрдВ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЯреАрдо рдЕрдХреНрд╕рд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯреНрд╕ рдЫреЛрдбрд╝ рджреЗрддреА рд╣реИред

How do we log actions done by automations or integrations?

actor_type рдФрд░ actor identifier рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ, рд╕рд┐рд░реНрдлрд╝ user ID рдирд╣реАрдВред рдЗрд╕рд╕реЗ рдЖрдк рдПрдХ рд╕реНрдЯрд╛рдл рд╕рджрд╕реНрдп, рд╕рд┐рд╕реНрдЯрдо рдЬреЙрдм, рд╕рд░реНрд╡рд┐рд╕ рдЕрдХрд╛рдЙрдиреНрдЯ рдпрд╛ рдмрд╛рд╣рд░реА рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдореЗрдВ рдлрд░реНрдХ рдмрддрд╛ рд╕рдХреЗрдВрдЧреЗ рдФрд░ тАЬрдХрд┐рд╕реА рдиреЗ рдХрд┐рдпрд╛тАЭ рдЬреИрд╕реА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдмрдЪ рдЬрд╛рдПрдЧреАред

Should audit timestamps be stored in UTC or local time?

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ timestamps UTC рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ, рдФрд░ рдПрдбрдорд┐рди UI рдореЗрдВ рд╡реНрдпреВрдЕрд░ рдХреЗ рд▓реЛрдХрд▓ рдЯрд╛рдЗрдо рдореЗрдВ рджрд┐рдЦрд╛рдПрдБред рдЗрд╕рд╕реЗ рдЯрд╛рдЗрдордЬрд╝реЛрди рдХреЗ рд╡рд┐рд╡рд╛рдж рдмрдЪрддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕рдкреЛрд░реНрдЯреНрд╕ рднреА рд╕рдВрдЧрдд рд░рд╣рддреЗ рд╣реИрдВред

Should we use an event log table or per-entity version history?

рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЦреЛрдЬ рдФрд░ рдЖрд╕рд╛рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдлрд╝реАрдб рдХреЗ рд▓рд┐рдП append-only event log рдЪреБрдиреЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдХрд┐рд╕реА рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ point-in-time рджреГрд╢реНрдп рдЪрд╛рд╣рд┐рдП рддреЛ per-entity versioned history рдЪреБрдиреЗрдВ; рдХрдИ рдРрдкреНрд╕ рдореЗрдВ field-level diffs рдХреЗ рд╕рд╛рде event log рдЕрдзрд┐рдХ рд╕рд╕реНрдЯреЗрдиреЗрдмрд▓ рд░рд╣рддрд╛ рд╣реИред

How should we handle deletes so we donтАЩt erase evidence?

рд╕рд╛рдХреНрд╖реНрдп рдорд┐рдЯрд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП soft delete рдкрд╕рдВрдж рдХрд░реЗрдВ рдФрд░ delete рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдкрдХреЛ hard delete рдХрд░рдиреА рд╣реА рд╣реИ рддреЛ рдкрд╣рд▓реЗ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рд▓рд┐рдЦреЗрдВ рдФрд░ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдпрд╛ рдкреНрд░рдореБрдЦ рдлрд╝реАрд▓реНрдб рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХреНрдпрд╛ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

How do we log тАЬwhat changedтАЭ without storing sensitive data?

рдЕрдкрдбреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ field-level diffs рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдФрд░ creates/deletes рдХреЗ рд▓рд┐рдП рд╕реНрдиреИрдкрд╢реЙрдЯ рд░рдЦреЗрдВред рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ рдХрд┐ рд╡реИрд▓реНрдпреВ рдмрджрд▓реА, рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдХреЛ рд░реЗрдбреИрдХреНрдЯ/рдорд╛рд╕реНрдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдСрдбрд┐рдЯ рд▓реЙрдЧ рдЖрдкрдХреА рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рджреВрд╕рд░реА рдХреЙрдкреА рди рдмрди рдЬрд╛рдПред

How do we ensure every write path actually produces an audit event?

рдПрдХ рд╕рд╛рдЭрд╛ тАЬwrite + auditтАЭ рдкрд╛рде рдмрдирд╛рдПрдБ рдФрд░ рд╣рд░ рд░рд╛рдЗрдЯ рдХреЛ рдЙрд╕реА рдХреЗ рдЬрд╝рд░рд┐рдП рд╣реЛрдиреЗ рдкрд░ рдЬрд╝реЛрд░ рджреЗрдВтАФUI, API, рдЗрдореНрдкреЛрд░реНрдЯ, рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЬреЙрдмреНрд╕ рд╕рд╣рд┐рддред AppMaster рдореЗрдВ рдЯреАрдореЗрдВ рдЕрдХреНрд╕рд░ рдпрд╣ рдПрдХ рдкреБрди:рдЙрдкрдпреЛрдЧреА Business Process рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдлреНрд▓реЛ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдСрдбрд┐рдЯ рдЗрд╡реЗрдВрдЯ рджреЛрдиреЛрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЧреИрдк рди рд░рд╣реЗред

рд╢реБрд░реВ рдХрд░рдирд╛ рдЖрд╕рд╛рди
рдХреБрдЫ рдмрдирд╛рдПрдВ рдЕрджреНрднреБрдд

рдлреНрд░реА рдкреНрд▓рд╛рди рдХреЗ рд╕рд╛рде рдРрдкрдорд╛рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
рдЬрдм рдЖрдк рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ рддрдм рдЖрдк рдЙрдЪрд┐рдд рд╕рджрд╕реНрдпрддрд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ
рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдЯ рд▓реЙрдЧрд┐рдВрдЧ: рд╕рд╛рдлрд╝ рдкрд░рд┐рд╡рд░реНрддрди рдЗрддрд┐рд╣рд╛рд╕ рдкреИрдЯрд░реНрди | AppMaster