mirror of
https://github.com/hansjone/netx.git
synced 2026-10-11 23:20:52 +08:00
Tighten cutover verdicts and scope iface metrics by port mapping.
Mapped interfaces are the expect set and must appear after cutover; unmapped same-name down/up is anomaly. Success presets no longer treat bare unchanged as green. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
27c6b7c61d
commit
88b7558a48
11 changed files with 4663 additions and 1497 deletions
|
|
@ -288,8 +288,16 @@ const en = {
|
|||
stepPickMetrics: "① Pick metrics",
|
||||
stepConfigRules: "② Configure compare rules",
|
||||
pickMetricsHint: "Check metrics to add. Then configure each sheet below.",
|
||||
noMetricsYet: "Select at least one metric above",
|
||||
pickMetricsHintShort: "Click to add/remove; switch sheets in the left list below.",
|
||||
showMetrics: "Show metric picker",
|
||||
hideMetrics: "Hide metric picker",
|
||||
noMetricsYet: "Select at least one metric first",
|
||||
selectedCount: "{{n}} selected",
|
||||
tabFields: "Field rules",
|
||||
tabFilters: "Row filters",
|
||||
fieldsHintShort:
|
||||
"Key aligns rows; Compare fields take part in value diff; empty compare = presence-only.",
|
||||
tagCompareN: "{{n}} cmp",
|
||||
colFields: "Fields",
|
||||
keyFields: "Key",
|
||||
ifaceFields: "Interface",
|
||||
|
|
@ -301,7 +309,7 @@ const en = {
|
|||
modeEq: "Exact equal",
|
||||
modeNumeric: "Abs delta",
|
||||
modePercent: "Relative %",
|
||||
normalizeField: "Normalize",
|
||||
normalizeField: "Norm",
|
||||
ignoreFields: "Ignore",
|
||||
field: "Field",
|
||||
note: "Note",
|
||||
|
|
@ -312,12 +320,17 @@ const en = {
|
|||
rowFilters: "Row filter rules",
|
||||
rowFiltersHint:
|
||||
"Filter rows before compare. Conditions in a group are AND; groups are OR. Selecting ARP seeds editable default rules you can change.",
|
||||
rowFiltersEmpty: "No filters → compare all rows. Add a condition group to start.",
|
||||
filterClear: "Clear rules",
|
||||
rowFiltersHintShort: "AND in group · OR across groups · empty = all rows",
|
||||
rowFiltersEmpty: "No filters → compare all rows.",
|
||||
filterClear: "Clear",
|
||||
filterAddOr: "Add group (OR)",
|
||||
filterAddAnd: "Add condition (AND)",
|
||||
filterAddOrShort: "+ OR group",
|
||||
filterAddAndShort: "+ AND",
|
||||
filterRemoveGroup: "Remove group",
|
||||
filterGroupN: "Group {{n}}",
|
||||
filterOr: "OR",
|
||||
filterAnd: "AND",
|
||||
filterField: "Field",
|
||||
filterOp: "Op",
|
||||
filterValue: "Value",
|
||||
|
|
@ -455,8 +468,13 @@ const en = {
|
|||
hint: "Separate from business compare: baseline drift, expect set, dual-device verdict. Reuses collect tasks and port mappings.",
|
||||
hintPort:
|
||||
"Metric focus: port status (interface_brief / admin·phy·prot). Baseline → pick ports → evaluate board.",
|
||||
hintShort: "Monitor template sets rules; bind collect + dual baselines → expect → evaluate board.",
|
||||
create: "Create task",
|
||||
createHint: "Name the task and bind old/new business-monitor collect tasks. Mapping and baselines can be set later.",
|
||||
createHintShort: "Name + old/new collect tasks; template, mapping, baselines can come later.",
|
||||
showCreateMore: "More: template / mapping / baselines",
|
||||
hideCreateMore: "Hide more",
|
||||
setupHintShort: "Collect tasks are fixed at create; set monitor template, mapping and dual baselines here.",
|
||||
createProject: "Create task",
|
||||
projectName: "Task name",
|
||||
projectNamePh: "e.g. CN1/CN2 night-1 cutover",
|
||||
|
|
@ -469,23 +487,27 @@ const en = {
|
|||
sectionPair: "Bound collect tasks",
|
||||
sectionPairHint: "Collect tasks are fixed at create time; adjust monitor template, mapping and baselines here.",
|
||||
sectionBaseline: "Baseline batches",
|
||||
sectionBaselineHint: "Old baseline feeds the expected-object picker; new baseline is optional.",
|
||||
sectionBaselineHint: "Both old and new baselines are required; old lists expect objects, new feeds dual-side verdict.",
|
||||
optionalNone: "None",
|
||||
monitorTemplate: "Monitor template",
|
||||
monitorTemplateHint: "Chooses which metrics to compare and dual-side success semantics. Defaults to port cutover.",
|
||||
compareTemplate: "Compare template",
|
||||
compareTemplateBound: "Bound compare template: {{name}}",
|
||||
portMappingHint: "From Business compare port mappings; leave empty if none yet.",
|
||||
portMappingHint:
|
||||
"With a mapping, iface metrics compare only mapped ports (they must appear after cutover). Same-name ports outside the map are not a migration; old down + new up is an anomaly. No mapping means same-name compare. BGP/PW still use the batch expect set.",
|
||||
baselineNeedTask: "Select the matching collect task first",
|
||||
baselinePickHint: "Choose from that task’s collect batches",
|
||||
oldTask: "Old-device collect task",
|
||||
newTask: "New-device collect task",
|
||||
portMapping: "Port mapping",
|
||||
oldBaseline: "Old baseline batch",
|
||||
newBaseline: "New baseline batch (optional)",
|
||||
newBaseline: "New baseline batch",
|
||||
needProjectFields: "Enter a name and pick old/new collect tasks",
|
||||
needExpectPorts: "Select at least one expected object for this batch",
|
||||
needBaselineFirst: "Save an old baseline batch first to list expect objects",
|
||||
needBothBaselines: "Save both old and new baseline batches before evaluating",
|
||||
errOldBaselineRequired: "Old baseline batch is required",
|
||||
errNewBaselineRequired: "New baseline batch is required",
|
||||
needBizStateTasks: "No business-monitor tasks yet. Create one first:",
|
||||
projectCreated: "Task created",
|
||||
projects: "Tasks",
|
||||
|
|
@ -534,6 +556,15 @@ const en = {
|
|||
progress: "Progress",
|
||||
anomaly: "Anomaly",
|
||||
onlyExpect: "Expected objects only",
|
||||
onlyExpectHint: "Shows all drift by default; check to filter to this batch's expect set",
|
||||
pinCurrentBatches: "Current collect batches",
|
||||
pinOldBatch: "Old current batch",
|
||||
pinNewBatch: "New current batch",
|
||||
pinLatest: "Auto latest success",
|
||||
runHistory: "Run history",
|
||||
runLatest: "Latest run",
|
||||
colRuleHit: "Rule hit",
|
||||
mappingBound: "Mapping saved and bound to this project",
|
||||
allMetrics: "All metrics",
|
||||
colMetric: "Metric",
|
||||
colKey: "Object",
|
||||
|
|
@ -548,6 +579,7 @@ const en = {
|
|||
colNew: "New",
|
||||
colVerdict: "Verdict",
|
||||
emptyDiffs: "No rows yet — run Evaluate",
|
||||
emptyRed: "No red tickets",
|
||||
verdictMigrated: "Migrated",
|
||||
verdictMigrating: "Migrating",
|
||||
verdictLost: "Lost",
|
||||
|
|
@ -568,6 +600,7 @@ const en = {
|
|||
acceptFailed: "Batch acceptance failed ({{n}} red tickets; you may continue)",
|
||||
acceptPassedShort: "Passed",
|
||||
acceptFailedShort: "Failed",
|
||||
newBaselineMissingBanner: "These sheets have no usable new baseline rows; verdicts are unreliable: {{metrics}}",
|
||||
acceptCarryHint: "Failure does not block the next batch; red tickets stay until resolved.",
|
||||
openRedHint: "{{n}} open red ticket(s) on this task (carry allowed)",
|
||||
redTitle: "Red tickets",
|
||||
|
|
@ -602,7 +635,7 @@ const en = {
|
|||
needName: "Name is required",
|
||||
defaultsInvalid: "Invalid defaults JSON",
|
||||
overridesInvalid: "Invalid sheet_overrides JSON",
|
||||
formHint: "Pick a compare template → same sheet tabs appear → configure status fields and success patterns per sheet.",
|
||||
formHint: "Pick a compare template → same sheet tabs appear → set success conditions per sheet.",
|
||||
compareHint: "Owns which sheets and Key/compare fields; here you only set dual verdict rules.",
|
||||
pickCompare: "Pick compare template…",
|
||||
openCompare: "Manage compare templates",
|
||||
|
|
@ -621,26 +654,85 @@ const en = {
|
|||
ooeIgnore: "Ignore (always not involved)",
|
||||
sheetRules: "Per-sheet migrate rules",
|
||||
applyAllPresets: "Apply recommended presets to all",
|
||||
applyAllPresetsShort: "All presets",
|
||||
sheetsUnit: " sheets",
|
||||
sheetHowReadonly: "Compare template (read-only)",
|
||||
iface: "Interface",
|
||||
compare: "Compare",
|
||||
presenceOnly: "presence only",
|
||||
editInCompare: "Edit HOW in compare templates",
|
||||
presetAuto: "Apply recommended preset",
|
||||
presetSkip: "Skip dual verdict",
|
||||
editInCompare: "Edit HOW",
|
||||
presetAuto: "Recommended",
|
||||
presetSkip: "Skip sheet",
|
||||
skipDual: "Skip dual for this sheet",
|
||||
skipDualHint: "This sheet is skipped in cutover evaluate (use a compare job for pure value checks).",
|
||||
statusFields: "Status fields",
|
||||
statusFieldsHint: "Classify current rows as up/down; ports use admin/phy/prot, BGP uses state.",
|
||||
skipDualHint: "Skipped in cutover evaluate (use a compare job for counters).",
|
||||
statusFields: "Fields used for up/down",
|
||||
statusFieldsHint: "Ports: admin/phy/prot; BGP: state; ARP: leave empty (presence only).",
|
||||
statusOptionalHint: "With no status fields, only presence (gone/added) is used.",
|
||||
downValues: "Down values",
|
||||
upValues: "Up values",
|
||||
noFields: "No fields (pick metrics on the compare template first)",
|
||||
successPatterns: "Success patterns (old any-of × new any-of)",
|
||||
successPatternsHint: "e.g. port: old removed/down + new added/up; ARP: old removed + new added; BGP: old down(idle) + new up(established).",
|
||||
oldSideAny: "Old side (any match)",
|
||||
newSideAny: "New side (any match)",
|
||||
addSuccessRow: "Add success pattern",
|
||||
successPatterns: "Success rules (old OR-groups × new OR-groups)",
|
||||
successPatternsShort: "Success",
|
||||
successPatternsHint:
|
||||
"Presence is whether the row exists. Value change binds a field and a strategy. AND inside a group, OR between groups.",
|
||||
successPatternsHintShort: "AND in group · OR across groups · old+new both match ⇒ success",
|
||||
successPatternsHintFree:
|
||||
"Each side has two condition kinds: presence (no field) or value change (must bind a field). Inside a group everything must match (AND). Between groups, any group is enough (OR).",
|
||||
anomalyPatternsShort: "Anomaly",
|
||||
anomalyPatternsHint:
|
||||
"Same shape as success. Match ⇒ red. Check “don’t care” on one side to watch only the other (e.g. new-side gone/down). Not-yet-success is still migrating, not anomaly.",
|
||||
anomalyPatternsHintShort: "Success first; then anomaly. Don’t-care watches one side. Mid-state ≠ anomaly.",
|
||||
successRow: "Success {{n}}",
|
||||
anomalyRow: "Anomaly {{n}}",
|
||||
removeRow: "Remove",
|
||||
oldSideAny: "Old",
|
||||
newSideAny: "New",
|
||||
groupLogicHint: "AND inside a group, OR between groups",
|
||||
sideDontCare: "Don’t care this side",
|
||||
sideDontCareHint: "Judged by the other side only.",
|
||||
groupN: "Group {{n}}",
|
||||
addAnd: "Add to this group (AND)",
|
||||
addOr: "Add another group (OR)",
|
||||
addAndShort: "+ AND",
|
||||
addOrShort: "+ OR group",
|
||||
addSuccessRow: "+ Success rule",
|
||||
addAnomalyRow: "+ Anomaly rule",
|
||||
modeAny: "Match any",
|
||||
modeAll: "Match all",
|
||||
addCond: "Add condition",
|
||||
pickField: "Pick field…",
|
||||
condValue: "Value",
|
||||
opEmpty: "empty",
|
||||
opNotEmpty: "not empty",
|
||||
opChanged: "changed vs baseline",
|
||||
opUnchanged: "same as baseline",
|
||||
op_eq: "equals",
|
||||
op_ne: "not equals",
|
||||
op_in: "in",
|
||||
op_not_in: "not in",
|
||||
op_empty: "empty",
|
||||
op_not_empty: "not empty",
|
||||
op_changed: "changed vs baseline",
|
||||
op_unchanged: "same as baseline",
|
||||
and: "and",
|
||||
groupPresence: "Presence",
|
||||
groupValue: "Value change",
|
||||
groupStatus: "Status class",
|
||||
groupField: "Field condition",
|
||||
tokRemoved: "Gone",
|
||||
tokAdded: "Added",
|
||||
tokUnchanged: "Unchanged",
|
||||
tokChanged: "Changed",
|
||||
tokUp: "up",
|
||||
tokDown: "down",
|
||||
tokOther: "other",
|
||||
or: "or",
|
||||
tagSkip: "skip",
|
||||
tagRules: "{{n}}",
|
||||
tagEmpty: "empty",
|
||||
needCompareFirst: "Pick a compare template that has sheets first.",
|
||||
showMore: "More: note / HF collect / JSON",
|
||||
hideMore: "Hide more",
|
||||
showJson: "Advanced: edit JSON",
|
||||
hideJson: "Back to visual editor",
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue