Add deprecation plan review gates. (#3659)

* Add deprecation plan review gates.

* Incorporated feedback from stakeholders.
This commit is contained in:
Jason Robbins 2024-03-07 18:11:17 +00:00 коммит произвёл GitHub
Родитель 9c991272ae
Коммит c7cc90a7d3
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
7 изменённых файлов: 64 добавлений и 12 удалений

Просмотреть файл

@ -872,13 +872,19 @@ export const GATE_QUESTIONNAIRES = {
[enums.GATE_TYPES.API_ORIGIN_TRIAL]: BLINK_GENERIC_QUESTIONNAIRE,
[enums.GATE_TYPES.API_EXTEND_ORIGIN_TRIAL]: BLINK_GENERIC_QUESTIONNAIRE,
[enums.GATE_TYPES.API_SHIP]: BLINK_GENERIC_QUESTIONNAIRE,
[enums.GATE_TYPES.API_PLAN]: BLINK_GENERIC_QUESTIONNAIRE,
[enums.GATE_TYPES.PRIVACY_ORIGIN_TRIAL]: PRIVACY_GENERIC_QUESTIONNAIRE,
[enums.GATE_TYPES.PRIVACY_SHIP]: PRIVACY_GENERIC_QUESTIONNAIRE,
// Note: There is no privacy planning gate.
[enums.GATE_TYPES.SECURITY_ORIGIN_TRIAL]: SECURITY_GENERIC_QUESTIONNAIRE,
[enums.GATE_TYPES.SECURITY_SHIP]: SECURITY_GENERIC_QUESTIONNAIRE,
// Note: There is no security planning gate.
[enums.GATE_TYPES.ENTERPRISE_SHIP]: ENTERPRISE_SHIP_QUESTIONNAIRE,
[enums.GATE_TYPES.ENTERPRISE_PLAN]: ENTERPRISE_SHIP_QUESTIONNAIRE,
[enums.GATE_TYPES.DEBUGGABILITY_ORIGIN_TRIAL]:
DEBUGGABILITY_ORIGIN_TRIAL_QUESTIONNAIRE,
[enums.GATE_TYPES.DEBUGGABILITY_SHIP]: DEBUGGABILITY_SHIP_QUESTIONNAIRE,
[enums.GATE_TYPES.DEBUGGABILITY_PLAN]: DEBUGGABILITY_SHIP_QUESTIONNAIRE,
[enums.GATE_TYPES.TESTING_SHIP]: TESTING_SHIP_QUESTIONNAIRE,
[enums.GATE_TYPES.TESTING_PLAN]: TESTING_SHIP_QUESTIONNAIRE,
};

Просмотреть файл

@ -362,15 +362,20 @@ export const GATE_TYPES = {
API_ORIGIN_TRIAL: 2,
API_EXTEND_ORIGIN_TRIAL: 3,
API_SHIP: 4,
API_PLAN: 5,
PRIVACY_ORIGIN_TRIAL: 32,
PRIVACY_SHIP: 34,
// Not needed: PRIVACY_PLAN: 35,
SECURITY_ORIGIN_TRIAL: 42,
SECURITY_SHIP: 44,
// Not needed: SECURITY_PLAN: 45,
ENTERPRISE_SHIP: 54,
ENTERPRISE_PLAN: 55,
DEBUGGABILITY_ORIGIN_TRIAL: 62,
DEBUGGABILITY_SHIP: 64,
DEBUGGABILITY_PLAN: 65,
TESTING_SHIP: 74,
TESTING_PLAN: 75,
};
export const GATE_PREPARING = 0;

Просмотреть файл

@ -92,6 +92,12 @@ ShipApproval = ApprovalFieldDef(
core_enums.GATE_API_SHIP, THREE_LGTM,
approvers=API_OWNERS_URL, team_name='API Owners')
PlanApproval = ApprovalFieldDef(
'Intent to Deprecate and Remove',
'Three API Owners must approve your intent',
core_enums.GATE_API_PLAN, THREE_LGTM,
approvers=API_OWNERS_URL, team_name='API Owners')
PrivacyOriginTrialApproval = ApprovalFieldDef(
'Privacy OT Review',
'Privacy OT Review',
@ -108,6 +114,8 @@ PrivacyShipApproval = ApprovalFieldDef(
escalation_email='chrome-privacy-owp-rotation@google.com',
slo_initial_response=6)
# Note: There is no PrivacyPlanApproval
SecurityOriginTrialApproval = ApprovalFieldDef(
'Security OT Review',
'Security OT Review',
@ -122,12 +130,20 @@ SecurityShipApproval = ApprovalFieldDef(
approvers=SECURITY_APPROVERS, team_name='Security',
slo_initial_response=6)
# Note: There is no SecurityPlanApproval
EnterpriseShipApproval = ApprovalFieldDef(
'Enterprise Ship Review',
'Enterprise Ship Review',
core_enums.GATE_ENTERPRISE_SHIP, ONE_LGTM,
approvers=ENTERPRISE_APPROVERS, team_name='Enterprise')
EnterprisePlanApproval = ApprovalFieldDef(
'Enterprise Deprecation Plan Review',
'Enterprise Deprecation Plan Review',
core_enums.GATE_ENTERPRISE_PLAN, ONE_LGTM,
approvers=ENTERPRISE_APPROVERS, team_name='Enterprise')
DebuggabilityOriginTrialApproval = ApprovalFieldDef(
'Debuggability OT Review',
'Debuggability OT Review',
@ -142,22 +158,36 @@ DebuggabilityShipApproval = ApprovalFieldDef(
approvers=DEBUGGABILITY_APPROVERS, team_name='Debuggability',
escalation_email='devtools-dev@chromium.org')
DebuggabilityPlanApproval = ApprovalFieldDef(
'Debuggability Deprecation Plan Review',
'Debuggability Deprecation Plan Review',
core_enums.GATE_DEBUGGABILITY_PLAN, ONE_LGTM,
approvers=DEBUGGABILITY_APPROVERS, team_name='Debuggability',
escalation_email='devtools-dev@chromium.org')
TestingShipApproval = ApprovalFieldDef(
'Testing Ship Review',
'Testing Ship Review',
core_enums.GATE_TESTING_SHIP, ONE_LGTM,
approvers=TESTING_APPROVERS, team_name='Testing')
TestingPlanApproval = ApprovalFieldDef(
'Testing Deprecation Plan Review',
'Testing Deprecation Plan Review',
core_enums.GATE_TESTING_PLAN, ONE_LGTM,
approvers=TESTING_APPROVERS, team_name='Testing')
APPROVAL_FIELDS_BY_ID = {
afd.field_id: afd
for afd in [
PrototypeApproval, ExperimentApproval, ExtendExperimentApproval,
ShipApproval,
ShipApproval, PlanApproval,
PrivacyOriginTrialApproval, PrivacyShipApproval,
SecurityOriginTrialApproval, SecurityShipApproval,
EnterpriseShipApproval,
EnterpriseShipApproval, EnterprisePlanApproval,
DebuggabilityOriginTrialApproval, DebuggabilityShipApproval,
TestingShipApproval,
DebuggabilityPlanApproval,
TestingShipApproval, TestingPlanApproval,
]
}

Просмотреть файл

@ -282,14 +282,20 @@ GATE_API_PROTOTYPE = 1
GATE_API_ORIGIN_TRIAL = 2
GATE_API_EXTEND_ORIGIN_TRIAL = 3
GATE_API_SHIP = 4
GATE_API_PLAN = 5
GATE_PRIVACY_ORIGIN_TRIAL = 32
GATE_PRIVACY_SHIP = 34
# Not needed: GATE_PRIVACY_PLAN = 35
GATE_SECURITY_ORIGIN_TRIAL = 42
GATE_SECURITY_SHIP = 44
# Not needed: GATE_SECURITY_PLAN = 45
GATE_ENTERPRISE_SHIP = 54
GATE_ENTERPRISE_PLAN = 55
GATE_DEBUGGABILITY_ORIGIN_TRIAL = 62
GATE_DEBUGGABILITY_SHIP = 64
GATE_DEBUGGABILITY_PLAN = 65
GATE_TESTING_SHIP = 74
GATE_TESTING_PLAN = 75
# List of (stage type, gate type) for each feature type.
STAGES_AND_GATES_BY_FEATURE_TYPE: dict[int, list[tuple[int, list[int]]]] = {
@ -328,7 +334,11 @@ STAGES_AND_GATES_BY_FEATURE_TYPE: dict[int, list[tuple[int, list[int]]]] = {
(STAGE_PSA_DEV_TRIAL, []),
(STAGE_PSA_SHIPPING, [GATE_API_SHIP])],
FEATURE_TYPE_DEPRECATION_ID: [
(STAGE_DEP_PLAN, []),
(STAGE_DEP_PLAN,
[# Not needed: GATE_PRIVACY_PLAN, GATE_SECURITY_PLAN,
GATE_ENTERPRISE_PLAN,
GATE_DEBUGGABILITY_PLAN, GATE_TESTING_PLAN,
GATE_API_PLAN]),
(STAGE_DEP_DEV_TRIAL, []),
(STAGE_DEP_DEPRECATION_TRIAL,
[GATE_PRIVACY_ORIGIN_TRIAL, GATE_SECURITY_ORIGIN_TRIAL,

Просмотреть файл

@ -480,10 +480,10 @@ PSA_ONLY_PROCESS = Process(
DEPRECATION_STAGES = [
ProcessStage(
'Write up motivation',
'Write up deprecation plan',
'Create an initial WebStatus feature entry to deprecate '
'an existing feature, including motivation and impact. '
'Then, move existing Chromium code under a flag.',
'Then, get approval for your deprecation plans.',
[PI_EXISTING_FEATURE,
PI_MOTIVATION,
],
@ -538,7 +538,8 @@ DEPRECATION_STAGES = [
ProcessStage(
'Prepare to ship',
'Lock in shipping milestone. '
'Finalize docs and announcements before disabling feature by default.',
'Finalize docs and announcements before disabling feature by default. '
'If there were changes since your plan approvals, get approvals again.',
[PI_UPDATED_TARGET_MILESTONE,
PI_I2S_EMAIL,
PI_I2S_LGTMS,

Просмотреть файл

@ -75,11 +75,11 @@ class IntentEmailPreviewHandler(basehandlers.FlaskHandler):
def compute_subject_prefix(self, feature, intent_stage):
"""Return part of the subject line for an intent email."""
if intent_stage == core_enums.INTENT_INCUBATE:
if intent_stage == core_enums.INTENT_IMPLEMENT:
if feature.feature_type == core_enums.FEATURE_TYPE_DEPRECATION_ID:
return 'Intent to Deprecate and Remove'
elif intent_stage == core_enums.INTENT_IMPLEMENT:
return 'Intent to Prototype'
else:
return 'Intent to Prototype'
elif intent_stage == core_enums.INTENT_EXPERIMENT:
return 'Ready for Developer Testing'
elif intent_stage == core_enums.INTENT_ORIGIN_TRIAL:

Просмотреть файл

@ -198,7 +198,7 @@ class IntentEmailPreviewHandlerTest(testing_config.CustomTestCase):
self.assertEqual(
'Intent to Deprecate and Remove',
self.handler.compute_subject_prefix(
self.feature_1, core_enums.INTENT_INCUBATE))
self.feature_1, core_enums.INTENT_IMPLEMENT))
self.assertEqual(
'Request for Deprecation Trial',